xref: /llvm-project/clang/test/CXX/expr/expr.prim/expr.prim.general/p12-0x.cpp (revision fa0a1f531f7d31ef90419c2ef36bfa0060a73b2c)
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