1b06c68d3SDavid Blaikie // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 2b06c68d3SDavid Blaikie 3b06c68d3SDavid Blaikie struct S { 4b06c68d3SDavid Blaikie int *j = &nonexistent; // expected-error {{use of undeclared identifier 'nonexistent'}} 5b06c68d3SDavid Blaikie int *m = &n; // ok 6b06c68d3SDavid Blaikie 7b06c68d3SDavid Blaikie int n = f(); // ok 8b06c68d3SDavid Blaikie int f(); 9b06c68d3SDavid Blaikie }; 10b06c68d3SDavid Blaikie 11b06c68d3SDavid Blaikie int i = sizeof(S::m); // ok 12b06c68d3SDavid Blaikie int j = sizeof(S::m + 42); // ok 13764d2fe6SRichard Smith 14764d2fe6SRichard Smith 15764d2fe6SRichard Smith struct T { 16764d2fe6SRichard Smith int n; fT17764d2fe6SRichard Smith static void f() { 18764d2fe6SRichard Smith int a[n]; // expected-error {{invalid use of member 'n' in static member function}} 19764d2fe6SRichard Smith int b[sizeof n]; // ok 20764d2fe6SRichard Smith } 21764d2fe6SRichard Smith }; 227bda7f75SEli Friedman 237bda7f75SEli Friedman // Make sure the rule for unevaluated operands works correctly with typeid. 247bda7f75SEli Friedman namespace std { 257bda7f75SEli Friedman class type_info; 267bda7f75SEli Friedman } 277bda7f75SEli Friedman class Poly { virtual ~Poly(); }; 287bda7f75SEli Friedman const std::type_info& k = typeid(S::m); 29*fa0a1f53SRichard Smith const std::type_info& m = typeid(*(Poly*)S::m); // expected-error {{invalid use of non-static data member}} 30456f0183SEli Friedman const std::type_info& n = typeid(*(Poly*)(0*sizeof S::m)); 31eae99680SRichard Smith 32eae99680SRichard Smith namespace PR11956 { 33eae99680SRichard Smith struct X { char a; }; fPR11956::Y34eae99680SRichard Smith struct Y { int f() { return sizeof(X::a); } }; // ok 35eae99680SRichard Smith 36eae99680SRichard Smith struct A { enum E {} E; }; fPR11956::B37eae99680SRichard Smith struct B { int f() { return sizeof(A::E); } }; // ok 38eae99680SRichard Smith } 39