2009-12-16 04:14:24 +08:00
// RUN: %clang_cc1 -fsyntax-only -verify %s
2009-03-26 08:10:35 +08:00
template < typename T >
struct X {
X < T * > * ptr ;
} ;
X < int > x ;
template < >
struct X < int * * * > {
typedef X < int * * * > * ptr ;
} ;
2010-01-14 01:31:36 +08:00
X < float > : : X < int > xi = x ; // expected-error{{qualified reference to 'X' is a constructor name rather than a template name wherever a constructor can be declared}}
2009-05-11 06:57:19 +08:00
// [temp.local]p1:
2009-07-30 00:09:57 +08:00
// FIXME: test template template parameters
2009-05-11 06:57:19 +08:00
template < typename T , typename U >
struct X0 {
typedef T type ;
typedef U U_type ;
typedef U_type U_type2 ;
void f0 ( const X0 & ) ; // expected-note{{here}}
void f0 ( X0 & ) ;
void f0 ( const X0 < T , U > & ) ; // expected-error{{redecl}}
void f1 ( const X0 & ) ; // expected-note{{here}}
void f1 ( X0 & ) ;
void f1 ( const X0 < type , U_type2 > & ) ; // expected-error{{redecl}}
void f2 ( const X0 & ) ; // expected-note{{here}}
void f2 ( X0 & ) ;
void f2 ( const : : X0 < type , U_type2 > & ) ; // expected-error{{redecl}}
} ;
2009-07-30 00:09:57 +08:00
template < typename T , T N >
struct X1 {
void f0 ( const X1 & ) ; // expected-note{{here}}
void f0 ( X1 & ) ;
void f0 ( const X1 < T , N > & ) ; // expected-error{{redecl}}
} ;
2010-03-10 11:28:59 +08:00
namespace pr6326 {
template < class T > class A {
friend class A ;
} ;
template class A < int > ;
}
2010-04-30 12:39:27 +08:00
namespace ForwardDecls {
template < typename T >
struct X ;
template < typename T >
struct X {
typedef T foo ;
typedef X < T > xt ;
typename xt : : foo * t ;
} ;
}