// RUN: %clang_cc1 -fsyntax-only -verify %s // RUN: not %clang_cc1 -fsyntax-only %s 2>&1 | FileCheck %s namespace ambig { struct Foo { operator int(); operator const char *(); }; void func(const char*, long); void func(const char*, const char*); void func(int, int); bool doit(Foo x) { func(x, x); // expected-error {{call to 'func' is ambiguous}} // expected-note@* 3{{candidate}} // Check that two functions with best conversions are at the top. // CHECK: error: call to 'func' is ambiguous // CHECK-NEXT: func(x, x) // CHECK-NEXT: ^~~~ // CHECK-NEXT: note: candidate function // CHECK-NEXT: void func(const char*, const char*) // CHECK-NEXT: ^ // CHECK-NEXT: note: candidate function // CHECK-NEXT: void func(int, int) } } namespace bad_conversion { struct Foo { operator int(); operator const char *(); }; void func(double*, const char*, long); void func(double*, const char*, const char*); void func(double*, int, int); bool doit(Foo x) { func((int*)0, x, x); // expected-error {{no matching function for call to 'func'}} // expected-note@* 3{{candidate}} // Check that two functions with best conversions are at the top. // CHECK: error: no matching function for call to 'func' // CHECK-NEXT: func((int*)0, x, x) // CHECK-NEXT: ^~~~ // CHECK-NEXT: note: candidate function // CHECK-NEXT: void func(double*, const char*, const char*) // CHECK-NEXT: ^ // CHECK-NEXT: note: candidate function // CHECK-NEXT: void func(double*, int, int) } } namespace bad_deduction { template struct templ {}; template void func(templ); template void func(T*); template auto func(T&) -> decltype(T().begin()); template auto func(const T&) -> decltype(T().begin()); bool doit() { struct record {} r; func(r); // expected-error {{no matching function for call to 'func'}} // expected-note@* 4{{candidate}} } }