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