1 // RUN: %clang_cc1 -fsyntax-only -verify %s 2 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s 3 // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s 4 5 template<class X, class Y, class Z> X f(Y,Z); // expected-note {{candidate template ignored: couldn't infer template argument 'X'}} 6 7 void g() { 8 f<int,char*,double>("aa",3.0); 9 #if __cplusplus <= 199711L // C++03 or earlier modes 10 // expected-warning@-2{{conversion from string literal to 'char *' is deprecated}} 11 #else 12 // expected-warning@-4{{ISO C++11 does not allow conversion from string literal to 'char *'}} 13 #endif 14 15 f<int,char*>("aa",3.0); // Z is deduced to be double 16 #if __cplusplus <= 199711L 17 // expected-warning@-2{{conversion from string literal to 'char *' is deprecated}} 18 #else 19 // expected-warning@-4{{ISO C++11 does not allow conversion from string literal to 'char *'}} 20 #endif 21 22 f<int>("aa",3.0); // Y is deduced to be char*, and 23 // Z is deduced to be double 24 f("aa",3.0); // expected-error{{no matching}} 25 } 26 27 // PR5910 28 namespace PR5910 { 29 template <typename T> 30 void Func() {} 31 32 template <typename R> 33 void Foo(R (*fp)()); 34 35 void Test() { 36 Foo(Func<int>); 37 } 38 } 39 40 // PR5949 41 namespace PR5949 { 42 struct Bar; 43 44 template <class Container> 45 void quuz(const Container &cont) { 46 } 47 48 template<typename T> 49 int Foo(Bar *b, void (*Baz)(const T &t), T * = 0) { 50 return 0; 51 } 52 53 template<typename T> 54 int Quux(Bar *b, T * = 0) 55 { 56 return Foo<T>(b, quuz); 57 } 58 } 59 60 // PR7641 61 namespace PR7641 { 62 namespace N2 63 { 64 template<class> 65 int f0(int); 66 } 67 namespace N 68 { 69 using N2::f0; 70 } 71 72 template<class R,class B1> 73 int 74 f1(R(a)(B1)); 75 76 void f2() 77 { f1(N::f0<int>); } 78 } 79