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 | |