// { dg-do compile { target c++11 } }
// { dg-options "-Wdeprecated" }

inline int var1 = 4;				// { dg-warning "1:inline variables are only available with" "" { target c++14_down } }
static inline int var7 = 9;			// { dg-warning "8:inline variables are only available with" "" { target c++14_down } }
namespace N
{
  int inline var2;				// { dg-warning "7:inline variables are only available with" "" { target c++14_down } }
  inline const int var6 = 8;			// { dg-warning "3:inline variables are only available with" "" { target c++14_down } }
  static inline double var8 = 2.0;		// { dg-warning "10:inline variables are only available with" "" { target c++14_down } }
  extern inline char var10;			// { dg-warning "10:inline variables are only available with" "" { target c++14_down } }
}
struct S
{
  static constexpr int var3 = 5;
  static inline int var4 = 6;			// { dg-warning "10:inline variables are only available with" "" { target c++14_down } }
  static constexpr int var5 = 7;
  static inline double var9 = 3.0;		// { dg-warning "10:inline variables are only available with" "" { target c++14_down } }
  static constexpr inline int var11 = 11;	// { dg-warning "20:inline variables are only available with" "" { target c++14_down } }
};
const int S::var3;				// { dg-warning "redundant redeclaration of" "" { target c++17 } }
const int S::var3;				// { dg-error "redefinition of" "" { target c++14_down } }
extern int foo (int);				// { dg-warning "redundant redeclaration of" "" { target c++17 } .-1 }
extern int bar (int);
struct T { T () { t = foo (3); } T (int x) { t = foo (x); } int t; };
inline int var12 = foo (0);			// { dg-warning "1:inline variables are only available with" "" { target c++14_down } }
int inline var13 = foo (1);			// { dg-warning "5:inline variables are only available with" "" { target c++14_down } }
struct U
{
  static inline int var14 = foo (2);		// { dg-warning "10:inline variables are only available with" "" { target c++14_down } }
  static inline T var15;			// { dg-warning "10:inline variables are only available with" "" { target c++14_down } }
  static inline T var16 = 4;			// { dg-warning "10:inline variables are only available with" "" { target c++14_down } }
  static int inline var17 = foo (5);		// { dg-warning "14:inline variables are only available with" "" { target c++14_down } }
  static constexpr double var18 = 4.0;
};
extern inline int var19;			// { dg-warning "8:inline variables are only available with" "" { target c++14_down } }
extern inline int var20;			// { dg-warning "8:inline variables are only available with" "" { target c++14_down } }
int &ref19 = var19;				// { dg-error "odr-used inline variable 'var19' is not defined" "" { target *-*-* } .-2 }
int sz20 = sizeof (var20);
struct V
{
  static struct A var21;			// { dg-warning "10:inline variables are only available with" "" { target c++14_down } .+1 }
  static inline struct B var22;			// { dg-error "has incomplete type" }
  static inline struct C var23 = {};		// { dg-error "has incomplete type" }
};						// { dg-warning "10:inline variables are only available with" "" { target c++14_down } .-1 }
struct W
{
  static inline int var24;			// { dg-warning "10:inline variables are only available with" "" { target c++14_down } }
  static inline const int var25;		// { dg-warning "10:inline variables are only available with" "" { target c++14_down } }
						// { dg-error "uninitialized 'const" "" { target *-*-* } .-1 }
  static inline int var26 = 5;			// { dg-warning "10:inline variables are only available with" "" { target c++14_down } }
  static inline const int var27 = 6;		// { dg-warning "10:inline variables are only available with" "" { target c++14_down } }
  static inline double var28 = { 4.0 };		// { dg-warning "10:inline variables are only available with" "" { target c++14_down } }
  static const inline double var29 = { 5.0 };	// { dg-warning "16:inline variables are only available with" "" { target c++14_down } }
};
int W::var24;					// { dg-error "redefinition of" }
const int W::var25;				// { dg-error "redefinition of" }
int W::var26;					// { dg-error "redefinition of" }
const int W::var27;				// { dg-error "redefinition of" }
double W::var28;				// { dg-error "redefinition of" }
double const W::var29;				// { dg-error "redefinition of" }
struct X
{
  inline int var30;				// { dg-error "3:'var30' declared as an 'inline' field" }
};
inline typedef int TT;				// { dg-error "1:'TT' declared as an 'inline' type" }
int
foo (inline int var31)				// { dg-error "6:'var31' declared as an 'inline' parameter" }
{
  inline int var32;				// { dg-error "3:'inline' specifier invalid for variable 'var32' declared at block scope" }
  static inline int var33;			// { dg-error "10:'inline' specifier invalid for variable 'var33' declared at block scope" }
  return 0;
}
template <typename A, typename B, typename C>
struct Y
{
  static A var34;				// { dg-warning "10:inline variables are only available with" "" { target c++14_down } .+1 }
  static inline B var35;			// { dg-error "has incomplete type" }
  static inline C var36;			// { dg-error "has incomplete type" }
};						// { dg-warning "10:inline variables are only available with" "" { target c++14_down } .-1 }
struct A;
struct B;
struct C;
Y<A, B, C> y;
A *ptr34 = &Y<A, B, C>::var34;
B *ptr35 = &Y<A, B, C>::var35;
C *ptr36 = &Y<A, B, C>::var36;
template <int N>
struct Z
{
  static inline int var37;			// { dg-warning "10:inline variables are only available with" "" { target c++14_down } }
  static inline const int var38;		// { dg-warning "10:inline variables are only available with" "" { target c++14_down } }
						// { dg-error "uninitialized 'const" "" { target *-*-* } .-1 }
  static inline int var39 = 5;			// { dg-warning "10:inline variables are only available with" "" { target c++14_down } }
  static inline const int var40 = 6;		// { dg-warning "10:inline variables are only available with" "" { target c++14_down } }
  static inline double var41 = { 4.0 };		// { dg-warning "10:inline variables are only available with" "" { target c++14_down } }
  static const inline double var42 = { 5.0 };	// { dg-warning "16:inline variables are only available with" "" { target c++14_down } }
  static constexpr int var43 = 5;
  static constexpr inline int var44 = 5;	// { dg-warning "20:inline variables are only available with" "" { target c++14_down } }
};
template <int N>
int Z<N>::var37;				// { dg-error "redefinition of" }
template <int N>
const int Z<N>::var38;				// { dg-error "redefinition of" }
const int &ref38 = Z<0>::var38;
template <int N>
int Z<N>::var39;				// { dg-error "redefinition of" }
template <int N>
const int Z<N>::var40;				// { dg-error "redefinition of" }
template <int N>
double Z<N>::var41;				// { dg-error "redefinition of" }
template <int N>
double const Z<N>::var42;			// { dg-error "redefinition of" }
template <int N>
const int Z<N>::var43;				// { dg-warning "redundant redeclaration of" "" { target c++17 } }
template <int N>				// { dg-warning "redundant redeclaration of" "" { target c++17 } .+1 }
const int Z<N>::var43;				// { dg-error "redefinition of" "" { target c++14_down } }
Z<0> z;
