2009-12-28 06:31:18 +08:00
|
|
|
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
2015-12-10 09:07:17 +08:00
|
|
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s
|
|
|
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
|
2013-12-04 11:51:14 +08:00
|
|
|
// RUN: %clang_cc1 -fsyntax-only -verify %s -fdelayed-template-parsing
|
2015-12-10 09:07:17 +08:00
|
|
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s -fdelayed-template-parsing
|
|
|
|
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s -fdelayed-template-parsing
|
2009-12-28 06:31:18 +08:00
|
|
|
|
|
|
|
template<typename T> struct A {};
|
|
|
|
|
|
|
|
// Check for template argument lists followed by junk
|
|
|
|
// FIXME: The diagnostics here aren't great...
|
|
|
|
A<int+> int x; // expected-error {{expected '>'}} expected-error {{expected unqualified-id}}
|
2017-05-19 09:54:59 +08:00
|
|
|
A<int x; // expected-error {{expected '>'}}
|
2009-12-28 06:31:18 +08:00
|
|
|
|
2011-01-11 08:33:19 +08:00
|
|
|
// PR8912
|
|
|
|
template <bool> struct S {};
|
|
|
|
S<bool(2 > 1)> s;
|
2012-06-18 14:11:04 +08:00
|
|
|
|
|
|
|
// Test behavior when a template-id is ended by a token which starts with '>'.
|
|
|
|
namespace greatergreater {
|
|
|
|
template<typename T> struct S { S(); S(T); };
|
|
|
|
void f(S<int>=0); // expected-error {{a space is required between a right angle bracket and an equals sign (use '> =')}}
|
|
|
|
void f(S<S<int>>=S<int>()); // expected-error {{use '> >'}} expected-error {{use '> ='}}
|
|
|
|
template<typename T> void t();
|
|
|
|
void g() {
|
|
|
|
void (*p)() = &t<int>;
|
|
|
|
(void)(&t<int>==p); // expected-error {{use '> ='}}
|
|
|
|
(void)(&t<int>>=p); // expected-error {{use '> >'}}
|
2015-12-10 09:07:17 +08:00
|
|
|
(void)(&t<S<int>>>=p);
|
|
|
|
#if __cplusplus <= 199711L
|
|
|
|
// expected-error@-2 {{use '> >'}}
|
|
|
|
#endif
|
2012-06-18 14:11:04 +08:00
|
|
|
(void)(&t<S<int>>==p); // expected-error {{use '> >'}} expected-error {{use '> ='}}
|
|
|
|
}
|
|
|
|
}
|
2012-08-18 08:55:03 +08:00
|
|
|
|
|
|
|
namespace PR5925 {
|
|
|
|
template <typename x>
|
|
|
|
class foo { // expected-note {{here}}
|
|
|
|
};
|
|
|
|
void bar(foo *X) { // expected-error {{requires template arguments}}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
namespace PR13210 {
|
|
|
|
template <class T>
|
|
|
|
class C {}; // expected-note {{here}}
|
|
|
|
|
|
|
|
void f() {
|
|
|
|
new C(); // expected-error {{requires template arguments}}
|
|
|
|
}
|
|
|
|
}
|
2013-08-10 13:54:47 +08:00
|
|
|
|
|
|
|
// Don't emit spurious messages
|
|
|
|
namespace pr16225add {
|
|
|
|
|
|
|
|
template<class T1, typename T2> struct Known { }; // expected-note 3 {{template is declared here}}
|
|
|
|
template<class T1, typename T2> struct X;
|
|
|
|
template<class T1, typename T2> struct ABC; // expected-note {{template is declared here}}
|
|
|
|
template<int N1, int N2> struct ABC2 {};
|
|
|
|
|
|
|
|
template<class T1, typename T2> struct foo :
|
|
|
|
UnknownBase<T1,T2> // expected-error {{unknown template name 'UnknownBase'}}
|
|
|
|
{ };
|
|
|
|
|
|
|
|
template<class T1, typename T2> struct foo2 :
|
|
|
|
UnknownBase<T1,T2>, // expected-error {{unknown template name 'UnknownBase'}}
|
|
|
|
Known<T1> // expected-error {{too few template arguments for class template 'Known'}}
|
|
|
|
{ };
|
|
|
|
|
|
|
|
template<class T1, typename T2> struct foo3 :
|
|
|
|
UnknownBase<T1,T2,ABC<T2,T1> > // expected-error {{unknown template name 'UnknownBase'}}
|
|
|
|
{ };
|
|
|
|
|
|
|
|
template<class T1, typename T2> struct foo4 :
|
|
|
|
UnknownBase<T1,ABC<T2> >, // expected-error {{unknown template name 'UnknownBase'}} \
|
|
|
|
// expected-error {{too few template arguments for class template 'ABC'}}
|
|
|
|
Known<T1> // expected-error {{too few template arguments for class template 'Known'}}
|
|
|
|
{ };
|
|
|
|
|
|
|
|
template<class T1, typename T2> struct foo5 :
|
2015-12-10 09:07:17 +08:00
|
|
|
UnknownBase<T1,T2,ABC<T2,T1>> // expected-error {{unknown template name 'UnknownBase'}}
|
|
|
|
#if __cplusplus <= 199711L
|
|
|
|
// expected-error@-2 {{use '> >'}}
|
|
|
|
#endif
|
2013-08-10 13:54:47 +08:00
|
|
|
{ };
|
|
|
|
|
|
|
|
template<class T1, typename T2> struct foo6 :
|
2015-12-10 09:07:17 +08:00
|
|
|
UnknownBase<T1,ABC<T2,T1>>, // expected-error {{unknown template name 'UnknownBase'}}
|
|
|
|
#if __cplusplus <= 199711L
|
|
|
|
// expected-error@-2 {{use '> >'}}
|
|
|
|
#endif
|
2013-08-10 13:54:47 +08:00
|
|
|
Known<T1> // expected-error {{too few template arguments for class template 'Known'}}
|
|
|
|
{ };
|
|
|
|
|
|
|
|
template<class T1, typename T2, int N> struct foo7 :
|
|
|
|
UnknownBase<T1,T2,(N>1)> // expected-error {{unknown template name 'UnknownBase'}}
|
|
|
|
{ };
|
|
|
|
|
|
|
|
template<class T1, typename T2> struct foo8 :
|
2015-12-10 09:07:17 +08:00
|
|
|
UnknownBase<X<int,int>,X<int,int>> // expected-error {{unknown template name 'UnknownBase'}}
|
|
|
|
#if __cplusplus <= 199711L
|
|
|
|
// expected-error@-2 {{use '> >'}}
|
|
|
|
#endif
|
2013-08-10 13:54:47 +08:00
|
|
|
{ };
|
|
|
|
|
|
|
|
template<class T1, typename T2> struct foo9 :
|
2015-12-10 09:07:17 +08:00
|
|
|
UnknownBase<Known<int,int>,X<int,int>> // expected-error {{unknown template name 'UnknownBase'}}
|
|
|
|
#if __cplusplus <= 199711L
|
|
|
|
// expected-error@-2 {{use '> >'}}
|
|
|
|
#endif
|
2013-08-10 13:54:47 +08:00
|
|
|
{ };
|
|
|
|
|
|
|
|
template<class T1, typename T2> struct foo10 :
|
2015-12-10 09:07:17 +08:00
|
|
|
UnknownBase<Known<int,int>,X<int,X<int,int>>> // expected-error {{unknown template name 'UnknownBase'}}
|
|
|
|
#if __cplusplus <= 199711L
|
|
|
|
// expected-error@-2 {{use '> >'}}
|
|
|
|
#endif
|
2013-08-10 13:54:47 +08:00
|
|
|
{ };
|
|
|
|
|
|
|
|
template<int N1, int N2> struct foo11 :
|
|
|
|
UnknownBase<2<N1,N2<4> // expected-error {{unknown template name 'UnknownBase'}}
|
|
|
|
{ };
|
|
|
|
|
|
|
|
}
|
2014-09-24 05:05:52 +08:00
|
|
|
|
|
|
|
namespace PR18793 {
|
|
|
|
template<typename T, T> struct S {};
|
|
|
|
template<typename T> int g(S<T, (T())> *);
|
|
|
|
}
|