Home | History | Annotate | Download | only in Misc
      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