1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 27a614d8380297fcd2bc23986241905d97222948cRichard Smith 37a614d8380297fcd2bc23986241905d97222948cRichard Smithstruct S { 47a614d8380297fcd2bc23986241905d97222948cRichard Smith int *j = &nonexistent; // expected-error {{use of undeclared identifier 'nonexistent'}} 57a614d8380297fcd2bc23986241905d97222948cRichard Smith int *m = &n; // ok 67a614d8380297fcd2bc23986241905d97222948cRichard Smith 77a614d8380297fcd2bc23986241905d97222948cRichard Smith int n = f(); // ok 87a614d8380297fcd2bc23986241905d97222948cRichard Smith int f(); 97a614d8380297fcd2bc23986241905d97222948cRichard Smith}; 107a614d8380297fcd2bc23986241905d97222948cRichard Smith 117a614d8380297fcd2bc23986241905d97222948cRichard Smithint i = sizeof(S::m); // ok 127a614d8380297fcd2bc23986241905d97222948cRichard Smithint j = sizeof(S::m + 42); // ok 13f6702a3927147655206ae729a84339c4fda4c651Richard Smith 14f6702a3927147655206ae729a84339c4fda4c651Richard Smith 15f6702a3927147655206ae729a84339c4fda4c651Richard Smithstruct T { 16f6702a3927147655206ae729a84339c4fda4c651Richard Smith int n; 17f6702a3927147655206ae729a84339c4fda4c651Richard Smith static void f() { 18f6702a3927147655206ae729a84339c4fda4c651Richard Smith int a[n]; // expected-error {{invalid use of member 'n' in static member function}} 19f6702a3927147655206ae729a84339c4fda4c651Richard Smith int b[sizeof n]; // ok 20f6702a3927147655206ae729a84339c4fda4c651Richard Smith } 21f6702a3927147655206ae729a84339c4fda4c651Richard Smith}; 229bc291d5c00f47383ce7358e6309abf45324b028Eli Friedman 239bc291d5c00f47383ce7358e6309abf45324b028Eli Friedman// Make sure the rule for unevaluated operands works correctly with typeid. 249bc291d5c00f47383ce7358e6309abf45324b028Eli Friedmannamespace std { 259bc291d5c00f47383ce7358e6309abf45324b028Eli Friedman class type_info; 269bc291d5c00f47383ce7358e6309abf45324b028Eli Friedman} 279bc291d5c00f47383ce7358e6309abf45324b028Eli Friedmanclass Poly { virtual ~Poly(); }; 289bc291d5c00f47383ce7358e6309abf45324b028Eli Friedmanconst std::type_info& k = typeid(S::m); 29a85cf39786fffd6860a940523be01eb02a4935c0Richard Smithconst std::type_info& m = typeid(*(Poly*)S::m); // expected-error {{invalid use of non-static data member}} 302c8aee454dac03e4918f0bb6e7fb849953056abaRichard Smithconst std::type_info& n = typeid(*(Poly*)(0*sizeof S::m)); 312c8aee454dac03e4918f0bb6e7fb849953056abaRichard Smith 322c8aee454dac03e4918f0bb6e7fb849953056abaRichard Smithnamespace PR11956 { 332c8aee454dac03e4918f0bb6e7fb849953056abaRichard Smith struct X { char a; }; 342c8aee454dac03e4918f0bb6e7fb849953056abaRichard Smith struct Y { int f() { return sizeof(X::a); } }; // ok 352c8aee454dac03e4918f0bb6e7fb849953056abaRichard Smith 362c8aee454dac03e4918f0bb6e7fb849953056abaRichard Smith struct A { enum E {} E; }; 372c8aee454dac03e4918f0bb6e7fb849953056abaRichard Smith struct B { int f() { return sizeof(A::E); } }; // ok 382c8aee454dac03e4918f0bb6e7fb849953056abaRichard Smith} 39