xref: /llvm-project/clang/test/CXX/temp/temp.res/temp.dep/temp.dep.constexpr/p2-0x.cpp (revision c7c636189adc45251be2b7cc53b6b047e1ac3536)
1 // RUN: %clang_cc1 -std=c++11 -verify %s -fexperimental-new-constant-interpreter
2 
3 template<int n> struct S; // expected-note 3{{here}}
4 
5 struct LiteralType {
LiteralTypeLiteralType6   constexpr LiteralType(int n) : n(n) {}
7   int n;
8 };
9 
10 template<int n> struct T {
TT11   T() {
12     // An identifier is value-dependent if it is:
13     //  - a name declared with a dependent type
14     S<n> s;
15     S<s> check1; // ok, s is value-dependent
16     //  - the name of a non-type template parameter
17     typename S<n>::T check2; // ok, n is value-dependent
18     //  - a potentially-constant variable that is initialized with an
19     //    expression that is value-dependent.
20     const int k = n;
21     typename S<k>::T check3a; // ok, u is value-dependent
22 
23     constexpr const int *p = &k;
24     typename S<*p>::T check3b; // ok, p is value-dependent
25 
26     const int &i = k;
27     typename S<i>::T check4; // ok, i is value-dependent
28 
29     static const int ki = 42;
30     const int &i2 = ki;
31     typename S<i2>::T check5; // expected-error {{undefined template}}
32 
33     constexpr LiteralType x = n;
34     typename S<true ? 1 : x.n>::T check6; // ok, x is value-dependent
35 
36     const LiteralType y = n;
37     typename S<true ? 2 : y.n>::T check7; // expected-error {{undefined template}}
38 
39     constexpr LiteralType z = 42;
40     typename S<true ? 3 : z.n>::T check8; // expected-error {{undefined template}}
41   }
42 };
43