101 lines · cpp
1// RUN: not %clang_cc1 -fsyntax-only -std=c++11 -fcolor-diagnostics %s 2>&1 | FileCheck %s2// RUN: not %clang_cc1 -fsyntax-only -std=c++11 -fcolor-diagnostics -fdiagnostics-show-template-tree %s 2>&1 | FileCheck %s -check-prefix=TREE3// REQUIRES: ansi-escape-sequences4template<typename> struct foo {};5void func(foo<int>);6int 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 argument11// TREE: foo<12// TREE: {{\[}}[[CYAN:.\[0;1;36m]]double[[RESET:.\[0m]] != [[CYAN]]int[[RESET]]]>[[RESET]]13 14foo<int> A;15foo<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 type18// TREE: foo<19// TREE: {{\[}}[[CYAN]]double[[RESET]][[BOLD:.\[1m]] != [[CYAN]]int[[RESET]][[BOLD]]]>[[RESET]]20 21template<typename> class vector {};22 23void set15(vector<const vector<int> >) {}24void 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 argument28// TREE: {{.*}}candidate function not viable: no known conversion from argument type to parameter type for 1st argument29// TREE: vector<30// TREE: const vector<31// TREE: {{\[}}[[CYAN]]const{{ ?}}[[RESET]]{{ ?}}!= [[CYAN]](no qualifiers)[[RESET]]] int>>32 33void set16(vector<vector<int> >) {}34void 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 argument38// TREE: {{.*}}candidate function not viable: no known conversion from argument type to parameter type for 1st argument39// TREE: vector<40// TREE: {{\[}}[[CYAN]]const{{ ?}}[[RESET]]{{ ?}}!= [[CYAN]](no qualifiers){{ ?}}[[RESET]]]{{ ?}}vector<...>>41 42void set17(vector<const vector<int> >) {}43void 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 argument47// TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument48// TREE: vector<49// TREE: {{\[}}[[CYAN]](no qualifiers){{ ?}}[[RESET]]{{ ?}}!= [[CYAN]]const[[RESET]]] vector<...>>50 51void set18(vector<volatile vector<int> >) {}52void 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 argument56// 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 argument58// TREE: vector<59// TREE: {{\[}}[[CYAN]]const{{ ?}}[[RESET]]{{ ?}}!= [[CYAN]]volatile[[RESET]]] vector<...>>60 61void set19(vector<const volatile vector<int> >) {}62void 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 argument66// TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument67// TREE: vector<68// TREE: [const != const [[CYAN]]volatile[[RESET]]] vector<...>>69 70namespace 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 83namespace 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 conversion90 // 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 conversion97 // 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