f4a2713ac8
Change-Id: Ia40e9ffdf29b5dab2f122f673ff6802a58bc690f
42 lines
1.4 KiB
C++
42 lines
1.4 KiB
C++
// RUN: %clang_cc1 -fsyntax-only -verify %s
|
|
template<typename T> class A; // expected-note 2 {{template parameter is declared here}} expected-note{{template is declared here}}
|
|
|
|
// [temp.arg.type]p1
|
|
A<0> *a1; // expected-error{{template argument for template type parameter must be a type}}
|
|
|
|
A<A> *a2; // expected-error{{use of class template 'A' requires template arguments}}
|
|
|
|
A<int> *a3;
|
|
A<int()> *a4;
|
|
A<int(float)> *a5;
|
|
A<A<int> > *a6;
|
|
|
|
// Pass an overloaded function template:
|
|
template<typename T> void function_tpl(T);
|
|
A<function_tpl> a7; // expected-error{{template argument for template type parameter must be a type}}
|
|
|
|
// Pass a qualified name:
|
|
namespace ns {
|
|
template<typename T> class B {}; // expected-note{{template is declared here}}
|
|
}
|
|
A<ns::B> a8; // expected-error{{use of class template 'ns::B' requires template arguments}}
|
|
|
|
// [temp.arg.type]p2
|
|
void f() {
|
|
class X { };
|
|
A<X> * a = 0; // expected-warning{{template argument uses local type 'X'}}
|
|
}
|
|
|
|
struct { int x; } Unnamed; // expected-note{{unnamed type used in template argument was declared here}}
|
|
A<__typeof__(Unnamed)> *a9; // expected-warning{{template argument uses unnamed type}}
|
|
|
|
template<typename T, unsigned N>
|
|
struct Array {
|
|
typedef struct { T x[N]; } type;
|
|
};
|
|
|
|
template<typename T> struct A1 { };
|
|
A1<Array<int, 17>::type> ax;
|
|
|
|
// FIXME: [temp.arg.type]p3. The check doesn't really belong here (it
|
|
// belongs somewhere in the template instantiation section).
|