2016-01-15 13:01:53 +08:00
// RUN: not %clang_cc1 -fsyntax-only -std=c++11 -fcolor-diagnostics %s 2>&1 | FileCheck %s
// RUN: not %clang_cc1 -fsyntax-only -std=c++11 -fcolor-diagnostics -fdiagnostics-show-template-tree %s 2>&1 | FileCheck %s -check-prefix=TREE
2012-07-11 19:44:00 +08:00
// REQUIRES: ansi-escape-sequences
2012-06-29 05:46:07 +08:00
template < typename > struct foo { } ;
void func ( foo < int > ) ;
int main ( ) {
func ( foo < double > ( ) ) ;
}
2013-01-26 14:13:05 +08:00
// 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]]
2012-06-30 07:11:10 +08:00
// TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
2012-06-30 05:12:16 +08:00
// TREE: foo<
2013-01-26 14:13:05 +08:00
// TREE: {{\[}}[[CYAN:.\[0;1;36m]]double[[RESET:.\[0m]] != [[CYAN]]int[[RESET]]]>[[RESET]]
2012-06-30 05:12:16 +08:00
foo < int > A ;
foo < double > & B = A ;
2013-01-26 14:13:05 +08:00
// 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]]
2012-06-30 07:11:10 +08:00
// TREE: non-const lvalue reference cannot bind to a value of unrelated type
2012-06-30 05:12:16 +08:00
// TREE: foo<
2013-01-26 14:13:05 +08:00
// TREE: {{\[}}[[CYAN]]double[[RESET]][[BOLD:.\[1m]] != [[CYAN]]int[[RESET]][[BOLD]]]>[[RESET]]
2012-09-29 04:32:51 +08:00
template < typename > class vector { } ;
void set15 ( vector < const vector < int > > ) { }
void test15 ( ) {
set15 ( vector < const vector < const int > > ( ) ) ;
}
2013-01-26 14:13:05 +08:00
// CHECK: {{.*}}candidate function not viable: no known conversion from 'vector<const vector<[[CYAN]]const{{ ?}}[[RESET]]{{ ?}}int>>' to 'vector<const vector<int>>' for 1st argument
2012-09-29 04:32:51 +08:00
// TREE: {{.*}}candidate function not viable: no known conversion from argument type to parameter type for 1st argument
// TREE: vector<
// TREE: const vector<
2013-01-26 14:13:05 +08:00
// TREE: {{\[}}[[CYAN]]const{{ ?}}[[RESET]]{{ ?}}!= [[CYAN]](no qualifiers)[[RESET]]] int>>
2012-09-29 04:32:51 +08:00
void set16 ( vector < vector < int > > ) { }
void test16 ( ) {
set16 ( vector < const vector < int > > ( ) ) ;
}
2016-02-02 08:36:59 +08:00
// CHECK: {{.*}}candidate function not viable: no known conversion from 'vector<[[CYAN]]const{{ ?}}[[RESET]]{{ ?}}vector<...>>' to 'vector<vector<...>>' for 1st argument
2012-09-29 04:32:51 +08:00
// TREE: {{.*}}candidate function not viable: no known conversion from argument type to parameter type for 1st argument
// TREE: vector<
2016-02-02 08:36:59 +08:00
// TREE: {{\[}}[[CYAN]]const{{ ?}}[[RESET]]{{ ?}}!= [[CYAN]](no qualifiers){{ ?}}[[RESET]]]{{ ?}}vector<...>>
2012-09-29 04:32:51 +08:00
void set17 ( vector < const vector < int > > ) { }
void test17 ( ) {
set17 ( vector < vector < int > > ( ) ) ;
}
2016-02-02 08:36:59 +08:00
// CHECK: candidate function not viable: no known conversion from 'vector<vector<...>>' to 'vector<[[CYAN]]const{{ ?}}[[RESET]]{{ ?}}vector<...>>' for 1st argument
2012-09-29 04:32:51 +08:00
// TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
// TREE: vector<
2016-02-02 08:36:59 +08:00
// TREE: {{\[}}[[CYAN]](no qualifiers){{ ?}}[[RESET]]{{ ?}}!= [[CYAN]]const[[RESET]]] vector<...>>
2012-09-29 04:32:51 +08:00
void set18 ( vector < volatile vector < int > > ) { }
void test18 ( ) {
set18 ( vector < const vector < int > > ( ) ) ;
}
2016-02-02 08:36:59 +08:00
// CHECK: candidate function not viable: no known conversion from 'vector<[[CYAN]]const{{ ?}}[[RESET]]{{ ?}}vector<...>>' to 'vector<[[CYAN]]volatile{{ ?}}[[RESET]]{{ ?}}vector<...>>' for 1st argument
2012-09-29 04:32:51 +08:00
// TREE: no matching function for call to 'set18'
// TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
// TREE: vector<
2016-02-02 08:36:59 +08:00
// TREE: {{\[}}[[CYAN]]const{{ ?}}[[RESET]]{{ ?}}!= [[CYAN]]volatile[[RESET]]] vector<...>>
2012-09-29 04:32:51 +08:00
void set19 ( vector < const volatile vector < int > > ) { }
void test19 ( ) {
set19 ( vector < const vector < int > > ( ) ) ;
}
2016-02-02 08:36:59 +08:00
// CHECK: candidate function not viable: no known conversion from 'vector<const vector<...>>' to 'vector<const [[CYAN]]volatile{{ ?}}[[RESET]]{{ ?}}vector<...>>' for 1st argument
2012-09-29 04:32:51 +08:00
// TREE: candidate function not viable: no known conversion from argument type to parameter type for 1st argument
// TREE: vector<
2016-02-02 08:36:59 +08:00
// TREE: [const != const [[CYAN]]volatile[[RESET]]] vector<...>>
2013-03-16 07:55:09 +08:00
namespace default_args {
template < int x , int y = 1 + 1 , int z = 2 >
class A { } ;
void foo ( A < 0 > & M ) {
// 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]]>'
A < 0 , 0 , 0 > N = M ;
// CHECK: no viable conversion from 'A<[2 * ...], (default) [[CYAN]]2[[RESET]][[BOLD]]>' to 'A<[2 * ...], [[CYAN]]0[[RESET]][[BOLD]]>'
A < 0 , 2 , 0 > N2 = M ;
}
2016-01-15 13:01:53 +08:00
}
namespace MixedDeclarationIntegerArgument {
template < typename T , T n = 5 > class A { } ;
int x ;
int y [ 5 ] ;
A < int > a1 = A < int & , x > ( ) ;
// 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]]>'
// TREE: no viable conversion
// TREE: A<
// TREE: {{\[}}[[CYAN]]int &[[RESET]][[BOLD]] != [[CYAN]]int[[RESET]][[BOLD]]],
// TREE: {{\[}}[[CYAN]]x[[RESET]][[BOLD]] != (default) [[CYAN]]5[[RESET]][[BOLD]]]>
2013-03-16 07:55:09 +08:00
2016-01-15 13:01:53 +08:00
A < int * * , nullptr > a2 = A < int , 3 + 1 > ( ) ;
// 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]]>'
// TREE: no viable conversion
// TREE: A<
// TREE: {{\[}}[[CYAN]]int[[RESET]][[BOLD]] != [[CYAN]]int **[[RESET]][[BOLD]]],
// TREE: {{\[}}[[CYAN]]3 + 1[[RESET]][[BOLD]] aka [[CYAN]]4[[RESET]][[BOLD]] != [[CYAN]]nullptr[[RESET]][[BOLD]]]>
2013-03-16 07:55:09 +08:00
}