// RUN: %clang_cc1 -fsyntax-only -verify %s
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
template<class X, class Y, class Z> X f(Y,Z); // expected-note {{candidate template ignored: couldn't infer template argument 'X'}}
void g() {
f<int,char*,double>("aa",3.0);
#if __cplusplus <= 199711L // C++03 or earlier modes
// expected-warning@-2{{conversion from string literal to 'char *' is deprecated}}
#else
// expected-warning@-4{{ISO C++11 does not allow conversion from string literal to 'char *'}}
#endif
f<int,char*>("aa",3.0); // Z is deduced to be double
#if __cplusplus <= 199711L
// expected-warning@-2{{conversion from string literal to 'char *' is deprecated}}
#else
// expected-warning@-4{{ISO C++11 does not allow conversion from string literal to 'char *'}}
#endif
f<int>("aa",3.0); // Y is deduced to be char*, and
// Z is deduced to be double
f("aa",3.0); // expected-error{{no matching}}
}
// PR5910
namespace PR5910 {
template <typename T>
void Func() {}
template <typename R>
void Foo(R (*fp)());
void Test() {
Foo(Func<int>);
}
}
// PR5949
namespace PR5949 {
struct Bar;
template <class Container>
void quuz(const Container &cont) {
}
template<typename T>
int Foo(Bar *b, void (*Baz)(const T &t), T * = 0) {
return 0;
}
template<typename T>
int Quux(Bar *b, T * = 0)
{
return Foo<T>(b, quuz);
}
}
// PR7641
namespace PR7641 {
namespace N2
{
template<class>
int f0(int);
}
namespace N
{
using N2::f0;
}
template<class R,class B1>
int
f1(R(a)(B1));
void f2()
{ f1(N::f0<int>); }
}