2013-07-04 08:13:48 +08:00
// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s
2009-09-13 07:06:30 +08:00
2009-09-13 03:35:43 +08:00
struct x {
x ( ) : a ( 4 ) ; // expected-error {{expected '{'}}
} ;
struct y {
int a ;
y ( ) : a ( 4 ) ; // expected-error {{expected '{'}}
} ;
2011-09-30 16:32:17 +08:00
struct z {
int a ;
2013-07-04 08:13:48 +08:00
z ( ) : a { }
} ; // expected-error {{expected '{'}}
namespace PR16480 {
template < int n > struct X {
X ( ) ;
X ( int ) ;
} ;
struct A : X < 0 > {
A ( ) : X < a < b > { 0 } . n > ( ) { }
template < int > struct a {
int n ;
} ;
static const int b = 1 ;
} ;
struct B : X < 0 > {
B ( ) : X < a < b > { 0 } { }
static const int a = 0 , b = 0 ;
} ;
template < int > struct a {
constexpr a ( int ) { }
constexpr operator int ( ) const { return 0 ; }
} ;
struct C : X < 0 > {
C ( ) : X < a < b > ( 0 ) > ( ) { }
static const int b = 0 ;
} ;
struct D : X < 0 > {
D ( ) : X < a < b > ( 0 ) { }
static const int a = 0 , b = 0 ;
} ;
template < typename T > struct E : X < 0 > {
E ( X < 0 > ) : X < ( 0 ) > { } { }
E ( X < 1 > ) : X < int { } > { } { }
E ( X < 2 > ) : X < ( 0 ) > ( ) { }
E ( X < 3 > ) : X < int { } > ( ) { }
} ;
// FIXME: This should be valid in the union of C99 and C++11.
struct F : X < 0 > {
F ( ) : X < A < T > ( ) . n + ( T ) { } . n > { } { } // expected-error +{{}}
struct T { int n ; } ;
template < typename > struct A { int n ; } ;
2015-01-13 13:06:20 +08:00
} ;
2013-07-04 08:13:48 +08:00
// FIXME: This is valid now, but may be made ill-formed by DR1607.
struct G : X < 0 > {
G ( ) : X < 0 & & [ ] ( ) { return 0 ; } ( ) > { } // expected-error +{{}}
2015-01-13 13:06:20 +08:00
} ;
2013-07-04 08:13:48 +08:00
struct Errs : X < 0 > {
Errs ( X < 0 > ) : decltype X < 0 > ( ) { } // expected-error {{expected '(' after 'decltype'}}
Errs ( X < 1 > ) : what is this ( ) { } // expected-error {{expected '(' or '{'}}
Errs ( X < 2 > ) : decltype ( X < 0 > // expected-note {{to match this '('}}
} ; // expected-error {{expected ')'}}
}
2014-12-29 07:24:02 +08:00
template < class U , class V > struct C {
int f ( ) { return 4 ; }
class C1 { } ;
} ;
class D { } ;
namespace N {
struct E {
class F { } ;
} ;
}
class G {
// These are all valid:
void f ( int x = C < int , D > ( ) . f ( ) ) { }
void g ( int x = C < int , : : D > ( ) . f ( ) ) { }
void h ( int x = C < int , N : : E > ( ) . f ( ) ) { }
void i ( int x = C < int , : : N : : E > ( ) . f ( ) ) { }
void j ( int x = C < int , decltype ( N : : E ( ) ) : : F > ( ) . f ( ) ) { }
void k ( int x = C < int , C < int , int > > ( ) . f ( ) ) { }
void l ( int x = C < int , C < int , int > : : C1 > ( ) . f ( ) ) { }
// This isn't, but it shouldn't crash. The diagnostics don't matter much.
2020-03-28 08:08:26 +08:00
void m ( int x = C < int , union int > ( ) . f ( ) ) { } // expected-error {{declaration of anonymous union must be a definition}} expected-error {{expected a type}} expected-error {{expected '>'}}
2015-01-12 11:36:37 +08:00
} ;