2009-12-16 04:14:24 +08:00
// RUN: %clang_cc1 -fsyntax-only -verify %s
2009-02-07 06:42:48 +08:00
template < typename T > class A ;
extern " C++ " {
template < typename T > class B ;
}
namespace N {
template < typename T > class C ;
}
extern " C " {
template < typename T > class D ; // expected-error{{templates must have C++ linkage}}
}
2009-05-04 01:18:57 +08:00
template < class U > class A ; // expected-note{{previous template declaration is here}}
2009-02-07 06:42:48 +08:00
template < int N > class A ; // expected-error{{template parameter has a different kind in template redeclaration}}
template < int N > class NonTypeTemplateParm ;
typedef int INT ;
2009-02-20 07:45:49 +08:00
template < INT M > class NonTypeTemplateParm ; // expected-note{{previous non-type template parameter with type 'INT' (aka 'int') is here}}
2009-02-07 06:42:48 +08:00
template < long > class NonTypeTemplateParm ; // expected-error{{template non-type parameter has a different type 'long' in template redeclaration}}
template < template < typename T > class X > class TemplateTemplateParm ;
template < template < class > class Y > class TemplateTemplateParm ; / / expected - note { { previous template declaration is here } } \
// expected-note{{previous template template parameter is here}}
template < typename > class TemplateTemplateParm ; // expected-error{{template parameter has a different kind in template redeclaration}}
template < template < typename T , int > class X > class TemplateTemplateParm ; // expected-error{{too many template parameters in template template parameter redeclaration}}
2009-06-23 07:20:33 +08:00
template < typename T >
struct test { } ; // expected-note{{previous definition}}
template < typename T >
struct test : T { } ; // expected-error{{redefinition}}
2009-02-07 06:42:48 +08:00
class X {
public :
template < typename T > class C ;
} ;
void f ( ) {
2009-11-06 04:02:41 +08:00
template < typename T > class X ; // expected-error{{expression}}
2009-02-07 06:42:48 +08:00
}
2009-11-06 04:54:04 +08:00
2011-07-15 05:35:26 +08:00
template < typename T > class X1 var ; // expected-error{{declared as a template}}
2010-04-13 00:00:01 +08:00
namespace M {
}
template < typename T > class M : : C3 { } ; // expected-error{{out-of-line definition of 'C3' does not match any declaration in namespace 'M'}}
2010-11-09 07:29:42 +08:00
namespace PR8001 {
template < typename T1 >
struct Foo {
template < typename T2 > class Bar ;
typedef Bar < T1 > Baz ;
template < typename T2 >
struct Bar {
Bar ( ) { }
} ;
} ;
void pr8001 ( ) {
Foo < int > : : Baz x ;
Foo < int > : : Bar < int > y ( x ) ;
}
}