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