| // RUN: %clang_cc1 -std=c++98 %s -Wno-unused -verify |
| // RUN: %clang_cc1 -std=c++11 %s -Wno-unused -verify |
| // RUN: %clang_cc1 -std=c++2a %s -Wno-unused -verify |
| |
| void use(int); |
| |
| void f() { |
| const int a = 1; // expected-note {{here}} |
| |
| #if __cplusplus >= 201103L |
| constexpr int arr[3] = {1, 2, 3}; // expected-note 2{{here}} |
| |
| struct S { int x; int f() const; }; |
| constexpr S s = {0}; // expected-note 3{{here}} |
| constexpr S *ps = nullptr; |
| S *const &psr = ps; // expected-note 2{{here}} |
| #endif |
| |
| struct Inner { |
| void test(int i) { |
| // id-expression |
| use(a); |
| |
| #if __cplusplus >= 201103L |
| // subscripting operation with an array operand |
| use(arr[i]); |
| use(i[arr]); |
| use((+arr)[i]); // expected-error {{reference to local variable}} |
| use(i[+arr]); // expected-error {{reference to local variable}} |
| |
| // class member access naming non-static data member |
| use(s.x); |
| use(s.f()); // expected-error {{reference to local variable}} |
| use((&s)->x); // expected-error {{reference to local variable}} |
| use(ps->x); // ok (lvalue-to-rvalue conversion applied to id-expression) |
| use(psr->x); // expected-error {{reference to local variable}} |
| |
| // class member access naming a static data member |
| // FIXME: How to test this? |
| |
| // pointer-to-member expression |
| use(s.*&S::x); |
| use((s.*&S::f)()); // expected-error {{reference to local variable}} |
| use(ps->*&S::x); // ok (lvalue-to-rvalue conversion applied to id-expression) |
| use(psr->*&S::x); // expected-error {{reference to local variable}} |
| #endif |
| |
| // parentheses |
| use((a)); |
| #if __cplusplus >= 201103L |
| use((s.x)); |
| #endif |
| |
| // glvalue conditional expression |
| use(i ? a : a); |
| use(i ? i : a); |
| |
| // comma expression |
| use((i, a)); |
| // FIXME: This is not an odr-use because it is a discarded-value |
| // expression applied to an expression whose potential result is 'a'. |
| use((a, a)); // expected-error {{reference to local variable}} |
| |
| // (and combinations thereof) |
| use(a ? (i, a) : a); |
| #if __cplusplus >= 201103L |
| use(a ? (i, a) : arr[a ? s.x : arr[a]]); |
| #endif |
| } |
| }; |
| } |
| |
| // FIXME: Test that this behaves properly. |
| namespace std_example { |
| struct S { static const int x = 0, y = 0; }; |
| const int &f(const int &r); |
| bool b; |
| int n = b ? (1, S::x) |
| : f(S::y); |
| } |