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
4template<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 argument
11// 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 type
18// 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 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
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 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
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 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
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 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
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 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
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 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