class.cpp revision d1a7846699a82f85ff3ce6b2e383409537c3f5c5
1d7d5f0223bd30dfd618762349c6209dd1d5ea3e6Daniel Dunbar// RUN: clang-cc -fsyntax-only -verify %s 207952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidisclass C { 307952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidispublic: 407952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis auto int errx; // expected-error {{error: storage class specified for a member declaration}} 507952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis register int erry; // expected-error {{error: storage class specified for a member declaration}} 607952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis extern int errz; // expected-error {{error: storage class specified for a member declaration}} 707952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis 807952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis static void sm() { 907952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis sx = 0; 1007952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis this->x = 0; // expected-error {{error: invalid use of 'this' outside of a nonstatic member function}} 1107952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis x = 0; // expected-error {{error: invalid use of member 'x' in static member function}} 1207952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis } 1307952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis 1407952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis class NestedC { 1507952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis void m() { 1607952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis sx = 0; 1707952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis x = 0; // expected-error {{error: invalid use of nonstatic data member 'x'}} 1807952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis } 1907952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis }; 2007952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis 2107952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis int b : 1, w : 2; 2207952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis int : 1, : 2; 238b963ef99be6235f1e9fe866180fff7dbbe5e85bChris Lattner typedef int E : 1; // expected-error {{typedef member 'E' cannot be a bit-field}} 2407952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis static int sb : 1; // expected-error {{error: static member 'sb' cannot be a bit-field}} 2507952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis static int vs; 2607952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis 2707952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis typedef int func(); 2807952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis func tm; 29d6caa9ef4cc68290b0bf33432934cc11dd5594e6Argyrios Kyrtzidis func *ptm; 303cf538d5c49bbebac1afa6f4a5010e3d877440bbDouglas Gregor func btm : 1; // expected-error {{bit-field 'btm' has non-integral type}} 313cf538d5c49bbebac1afa6f4a5010e3d877440bbDouglas Gregor NestedC bc : 1; // expected-error {{bit-field 'bc' has non-integral type}} 3207952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis 3366973121788ca645fe3d4a66179b9cfb6f2bce08Douglas Gregor enum E1 { en1, en2 }; 3407952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis 3507952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis int i = 0; // expected-error {{error: 'i' can only be initialized if it is a static const integral data member}} 3607952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis static int si = 0; // expected-error {{error: 'si' can only be initialized if it is a static const integral data member}} 3707952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis static const NestedC ci = 0; // expected-error {{error: 'ci' can only be initialized if it is a static const integral data member}} 38021c3b372c58f5423b4fa2a5be6933d1c7ecc663Douglas Gregor static const int nci = vs; // expected-error {{in-class initializer is not an integral constant expression}} 3907952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis static const int vi = 0; 4007952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis static const E evi = 0; 4107952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis 4207952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis void m() { 4307952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis sx = 0; 4407952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis this->x = 0; 4507952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis y = 0; 4607952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis this = 0; // expected-error {{error: expression is not assignable}} 4707952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis } 4807952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis 4907952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis int f1(int p) { 50d93f0ddba0965ded252e228134b30ce30e863fb0Sebastian Redl A z = 6; 51d93f0ddba0965ded252e228134b30ce30e863fb0Sebastian Redl return p + x + this->y + z; 5207952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis } 5307952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis 5407952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis typedef int A; 5507952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis 56021c3b372c58f5423b4fa2a5be6933d1c7ecc663Douglas Gregor virtual int viv; // expected-error {{'virtual' can only appear on non-static member functions}} 57d93f0ddba0965ded252e228134b30ce30e863fb0Sebastian Redl virtual static int vsif(); // expected-error {{error: 'virtual' can only appear on non-static member functions}} 58d93f0ddba0965ded252e228134b30ce30e863fb0Sebastian Redl virtual int vif(); 59d93f0ddba0965ded252e228134b30ce30e863fb0Sebastian Redl 6007952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidisprivate: 6107952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis int x,y; 6207952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis static int sx; 63de933f025e839bde4b119f3437c320c2137bbe1fArgyrios Kyrtzidis 64669d5d74b880a8497b92a3ec159145713f4d6519Sebastian Redl mutable int mi; 65669d5d74b880a8497b92a3ec159145713f4d6519Sebastian Redl mutable int &mir; // expected-error {{error: 'mutable' cannot be applied to references}} 66669d5d74b880a8497b92a3ec159145713f4d6519Sebastian Redl mutable void mfn(); // expected-error {{error: 'mutable' cannot be applied to functions}} 67669d5d74b880a8497b92a3ec159145713f4d6519Sebastian Redl mutable const int mci; // expected-error {{error: 'mutable' and 'const' cannot be mixed}} 68669d5d74b880a8497b92a3ec159145713f4d6519Sebastian Redl 69de933f025e839bde4b119f3437c320c2137bbe1fArgyrios Kyrtzidis static const int number = 50; 70de933f025e839bde4b119f3437c320c2137bbe1fArgyrios Kyrtzidis static int arr[number]; 7107952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis}; 7207952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis 7307952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidisclass C2 { 7407952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis void f() { 7507952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis static int lx; 7607952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis class LC1 { 7707952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis int m() { return lx; } 7807952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis }; 7907952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis class LC2 { 8007952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis int m() { return lx; } 8107952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis }; 8207952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis } 8307952324dda0e758c17f8bc3015793c65c51c48cArgyrios Kyrtzidis}; 84669d5d74b880a8497b92a3ec159145713f4d6519Sebastian Redl 85a11f42f4bca694b9be91350d0a74815f119e3fbfSebastian Redlstruct C3 { 86a11f42f4bca694b9be91350d0a74815f119e3fbfSebastian Redl int i; 87a11f42f4bca694b9be91350d0a74815f119e3fbfSebastian Redl mutable int j; 88a11f42f4bca694b9be91350d0a74815f119e3fbfSebastian Redl}; 89a11f42f4bca694b9be91350d0a74815f119e3fbfSebastian Redlvoid f() 90a11f42f4bca694b9be91350d0a74815f119e3fbfSebastian Redl{ 91a11f42f4bca694b9be91350d0a74815f119e3fbfSebastian Redl const C3 c3 = { 1, 2 }; 92a11f42f4bca694b9be91350d0a74815f119e3fbfSebastian Redl (void)static_cast<int*>(&c3.i); // expected-error {{static_cast from 'int const *' to 'int *' is not allowed}} 93a11f42f4bca694b9be91350d0a74815f119e3fbfSebastian Redl // but no error here 94a11f42f4bca694b9be91350d0a74815f119e3fbfSebastian Redl (void)static_cast<int*>(&c3.j); 95a11f42f4bca694b9be91350d0a74815f119e3fbfSebastian Redl} 96a11f42f4bca694b9be91350d0a74815f119e3fbfSebastian Redl 97669d5d74b880a8497b92a3ec159145713f4d6519Sebastian Redl// Play with mutable a bit more, to make sure it doesn't crash anything. 98669d5d74b880a8497b92a3ec159145713f4d6519Sebastian Redlmutable int gi; // expected-error {{error: 'mutable' can only be applied to member variables}} 99669d5d74b880a8497b92a3ec159145713f4d6519Sebastian Redlmutable void gfn(); // expected-error {{illegal storage class on function}} 100669d5d74b880a8497b92a3ec159145713f4d6519Sebastian Redlvoid ogfn() 101669d5d74b880a8497b92a3ec159145713f4d6519Sebastian Redl{ 102669d5d74b880a8497b92a3ec159145713f4d6519Sebastian Redl mutable int ml; // expected-error {{error: 'mutable' can only be applied to member variables}} 103a4ed0d8d75212dc01b4438829a4b0c846d99458dSebastian Redl 104a4ed0d8d75212dc01b4438829a4b0c846d99458dSebastian Redl // PR3020: This used to crash due to double ownership of C4. 105a4ed0d8d75212dc01b4438829a4b0c846d99458dSebastian Redl struct C4; 106a4ed0d8d75212dc01b4438829a4b0c846d99458dSebastian Redl C4; // expected-error {{declaration does not declare anything}} 107669d5d74b880a8497b92a3ec159145713f4d6519Sebastian Redl} 10872de6676bd30f9081ee4166bbe07b4c270258ce6Douglas Gregor 10972de6676bd30f9081ee4166bbe07b4c270258ce6Douglas Gregorstruct C4 { 11072de6676bd30f9081ee4166bbe07b4c270258ce6Douglas Gregor void f(); // expected-note{{previous declaration is here}} 11172de6676bd30f9081ee4166bbe07b4c270258ce6Douglas Gregor int f; // expected-error{{duplicate member 'f'}} 11272de6676bd30f9081ee4166bbe07b4c270258ce6Douglas Gregor}; 11346408eedfff5aa33662cedb6716a20616f3bad31Sebastian Redl 11446408eedfff5aa33662cedb6716a20616f3bad31Sebastian Redl// PR5415 - don't hang! 11546408eedfff5aa33662cedb6716a20616f3bad31Sebastian Redlstruct S 11646408eedfff5aa33662cedb6716a20616f3bad31Sebastian Redl{ 117d1a7846699a82f85ff3ce6b2e383409537c3f5c5Sebastian Redl void f(); // expected-note 1 {{previous declaration}} 118d1a7846699a82f85ff3ce6b2e383409537c3f5c5Sebastian Redl void S::f() {} // expected-error {{class member cannot be redeclared}} expected-note {{previous declaration}} expected-note {{previous definition}} 11946408eedfff5aa33662cedb6716a20616f3bad31Sebastian Redl void f() {} // expected-error {{class member cannot be redeclared}} expected-error {{redefinition}} 12046408eedfff5aa33662cedb6716a20616f3bad31Sebastian Redl}; 121