1 // RUN: %clang_cc1 -std=c++98 %s -Wno-unused -verify
2 // RUN: %clang_cc1 -std=c++11 %s -Wno-unused -verify
3 // RUN: %clang_cc1 -std=c++2a %s -Wno-unused -verify
4
5 void use(int);
6
f()7 void f() {
8 const int a = 1; // expected-note {{here}}
9
10 #if __cplusplus >= 201103L
11 constexpr int arr[3] = {1, 2, 3}; // expected-note 2{{here}}
12
13 struct S { int x; int f() const; };
14 constexpr S s = {0}; // expected-note 3{{here}}
15 constexpr S *ps = nullptr;
16 S *const &psr = ps; // expected-note 2{{here}}
17 #endif
18
19 struct Inner {
20 void test(int i) {
21 // id-expression
22 use(a);
23
24 #if __cplusplus >= 201103L
25 // subscripting operation with an array operand
26 use(arr[i]);
27 use(i[arr]);
28 use((+arr)[i]); // expected-error {{reference to local variable}}
29 use(i[+arr]); // expected-error {{reference to local variable}}
30
31 // class member access naming non-static data member
32 use(s.x);
33 use(s.f()); // expected-error {{reference to local variable}}
34 use((&s)->x); // expected-error {{reference to local variable}}
35 use(ps->x); // ok (lvalue-to-rvalue conversion applied to id-expression)
36 use(psr->x); // expected-error {{reference to local variable}}
37
38 // class member access naming a static data member
39 // FIXME: How to test this?
40
41 // pointer-to-member expression
42 use(s.*&S::x);
43 use((s.*&S::f)()); // expected-error {{reference to local variable}}
44 use(ps->*&S::x); // ok (lvalue-to-rvalue conversion applied to id-expression)
45 use(psr->*&S::x); // expected-error {{reference to local variable}}
46 #endif
47
48 // parentheses
49 use((a));
50 #if __cplusplus >= 201103L
51 use((s.x));
52 #endif
53
54 // glvalue conditional expression
55 use(i ? a : a);
56 use(i ? i : a);
57
58 // comma expression
59 use((i, a));
60 // FIXME: This is not an odr-use because it is a discarded-value
61 // expression applied to an expression whose potential result is 'a'.
62 use((a, a)); // expected-error {{reference to local variable}}
63
64 // (and combinations thereof)
65 use(a ? (i, a) : a);
66 #if __cplusplus >= 201103L
67 use(a ? (i, a) : arr[a ? s.x : arr[a]]);
68 #endif
69 }
70 };
71 }
72
73 // FIXME: Test that this behaves properly.
74 namespace std_example {
75 struct S { static const int x = 0, y = 0; };
76 const int &f(const int &r);
77 bool b;
78 int n = b ? (1, S::x)
79 : f(S::y);
80 }
81