| // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s |
| |
| struct S { |
| int *j = &nonexistent; // expected-error {{use of undeclared identifier 'nonexistent'}} |
| int *m = &n; // ok |
| |
| int n = f(); // ok |
| int f(); |
| }; |
| |
| int i = sizeof(S::m); // ok |
| int j = sizeof(S::m + 42); // ok |
| |
| |
| struct T { |
| int n; |
| static void f() { |
| int a[n]; // expected-error {{invalid use of member 'n' in static member function}} |
| int b[sizeof n]; // ok |
| } |
| }; |
| |
| // Make sure the rule for unevaluated operands works correctly with typeid. |
| namespace std { |
| class type_info; |
| } |
| class Poly { virtual ~Poly(); }; |
| const std::type_info& k = typeid(S::m); |
| const std::type_info& m = typeid(*(Poly*)S::m); // expected-error {{invalid use of non-static data member}} |
| const std::type_info& n = typeid(*(Poly*)(0*sizeof S::m)); |
| |
| namespace PR11956 { |
| struct X { char a; }; |
| struct Y { int f() { return sizeof(X::a); } }; // ok |
| |
| struct A { enum E {} E; }; |
| struct B { int f() { return sizeof(A::E); } }; // ok |
| } |