xref: /aosp_15_r20/external/clang/test/Misc/diag-template-diffing-cxx98.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: not %clang_cc1 -fsyntax-only %s -std=c++98 2>&1 | FileCheck %s
2*67e74705SXin Li 
3*67e74705SXin Li namespace PR14342 {
4*67e74705SXin Li   template<typename T, char a> struct X {};
5*67e74705SXin Li   X<int, 1> x = X<long, 257>();
6*67e74705SXin Li   // CHECK: error: no viable conversion from 'X<long, [...]>' to 'X<int, [...]>'
7*67e74705SXin Li }
8*67e74705SXin Li 
9*67e74705SXin Li namespace PR15513 {
10*67e74705SXin Li   template <int x, int y = x+1>
11*67e74705SXin Li   class A {};
12*67e74705SXin Li 
foo(A<0> & M)13*67e74705SXin Li   void foo(A<0> &M) {
14*67e74705SXin Li     // CHECK: no viable conversion from 'A<[...], (default) x + 1 aka 1>' to 'A<[...], 0>'
15*67e74705SXin Li     A<0, 0> N = M;
16*67e74705SXin Li    // CHECK: no viable conversion from 'A<0, [...]>' to 'A<1, [...]>'
17*67e74705SXin Li     A<1, 1> O = M;
18*67e74705SXin Li   }
19*67e74705SXin Li }
20*67e74705SXin Li 
21*67e74705SXin Li namespace default_args {
22*67e74705SXin Li   template <int x, int y = 1+1, int z = 2>
23*67e74705SXin Li   class A {};
24*67e74705SXin Li 
foo(A<0> & M)25*67e74705SXin Li   void foo(A<0> &M) {
26*67e74705SXin Li     // CHECK: no viable conversion from 'A<[...], (default) 1 + 1 aka 2, (default) 2>' to 'A<[...], 0, 0>'
27*67e74705SXin Li     A<0, 0, 0> N = M;
28*67e74705SXin Li 
29*67e74705SXin Li     // CHECK: no viable conversion from 'A<[2 * ...], (default) 2>' to 'A<[2 * ...], 0>'
30*67e74705SXin Li     A<0, 2, 0> N2 = M;
31*67e74705SXin Li   }
32*67e74705SXin Li 
33*67e74705SXin Li }
34*67e74705SXin Li 
35*67e74705SXin Li namespace qualifiers {
36*67e74705SXin Li   template <class T>
foo(void (func (T *)),T *)37*67e74705SXin Li   void foo(void (func(T*)), T*) {}
38*67e74705SXin Li 
39*67e74705SXin Li   template <class T>
40*67e74705SXin Li   class vector{};
41*67e74705SXin Li 
bar(const vector<int> *)42*67e74705SXin Li   void bar(const vector<int>*) {}
43*67e74705SXin Li 
test(volatile vector<int> * V)44*67e74705SXin Li   void test(volatile vector<int>* V) {
45*67e74705SXin Li     foo(bar, V);
46*67e74705SXin Li   }
47*67e74705SXin Li 
48*67e74705SXin Li   // CHECK: candidate template ignored: deduced conflicting types for parameter 'T' ('const vector<...>' vs. 'volatile vector<...>')
49*67e74705SXin Li }
50