1 // RUN: %clang_cc1 -fsyntax-only -verify -Wc++11-compat %s 2 class C { 3 public: 4 auto int errx; // expected-error {{storage class specified for a member declaration}} 5 #if __cplusplus <= 199711L 6 // expected-warning@-2 {{'auto' storage class specifier is redundant}} 7 #else 8 // expected-warning@-4 {{'auto' storage class specifier is not permitted in C++11, and will not be supported in future releases}} 9 #endif 10 register int erry; // expected-error {{storage class specified for a member declaration}} 11 extern int errz; // expected-error {{storage class specified for a member declaration}} 12 13 static void sm() { 14 sx = 0; 15 this->x = 0; // expected-error {{invalid use of 'this' outside of a non-static member function}} 16 x = 0; // expected-error {{invalid use of member 'x' in static member function}} 17 } 18 19 class NestedC { 20 public: 21 NestedC(int); 22 void f() { 23 sx = 0; 24 x = 0; // expected-error {{use of non-static data member 'x' of 'C' from nested type 'NestedC'}} 25 sm(); 26 m(); // expected-error {{call to non-static member function 'm' of 'C' from nested type 'NestedC'}} 27 } 28 }; 29 30 int b : 1, w : 2; 31 int : 1, : 2; 32 typedef int E : 1; // expected-error {{typedef member 'E' cannot be a bit-field}} 33 static int sb : 1; // expected-error {{static member 'sb' cannot be a bit-field}} 34 static int vs; 35 36 typedef int func(); 37 func tm; 38 func *ptm; 39 func btm : 1; // expected-error {{bit-field 'btm' has non-integral type}} 40 NestedC bc : 1; // expected-error {{bit-field 'bc' has non-integral type}} 41 42 enum E1 { en1, en2 }; 43 44 int i = 0; 45 #if __cplusplus <= 199711L 46 // expected-warning@-2 {{in-class initialization of non-static data member is a C++11 extension}} 47 #endif 48 static int si = 0; // expected-error {{non-const static data member must be initialized out of line}} 49 static const NestedC ci = 0; // expected-error {{static data member of type 'const C::NestedC' must be initialized out of line}} 50 static const int nci = vs; // expected-error {{in-class initializer for static data member is not a constant expression}} 51 static const int vi = 0; 52 static const volatile int cvi = 0; // ok, illegal in C++11 53 #if __cplusplus >= 201103L 54 // expected-error@-2 {{static const volatile data member must be initialized out of line}} 55 #endif 56 static const E evi = 0; 57 58 void m() { 59 sx = 0; 60 this->x = 0; 61 y = 0; 62 this = 0; // expected-error {{expression is not assignable}} 63 } 64 65 int f1(int p) { 66 A z = 6; 67 return p + x + this->y + z; 68 } 69 70 typedef int A; 71 72 virtual int viv; // expected-error {{'virtual' can only appear on non-static member functions}} 73 virtual static int vsif(); // expected-error {{'virtual' can only appear on non-static member functions}} 74 virtual int vif(); 75 76 private: 77 int x,y; 78 static int sx; 79 80 mutable int mi; 81 mutable int &mir; // expected-error {{'mutable' cannot be applied to references}} 82 mutable void mfn(); // expected-error {{'mutable' cannot be applied to functions}} 83 mutable const int mci; // expected-error {{'mutable' and 'const' cannot be mixed}} 84 85 static const int number = 50; 86 static int arr[number]; 87 }; 88 89 class C2 { 90 void f() { 91 static int lx; 92 class LC1 { 93 int m() { return lx; } 94 }; 95 class LC2 { 96 int m() { return lx; } 97 }; 98 } 99 }; 100 101 struct C3 { 102 int i; 103 mutable int j; 104 }; 105 void f() 106 { 107 const C3 c3 = { 1, 2 }; 108 (void)static_cast<int*>(&c3.i); // expected-error {{static_cast from 'const int *' to 'int *' is not allowed}} 109 // but no error here 110 (void)static_cast<int*>(&c3.j); 111 } 112 113 // Play with mutable a bit more, to make sure it doesn't crash anything. 114 mutable int gi; // expected-error {{'mutable' can only be applied to member variables}} 115 mutable void gfn(); // expected-error {{illegal storage class on function}} 116 void ogfn() 117 { 118 mutable int ml; // expected-error {{'mutable' can only be applied to member variables}} 119 120 // PR3020: This used to crash due to double ownership of C4. 121 struct C4; 122 C4; // expected-warning {{declaration does not declare anything}} 123 } 124 125 struct C4 { 126 void f(); // expected-note{{previous declaration is here}} 127 int f; // expected-error{{duplicate member 'f'}} 128 }; 129 130 // PR5415 - don't hang! 131 struct S 132 { 133 void f(); // expected-note 1 {{previous declaration}} expected-note {{previous declaration}} 134 void S::f() {} // expected-error {{extra qualification on member}} expected-error {{class member cannot be redeclared}} 135 void f() {} // expected-error {{class member cannot be redeclared}} 136 }; 137 138 // Don't crash on this bogus code. 139 namespace pr6629 { 140 template<class T1, class T2> struct foo : 141 bogus<foo<T1,T2> > // expected-error {{unknown template name 'bogus'}} 142 { }; 143 144 template<> struct foo<unknown,unknown> { // expected-error {{undeclared identifier 'unknown'}} 145 template <typename U1, typename U2> struct bar { 146 typedef bar type; 147 static const int value = 0; 148 }; 149 }; 150 } 151 152 namespace PR7153 { 153 class EnclosingClass { 154 public: 155 struct A { } mutable *member; 156 }; 157 158 void f(const EnclosingClass &ec) { 159 ec.member = 0; 160 } 161 } 162 163 namespace PR7196 { 164 struct A { 165 int a; 166 167 void f() { 168 char i[sizeof(a)]; 169 enum { x = sizeof(i) }; 170 enum { y = sizeof(a) }; 171 } 172 }; 173 } 174 175 namespace rdar8066414 { 176 class C { 177 C() {} 178 } // expected-error{{expected ';' after class}} 179 } 180 181 namespace rdar8367341 { 182 float foo(); 183 #if __cplusplus >= 201103L 184 // expected-note@-2 {{declared here}} 185 #endif 186 187 struct A { 188 #if __cplusplus <= 199711L 189 static const float x = 5.0f; // expected-warning {{in-class initializer for static data member of type 'const float' is a GNU extension}} 190 static const float y = foo(); // expected-warning {{in-class initializer for static data member of type 'const float' is a GNU extension}} expected-error {{in-class initializer for static data member is not a constant expression}} 191 #else 192 static constexpr float x = 5.0f; 193 static constexpr float y = foo(); // expected-error {{constexpr variable 'y' must be initialized by a constant expression}} expected-note {{non-constexpr function 'foo' cannot be used in a constant expression}} 194 #endif 195 }; 196 } 197 198 namespace with_anon { 199 struct S { 200 union { 201 char c; 202 }; 203 }; 204 205 void f() { 206 S::c; // expected-error {{invalid use of non-static data member}} 207 } 208 } 209 210 struct PR9989 { 211 static int const PR9989_Member = sizeof PR9989_Member; 212 }; 213