79 lines
1.7 KiB
C++
79 lines
1.7 KiB
C++
// 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>); }
|
|
}
|