1*67e74705SXin Li // RUN: not %clang_cc1 -fsyntax-only %s -std=c++11 2>&1 | FileCheck %s -check-prefix=CHECK-ELIDE-NOTREE
2*67e74705SXin Li // RUN: not %clang_cc1 -fsyntax-only %s -fno-elide-type -std=c++11 2>&1 | FileCheck %s -check-prefix=CHECK-NOELIDE-NOTREE
3*67e74705SXin Li // RUN: not %clang_cc1 -fsyntax-only %s -fdiagnostics-show-template-tree -std=c++11 2>&1 | FileCheck %s -check-prefix=CHECK-ELIDE-TREE
4*67e74705SXin Li // RUN: not %clang_cc1 -fsyntax-only %s -fno-elide-type -fdiagnostics-show-template-tree -std=c++11 2>&1 | FileCheck %s -check-prefix=CHECK-NOELIDE-TREE
5*67e74705SXin Li
6*67e74705SXin Li // PR9548 - "no known conversion from 'vector<string>' to 'vector<string>'"
7*67e74705SXin Li // vector<string> refers to two different types here. Make sure the message
8*67e74705SXin Li // gives a way to tell them apart.
9*67e74705SXin Li class versa_string;
10*67e74705SXin Li typedef versa_string string;
11*67e74705SXin Li
12*67e74705SXin Li namespace std {template <typename T> class vector;}
13*67e74705SXin Li using std::vector;
14*67e74705SXin Li
15*67e74705SXin Li void f(vector<string> v);
16*67e74705SXin Li
17*67e74705SXin Li namespace std {
18*67e74705SXin Li class basic_string;
19*67e74705SXin Li typedef basic_string string;
20*67e74705SXin Li template <typename T> class vector {};
g()21*67e74705SXin Li void g() {
22*67e74705SXin Li vector<string> v;
23*67e74705SXin Li f(v);
24*67e74705SXin Li }
25*67e74705SXin Li } // end namespace std
26*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'f'
27*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'vector<std::basic_string>' to 'vector<versa_string>' for 1st argument
28*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'f'
29*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'vector<std::basic_string>' to 'vector<versa_string>' for 1st argument
30*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'f'
31*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
32*67e74705SXin Li // CHECK-ELIDE-TREE: vector<
33*67e74705SXin Li // CHECK-ELIDE-TREE: [std::basic_string != versa_string]>
34*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'f'
35*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
36*67e74705SXin Li // CHECK-NOELIDE-TREE: vector<
37*67e74705SXin Li // CHECK-NOELIDE-TREE: [std::basic_string != versa_string]>
38*67e74705SXin Li
39*67e74705SXin Li template <int... A>
40*67e74705SXin Li class I1{};
set1(I1<1,2,3,4,2,3,4,3>)41*67e74705SXin Li void set1(I1<1,2,3,4,2,3,4,3>) {};
test1()42*67e74705SXin Li void test1() {
43*67e74705SXin Li set1(I1<1,2,3,4,2,2,4,3,7>());
44*67e74705SXin Li }
45*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'set1'
46*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'I1<[5 * ...], 2, [2 * ...], 7>' to 'I1<[5 * ...], 3, [2 * ...], (no argument)>' for 1st argument
47*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'set1'
48*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'I1<1, 2, 3, 4, 2, 2, 4, 3, 7>' to 'I1<1, 2, 3, 4, 2, 3, 4, 3, (no argument)>' for 1st argument
49*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'set1'
50*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
51*67e74705SXin Li // CHECK-ELIDE-TREE: I1<
52*67e74705SXin Li // CHECK-ELIDE-TREE: [5 * ...],
53*67e74705SXin Li // CHECK-ELIDE-TREE: [2 != 3],
54*67e74705SXin Li // CHECK-ELIDE-TREE: [2 * ...],
55*67e74705SXin Li // CHECK-ELIDE-TREE: [7 != (no argument)]>
56*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'set1'
57*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
58*67e74705SXin Li // CHECK-NOELIDE-TREE: I1<
59*67e74705SXin Li // CHECK-NOELIDE-TREE: 1,
60*67e74705SXin Li // CHECK-NOELIDE-TREE: 2,
61*67e74705SXin Li // CHECK-NOELIDE-TREE: 3,
62*67e74705SXin Li // CHECK-NOELIDE-TREE: 4,
63*67e74705SXin Li // CHECK-NOELIDE-TREE: 2,
64*67e74705SXin Li // CHECK-NOELIDE-TREE: [2 != 3],
65*67e74705SXin Li // CHECK-NOELIDE-TREE: 4,
66*67e74705SXin Li // CHECK-NOELIDE-TREE: 3,
67*67e74705SXin Li // CHECK-NOELIDE-TREE: [7 != (no argument)]>
68*67e74705SXin Li
69*67e74705SXin Li template <class A, class B, class C = void>
70*67e74705SXin Li class I2{};
set2(I2<int,int>)71*67e74705SXin Li void set2(I2<int, int>) {};
test2()72*67e74705SXin Li void test2() {
73*67e74705SXin Li set2(I2<double, int, int>());
74*67e74705SXin Li }
75*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'set2'
76*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'I2<double, [...], int>' to 'I2<int, [...], (default) void>' for 1st argument
77*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'set2'
78*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'I2<double, int, int>' to 'I2<int, int, (default) void>' for 1st argument
79*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'set2'
80*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
81*67e74705SXin Li // CHECK-ELIDE-TREE: I2<
82*67e74705SXin Li // CHECK-ELIDE-TREE: [double != int],
83*67e74705SXin Li // CHECK-ELIDE-TREE: [...],
84*67e74705SXin Li // CHECK-ELIDE-TREE: [int != (default) void]>
85*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'set2'
86*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
87*67e74705SXin Li // CHECK-NOELIDE-TREE: I2<
88*67e74705SXin Li // CHECK-NOELIDE-TREE: [double != int],
89*67e74705SXin Li // CHECK-NOELIDE-TREE: int,
90*67e74705SXin Li // CHECK-NOELIDE-TREE: [int != (default) void]>
91*67e74705SXin Li
92*67e74705SXin Li int V1, V2, V3;
93*67e74705SXin Li template <int* A, int *B>
94*67e74705SXin Li class I3{};
set3(I3<& V1,& V2>)95*67e74705SXin Li void set3(I3<&V1, &V2>) {};
test3()96*67e74705SXin Li void test3() {
97*67e74705SXin Li set3(I3<&V3, &V2>());
98*67e74705SXin Li }
99*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'set3'
100*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'I3<&V3, [...]>' to 'I3<&V1, [...]>' for 1st argument
101*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'set3'
102*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'I3<&V3, &V2>' to 'I3<&V1, &V2>' for 1st argument
103*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'set3'
104*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
105*67e74705SXin Li // CHECK-ELIDE-TREE: I3<
106*67e74705SXin Li // CHECK-ELIDE-TREE: [&V3 != &V1]
107*67e74705SXin Li // CHECK-ELIDE-TREE: [...]>
108*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'set3'
109*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
110*67e74705SXin Li // CHECK-NOELIDE-TREE: I3<
111*67e74705SXin Li // CHECK-NOELIDE-TREE: [&V3 != &V1]
112*67e74705SXin Li // CHECK-NOELIDE-TREE: &V2>
113*67e74705SXin Li
114*67e74705SXin Li template <class A, class B>
115*67e74705SXin Li class Alpha{};
116*67e74705SXin Li template <class A, class B>
117*67e74705SXin Li class Beta{};
118*67e74705SXin Li template <class A, class B>
119*67e74705SXin Li class Gamma{};
120*67e74705SXin Li template <class A, class B>
121*67e74705SXin Li class Delta{};
122*67e74705SXin Li
123*67e74705SXin Li void set4(Alpha<int, int>);
test4()124*67e74705SXin Li void test4() {
125*67e74705SXin Li set4(Beta<void, void>());
126*67e74705SXin Li }
127*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'set4'
128*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'Beta<void, void>' to 'Alpha<int, int>' for 1st argument
129*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'set4'
130*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'Beta<void, void>' to 'Alpha<int, int>' for 1st argument
131*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'set4'
132*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from 'Beta<void, void>' to 'Alpha<int, int>' for 1st argument
133*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'set4'
134*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from 'Beta<void, void>' to 'Alpha<int, int>' for 1st argument
135*67e74705SXin Li
136*67e74705SXin Li void set5(Alpha<Beta<Gamma<Delta<int, int>, int>, int>, int>);
test5()137*67e74705SXin Li void test5() {
138*67e74705SXin Li set5(Alpha<Beta<Gamma<void, void>, double>, double>());
139*67e74705SXin Li }
140*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'set5'
141*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'Alpha<Beta<Gamma<void, void>, double>, double>' to 'Alpha<Beta<Gamma<Delta<int, int>, int>, int>, int>' for 1st argument
142*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'set5'
143*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'Alpha<Beta<Gamma<void, void>, double>, double>' to 'Alpha<Beta<Gamma<Delta<int, int>, int>, int>, int>' for 1st argument
144*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'set5'
145*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
146*67e74705SXin Li // CHECK-ELIDE-TREE: Alpha<
147*67e74705SXin Li // CHECK-ELIDE-TREE: Beta<
148*67e74705SXin Li // CHECK-ELIDE-TREE: Gamma<
149*67e74705SXin Li // CHECK-ELIDE-TREE: [void != Delta<int, int>],
150*67e74705SXin Li // CHECK-ELIDE-TREE: [void != int]>
151*67e74705SXin Li // CHECK-ELIDE-TREE: [double != int]>
152*67e74705SXin Li // CHECK-ELIDE-TREE: [double != int]>
153*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'set5'
154*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
155*67e74705SXin Li // CHECK-NOELIDE-TREE: Alpha<
156*67e74705SXin Li // CHECK-NOELIDE-TREE: Beta<
157*67e74705SXin Li // CHECK-NOELIDE-TREE: Gamma<
158*67e74705SXin Li // CHECK-NOELIDE-TREE: [void != Delta<int, int>],
159*67e74705SXin Li // CHECK-NOELIDE-TREE: [void != int]>
160*67e74705SXin Li // CHECK-NOELIDE-TREE: [double != int]>
161*67e74705SXin Li // CHECK-NOELIDE-TREE: [double != int]>
162*67e74705SXin Li
test6()163*67e74705SXin Li void test6() {
164*67e74705SXin Li set5(Alpha<Beta<Delta<int, int>, int>, int>());
165*67e74705SXin Li }
166*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'set5'
167*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'Alpha<Beta<Delta<int, int>, [...]>, [...]>' to 'Alpha<Beta<Gamma<Delta<int, int>, int>, [...]>, [...]>' for 1st argument
168*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'set5'
169*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'Alpha<Beta<Delta<int, int>, int>, int>' to 'Alpha<Beta<Gamma<Delta<int, int>, int>, int>, int>' for 1st argument
170*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'set5'
171*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
172*67e74705SXin Li // CHECK-ELIDE-TREE: Alpha<
173*67e74705SXin Li // CHECK-ELIDE-TREE: Beta<
174*67e74705SXin Li // CHECK-ELIDE-TREE: [Delta<int, int> != Gamma<Delta<int, int>, int>],
175*67e74705SXin Li // CHECK-ELIDE-TREE: [...]>
176*67e74705SXin Li // CHECK-ELIDE-TREE: [...]>
177*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'set5'
178*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
179*67e74705SXin Li // CHECK-NOELIDE-TREE: Alpha<
180*67e74705SXin Li // CHECK-NOELIDE-TREE: Beta<
181*67e74705SXin Li // CHECK-NOELIDE-TREE: [Delta<int, int> != Gamma<Delta<int, int>, int>],
182*67e74705SXin Li // CHECK-NOELIDE-TREE: int>
183*67e74705SXin Li // CHECK-NOELIDE-TREE: int>
184*67e74705SXin Li
185*67e74705SXin Li int a7, b7;
186*67e74705SXin Li int c7[] = {1,2,3};
187*67e74705SXin Li template<int *A>
188*67e74705SXin Li class class7 {};
set7(class7<& a7> A)189*67e74705SXin Li void set7(class7<&a7> A) {}
test7()190*67e74705SXin Li void test7() {
191*67e74705SXin Li set7(class7<&a7>());
192*67e74705SXin Li set7(class7<&b7>());
193*67e74705SXin Li set7(class7<c7>());
194*67e74705SXin Li set7(class7<nullptr>());
195*67e74705SXin Li }
196*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'set7'
197*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'class7<&b7>' to 'class7<&a7>' for 1st argument
198*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'set7'
199*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'class7<c7>' to 'class7<&a7>' for 1st argument
200*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'set7'
201*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'class7<nullptr>' to 'class7<&a7>' for 1st argument
202*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'set7'
203*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'class7<&b7>' to 'class7<&a7>' for 1st argument
204*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'set7'
205*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'class7<c7>' to 'class7<&a7>' for 1st argument
206*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'set7'
207*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'class7<nullptr>' to 'class7<&a7>' for 1st argument
208*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'set7'
209*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
210*67e74705SXin Li // CHECK-ELIDE-TREE: class7<
211*67e74705SXin Li // CHECK-ELIDE-TREE: [&b7 != &a7]>
212*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'set7'
213*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
214*67e74705SXin Li // CHECK-ELIDE-TREE: class7<
215*67e74705SXin Li // CHECK-ELIDE-TREE: [c7 != &a7]>
216*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'set7'
217*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
218*67e74705SXin Li // CHECK-ELIDE-TREE: class7<
219*67e74705SXin Li // CHECK-ELIDE-TREE: [nullptr != &a7]>
220*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'set7'
221*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
222*67e74705SXin Li // CHECK-NOELIDE-TREE: class7<
223*67e74705SXin Li // CHECK-NOELIDE-TREE: [&b7 != &a7]>
224*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'set7'
225*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
226*67e74705SXin Li // CHECK-NOELIDE-TREE: class7<
227*67e74705SXin Li // CHECK-NOELIDE-TREE: [c7 != &a7]>
228*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'set7'
229*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
230*67e74705SXin Li // CHECK-NOELIDE-TREE: class7<
231*67e74705SXin Li // CHECK-NOELIDE-TREE: [nullptr != &a7]>
232*67e74705SXin Li
233*67e74705SXin Li template<typename ...T> struct S8 {};
234*67e74705SXin Li template<typename T> using U8 = S8<int, char, T>;
235*67e74705SXin Li int f8(S8<int, char, double>);
236*67e74705SXin Li int k8 = f8(U8<char>());
237*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'f8'
238*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'S8<[2 * ...], char>' to 'S8<[2 * ...], double>' for 1st argument
239*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'f8'
240*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'S8<int, char, char>' to 'S8<int, char, double>' for 1st argument
241*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'f8'
242*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
243*67e74705SXin Li // CHECK-ELIDE-TREE: S8<
244*67e74705SXin Li // CHECK-ELIDE-TREE: [2 * ...],
245*67e74705SXin Li // CHECK-ELIDE-TREE: [char != double]>
246*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'f8'
247*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
248*67e74705SXin Li // CHECK-NOELIDE-TREE: S8<
249*67e74705SXin Li // CHECK-NOELIDE-TREE: int,
250*67e74705SXin Li // CHECK-NOELIDE-TREE: char,
251*67e74705SXin Li // CHECK-NOELIDE-TREE: [char != double]>
252*67e74705SXin Li
253*67e74705SXin Li template<typename ...T> struct S9 {};
254*67e74705SXin Li template<typename T> using U9 = S9<int, char, T>;
255*67e74705SXin Li template<typename T> using V9 = U9<U9<T>>;
256*67e74705SXin Li int f9(S9<int, char, U9<const double>>);
257*67e74705SXin Li int k9 = f9(V9<double>());
258*67e74705SXin Li
259*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'f9'
260*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'S9<[2 * ...], S9<[2 * ...], double>>' to 'S9<[2 * ...], S9<[2 * ...], const double>>' for 1st argument
261*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'f9'
262*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'S9<int, char, S9<int, char, double>>' to 'S9<int, char, S9<int, char, const double>>' for 1st argument
263*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'f9'
264*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
265*67e74705SXin Li // CHECK-ELIDE-TREE: S9<
266*67e74705SXin Li // CHECK-ELIDE-TREE: [2 * ...],
267*67e74705SXin Li // CHECK-ELIDE-TREE: S9<
268*67e74705SXin Li // CHECK-ELIDE-TREE: [2 * ...],
269*67e74705SXin Li // CHECK-ELIDE-TREE: [double != const double]>>
270*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'f9'
271*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
272*67e74705SXin Li // CHECK-NOELIDE-TREE: S9<
273*67e74705SXin Li // CHECK-NOELIDE-TREE: int,
274*67e74705SXin Li // CHECK-NOELIDE-TREE: char,
275*67e74705SXin Li // CHECK-NOELIDE-TREE: S9<
276*67e74705SXin Li // CHECK-NOELIDE-TREE: int,
277*67e74705SXin Li // CHECK-NOELIDE-TREE: char,
278*67e74705SXin Li // CHECK-NOELIDE-TREE: [double != const double]>>
279*67e74705SXin Li
280*67e74705SXin Li template<typename ...A> class class_types {};
set10(class_types<int,int>)281*67e74705SXin Li void set10(class_types<int, int>) {}
test10()282*67e74705SXin Li void test10() {
283*67e74705SXin Li set10(class_types<int>());
284*67e74705SXin Li set10(class_types<int, int, int>());
285*67e74705SXin Li }
286*67e74705SXin Li
287*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'set10'
288*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'class_types<[...], (no argument)>' to 'class_types<[...], int>' for 1st argument
289*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'set10'
290*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'class_types<[2 * ...], int>' to 'class_types<[2 * ...], (no argument)>' for 1st argument
291*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'set10'
292*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'class_types<int, (no argument)>' to 'class_types<int, int>' for 1st argument
293*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'set10'
294*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'class_types<int, int, int>' to 'class_types<int, int, (no argument)>' for 1st argument
295*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'set10'
296*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
297*67e74705SXin Li // CHECK-ELIDE-TREE: class_types<
298*67e74705SXin Li // CHECK-ELIDE-TREE: [...],
299*67e74705SXin Li // CHECK-ELIDE-TREE: [(no argument) != int]>
300*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'set10'
301*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
302*67e74705SXin Li // CHECK-ELIDE-TREE: class_types<
303*67e74705SXin Li // CHECK-ELIDE-TREE: [2 * ...],
304*67e74705SXin Li // CHECK-ELIDE-TREE: [int != (no argument)]>
305*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'set10'
306*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
307*67e74705SXin Li // CHECK-NOELIDE-TREE: class_types<
308*67e74705SXin Li // CHECK-NOELIDE-TREE: int,
309*67e74705SXin Li // CHECK-NOELIDE-TREE: [(no argument) != int]>
310*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'set10'
311*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
312*67e74705SXin Li // CHECK-NOELIDE-TREE: class_types<
313*67e74705SXin Li // CHECK-NOELIDE-TREE: int,
314*67e74705SXin Li // CHECK-NOELIDE-TREE: int,
315*67e74705SXin Li // CHECK-NOELIDE-TREE: [int != (no argument)]>
316*67e74705SXin Li
317*67e74705SXin Li template<int ...A> class class_ints {};
set11(class_ints<2,3>)318*67e74705SXin Li void set11(class_ints<2, 3>) {}
test11()319*67e74705SXin Li void test11() {
320*67e74705SXin Li set11(class_ints<1>());
321*67e74705SXin Li set11(class_ints<0, 3, 6>());
322*67e74705SXin Li }
323*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'set11'
324*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'class_ints<1, (no argument)>' to 'class_ints<2, 3>' for 1st argument
325*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'set11'
326*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'class_ints<0, [...], 6>' to 'class_ints<2, [...], (no argument)>' for 1st argument
327*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'set11'
328*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'class_ints<1, (no argument)>' to 'class_ints<2, 3>' for 1st argument
329*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'set11'
330*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'class_ints<0, 3, 6>' to 'class_ints<2, 3, (no argument)>' for 1st argument
331*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'set11'
332*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
333*67e74705SXin Li // CHECK-ELIDE-TREE: class_ints<
334*67e74705SXin Li // CHECK-ELIDE-TREE: [1 != 2],
335*67e74705SXin Li // CHECK-ELIDE-TREE: [(no argument) != 3]>
336*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'set11'
337*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
338*67e74705SXin Li // CHECK-ELIDE-TREE: class_ints<
339*67e74705SXin Li // CHECK-ELIDE-TREE: [0 != 2],
340*67e74705SXin Li // CHECK-ELIDE-TREE: [...],
341*67e74705SXin Li // CHECK-ELIDE-TREE: [6 != (no argument)]>
342*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'set11'
343*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
344*67e74705SXin Li // CHECK-NOELIDE-TREE: class_ints<
345*67e74705SXin Li // CHECK-NOELIDE-TREE: [1 != 2],
346*67e74705SXin Li // CHECK-NOELIDE-TREE: [(no argument) != 3]>
347*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'set11'
348*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
349*67e74705SXin Li // CHECK-NOELIDE-TREE: class_ints<
350*67e74705SXin Li // CHECK-NOELIDE-TREE: [0 != 2],
351*67e74705SXin Li // CHECK-NOELIDE-TREE: 3,
352*67e74705SXin Li // CHECK-NOELIDE-TREE: [6 != (no argument)]>
353*67e74705SXin Li
354*67e74705SXin Li template<template<class> class ...A> class class_template_templates {};
355*67e74705SXin Li template<class> class tt1 {};
356*67e74705SXin Li template<class> class tt2 {};
set12(class_template_templates<tt1,tt1>)357*67e74705SXin Li void set12(class_template_templates<tt1, tt1>) {}
test12()358*67e74705SXin Li void test12() {
359*67e74705SXin Li set12(class_template_templates<tt2>());
360*67e74705SXin Li set12(class_template_templates<tt1, tt1, tt1>());
361*67e74705SXin Li }
362*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'set12'
363*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'class_template_templates<template tt2, template (no argument)>' to 'class_template_templates<template tt1, template tt1>' for 1st argument
364*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'set12'
365*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'class_template_templates<[2 * ...], template tt1>' to 'class_template_templates<[2 * ...], template (no argument)>' for 1st argument
366*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'set12'
367*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'class_template_templates<template tt2, template (no argument)>' to 'class_template_templates<template tt1, template tt1>' for 1st argument
368*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'set12'
369*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'class_template_templates<template tt1, template tt1, template tt1>' to 'class_template_templates<template tt1, template tt1, template (no argument)>' for 1st argument
370*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'set12'
371*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
372*67e74705SXin Li // CHECK-ELIDE-TREE: class_template_templates<
373*67e74705SXin Li // CHECK-ELIDE-TREE: [template tt2 != template tt1],
374*67e74705SXin Li // CHECK-ELIDE-TREE: [template (no argument) != template tt1]>
375*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'set12'
376*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
377*67e74705SXin Li // CHECK-ELIDE-TREE: class_template_templates<
378*67e74705SXin Li // CHECK-ELIDE-TREE: [2 * ...],
379*67e74705SXin Li // CHECK-ELIDE-TREE: [template tt1 != template (no argument)]>
380*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'set12'
381*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
382*67e74705SXin Li // CHECK-NOELIDE-TREE: class_template_templates<
383*67e74705SXin Li // CHECK-NOELIDE-TREE: [template tt2 != template tt1],
384*67e74705SXin Li // CHECK-NOELIDE-TREE: [template (no argument) != template tt1]>
385*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'set12'
386*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
387*67e74705SXin Li // CHECK-NOELIDE-TREE: class_template_templates<
388*67e74705SXin Li // CHECK-NOELIDE-TREE: template tt1,
389*67e74705SXin Li // CHECK-NOELIDE-TREE: template tt1,
390*67e74705SXin Li // CHECK-NOELIDE-TREE: [template tt1 != template (no argument)]>
391*67e74705SXin Li
392*67e74705SXin Li double a13, b13, c13, d13;
393*67e74705SXin Li template<double* ...A> class class_ptrs {};
set13(class_ptrs<& a13,& b13>)394*67e74705SXin Li void set13(class_ptrs<&a13, &b13>) {}
test13()395*67e74705SXin Li void test13() {
396*67e74705SXin Li set13(class_ptrs<&c13>());
397*67e74705SXin Li set13(class_ptrss<&a13, &b13, &d13>());
398*67e74705SXin Li }
399*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'set13'
400*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'class_ptrs<&c13, (no argument)>' to 'class_ptrs<&a13, &b13>' for 1st argument
401*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'set13'
402*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'class_ptrs<[2 * ...], &d13>' to 'class_ptrs<[2 * ...], (no argument)>' for 1st argument
403*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'set13'
404*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'class_ptrs<&c13, (no argument)>' to 'class_ptrs<&a13, &b13>' for 1st argument
405*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'set13'
406*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'class_ptrs<&a13, &b13, &d13>' to 'class_ptrs<&a13, &b13, (no argument)>' for 1st argument
407*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'set13'
408*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
409*67e74705SXin Li // CHECK-ELIDE-TREE: class_ptrs<
410*67e74705SXin Li // CHECK-ELIDE-TREE: [&c13 != &a13],
411*67e74705SXin Li // CHECK-ELIDE-TREE: [(no argument) != &b13]>
412*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'set13'
413*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
414*67e74705SXin Li // CHECK-ELIDE-TREE: class_ptrs<
415*67e74705SXin Li // CHECK-ELIDE-TREE: [2 * ...],
416*67e74705SXin Li // CHECK-ELIDE-TREE: [&d13 != (no argument)]>
417*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'set13'
418*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
419*67e74705SXin Li // CHECK-NOELIDE-TREE: class_ptrs<
420*67e74705SXin Li // CHECK-NOELIDE-TREE: [&c13 != &a13],
421*67e74705SXin Li // CHECK-NOELIDE-TREE: [(no argument) != &b13]>
422*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'set13'
423*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
424*67e74705SXin Li // CHECK-NOELIDE-TREE: class_ptrs<
425*67e74705SXin Li // CHECK-NOELIDE-TREE: &a13,
426*67e74705SXin Li // CHECK-NOELIDE-TREE: &b13,
427*67e74705SXin Li // CHECK-NOELIDE-TREE: [&d13 != (no argument)]>
428*67e74705SXin Li
429*67e74705SXin Li template<typename T> struct s14 {};
430*67e74705SXin Li template<typename T> using a14 = s14<T>;
431*67e74705SXin Li typedef a14<int> b14;
432*67e74705SXin Li template<typename T> using c14 = b14;
433*67e74705SXin Li int f14(c14<int>);
434*67e74705SXin Li int k14 = f14(a14<char>());
435*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'f14'
436*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'a14<char>' to 'a14<int>' for 1st argument
437*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'f14'
438*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'a14<char>' to 'a14<int>' for 1st argument
439*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'f14'
440*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
441*67e74705SXin Li // CHECK-ELIDE-TREE: a14<
442*67e74705SXin Li // CHECK-ELIDE-TREE: [char != int]>
443*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'f14'
444*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
445*67e74705SXin Li // CHECK-NOELIDE-TREE: a14<
446*67e74705SXin Li // CHECK-NOELIDE-TREE: [char != int]>
447*67e74705SXin Li
set15(vector<vector<int>>)448*67e74705SXin Li void set15(vector<vector<int>>) {}
test15()449*67e74705SXin Li void test15() {
450*67e74705SXin Li set15(vector<vector<int>>());
451*67e74705SXin Li }
452*67e74705SXin Li // CHECK-ELIDE-NOTREE-NOT: set15
453*67e74705SXin Li // CHECK-NOELIDE-NOTREE-NOT: set15
454*67e74705SXin Li // CHECK-ELIDE-TREE-NOT: set15
455*67e74705SXin Li // CHECK-NOELIDE-TREE-NOT: set15
456*67e74705SXin Li // no error here
457*67e74705SXin Li
set16(vector<const vector<int>>)458*67e74705SXin Li void set16(vector<const vector<int>>) {}
test16()459*67e74705SXin Li void test16() {
460*67e74705SXin Li set16(vector<const vector<const int>>());
461*67e74705SXin Li }
462*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'set16'
463*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'vector<const vector<const int>>' to 'vector<const vector<int>>' for 1st argument
464*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'set16'
465*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'vector<const vector<const int>>' to 'vector<const vector<int>>' for 1st argument
466*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'set16'
467*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
468*67e74705SXin Li // CHECK-ELIDE-TREE: vector<
469*67e74705SXin Li // CHECK-ELIDE-TREE: const vector<
470*67e74705SXin Li // CHECK-ELIDE-TREE: [const != (no qualifiers)] int>>
471*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'set16'
472*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
473*67e74705SXin Li // CHECK-NOELIDE-TREE: vector<
474*67e74705SXin Li // CHECK-NOELIDE-TREE: const vector<
475*67e74705SXin Li // CHECK-NOELIDE-TREE: [const != (no qualifiers)] int>>
476*67e74705SXin Li
set17(vector<vector<int>>)477*67e74705SXin Li void set17(vector<vector<int>>) {}
test17()478*67e74705SXin Li void test17() {
479*67e74705SXin Li set17(vector<const vector<int>>());
480*67e74705SXin Li }
481*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'set17'
482*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'vector<const vector<...>>' to 'vector<vector<...>>' for 1st argument
483*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'set17'
484*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'vector<const vector<int>>' to 'vector<vector<int>>' for 1st argument
485*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'set17'
486*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
487*67e74705SXin Li // CHECK-ELIDE-TREE: vector<
488*67e74705SXin Li // CHECK-ELIDE-TREE: [const != (no qualifiers)] vector<...>>
489*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'set17'
490*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
491*67e74705SXin Li // CHECK-NOELIDE-TREE: vector<
492*67e74705SXin Li // CHECK-NOELIDE-TREE: [const != (no qualifiers)] vector<
493*67e74705SXin Li // CHECK-NOELIDE-TREE: int>>
494*67e74705SXin Li
set18(vector<const vector<int>>)495*67e74705SXin Li void set18(vector<const vector<int>>) {}
test18()496*67e74705SXin Li void test18() {
497*67e74705SXin Li set18(vector<vector<int>>());
498*67e74705SXin Li }
499*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'set18'
500*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'vector<vector<...>>' to 'vector<const vector<...>>' for 1st argument
501*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'set18'
502*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'vector<vector<int>>' to 'vector<const vector<int>>' for 1st argument
503*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'set18'
504*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
505*67e74705SXin Li // CHECK-ELIDE-TREE: vector<
506*67e74705SXin Li // CHECK-ELIDE-TREE: [(no qualifiers) != const] vector<...>>
507*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'set18'
508*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
509*67e74705SXin Li // CHECK-NOELIDE-TREE: vector<
510*67e74705SXin Li // CHECK-NOELIDE-TREE: [(no qualifiers) != const] vector<
511*67e74705SXin Li // CHECK-NOELIDE-TREE: int>>
512*67e74705SXin Li
set19(vector<volatile vector<int>>)513*67e74705SXin Li void set19(vector<volatile vector<int>>) {}
test19()514*67e74705SXin Li void test19() {
515*67e74705SXin Li set19(vector<const vector<int>>());
516*67e74705SXin Li }
517*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'set19'
518*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'vector<const vector<...>>' to 'vector<volatile vector<...>>' for 1st argument
519*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'set19'
520*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'vector<const vector<int>>' to 'vector<volatile vector<int>>' for 1st argument
521*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'set19'
522*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
523*67e74705SXin Li // CHECK-ELIDE-TREE: vector<
524*67e74705SXin Li // CHECK-ELIDE-TREE: [const != volatile] vector<...>>
525*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'set19'
526*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
527*67e74705SXin Li // CHECK-NOELIDE-TREE: vector<
528*67e74705SXin Li // CHECK-NOELIDE-TREE: [const != volatile] vector<
529*67e74705SXin Li // CHECK-NOELIDE-TREE: int>>
530*67e74705SXin Li
set20(vector<const volatile vector<int>>)531*67e74705SXin Li void set20(vector<const volatile vector<int>>) {}
test20()532*67e74705SXin Li void test20() {
533*67e74705SXin Li set20(vector<const vector<int>>());
534*67e74705SXin Li }
535*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'set20'
536*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'vector<const vector<...>>' to 'vector<const volatile vector<...>>' for 1st argument
537*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'set20'
538*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'vector<const vector<int>>' to 'vector<const volatile vector<int>>' for 1st argument
539*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'set20'
540*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
541*67e74705SXin Li // CHECK-ELIDE-TREE: vector<
542*67e74705SXin Li // CHECK-ELIDE-TREE: [const != const volatile] vector<...>>
543*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'set20'
544*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
545*67e74705SXin Li // CHECK-NOELIDE-TREE: vector<
546*67e74705SXin Li // CHECK-NOELIDE-TREE: [const != const volatile] vector<
547*67e74705SXin Li // CHECK-NOELIDE-TREE: int>>
548*67e74705SXin Li
549*67e74705SXin Li
550*67e74705SXin Li // Checks that volatile does not show up in diagnostics.
551*67e74705SXin Li template<typename T> struct S21 {};
552*67e74705SXin Li template<typename T> using U21 = volatile S21<T>;
553*67e74705SXin Li int f21(vector<const U21<int>>);
554*67e74705SXin Li int k21 = f21(vector<U21<int>>());
555*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'f21'
556*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'vector<U21<...>>' to 'vector<const U21<...>>' for 1st argument
557*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'f21'
558*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'vector<U21<int>>' to 'vector<const U21<int>>' for 1st argument
559*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'f21'
560*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
561*67e74705SXin Li // CHECK-ELIDE-TREE: vector<
562*67e74705SXin Li // CHECK-ELIDE-TREE: [(no qualifiers) != const] U21<...>>
563*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'f21'
564*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
565*67e74705SXin Li // CHECK-NOELIDE-TREE: vector<
566*67e74705SXin Li // CHECK-NOELIDE-TREE: [(no qualifiers) != const] U21<
567*67e74705SXin Li // CHECK-NOELIDE-TREE: int>>
568*67e74705SXin Li
569*67e74705SXin Li // Checks that volatile does not show up in diagnostics.
570*67e74705SXin Li template<typename T> struct S22 {};
571*67e74705SXin Li template<typename T> using U22 = volatile S22<T>;
572*67e74705SXin Li int f22(vector<volatile const U22<int>>);
573*67e74705SXin Li int k22 = f22(vector<volatile U22<int>>());
574*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'f22'
575*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'vector<U22<...>>' to 'vector<const U22<...>>' for 1st argument
576*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'f22'
577*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'vector<U22<int>>' to 'vector<const U22<int>>' for 1st argument
578*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'f22'
579*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
580*67e74705SXin Li // CHECK-ELIDE-TREE: vector<
581*67e74705SXin Li // CHECK-ELIDE-TREE: [(no qualifiers) != const] U22<...>>
582*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'f22'
583*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
584*67e74705SXin Li // CHECK-NOELIDE-TREE: vector<
585*67e74705SXin Li // CHECK-NOELIDE-TREE: [(no qualifiers) != const] U22<
586*67e74705SXin Li // CHECK-NOELIDE-TREE: int>>
587*67e74705SXin Li
588*67e74705SXin Li // Testing qualifiers and typedefs.
589*67e74705SXin Li template <class T> struct D23{};
590*67e74705SXin Li template <class T> using C23 = D23<T>;
591*67e74705SXin Li typedef const C23<int> B23;
592*67e74705SXin Li template<class ...T> using A23 = B23;
593*67e74705SXin Li
foo23(D23<A23<>> b)594*67e74705SXin Li void foo23(D23<A23<>> b) {}
test23()595*67e74705SXin Li void test23() {
596*67e74705SXin Li foo23(D23<D23<char>>());
597*67e74705SXin Li foo23(C23<char>());
598*67e74705SXin Li }
599*67e74705SXin Li
600*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'foo23'
601*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'D23<D23<char>>' to 'D23<const D23<int>>' for 1st argument
602*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'foo23'
603*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function not viable: no known conversion from 'D23<char>' to 'D23<A23<>>' for 1st argument
604*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'foo23'
605*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'D23<D23<char>>' to 'D23<const D23<int>>' for 1st argument
606*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no matching function for call to 'foo23'
607*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function not viable: no known conversion from 'D23<char>' to 'D23<A23<>>' for 1st argument
608*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'foo23'
609*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
610*67e74705SXin Li // CHECK-ELIDE-TREE: D23<
611*67e74705SXin Li // CHECK-ELIDE-TREE: [(no qualifiers) != const] D23<
612*67e74705SXin Li // CHECK-ELIDE-TREE: [char != int]>>
613*67e74705SXin Li // CHECK-ELIDE-TREE: no matching function for call to 'foo23'
614*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
615*67e74705SXin Li // CHECK-ELIDE-TREE: D23<
616*67e74705SXin Li // CHECK-ELIDE-TREE: [char != A23<>]>
617*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'foo23'
618*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
619*67e74705SXin Li // CHECK-NOELIDE-TREE: D23<
620*67e74705SXin Li // CHECK-NOELIDE-TREE: [(no qualifiers) != const] D23<
621*67e74705SXin Li // CHECK-NOELIDE-TREE: [char != int]>>
622*67e74705SXin Li // CHECK-NOELIDE-TREE: no matching function for call to 'foo23'
623*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
624*67e74705SXin Li // CHECK-NOELIDE-TREE: D23<
625*67e74705SXin Li // CHECK-NOELIDE-TREE: [char != A23<>]>
626*67e74705SXin Li
627*67e74705SXin Li namespace PR14015 {
628*67e74705SXin Li template <unsigned N> class Foo1 {};
629*67e74705SXin Li template <unsigned N = 2> class Foo2 {};
630*67e74705SXin Li template <unsigned ...N> class Foo3 {};
631*67e74705SXin Li
Play1()632*67e74705SXin Li void Play1() {
633*67e74705SXin Li Foo1<1> F1;
634*67e74705SXin Li Foo1<2> F2, F3;
635*67e74705SXin Li F2 = F1;
636*67e74705SXin Li F1 = F2;
637*67e74705SXin Li F2 = F3;
638*67e74705SXin Li F3 = F2;
639*67e74705SXin Li }
640*67e74705SXin Li
641*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
642*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function (the implicit copy assignment operator) not viable: no known conversion from 'Foo1<1>' to 'const Foo1<2>' for 1st argument
643*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function (the implicit move assignment operator) not viable: no known conversion from 'Foo1<1>' to 'Foo1<2>' for 1st argument
644*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
645*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function (the implicit copy assignment operator) not viable: no known conversion from 'Foo1<2>' to 'const Foo1<1>' for 1st argument
646*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function (the implicit move assignment operator) not viable: no known conversion from 'Foo1<2>' to 'Foo1<1>' for 1st argument
647*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no viable overloaded '='
648*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function (the implicit copy assignment operator) not viable: no known conversion from 'Foo1<1>' to 'const Foo1<2>' for 1st argument
649*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function (the implicit move assignment operator) not viable: no known conversion from 'Foo1<1>' to 'Foo1<2>' for 1st argument
650*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no viable overloaded '='
651*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function (the implicit copy assignment operator) not viable: no known conversion from 'Foo1<2>' to 'const Foo1<1>' for 1st argument
652*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function (the implicit move assignment operator) not viable: no known conversion from 'Foo1<2>' to 'Foo1<1>' for 1st argument
653*67e74705SXin Li // CHECK-ELIDE-TREE: no viable overloaded '='
654*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function (the implicit copy assignment operator) not viable: no known conversion from argument type to parameter type for 1st argument
655*67e74705SXin Li // CHECK-ELIDE-TREE: [(no qualifiers) != const] Foo1<
656*67e74705SXin Li // CHECK-ELIDE-TREE: [1 != 2]>
657*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function (the implicit move assignment operator) not viable: no known conversion from argument type to parameter type for 1st argument
658*67e74705SXin Li // CHECK-ELIDE-TREE: Foo1<
659*67e74705SXin Li // CHECK-ELIDE-TREE: [1 != 2]>
660*67e74705SXin Li // CHECK-ELIDE-TREE: no viable overloaded '='
661*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function (the implicit copy assignment operator) not viable: no known conversion from argument type to parameter type for 1st argument
662*67e74705SXin Li // CHECK-ELIDE-TREE: [(no qualifiers) != const] Foo1<
663*67e74705SXin Li // CHECK-ELIDE-TREE: [2 != 1]>
664*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function (the implicit move assignment operator) not viable: no known conversion from argument type to parameter type for 1st argument
665*67e74705SXin Li // CHECK-ELIDE-TREE: Foo1<
666*67e74705SXin Li // CHECK-ELIDE-TREE: [2 != 1]>
667*67e74705SXin Li // CHECK-NOELIDE-TREE: no viable overloaded '='
668*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function (the implicit copy assignment operator) not viable: no known conversion from argument type to parameter type for 1st argument
669*67e74705SXin Li // CHECK-NOELIDE-TREE: [(no qualifiers) != const] Foo1<
670*67e74705SXin Li // CHECK-NOELIDE-TREE: [1 != 2]>
671*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function (the implicit move assignment operator) not viable: no known conversion from argument type to parameter type for 1st argument
672*67e74705SXin Li // CHECK-NOELIDE-TREE: Foo1<
673*67e74705SXin Li // CHECK-NOELIDE-TREE: [1 != 2]>
674*67e74705SXin Li // CHECK-NOELIDE-TREE: no viable overloaded '='
675*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function (the implicit copy assignment operator) not viable: no known conversion from argument type to parameter type for 1st argument
676*67e74705SXin Li // CHECK-NOELIDE-TREE: [(no qualifiers) != const] Foo1<
677*67e74705SXin Li // CHECK-NOELIDE-TREE: [2 != 1]>
678*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function (the implicit move assignment operator) not viable: no known conversion from argument type to parameter type for 1st argument
679*67e74705SXin Li // CHECK-NOELIDE-TREE: Foo1<
680*67e74705SXin Li // CHECK-NOELIDE-TREE: [2 != 1]>
681*67e74705SXin Li
Play2()682*67e74705SXin Li void Play2() {
683*67e74705SXin Li Foo2<1> F1;
684*67e74705SXin Li Foo2<> F2, F3;
685*67e74705SXin Li F2 = F1;
686*67e74705SXin Li F1 = F2;
687*67e74705SXin Li F2 = F3;
688*67e74705SXin Li F3 = F2;
689*67e74705SXin Li }
690*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
691*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function (the implicit copy assignment operator) not viable: no known conversion from 'Foo2<1>' to 'const Foo2<2>' for 1st argument
692*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function (the implicit move assignment operator) not viable: no known conversion from 'Foo2<1>' to 'Foo2<2>' for 1st argument
693*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
694*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function (the implicit copy assignment operator) not viable: no known conversion from 'Foo2<(default) 2>' to 'const Foo2<1>' for 1st argument
695*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function (the implicit move assignment operator) not viable: no known conversion from 'Foo2<(default) 2>' to 'Foo2<1>' for 1st argument
696*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no viable overloaded '='
697*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function (the implicit copy assignment operator) not viable: no known conversion from 'Foo2<1>' to 'const Foo2<2>' for 1st argument
698*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function (the implicit move assignment operator) not viable: no known conversion from 'Foo2<1>' to 'Foo2<2>' for 1st argument
699*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no viable overloaded '='
700*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function (the implicit copy assignment operator) not viable: no known conversion from 'Foo2<(default) 2>' to 'const Foo2<1>' for 1st argument
701*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function (the implicit move assignment operator) not viable: no known conversion from 'Foo2<(default) 2>' to 'Foo2<1>' for 1st argument
702*67e74705SXin Li // CHECK-ELIDE-TREE: no viable overloaded '='
703*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function (the implicit copy assignment operator) not viable: no known conversion from argument type to parameter type for 1st argument
704*67e74705SXin Li // CHECK-ELIDE-TREE: [(no qualifiers) != const] Foo2<
705*67e74705SXin Li // CHECK-ELIDE-TREE: [1 != 2]>
706*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function (the implicit move assignment operator) not viable: no known conversion from argument type to parameter type for 1st argument
707*67e74705SXin Li // CHECK-ELIDE-TREE: Foo2<
708*67e74705SXin Li // CHECK-ELIDE-TREE: [1 != 2]>
709*67e74705SXin Li // CHECK-ELIDE-TREE: no viable overloaded '='
710*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function (the implicit copy assignment operator) not viable: no known conversion from argument type to parameter type for 1st argument
711*67e74705SXin Li // CHECK-ELIDE-TREE: [(no qualifiers) != const] Foo2<
712*67e74705SXin Li // CHECK-ELIDE-TREE: [(default) 2 != 1]>
713*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function (the implicit move assignment operator) not viable: no known conversion from argument type to parameter type for 1st argument
714*67e74705SXin Li // CHECK-ELIDE-TREE: Foo2<
715*67e74705SXin Li // CHECK-ELIDE-TREE: [(default) 2 != 1]>
716*67e74705SXin Li // CHECK-NOELIDE-TREE: no viable overloaded '='
717*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function (the implicit copy assignment operator) not viable: no known conversion from argument type to parameter type for 1st argument
718*67e74705SXin Li // CHECK-NOELIDE-TREE: [(no qualifiers) != const] Foo2<
719*67e74705SXin Li // CHECK-NOELIDE-TREE: [1 != 2]>
720*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function (the implicit move assignment operator) not viable: no known conversion from argument type to parameter type for 1st argument
721*67e74705SXin Li // CHECK-NOELIDE-TREE: Foo2<
722*67e74705SXin Li // CHECK-NOELIDE-TREE: [1 != 2]>
723*67e74705SXin Li // CHECK-NOELIDE-TREE: no viable overloaded '='
724*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function (the implicit copy assignment operator) not viable: no known conversion from argument type to parameter type for 1st argument
725*67e74705SXin Li // CHECK-NOELIDE-TREE: [(no qualifiers) != const] Foo2<
726*67e74705SXin Li // CHECK-NOELIDE-TREE: [(default) 2 != 1]>
727*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function (the implicit move assignment operator) not viable: no known conversion from argument type to parameter type for 1st argument
728*67e74705SXin Li // CHECK-NOELIDE-TREE: Foo2<
729*67e74705SXin Li // CHECK-NOELIDE-TREE: [(default) 2 != 1]>
730*67e74705SXin Li
Play3()731*67e74705SXin Li void Play3() {
732*67e74705SXin Li Foo3<1> F1;
733*67e74705SXin Li Foo3<2, 1> F2, F3;
734*67e74705SXin Li F2 = F1;
735*67e74705SXin Li F1 = F2;
736*67e74705SXin Li F2 = F3;
737*67e74705SXin Li F3 = F2;
738*67e74705SXin Li }
739*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
740*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function (the implicit copy assignment operator) not viable: no known conversion from 'Foo3<1, (no argument)>' to 'const Foo3<2, 1>' for 1st argument
741*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function (the implicit move assignment operator) not viable: no known conversion from 'Foo3<1, (no argument)>' to 'Foo3<2, 1>' for 1st argument
742*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
743*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function (the implicit copy assignment operator) not viable: no known conversion from 'Foo3<2, 1>' to 'const Foo3<1, (no argument)>' for 1st argument
744*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function (the implicit move assignment operator) not viable: no known conversion from 'Foo3<2, 1>' to 'Foo3<1, (no argument)>' for 1st argument
745*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no viable overloaded '='
746*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function (the implicit copy assignment operator) not viable: no known conversion from 'Foo3<1, (no argument)>' to 'const Foo3<2, 1>' for 1st argument
747*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function (the implicit move assignment operator) not viable: no known conversion from 'Foo3<1, (no argument)>' to 'Foo3<2, 1>' for 1st argument
748*67e74705SXin Li // CHECK-NOELIDE-NOTREE: no viable overloaded '='
749*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function (the implicit copy assignment operator) not viable: no known conversion from 'Foo3<2, 1>' to 'const Foo3<1, (no argument)>' for 1st argument
750*67e74705SXin Li // CHECK-NOELIDE-NOTREE: candidate function (the implicit move assignment operator) not viable: no known conversion from 'Foo3<2, 1>' to 'Foo3<1, (no argument)>' for 1st argument
751*67e74705SXin Li // CHECK-ELIDE-TREE: no viable overloaded '='
752*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function (the implicit copy assignment operator) not viable: no known conversion from argument type to parameter type for 1st argument
753*67e74705SXin Li // CHECK-ELIDE-TREE: [(no qualifiers) != const] Foo3<
754*67e74705SXin Li // CHECK-ELIDE-TREE: [1 != 2],
755*67e74705SXin Li // CHECK-ELIDE-TREE: [(no argument) != 1]>
756*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function (the implicit move assignment operator) not viable: no known conversion from argument type to parameter type for 1st argument
757*67e74705SXin Li // CHECK-ELIDE-TREE: Foo3<
758*67e74705SXin Li // CHECK-ELIDE-TREE: [1 != 2],
759*67e74705SXin Li // CHECK-ELIDE-TREE: [(no argument) != 1]>
760*67e74705SXin Li // CHECK-ELIDE-TREE: no viable overloaded '='
761*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function (the implicit copy assignment operator) not viable: no known conversion from argument type to parameter type for 1st argument
762*67e74705SXin Li // CHECK-ELIDE-TREE: [(no qualifiers) != const] Foo3<
763*67e74705SXin Li // CHECK-ELIDE-TREE: [2 != 1],
764*67e74705SXin Li // CHECK-ELIDE-TREE: [1 != (no argument)]>
765*67e74705SXin Li // CHECK-ELIDE-TREE: candidate function (the implicit move assignment operator) not viable: no known conversion from argument type to parameter type for 1st argument
766*67e74705SXin Li // CHECK-ELIDE-TREE: Foo3<
767*67e74705SXin Li // CHECK-ELIDE-TREE: [2 != 1],
768*67e74705SXin Li // CHECK-ELIDE-TREE: [1 != (no argument)]>
769*67e74705SXin Li // CHECK-NOELIDE-TREE: no viable overloaded '='
770*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function (the implicit copy assignment operator) not viable: no known conversion from argument type to parameter type for 1st argument
771*67e74705SXin Li // CHECK-NOELIDE-TREE: [(no qualifiers) != const] Foo3<
772*67e74705SXin Li // CHECK-NOELIDE-TREE: [1 != 2],
773*67e74705SXin Li // CHECK-NOELIDE-TREE: [(no argument) != 1]>
774*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function (the implicit move assignment operator) not viable: no known conversion from argument type to parameter type for 1st argument
775*67e74705SXin Li // CHECK-NOELIDE-TREE: Foo3<
776*67e74705SXin Li // CHECK-NOELIDE-TREE: [1 != 2],
777*67e74705SXin Li // CHECK-NOELIDE-TREE: [(no argument) != 1]>
778*67e74705SXin Li // CHECK-NOELIDE-TREE: no viable overloaded '='
779*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function (the implicit copy assignment operator) not viable: no known conversion from argument type to parameter type for 1st argument
780*67e74705SXin Li // CHECK-NOELIDE-TREE: [(no qualifiers) != const] Foo3<
781*67e74705SXin Li // CHECK-NOELIDE-TREE: [2 != 1],
782*67e74705SXin Li // CHECK-NOELIDE-TREE: [1 != (no argument)]>
783*67e74705SXin Li // CHECK-NOELIDE-TREE: candidate function (the implicit move assignment operator) not viable: no known conversion from argument type to parameter type for 1st argument
784*67e74705SXin Li // CHECK-NOELIDE-TREE: Foo3<
785*67e74705SXin Li // CHECK-NOELIDE-TREE: [2 != 1],
786*67e74705SXin Li // CHECK-NOELIDE-TREE: [1 != (no argument)]>
787*67e74705SXin Li }
788*67e74705SXin Li
789*67e74705SXin Li namespace PR14342 {
790*67e74705SXin Li template<typename T, short a> struct X {};
791*67e74705SXin Li X<int, (signed char)-1> x = X<long, -1>();
792*67e74705SXin Li X<int, 3UL> y = X<int, 2>();
793*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no viable conversion from 'X<long, [...]>' to 'X<int, [...]>'
794*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no viable conversion from 'X<[...], 2>' to 'X<[...], 3>'
795*67e74705SXin Li }
796*67e74705SXin Li
797*67e74705SXin Li namespace PR14489 {
798*67e74705SXin Li // The important thing here is that the diagnostic diffs a template specialization
799*67e74705SXin Li // with no arguments against itself. (We might need a different test if this
800*67e74705SXin Li // diagnostic changes).
801*67e74705SXin Li template<class ...V>
802*67e74705SXin Li struct VariableList {
ConnectAllToAllPR14489::VariableList803*67e74705SXin Li void ConnectAllToAll(VariableList<>& params = VariableList<>()) {
804*67e74705SXin Li }
805*67e74705SXin Li };
806*67e74705SXin Li // CHECK-ELIDE-NOTREE: non-const lvalue reference to type 'VariableList<>' cannot bind to a temporary of type 'VariableList<>'
807*67e74705SXin Li }
808*67e74705SXin Li
809*67e74705SXin Li namespace rdar12456626 {
810*67e74705SXin Li struct IntWrapper {
811*67e74705SXin Li typedef int type;
812*67e74705SXin Li };
813*67e74705SXin Li
814*67e74705SXin Li template<typename T, typename T::type V>
815*67e74705SXin Li struct X { };
816*67e74705SXin Li
817*67e74705SXin Li struct A {
818*67e74705SXin Li virtual X<IntWrapper, 1> foo();
819*67e74705SXin Li };
820*67e74705SXin Li
821*67e74705SXin Li struct B : A {
822*67e74705SXin Li // CHECK-ELIDE-NOTREE: virtual function 'foo' has a different return type
823*67e74705SXin Li virtual X<IntWrapper, 2> foo();
824*67e74705SXin Li };
825*67e74705SXin Li }
826*67e74705SXin Li
827*67e74705SXin Li namespace PR15023 {
828*67e74705SXin Li // Don't crash when non-QualTypes are passed to a diff modifier.
829*67e74705SXin Li template <typename... Args>
func(void (* func)(Args...),Args...)830*67e74705SXin Li void func(void (*func)(Args...), Args...) { }
831*67e74705SXin Li
bar(int,int &)832*67e74705SXin Li void bar(int, int &) {
833*67e74705SXin Li }
834*67e74705SXin Li
foo(int x)835*67e74705SXin Li void foo(int x) {
836*67e74705SXin Li func(bar, 1, x)
837*67e74705SXin Li }
838*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'func'
839*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate template ignored: deduced conflicting types for parameter 'Args' (<int, int &> vs. <int, int>)
840*67e74705SXin Li }
841*67e74705SXin Li
842*67e74705SXin Li namespace rdar12931988 {
843*67e74705SXin Li namespace A {
844*67e74705SXin Li template<typename T> struct X { };
845*67e74705SXin Li }
846*67e74705SXin Li
847*67e74705SXin Li namespace B {
848*67e74705SXin Li template<typename T> struct X { };
849*67e74705SXin Li }
850*67e74705SXin Li
foo(A::X<int> & ax,B::X<int> bx)851*67e74705SXin Li void foo(A::X<int> &ax, B::X<int> bx) {
852*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
853*67e74705SXin Li // CHECK-ELIDE-NOTREE: no known conversion from 'B::X<int>' to 'const rdar12931988::A::X<int>'
854*67e74705SXin Li ax = bx;
855*67e74705SXin Li }
856*67e74705SXin Li
857*67e74705SXin Li template<template<typename> class> class Y {};
858*67e74705SXin Li
bar(Y<A::X> ya,Y<B::X> yb)859*67e74705SXin Li void bar(Y<A::X> ya, Y<B::X> yb) {
860*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
861*67e74705SXin Li // CHECK-ELIDE-NOTREE: no known conversion from 'Y<template rdar12931988::B::X>' to 'Y<template rdar12931988::A::X>'
862*67e74705SXin Li ya = yb;
863*67e74705SXin Li }
864*67e74705SXin Li }
865*67e74705SXin Li
866*67e74705SXin Li namespace ValueDecl {
867*67e74705SXin Li int int1, int2, default_int;
868*67e74705SXin Li template <const int& T = default_int>
869*67e74705SXin Li struct S {};
870*67e74705SXin Li
871*67e74705SXin Li typedef S<int1> T1;
872*67e74705SXin Li typedef S<int2> T2;
873*67e74705SXin Li typedef S<> TD;
874*67e74705SXin Li
test()875*67e74705SXin Li void test() {
876*67e74705SXin Li T1 t1;
877*67e74705SXin Li T2 t2;
878*67e74705SXin Li TD td;
879*67e74705SXin Li
880*67e74705SXin Li t1 = t2;
881*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
882*67e74705SXin Li // CHECK-ELIDE-NOTREE: no known conversion from 'S<int2>' to 'S<int1>'
883*67e74705SXin Li
884*67e74705SXin Li t2 = t1;
885*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
886*67e74705SXin Li // CHECK-ELIDE-NOTREE: no known conversion from 'S<int1>' to 'S<int2>'
887*67e74705SXin Li
888*67e74705SXin Li td = t1;
889*67e74705SXin Li // TODO: Find out why (default) isn't printed on second template.
890*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
891*67e74705SXin Li // CHECK-ELIDE-NOTREE: no known conversion from 'S<int1>' to 'S<default_int>'
892*67e74705SXin Li
893*67e74705SXin Li t2 = td;
894*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
895*67e74705SXin Li // CHECK-ELIDE-NOTREE: no known conversion from 'S<(default) default_int>' to 'S<int2>'
896*67e74705SXin Li
897*67e74705SXin Li }
898*67e74705SXin Li }
899*67e74705SXin Li
900*67e74705SXin Li namespace DependentDefault {
901*67e74705SXin Li template <typename> struct Trait {
902*67e74705SXin Li enum { V = 40 };
903*67e74705SXin Li typedef int Ty;
904*67e74705SXin Li static int I;
905*67e74705SXin Li };
906*67e74705SXin Li int other;
907*67e74705SXin Li
908*67e74705SXin Li template <typename T, int = Trait<T>::V > struct A {};
909*67e74705SXin Li template <typename T, typename = Trait<T>::Ty > struct B {};
910*67e74705SXin Li template <typename T, int& = Trait<T>::I > struct C {};
911*67e74705SXin Li
test()912*67e74705SXin Li void test() {
913*67e74705SXin Li
914*67e74705SXin Li A<int> a1;
915*67e74705SXin Li A<char> a2;
916*67e74705SXin Li A<int, 10> a3;
917*67e74705SXin Li a1 = a2;
918*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
919*67e74705SXin Li // CHECK-ELIDE-NOTREE: no known conversion from 'A<char, [...]>' to 'A<int, [...]>'
920*67e74705SXin Li a3 = a1;
921*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
922*67e74705SXin Li // CHECK-ELIDE-NOTREE: no known conversion from 'A<[...], (default) Trait<T>::V aka 40>' to 'A<[...], 10>'
923*67e74705SXin Li a2 = a3;
924*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
925*67e74705SXin Li // CHECK-ELIDE-NOTREE: no known conversion from 'A<int, 10>' to 'A<char, 40>'
926*67e74705SXin Li
927*67e74705SXin Li B<int> b1;
928*67e74705SXin Li B<char> b2;
929*67e74705SXin Li B<int, char> b3;
930*67e74705SXin Li b1 = b2;
931*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
932*67e74705SXin Li // CHECK-ELIDE-NOTREE: no known conversion from 'B<char, [...]>' to 'B<int, [...]>'
933*67e74705SXin Li b3 = b1;
934*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
935*67e74705SXin Li // CHECK-ELIDE-NOTREE: no known conversion from 'B<[...], (default) int>' to 'B<[...], char>'
936*67e74705SXin Li b2 = b3;
937*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
938*67e74705SXin Li // CHECK-ELIDE-NOTREE: no known conversion from 'B<int, char>' to 'B<char, int>'
939*67e74705SXin Li
940*67e74705SXin Li C<int> c1;
941*67e74705SXin Li C<char> c2;
942*67e74705SXin Li C<int, other> c3;
943*67e74705SXin Li c1 = c2;
944*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
945*67e74705SXin Li // CHECK-ELIDE-NOTREE: no known conversion from 'C<char, (default) I>' to 'C<int, I>'
946*67e74705SXin Li c3 = c1;
947*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
948*67e74705SXin Li // CHECK-ELIDE-NOTREE: no known conversion from 'C<[...], (default) I>' to 'C<[...], other>'
949*67e74705SXin Li c2 = c3;
950*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
951*67e74705SXin Li // CHECK-ELIDE-NOTREE: no known conversion from 'C<int, other>' to 'C<char, I>'
952*67e74705SXin Li }
953*67e74705SXin Li }
954*67e74705SXin Li
955*67e74705SXin Li namespace VariadicDefault {
956*67e74705SXin Li int i1, i2, i3;
957*67e74705SXin Li template <int = 5, int...> struct A {};
958*67e74705SXin Li template <int& = i1, int& ...> struct B {};
959*67e74705SXin Li template <typename = void, typename...> struct C {};
960*67e74705SXin Li
test()961*67e74705SXin Li void test() {
962*67e74705SXin Li A<> a1;
963*67e74705SXin Li A<5, 6, 7> a2;
964*67e74705SXin Li A<1, 2> a3;
965*67e74705SXin Li a2 = a1;
966*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
967*67e74705SXin Li // CHECK-ELIDE-NOTREE: no known conversion from 'A<[...], (no argument), (no argument)>' to 'A<[...], 6, 7>'
968*67e74705SXin Li a3 = a1;
969*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
970*67e74705SXin Li // CHECK-ELIDE-NOTREE: no known conversion from 'A<(default) 5, (no argument)>' to 'A<1, 2>'
971*67e74705SXin Li
972*67e74705SXin Li B<> b1;
973*67e74705SXin Li B<i1, i2, i3> b2;
974*67e74705SXin Li B<i2, i3> b3;
975*67e74705SXin Li b2 = b1;
976*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
977*67e74705SXin Li // CHECK-ELIDE-NOTREE: no known conversion from 'B<[...], (no argument), (no argument)>' to 'B<[...], i2, i3>'
978*67e74705SXin Li b3 = b1;
979*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
980*67e74705SXin Li // CHECK-ELIDE-NOTREE: no known conversion from 'B<(default) i1, (no argument)>' to 'B<i2, i3>'
981*67e74705SXin Li
982*67e74705SXin Li B<i1, i2, i3> b4 = b1;
983*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'B<[...], (no argument), (no argument)>' to 'B<[...], i2, i3>'
984*67e74705SXin Li B<i2, i3> b5 = b1;
985*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'B<(default) i1, (no argument)>' to 'B<i2, i3>'
986*67e74705SXin Li
987*67e74705SXin Li C<> c1;
988*67e74705SXin Li C<void, void> c2;
989*67e74705SXin Li C<char, char> c3;
990*67e74705SXin Li c2 = c1;
991*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
992*67e74705SXin Li // CHECK-ELIDE-NOTREE: no known conversion from 'C<[...], (no argument)>' to 'C<[...], void>'
993*67e74705SXin Li c3 = c1;
994*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable overloaded '='
995*67e74705SXin Li // CHECK-ELIDE-NOTREE: no known conversion from 'C<(default) void, (no argument)>' to 'C<char, char>'
996*67e74705SXin Li }
997*67e74705SXin Li }
998*67e74705SXin Li
999*67e74705SXin Li namespace PointerArguments {
1000*67e74705SXin Li template <int *p> class T {};
1001*67e74705SXin Li template <int* ...> class U {};
1002*67e74705SXin Li int a, b, c;
1003*67e74705SXin Li int z[5];
test()1004*67e74705SXin Li void test() {
1005*67e74705SXin Li T<&a> ta;
1006*67e74705SXin Li T<z> tz;
1007*67e74705SXin Li T<&b> tb(ta);
1008*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching constructor for initialization of 'T<&b>'
1009*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'T<&a>' to 'const T<&b>' for 1st argument
1010*67e74705SXin Li T<&c> tc(tz);
1011*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching constructor for initialization of 'T<&c>'
1012*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'T<z>' to 'const T<&c>' for 1st argument
1013*67e74705SXin Li
1014*67e74705SXin Li U<&a, &a> uaa;
1015*67e74705SXin Li U<&b> ub(uaa);
1016*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching constructor for initialization of 'U<&b>'
1017*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'U<&a, &a>' to 'const U<&b, (no argument)>' for 1st argument
1018*67e74705SXin Li
1019*67e74705SXin Li U<&b, &b, &b> ubbb(uaa);
1020*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching constructor for initialization of 'U<&b, &b, &b>'
1021*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate constructor (the implicit copy constructor) not viable: no known conversion from 'U<&a, &a, (no argument)>' to 'const U<&b, &b, &b>' for 1st argument
1022*67e74705SXin Li
1023*67e74705SXin Li }
1024*67e74705SXin Li }
1025*67e74705SXin Li
1026*67e74705SXin Li namespace DependentInt {
1027*67e74705SXin Li template<int Num> struct INT;
1028*67e74705SXin Li
1029*67e74705SXin Li template <class CLASS, class Int_wrapper = INT<CLASS::val> >
1030*67e74705SXin Li struct C;
1031*67e74705SXin Li
1032*67e74705SXin Li struct N {
1033*67e74705SXin Li static const int val = 1;
1034*67e74705SXin Li };
1035*67e74705SXin Li
1036*67e74705SXin Li template <class M_T>
1037*67e74705SXin Li struct M {};
1038*67e74705SXin Li
test()1039*67e74705SXin Li void test() {
1040*67e74705SXin Li using T1 = M<C<int, INT<0>>>;
1041*67e74705SXin Li using T2 = M<C<N>>;
1042*67e74705SXin Li T2 p;
1043*67e74705SXin Li T1 x = p;
1044*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'M<C<DependentInt::N, INT<1>>>' to 'M<C<int, INT<0>>>'
1045*67e74705SXin Li }
1046*67e74705SXin Li }
1047*67e74705SXin Li
1048*67e74705SXin Li namespace PR17510 {
1049*67e74705SXin Li class Atom;
1050*67e74705SXin Li
1051*67e74705SXin Li template <typename T> class allocator;
1052*67e74705SXin Li template <typename T, typename A> class vector;
1053*67e74705SXin Li
1054*67e74705SXin Li typedef vector<const Atom *, allocator<const Atom *> > AtomVector;
1055*67e74705SXin Li
1056*67e74705SXin Li template <typename T, typename A = allocator<const Atom *> > class vector {};
1057*67e74705SXin Li
foo()1058*67e74705SXin Li void foo() {
1059*67e74705SXin Li vector<Atom *> v;
1060*67e74705SXin Li AtomVector v2(v);
1061*67e74705SXin Li // CHECK-ELIDE-NOTREE: no known conversion from 'vector<PR17510::Atom *, [...]>' to 'const vector<const PR17510::Atom *, [...]>'
1062*67e74705SXin Li }
1063*67e74705SXin Li }
1064*67e74705SXin Li
1065*67e74705SXin Li namespace PR15677 {
1066*67e74705SXin Li template <bool>
1067*67e74705SXin Li struct A{};
1068*67e74705SXin Li
1069*67e74705SXin Li template <typename T>
1070*67e74705SXin Li using B = A<T::value>;
1071*67e74705SXin Li
1072*67e74705SXin Li template <typename T>
1073*67e74705SXin Li using B = A<!T::value>;
1074*67e74705SXin Li // CHECK-ELIDE-NOTREE: type alias template redefinition with different types ('A<!T::value>' vs 'A<T::value>')
1075*67e74705SXin Li
1076*67e74705SXin Li template <int>
1077*67e74705SXin Li struct C{};
1078*67e74705SXin Li
1079*67e74705SXin Li template <typename T>
1080*67e74705SXin Li using D = C<T::value>;
1081*67e74705SXin Li
1082*67e74705SXin Li template <typename T>
1083*67e74705SXin Li using D = C<T::value + 1>;
1084*67e74705SXin Li // CHECK-ELIDE-NOTREE: type alias template redefinition with different types ('C<T::value + 1>' vs 'C<T::value>')
1085*67e74705SXin Li
1086*67e74705SXin Li template <typename T>
1087*67e74705SXin Li using E = C<T::value>;
1088*67e74705SXin Li
1089*67e74705SXin Li template <typename T>
1090*67e74705SXin Li using E = C<42>;
1091*67e74705SXin Li // CHECK-ELIDE-NOTREE: type alias template redefinition with different types ('C<42>' vs 'C<T::value>')
1092*67e74705SXin Li
1093*67e74705SXin Li template <typename T>
1094*67e74705SXin Li using F = C<T::value>;
1095*67e74705SXin Li
1096*67e74705SXin Li template <typename T>
1097*67e74705SXin Li using F = C<21 + 21>;
1098*67e74705SXin Li // CHECK-ELIDE-NOTREE: type alias template redefinition with different types ('C<21 + 21 aka 42>' vs 'C<T::value>')
1099*67e74705SXin Li }
1100*67e74705SXin Li }
1101*67e74705SXin Li
1102*67e74705SXin Li namespace AddressOf {
1103*67e74705SXin Li template <int*>
1104*67e74705SXin Li struct S {};
1105*67e74705SXin Li
1106*67e74705SXin Li template <class T>
1107*67e74705SXin Li struct Wrapper {};
1108*67e74705SXin Li
1109*67e74705SXin Li template <class T>
1110*67e74705SXin Li Wrapper<T> MakeWrapper();
1111*67e74705SXin Li int global, global2;
1112*67e74705SXin Li constexpr int * ptr = nullptr;
1113*67e74705SXin Li Wrapper<S<ptr>> W = MakeWrapper<S<&global>>();
1114*67e74705SXin Li // Don't print an extra '&' for 'ptr'
1115*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<&global>>' to 'Wrapper<S<ptr aka nullptr>>'
1116*67e74705SXin Li
1117*67e74705SXin Li // Handle parens correctly
1118*67e74705SXin Li Wrapper<S<(&global2)>> W2 = MakeWrapper<S<&global>>();
1119*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<&global>>' to 'Wrapper<S<&global2>>'
1120*67e74705SXin Li Wrapper<S<&global2>> W3 = MakeWrapper<S<(&global)>>();
1121*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<&global>>' to 'Wrapper<S<&global2>>'
1122*67e74705SXin Li Wrapper<S<(&global2)>> W4 = MakeWrapper<S<(&global)>>();
1123*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<&global>>' to 'Wrapper<S<&global2>>'
1124*67e74705SXin Li }
1125*67e74705SXin Li
1126*67e74705SXin Li namespace NullPtr {
1127*67e74705SXin Li template <int*, int*>
1128*67e74705SXin Li struct S {};
1129*67e74705SXin Li
1130*67e74705SXin Li template <class T>
1131*67e74705SXin Li struct Wrapper {};
1132*67e74705SXin Li
1133*67e74705SXin Li template <class T>
1134*67e74705SXin Li Wrapper<T> MakeWrapper();
1135*67e74705SXin Li int global, global2;
1136*67e74705SXin Li constexpr int * ptr = nullptr;
1137*67e74705SXin Li constexpr int * ptr2 = static_cast<int*>(0);
1138*67e74705SXin Li
1139*67e74705SXin Li S<&global> s1 = S<&global, ptr>();
1140*67e74705SXin Li S<&global, nullptr> s2 = S<&global, ptr>();
1141*67e74705SXin Li
1142*67e74705SXin Li S<&global, nullptr> s3 = S<&global, &global>();
1143*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'S<[...], &global>' to 'S<[...], nullptr>'
1144*67e74705SXin Li S<&global, ptr> s4 = S<&global, &global>();
1145*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'S<[...], &global>' to 'S<[...], ptr aka nullptr>
1146*67e74705SXin Li
1147*67e74705SXin Li Wrapper<S<&global, nullptr>> W1 = MakeWrapper<S<&global, ptr>>();
1148*67e74705SXin Li Wrapper<S<&global, static_cast<int*>(0)>> W2 = MakeWrapper<S<&global, ptr>>();
1149*67e74705SXin Li
1150*67e74705SXin Li Wrapper<S<&global, nullptr>> W3 = MakeWrapper<S<&global, &global>>();
1151*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<[...], &global>>' to 'Wrapper<S<[...], nullptr>>'
1152*67e74705SXin Li Wrapper<S<&global, ptr>> W4 = MakeWrapper<S<&global, &global>>();
1153*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<[...], &global>>' to 'Wrapper<S<[...], ptr aka nullptr>>'
1154*67e74705SXin Li
1155*67e74705SXin Li Wrapper<S<&global2, ptr>> W5 = MakeWrapper<S<&global, nullptr>>();
1156*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<&global, [...]>>' to 'Wrapper<S<&global2, [...]>>'
1157*67e74705SXin Li Wrapper<S<&global2, nullptr>> W6 = MakeWrapper<S<&global, nullptr>>();
1158*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<&global, [...]>>' to 'Wrapper<S<&global2, [...]>>'
1159*67e74705SXin Li Wrapper<S<&global2, ptr2>> W7 = MakeWrapper<S<&global, nullptr>>();
1160*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<&global, [...]>>' to 'Wrapper<S<&global2, [...]>>'
1161*67e74705SXin Li Wrapper<S<&global2, nullptr>> W8 = MakeWrapper<S<&global, ptr2>>();
1162*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<&global, [...]>>' to 'Wrapper<S<&global2, [...]>>'
1163*67e74705SXin Li Wrapper<S<&global2, ptr>> W9 = MakeWrapper<S<&global, ptr2>>();
1164*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<&global, [...]>>' to 'Wrapper<S<&global2, [...]>>'
1165*67e74705SXin Li Wrapper<S<&global2, ptr2>> W10 = MakeWrapper<S<&global, ptr>>();
1166*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<&global, [...]>>' to 'Wrapper<S<&global2, [...]>>'
1167*67e74705SXin Li Wrapper<S<&global2, static_cast<int *>(0)>> W11 =
1168*67e74705SXin Li MakeWrapper<S<&global, nullptr>>();
1169*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<&global, [...]>>' to 'Wrapper<S<&global2, [...]>>'
1170*67e74705SXin Li Wrapper<S<&global2, nullptr>> W12 =
1171*67e74705SXin Li MakeWrapper<S<&global, static_cast<int *>(0)>>();
1172*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<&global, [...]>>' to 'Wrapper<S<&global2, [...]>>'
1173*67e74705SXin Li
1174*67e74705SXin Li Wrapper<S<&global, &global>> W13 = MakeWrapper<S<&global, ptr>>();
1175*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<[...], nullptr>>' to 'Wrapper<S<[...], &global>>'
1176*67e74705SXin Li Wrapper<S<&global, ptr>> W14 = MakeWrapper<S<&global, &global>>();
1177*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'Wrapper<S<[...], &global>>' to 'Wrapper<S<[...], ptr aka nullptr>>'
1178*67e74705SXin Li }
1179*67e74705SXin Li
1180*67e74705SXin Li namespace TemplateTemplateDefault {
1181*67e74705SXin Li template <class> class A{};
1182*67e74705SXin Li template <class> class B{};
1183*67e74705SXin Li template <class> class C{};
1184*67e74705SXin Li template <template <class> class, template <class> class = A>
1185*67e74705SXin Li class T {};
1186*67e74705SXin Li
1187*67e74705SXin Li T<A> t1 = T<A, C>();
1188*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'T<[...], template C>' to 'T<[...], (default) template A>'
1189*67e74705SXin Li T<A, C> t2 = T<A>();
1190*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'T<[...], (default) template A>' to 'T<[...], template C>'
1191*67e74705SXin Li T<A> t3 = T<B>();
1192*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'T<template B>' to 'T<template A>'
1193*67e74705SXin Li T<B, C> t4 = T<C, B>();
1194*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'T<template C, template B>' to 'T<template B, template C>'
1195*67e74705SXin Li T<A, A> t5 = T<B>();
1196*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'T<template B, [...]>' to 'T<template A, [...]>'
1197*67e74705SXin Li T<B> t6 = T<A, A>();
1198*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'T<template A, [...]>' to 'T<template B, [...]>'
1199*67e74705SXin Li }
1200*67e74705SXin Li
1201*67e74705SXin Li namespace Bool {
1202*67e74705SXin Li template <class> class A{};
1203*67e74705SXin Li A<bool> a1 = A<int>();
1204*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'A<int>' to 'A<bool>'
1205*67e74705SXin Li A<int> a2 = A<bool>();
1206*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'A<bool>' to 'A<int>'
1207*67e74705SXin Li }
1208*67e74705SXin Li
1209*67e74705SXin Li namespace TypeAlias {
1210*67e74705SXin Li template <int, int = 0> class A {};
1211*67e74705SXin Li
1212*67e74705SXin Li template <class T> using a = A<T::num, 0>;
1213*67e74705SXin Li template <class T> using a = A<T::num>;
1214*67e74705SXin Li
1215*67e74705SXin Li template <class T> using A1 = A<T::num>;
1216*67e74705SXin Li template <class T> using A1 = A<T::num + 0>;
1217*67e74705SXin Li // CHECK-ELIDE-NOTREE: type alias template redefinition with different types ('A<T::num + 0>' vs 'A<T::num>')
1218*67e74705SXin Li
1219*67e74705SXin Li template <class T> using A2 = A<1 + T::num>;
1220*67e74705SXin Li template <class T> using A2 = A<T::num + 1>;
1221*67e74705SXin Li // CHECK-ELIDE-NOTREE: type alias template redefinition with different types ('A<T::num + 1>' vs 'A<1 + T::num>')
1222*67e74705SXin Li
1223*67e74705SXin Li template <class T> using A3 = A<(T::num)>;
1224*67e74705SXin Li template <class T> using A3 = A<T::num>;
1225*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: type alias template redefinition with different types ('A<T::num>' vs 'A<(T::num)>')
1226*67e74705SXin Li
1227*67e74705SXin Li template <class T> using A4 = A<(T::num)>;
1228*67e74705SXin Li template <class T> using A4 = A<((T::num))>;
1229*67e74705SXin Li // CHECK-ELIDE-NOTREE: type alias template redefinition with different types ('A<((T::num))>' vs 'A<(T::num)>')
1230*67e74705SXin Li
1231*67e74705SXin Li template <class T> using A5 = A<T::num, 1>;
1232*67e74705SXin Li template <class T> using A5 = A<T::num>;
1233*67e74705SXin Li // CHECK-ELIDE-NOTREE: type alias template redefinition with different types ('A<[...], (default) 0>' vs 'A<[...], 1>')
1234*67e74705SXin Li
1235*67e74705SXin Li template <class T> using A6 = A<T::num + 5, 1>;
1236*67e74705SXin Li template <class T> using A6 = A<T::num + 5>;
1237*67e74705SXin Li // CHECK-ELIDE-NOTREE: type alias template redefinition with different types ('A<[...], (default) 0>' vs 'A<[...], 1>')
1238*67e74705SXin Li
1239*67e74705SXin Li template <class T> using A7 = A<T::num, 1>;
1240*67e74705SXin Li template <class T> using A7 = A<(T::num)>;
1241*67e74705SXin Li // CHECK-ELIDE-NOTREE: type alias template redefinition with different types ('A<(T::num), (default) 0>' vs 'A<T::num, 1>')
1242*67e74705SXin Li }
1243*67e74705SXin Li
1244*67e74705SXin Li namespace TemplateArgumentImplicitConversion {
1245*67e74705SXin Li template <int X> struct condition {};
1246*67e74705SXin Li
1247*67e74705SXin Li struct is_const {
1248*67e74705SXin Li constexpr operator int() const { return 10; }
1249*67e74705SXin Li };
1250*67e74705SXin Li
1251*67e74705SXin Li using T = condition<(is_const())>;
1252*67e74705SXin Li void foo(const T &t) {
1253*67e74705SXin Li T &t2 = t;
1254*67e74705SXin Li }
1255*67e74705SXin Li // CHECK-ELIDE-NOTREE: binding value of type 'const condition<...>' to reference to type 'condition<...>' drops 'const' qualifier
1256*67e74705SXin Li }
1257*67e74705SXin Li
1258*67e74705SXin Li namespace BoolArgumentBitExtended {
1259*67e74705SXin Li template <bool B> struct BoolT {};
1260*67e74705SXin Li
1261*67e74705SXin Li template <typename T> void foo(T) {}
1262*67e74705SXin Li
1263*67e74705SXin Li void test() {
1264*67e74705SXin Li BoolT<false> X;
1265*67e74705SXin Li foo<BoolT<true>>(X);
1266*67e74705SXin Li }
1267*67e74705SXin Li // CHECK-ELIDE-NOTREE: no matching function for call to 'foo'
1268*67e74705SXin Li // CHECK-ELIDE-NOTREE: candidate function [with T = BoolArgumentBitExtended::BoolT<true>] not viable: no known conversion from 'BoolT<false>' to 'BoolT<true>' for 1st argument
1269*67e74705SXin Li }
1270*67e74705SXin Li
1271*67e74705SXin Li namespace DifferentIntegralTypes {
1272*67e74705SXin Li template<typename T, T n>
1273*67e74705SXin Li class A{};
1274*67e74705SXin Li void foo() {
1275*67e74705SXin Li A<int, 1> a1 = A<long long, 1>();
1276*67e74705SXin Li A<unsigned int, 1> a2 = A<int, 5>();
1277*67e74705SXin Li A<bool, true> a3 = A<signed char, true>();
1278*67e74705SXin Li }
1279*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<long long, (long long) 1>' to 'A<int, (int) 1>'
1280*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int, (int) 5>' to 'A<unsigned int, (unsigned int) 1>'
1281*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<signed char, (signed char) 1>' to 'A<bool, (bool) true>'
1282*67e74705SXin Li }
1283*67e74705SXin Li
1284*67e74705SXin Li namespace MixedDeclarationIntegerArgument {
1285*67e74705SXin Li template<typename T, T n> class A{};
1286*67e74705SXin Li int x;
1287*67e74705SXin Li int y[5];
1288*67e74705SXin Li
1289*67e74705SXin Li A<int, 5> a1 = A<int&, x>();
1290*67e74705SXin Li A<int, 5 - 1> a2 = A<int*, &x>();
1291*67e74705SXin Li A<int, 5 + 1> a3 = A<int*, y>();
1292*67e74705SXin Li A<int, 0> a4 = A<int**, nullptr>();
1293*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int &, x>' to 'A<int, 5>'
1294*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int *, &x>' to 'A<int, 5 - 1 aka 4>'
1295*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int *, y>' to 'A<int, 5 + 1 aka 6>'
1296*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int **, nullptr>' to 'A<int, 0>'
1297*67e74705SXin Li // CHECK-ELIDE-TREE: error: no viable conversion
1298*67e74705SXin Li // CHECK-ELIDE-TREE: A<
1299*67e74705SXin Li // CHECK-ELIDE-TREE: [int & != int],
1300*67e74705SXin Li // CHECK-ELIDE-TREE: [x != 5]>
1301*67e74705SXin Li // CHECK-ELIDE-TREE: error: no viable conversion
1302*67e74705SXin Li // CHECK-ELIDE-TREE: A<
1303*67e74705SXin Li // CHECK-ELIDE-TREE: [int * != int],
1304*67e74705SXin Li // CHECK-ELIDE-TREE: [&x != 5 - 1 aka 4]>
1305*67e74705SXin Li // CHECK-ELIDE-TREE: error: no viable conversion
1306*67e74705SXin Li // CHECK-ELIDE-TREE: A<
1307*67e74705SXin Li // CHECK-ELIDE-TREE: [int * != int],
1308*67e74705SXin Li // CHECK-ELIDE-TREE: [y != 5 + 1 aka 6]>
1309*67e74705SXin Li // CHECK-ELIDE-TREE: error: no viable conversion
1310*67e74705SXin Li // CHECK-ELIDE-TREE: A<
1311*67e74705SXin Li // CHECK-ELIDE-TREE: [int ** != int],
1312*67e74705SXin Li // CHECK-ELIDE-TREE: [nullptr != 0]>
1313*67e74705SXin Li
1314*67e74705SXin Li A<int&, x> a5 = A<int, 3>();
1315*67e74705SXin Li A<int*, &x> a6 = A<int, 3 - 1>();
1316*67e74705SXin Li A<int*, y> a7 = A<int, 3 + 1>();
1317*67e74705SXin Li A<int**, nullptr> a8 = A<int, 3>();
1318*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int, 3>' to 'A<int &, x>'
1319*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int, 3 - 1 aka 2>' to 'A<int *, &x>'
1320*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int, 3 + 1 aka 4>' to 'A<int *, y>'
1321*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<int, 3>' to 'A<int **, nullptr>'
1322*67e74705SXin Li // CHECK-ELIDE-TREE: error: no viable conversion
1323*67e74705SXin Li // CHECK-ELIDE-TREE: A<
1324*67e74705SXin Li // CHECK-ELIDE-TREE: [int != int &],
1325*67e74705SXin Li // CHECK-ELIDE-TREE: [3 != x]>
1326*67e74705SXin Li // CHECK-ELIDE-TREE: error: no viable conversion
1327*67e74705SXin Li // CHECK-ELIDE-TREE: A<
1328*67e74705SXin Li // CHECK-ELIDE-TREE: [int != int *],
1329*67e74705SXin Li // CHECK-ELIDE-TREE: [3 - 1 aka 2 != &x]>
1330*67e74705SXin Li // CHECK-ELIDE-TREE: error: no viable conversion
1331*67e74705SXin Li // CHECK-ELIDE-TREE: A<
1332*67e74705SXin Li // CHECK-ELIDE-TREE: [int != int *],
1333*67e74705SXin Li // CHECK-ELIDE-TREE: [3 + 1 aka 4 != y]>
1334*67e74705SXin Li // CHECK-ELIDE-TREE: error: no viable conversion
1335*67e74705SXin Li // CHECK-ELIDE-TREE: A<
1336*67e74705SXin Li // CHECK-ELIDE-TREE: [int != int **],
1337*67e74705SXin Li // CHECK-ELIDE-TREE: [3 != nullptr]>
1338*67e74705SXin Li
1339*67e74705SXin Li template<class T, T n = x> class B{} ;
1340*67e74705SXin Li B<int, 5> b1 = B<int&>();
1341*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no viable conversion from 'B<int &, (default) x>' to 'B<int, 5>'
1342*67e74705SXin Li // CHECK-ELIDE-TREE: error: no viable conversion
1343*67e74705SXin Li // CHECK-ELIDE-TREE: B<
1344*67e74705SXin Li // CHECK-ELIDE-TREE: [int & != int],
1345*67e74705SXin Li // CHECK-ELIDE-TREE: [(default) x != 5]>
1346*67e74705SXin Li
1347*67e74705SXin Li B<int &> b2 = B<int, 2>();
1348*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no viable conversion from 'B<int, 2>' to 'B<int &, (default) x>'
1349*67e74705SXin Li // CHECK-ELIDE-TREE: B<
1350*67e74705SXin Li // CHECK-ELIDE-TREE: [int != int &],
1351*67e74705SXin Li // CHECK-ELIDE-TREE: [2 != (default) x]>
1352*67e74705SXin Li
1353*67e74705SXin Li template<class T, T n = 11> class C {};
1354*67e74705SXin Li C<int> c1 = C<int&, x>();
1355*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no viable conversion from 'C<int &, x>' to 'C<int, (default) 11>'
1356*67e74705SXin Li // CHECK-ELIDE-TREE: error: no viable conversion
1357*67e74705SXin Li // CHECK-ELIDE-TREE: C<
1358*67e74705SXin Li // CHECK-ELIDE-TREE: [int & != int],
1359*67e74705SXin Li // CHECK-ELIDE-TREE: [x != (default) 11]>
1360*67e74705SXin Li
1361*67e74705SXin Li C<int &, x> c2 = C<int>();
1362*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no viable conversion from 'C<int, (default) 11>' to 'C<int &, x>'
1363*67e74705SXin Li // CHECK-ELIDE-TREE: C<
1364*67e74705SXin Li // CHECK-ELIDE-TREE: [int != int &],
1365*67e74705SXin Li // CHECK-ELIDE-TREE: [(default) 11 != x]>
1366*67e74705SXin Li }
1367*67e74705SXin Li
1368*67e74705SXin Li namespace default_args {
1369*67e74705SXin Li template <int x, int y = 1+1, int z = 2>
1370*67e74705SXin Li class A {};
1371*67e74705SXin Li
1372*67e74705SXin Li void foo(A<0> &M) {
1373*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'A<[...], (default) 1 + 1 aka 2, (default) 2>' to 'A<[...], 0, 0>'
1374*67e74705SXin Li A<0, 0, 0> N = M;
1375*67e74705SXin Li
1376*67e74705SXin Li // CHECK-ELIDE-NOTREE: no viable conversion from 'A<[2 * ...], (default) 2>' to 'A<[2 * ...], 0>'
1377*67e74705SXin Li A<0, 2, 0> N2 = M;
1378*67e74705SXin Li }
1379*67e74705SXin Li }
1380*67e74705SXin Li
1381*67e74705SXin Li namespace DefaultNonTypeArgWithDependentType {
1382*67e74705SXin Li // We used to crash diffing integer template arguments when the argument type
1383*67e74705SXin Li // is dependent and default arguments were used.
1384*67e74705SXin Li template <typename SizeType = int, SizeType = 0> struct A {};
1385*67e74705SXin Li template <typename R = A<>> R bar();
1386*67e74705SXin Li A<> &foo() { return bar(); }
1387*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: non-const lvalue reference to type 'A<...>' cannot bind to a temporary of type 'A<...>'
1388*67e74705SXin Li // CHECK-NOELIDE-NOTREE: error: non-const lvalue reference to type 'A<int, 0>' cannot bind to a temporary of type 'A<int, 0>'
1389*67e74705SXin Li }
1390*67e74705SXin Li
1391*67e74705SXin Li namespace PR24587 {
1392*67e74705SXin Li template <typename T, T v>
1393*67e74705SXin Li struct integral_constant {};
1394*67e74705SXin Li
1395*67e74705SXin Li auto false_ = integral_constant<bool, false> {};
1396*67e74705SXin Li
1397*67e74705SXin Li template <typename T>
1398*67e74705SXin Li void f(T, decltype(false_));
1399*67e74705SXin Li
1400*67e74705SXin Li void run() {
1401*67e74705SXin Li f(1, integral_constant<bool, true>{});
1402*67e74705SXin Li }
1403*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no matching function for call to 'f'
1404*67e74705SXin Li // CHECK-ELIDE-NOTREE: note: candidate function [with T = int] not viable: no known conversion from 'integral_constant<[...], true>' to 'integral_constant<[...], false>' for 2nd argument
1405*67e74705SXin Li }
1406*67e74705SXin Li
1407*67e74705SXin Li namespace ZeroArgs {
1408*67e74705SXin Li template <int N = 0> class A {};
1409*67e74705SXin Li template <class T = A<>> class B {};
1410*67e74705SXin Li A<1> a1 = A<>();
1411*67e74705SXin Li A<> a2 = A<1>();
1412*67e74705SXin Li B<> b1 = B<int>();
1413*67e74705SXin Li B<int> b2 = B<>();
1414*67e74705SXin Li B<> b3 = B<const A<>>();
1415*67e74705SXin Li B<const A<>> b4 = B<>();
1416*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<(default) 0>' to 'A<1>'
1417*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<1>' to 'A<(default) 0>'
1418*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no viable conversion from 'B<int>' to 'B<(default) ZeroArgs::A<0>>'
1419*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no viable conversion from 'B<(default) ZeroArgs::A<0>>' to 'B<int>'
1420*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no viable conversion from 'B<const A<...>>' to 'B<A<...>>'
1421*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no viable conversion from 'B<A<...>>' to 'B<const A<...>>'
1422*67e74705SXin Li }
1423*67e74705SXin Li
1424*67e74705SXin Li namespace TypeAlias {
1425*67e74705SXin Li
1426*67e74705SXin Li template <typename T> class vector {};
1427*67e74705SXin Li
1428*67e74705SXin Li template <int Dimension> class Point;
1429*67e74705SXin Li template <int dimension, typename T> using Polygon = vector<Point<dimension>>;
1430*67e74705SXin Li
1431*67e74705SXin Li void foo(Polygon<3, float>);
1432*67e74705SXin Li void bar() { foo(Polygon<2, float>()); }
1433*67e74705SXin Li
1434*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no matching function for call to 'foo'
1435*67e74705SXin Li // CHECK-ELIDE-NOTREE: note: candidate function not viable: no known conversion from 'Polygon<2, [...]>' to 'Polygon<3, [...]>' for 1st argument
1436*67e74705SXin Li
1437*67e74705SXin Li enum class X {
1438*67e74705SXin Li X1,
1439*67e74705SXin Li X2,
1440*67e74705SXin Li };
1441*67e74705SXin Li
1442*67e74705SXin Li template<X x> struct EnumToType;
1443*67e74705SXin Li
1444*67e74705SXin Li template <> struct EnumToType<X::X1> { using type = int; };
1445*67e74705SXin Li
1446*67e74705SXin Li template <> struct EnumToType<X::X2> { using type = double; };
1447*67e74705SXin Li
1448*67e74705SXin Li
1449*67e74705SXin Li template <X x> using VectorType = vector<typename EnumToType<x>::type>;
1450*67e74705SXin Li
1451*67e74705SXin Li template <X x> void D(const VectorType<x>&);
1452*67e74705SXin Li
1453*67e74705SXin Li void run() {
1454*67e74705SXin Li D<X::X1>(VectorType<X::X2>());
1455*67e74705SXin Li }
1456*67e74705SXin Li // CHECK-ELIDE-NOTREE: error: no matching function for call to 'D'
1457*67e74705SXin Li // CHECK-ELIDE-NOTREE: note: candidate function [with x = TypeAlias::X::X1] not viable: no known conversion from 'VectorType<X::X2>' to 'const VectorType<(TypeAlias::X)0>' for 1st argument
1458*67e74705SXin Li
1459*67e74705SXin Li }
1460*67e74705SXin Li
1461*67e74705SXin Li // CHECK-ELIDE-NOTREE: {{[0-9]*}} errors generated.
1462*67e74705SXin Li // CHECK-NOELIDE-NOTREE: {{[0-9]*}} errors generated.
1463*67e74705SXin Li // CHECK-ELIDE-TREE: {{[0-9]*}} errors generated.
1464*67e74705SXin Li // CHECK-NOELIDE-TREE: {{[0-9]*}} errors generated.
1465