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