1 | // RUN: not %clang_cc1 -fsyntax-only -std=c++11 -fcolor-diagnostics %s 2>&1 | FileCheck %s |
2 | // RUN: not %clang_cc1 -fsyntax-only -std=c++11 -fcolor-diagnostics -fdiagnostics-show-template-tree %s 2>&1 | FileCheck %s -check-prefix=TREE |
3 | // REQUIRES: ansi-escape-sequences |
4 | template<typename> struct foo {}; |
5 | void func(foo<int>); |
6 | int main() { |
7 | func(foo<double>()); |
8 | } |
9 | // CHECK: {{.*}}candidate function not viable: no known conversion from 'foo<[[CYAN:.\[0;1;36m]]double[[RESET:.\[0m]]>' to 'foo<[[CYAN]]int[[RESET]]>' for 1st argument[[RESET]] |
10 | // TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument |
11 | // TREE: foo< |
12 | // TREE: {{\[}}[[CYAN:.\[0;1;36m]]double[[RESET:.\[0m]] != [[CYAN]]int[[RESET]]]>[[RESET]] |
13 | |
14 | foo<int> A; |
15 | foo<double> &B = A; |
16 | // CHECK: {{.*}}non-const lvalue reference to type 'foo<[[CYAN]]double[[RESET]][[BOLD:.\[1m]]>' cannot bind to a value of unrelated type 'foo<[[CYAN]]int[[RESET]][[BOLD]]>'[[RESET]] |
17 | // TREE: non-const lvalue reference cannot bind to a value of unrelated type |
18 | // TREE: foo< |
19 | // TREE: {{\[}}[[CYAN]]double[[RESET]][[BOLD:.\[1m]] != [[CYAN]]int[[RESET]][[BOLD]]]>[[RESET]] |
20 | |
21 | template<typename> class vector {}; |
22 | |
23 | void set15(vector<const vector<int> >) {} |
24 | void test15() { |
25 | set15(vector<const vector<const int> >()); |
26 | } |
27 | // CHECK: {{.*}}candidate function not viable: no known conversion from 'vector<const vector<[[CYAN]]const{{ ?}}[[RESET]]{{ ?}}int>>' to 'vector<const vector<int>>' for 1st argument |
28 | // TREE: {{.*}}candidate function not viable: no known conversion from argument type to parameter type for 1st argument |
29 | // TREE: vector< |
30 | // TREE: const vector< |
31 | // TREE: {{\[}}[[CYAN]]const{{ ?}}[[RESET]]{{ ?}}!= [[CYAN]](no qualifiers)[[RESET]]] int>> |
32 | |
33 | void set16(vector<vector<int> >) {} |
34 | void test16() { |
35 | set16(vector<const vector<int> >()); |
36 | } |
37 | // CHECK: {{.*}}candidate function not viable: no known conversion from 'vector<[[CYAN]]const{{ ?}}[[RESET]]{{ ?}}vector<...>>' to 'vector<vector<...>>' for 1st argument |
38 | // TREE: {{.*}}candidate function not viable: no known conversion from argument type to parameter type for 1st argument |
39 | // TREE: vector< |
40 | // TREE: {{\[}}[[CYAN]]const{{ ?}}[[RESET]]{{ ?}}!= [[CYAN]](no qualifiers){{ ?}}[[RESET]]]{{ ?}}vector<...>> |
41 | |
42 | void set17(vector<const vector<int> >) {} |
43 | void test17() { |
44 | set17(vector<vector<int> >()); |
45 | } |
46 | // CHECK: candidate function not viable: no known conversion from 'vector<vector<...>>' to 'vector<[[CYAN]]const{{ ?}}[[RESET]]{{ ?}}vector<...>>' for 1st argument |
47 | // TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument |
48 | // TREE: vector< |
49 | // TREE: {{\[}}[[CYAN]](no qualifiers){{ ?}}[[RESET]]{{ ?}}!= [[CYAN]]const[[RESET]]] vector<...>> |
50 | |
51 | void set18(vector<volatile vector<int> >) {} |
52 | void test18() { |
53 | set18(vector<const vector<int> >()); |
54 | } |
55 | // CHECK: candidate function not viable: no known conversion from 'vector<[[CYAN]]const{{ ?}}[[RESET]]{{ ?}}vector<...>>' to 'vector<[[CYAN]]volatile{{ ?}}[[RESET]]{{ ?}}vector<...>>' for 1st argument |
56 | // TREE: no matching function for call to 'set18' |
57 | // TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument |
58 | // TREE: vector< |
59 | // TREE: {{\[}}[[CYAN]]const{{ ?}}[[RESET]]{{ ?}}!= [[CYAN]]volatile[[RESET]]] vector<...>> |
60 | |
61 | void set19(vector<const volatile vector<int> >) {} |
62 | void test19() { |
63 | set19(vector<const vector<int> >()); |
64 | } |
65 | // CHECK: candidate function not viable: no known conversion from 'vector<const vector<...>>' to 'vector<const [[CYAN]]volatile{{ ?}}[[RESET]]{{ ?}}vector<...>>' for 1st argument |
66 | // TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument |
67 | // TREE: vector< |
68 | // TREE: [const != const [[CYAN]]volatile[[RESET]]] vector<...>> |
69 | |
70 | namespace default_args { |
71 | template <int x, int y = 1+1, int z = 2> |
72 | class A {}; |
73 | |
74 | void foo(A<0> &M) { |
75 | // CHECK: no viable conversion from 'A<[...], (default) [[CYAN]]1 + 1[[RESET]][[BOLD]] aka [[CYAN]]2[[RESET]][[BOLD]], (default) [[CYAN]]2[[RESET]][[BOLD]]>' to 'A<[...], [[CYAN]]0[[RESET]][[BOLD]], [[CYAN]]0[[RESET]][[BOLD]]>' |
76 | A<0, 0, 0> N = M; |
77 | |
78 | // CHECK: no viable conversion from 'A<[2 * ...], (default) [[CYAN]]2[[RESET]][[BOLD]]>' to 'A<[2 * ...], [[CYAN]]0[[RESET]][[BOLD]]>' |
79 | A<0, 2, 0> N2 = M; |
80 | } |
81 | } |
82 | |
83 | namespace MixedDeclarationIntegerArgument { |
84 | template<typename T, T n = 5> class A{}; |
85 | int x; |
86 | int y[5]; |
87 | A<int> a1 = A<int&, x>(); |
88 | // CHECK: no viable conversion from 'A<[[CYAN]]int &[[RESET]][[BOLD]], [[CYAN]]x[[RESET]][[BOLD]]>' to 'A<[[CYAN]]int[[RESET]][[BOLD]], (default) [[CYAN]]5[[RESET]][[BOLD]]>' |
89 | // TREE: no viable conversion |
90 | // TREE: A< |
91 | // TREE: {{\[}}[[CYAN]]int &[[RESET]][[BOLD]] != [[CYAN]]int[[RESET]][[BOLD]]], |
92 | // TREE: {{\[}}[[CYAN]]x[[RESET]][[BOLD]] != (default) [[CYAN]]5[[RESET]][[BOLD]]]> |
93 | |
94 | A<int**, nullptr> a2 = A<int, 3 + 1>(); |
95 | // CHECK-ELIDE-NOTREE: error: no viable conversion from 'A<[[CYAN]]int[[RESET]][[BOLD]], [[CYAN]]3 + 1[[RESET]][[BOLD]] aka [[CYAN]]4[[RESET]][[BOLD]]>' to 'A<[[CYAN]]int **[[RESET]][[BOLD]], [[CYAN]]nullptr[[RESET]][[BOLD]]>' |
96 | // TREE: no viable conversion |
97 | // TREE: A< |
98 | // TREE: {{\[}}[[CYAN]]int[[RESET]][[BOLD]] != [[CYAN]]int **[[RESET]][[BOLD]]], |
99 | // TREE: {{\[}}[[CYAN]]3 + 1[[RESET]][[BOLD]] aka [[CYAN]]4[[RESET]][[BOLD]] != [[CYAN]]nullptr[[RESET]][[BOLD]]]> |
100 | } |
101 | |