1 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++1z %s
2 
3 template<typename T, T val> struct A {};
4 
5 template<typename T, typename U> constexpr bool is_same = false; // expected-note +{{here}}
6 template<typename T> constexpr bool is_same<T, T> = true;
7 
8 namespace String {
9   A<const char*, "test"> a; // expected-error {{does not refer to any declaration}}
10   A<const char (&)[5], "test"> b; // expected-error {{does not refer to any declaration}}
11 }
12 
13 namespace Array {
14   char arr[3];
15   char x;
16   A<const char*, arr> a;
17   A<const char(&)[3], arr> b;
18   A<const char*, &arr[0]> c;
19   A<const char*, &arr[1]> d; // expected-error {{refers to subobject '&arr[1]'}}
20   A<const char*, (&arr)[0]> e;
21   A<const char*, &x> f;
22   A<const char*, &(&x)[0]> g;
23   A<const char*, &(&x)[1]> h; // expected-error {{refers to subobject '&x + 1'}}
24   A<const char*, 0> i; // expected-error {{not allowed in a converted constant}}
25   A<const char*, nullptr> j;
26 }
27 
28 namespace Function {
29   void f();
30   void g() noexcept;
31   void h();
32   void h(int);
33   template<typename...T> void i(T...);
34   typedef A<void (*)(), f> a;
35   typedef A<void (*)(), &f> a;
36   typedef A<void (*)(), g> b;
37   typedef A<void (*)(), &g> b;
38   typedef A<void (*)(), h> c;
39   typedef A<void (*)(), &h> c;
40   typedef A<void (*)(), i> d;
41   typedef A<void (*)(), &i> d;
42   typedef A<void (*)(), i<>> d;
43   typedef A<void (*)(), i<int>> e; // expected-error {{is not implicitly convertible}}
44 
45   typedef A<void (*)(), 0> x; // expected-error {{not allowed in a converted constant}}
46   typedef A<void (*)(), nullptr> y;
47 }
48 
Func()49 void Func() {
50   A<const char*, __func__> a; // expected-error {{does not refer to any declaration}}
51 }
52 
53 namespace LabelAddrDiff {
f()54   void f() {
55     a: b: A<int, __builtin_constant_p(true) ? (__INTPTR_TYPE__)&&b - (__INTPTR_TYPE__)&&a : 0> s; // expected-error {{label address difference}}
56   };
57 }
58 
59 namespace Temp {
60   struct S { int n; };
addr(S && s)61   constexpr S &addr(S &&s) { return s; }
62   A<S &, addr({})> a; // expected-error {{constant}} expected-note 2{{temporary}}
63   A<S *, &addr({})> b; // expected-error {{constant}} expected-note 2{{temporary}}
64   A<int &, addr({}).n> c; // expected-error {{constant}} expected-note 2{{temporary}}
65   A<int *, &addr({}).n> d; // expected-error {{constant}} expected-note 2{{temporary}}
66 }
67 
68 namespace std { struct type_info; }
69 
70 namespace RTTI {
71   A<const std::type_info&, typeid(int)> a; // expected-error {{does not refer to any declaration}}
72   A<const std::type_info*, &typeid(int)> b; // expected-error {{does not refer to any declaration}}
73 }
74 
75 namespace PtrMem {
76   struct B { int b; };
77   struct C : B {};
78   struct D : B {};
79   struct E : C, D { int e; };
80 
81   constexpr int B::*b = &B::b;
82   constexpr int C::*cb = b;
83   constexpr int D::*db = b;
84   constexpr int E::*ecb = cb; // expected-note +{{here}}
85   constexpr int E::*edb = db; // expected-note +{{here}}
86 
87   constexpr int E::*e = &E::e;
88   constexpr int D::*de = (int D::*)e;
89   constexpr int C::*ce = (int C::*)e;
90   constexpr int B::*bde = (int B::*)de; // expected-note +{{here}}
91   constexpr int B::*bce = (int B::*)ce; // expected-note +{{here}}
92 
93   // FIXME: This should all be accepted, but we don't yet have a representation
94   // nor mangling for this form of template argument.
95   using Ab = A<int B::*, b>;
96   using Ab = A<int B::*, &B::b>;
97   using Abce = A<int B::*, bce>; // expected-error {{not supported}}
98   using Abde = A<int B::*, bde>; // expected-error {{not supported}}
99   static_assert(!is_same<Ab, Abce>, ""); // expected-error {{undeclared}} expected-error {{must be a type}}
100   static_assert(!is_same<Ab, Abde>, ""); // expected-error {{undeclared}} expected-error {{must be a type}}
101   static_assert(!is_same<Abce, Abde>, ""); // expected-error 2{{undeclared}} expected-error {{must be a type}}
102   static_assert(is_same<Abce, A<int B::*, (int B::*)(int C::*)&E::e>, ""); // expected-error {{undeclared}} expected-error {{not supported}}
103 
104   using Ae = A<int E::*, e>;
105   using Ae = A<int E::*, &E::e>;
106   using Aecb = A<int E::*, ecb>; // expected-error {{not supported}}
107   using Aedb = A<int E::*, edb>; // expected-error {{not supported}}
108   static_assert(!is_same<Ae, Aecb>, ""); // expected-error {{undeclared}} expected-error {{must be a type}}
109   static_assert(!is_same<Ae, Aedb>, ""); // expected-error {{undeclared}} expected-error {{must be a type}}
110   static_assert(!is_same<Aecb, Aedb>, ""); // expected-error 2{{undeclared}} expected-error {{must be a type}}
111   static_assert(is_same<Aecb, A<int E::*, (int E::*)(int C::*)&B::b>, ""); // expected-error {{undeclared}} expected-error {{not supported}}
112 
113   using An = A<int E::*, nullptr>;
114   using A0 = A<int E::*, (int E::*)0>;
115   static_assert(is_same<An, A0>);
116 }
117 
118 namespace DeduceDifferentType {
119   template<int N> struct A {};
120   template<long N> int a(A<N>); // expected-note {{does not have the same type}}
121   int a_imp = a(A<3>()); // expected-error {{no matching function}}
122   int a_exp = a<3>(A<3>());
123 
124   template<decltype(nullptr)> struct B {};
125   template<int *P> int b(B<P>); // expected-note {{could not match}} expected-note {{not implicitly convertible}}
126   int b_imp = b(B<nullptr>()); // expected-error {{no matching function}}
127   int b_exp = b<nullptr>(B<nullptr>()); // expected-error {{no matching function}}
128 
operator intDeduceDifferentType::X129   struct X { constexpr operator int() { return 0; } } x;
130   template<X &> struct C {};
131   template<int N> int c(C<N>); // expected-note {{does not have the same type}} expected-note {{not implicitly convertible}}
132   int c_imp = c(C<x>()); // expected-error {{no matching function}}
133   int c_exp = c<x>(C<x>()); // expected-error {{no matching function}}
134 
135   struct Z;
136   struct Y { constexpr operator Z&(); } y;
operator Y&DeduceDifferentType::Z137   struct Z { constexpr operator Y&() { return y; } } z;
operator Z&()138   constexpr Y::operator Z&() { return z; }
139   template<Y &> struct D {};
140   template<Z &z> int d(D<z>); // expected-note {{does not have the same type}}
141   int d_imp = d(D<y>()); // expected-error {{no matching function}}
142   int d_exp = d<y>(D<y>());
143 }
144 
145 namespace DeclMatch {
146   template<typename T, T> int f();
147   template<typename T> class X { friend int f<T, 0>(); static int n; };
f()148   template<typename T, T> int f() { return X<T>::n; }
149   int k = f<int, 0>(); // ok, friend
150 }
151