2009-12-16 04:14:24 +08:00
// RUN: %clang_cc1 -fsyntax-only -pedantic -verify %s
2009-01-31 06:09:00 +08:00
// C++ [dcl.init.aggr]p2
struct A {
int x ;
struct B {
int i ;
int j ;
} b ;
} a1 = { 1 , { 2 , 3 } } ;
struct NonAggregate {
NonAggregate ( ) ;
int a , b ;
} ;
2010-03-10 19:27:22 +08:00
NonAggregate non_aggregate_test = { 1 , 2 } ; // expected-error{{non-aggregate type 'NonAggregate' cannot be initialized with an initializer list}}
2009-01-31 06:09:00 +08:00
2012-07-07 16:35:56 +08:00
NonAggregate non_aggregate_test2 [ 2 ] = { { 1 , 2 } , { 3 , 4 } } ; // expected-error 2 {{non-aggregate type 'NonAggregate' cannot be initialized with an initializer list}}
2009-01-31 06:09:00 +08:00
// C++ [dcl.init.aggr]p3
A a_init = A ( ) ;
// C++ [dcl.init.aggr]p4
int x [ ] = { 1 , 3 , 5 } ;
int x_sizecheck [ ( sizeof ( x ) / sizeof ( int ) ) = = 3 ? 1 : - 1 ] ;
int x2 [ ] = { } ; // expected-warning{{zero size arrays are an extension}}
// C++ [dcl.init.aggr]p5
struct StaticMemberTest {
int i ;
static int s ;
int * j ;
} smt = { 1 , & smt . i } ;
// C++ [dcl.init.aggr]p6
2009-01-31 06:26:29 +08:00
char cv [ 4 ] = { ' a ' , ' s ' , ' d ' , ' f ' , 0 } ; // expected-error{{excess elements in array initializer}}
2009-01-31 06:09:00 +08:00
// C++ [dcl.init.aggr]p7
struct TooFew { int a ; char * b ; int c ; } ;
2010-03-01 02:30:25 +08:00
TooFew too_few = { 1 , " asdf " } ; // expected-warning{{conversion from string literal to 'char *' is deprecated}}
2009-01-31 06:09:00 +08:00
2010-01-13 08:25:19 +08:00
struct NoDefaultConstructor { / / expected - note 3 { { candidate constructor ( the implicit copy constructor ) } } \
2009-12-17 02:50:27 +08:00
// expected-note{{declared here}}
2010-01-06 17:43:14 +08:00
NoDefaultConstructor ( int ) ; // expected-note 3 {{candidate constructor}}
2009-02-03 01:43:21 +08:00
} ;
2009-12-17 02:50:27 +08:00
struct TooFewError { // expected-error{{implicit default constructor for}}
2009-02-03 01:43:21 +08:00
int a ;
2014-06-03 15:28:54 +08:00
NoDefaultConstructor nodef ; // expected-note{{member is declared here}} expected-note 2{{in implicit initialization of field 'nodef'}}
2009-02-03 01:43:21 +08:00
} ;
TooFewError too_few_okay = { 1 , 1 } ;
TooFewError too_few_error = { 1 } ; // expected-error{{no matching constructor}}
2010-03-10 19:27:22 +08:00
TooFewError too_few_okay2 [ 2 ] = { 1 , 1 } ; // expected-note{{implicit default constructor for 'TooFewError' first required here}}
2009-02-03 01:43:21 +08:00
TooFewError too_few_error2 [ 2 ] = { 1 } ; // expected-error{{no matching constructor}}
2014-06-03 15:28:54 +08:00
NoDefaultConstructor too_few_error3 [ 3 ] = { } ; // expected-error {{no matching constructor}} expected-note {{implicit initialization of array element 0}}
2009-02-03 01:43:21 +08:00
2009-01-31 06:09:00 +08:00
// C++ [dcl.init.aggr]p8
struct Empty { } ;
struct EmptyTest {
Empty s ;
int i ;
} empty_test = { { } , 3 } ;
EmptyTest empty_test2 = { 3 } ; // expected-error{{initializer for aggregate with no elements requires explicit braces}}
struct NonEmpty {
int a ;
Empty empty ;
} ;
struct NonEmptyTest {
NonEmpty a , b ;
} non_empty_test = { { } , { } } ;
// C++ [dcl.init.aggr]p9
struct HasReference {
int i ;
int & j ; // expected-note{{uninitialized reference member is here}}
} ;
int global_int ;
HasReference r1 = { 1 , global_int } ;
2011-12-15 08:38:15 +08:00
HasReference r2 = { 1 } ; // expected-error{{reference member of type 'int &' uninitialized}}
2009-01-31 06:09:00 +08:00
// C++ [dcl.init.aggr]p10
// Note: the behavior here is identical to C
int xs [ 2 ] [ 2 ] = { 3 , 1 , 4 , 2 } ;
float y [ 4 ] [ 3 ] = { { 1 } , { 2 } , { 3 } , { 4 } } ;
// C++ [dcl.init.aggr]p11
// Note: the behavior here is identical to C
float y2 [ 4 ] [ 3 ] = { { 1 , 3 , 5 } , { 2 , 4 , 6 } , { 3 , 5 , 7 } } ;
float same_as_y2 [ 4 ] [ 3 ] = { 1 , 3 , 5 , 2 , 4 , 6 , 3 , 5 , 7 } ;
// C++ [dcl.init.aggr]p12
struct A2 {
int i ;
operator int * ( ) ;
} ;
struct B2 {
A2 a1 , a2 ;
int * z ;
} ;
struct C2 {
operator A2 ( ) ;
} ;
struct D2 {
operator int ( ) ;
} ;
A2 a2 ;
C2 c2 ;
D2 d2 ;
B2 b2 = { 4 , a2 , a2 } ;
B2 b2_2 = { 4 , d2 , 0 } ;
2009-01-31 07:27:23 +08:00
B2 b2_3 = { c2 , a2 , a2 } ;
2009-01-31 06:09:00 +08:00
// C++ [dcl.init.aggr]p15:
2010-01-13 08:25:19 +08:00
union u { int a ; char * b ; } ; // expected-note{{candidate constructor (the implicit copy constructor)}}
2009-01-31 06:09:00 +08:00
u u1 = { 1 } ;
u u2 = u1 ;
2009-12-19 11:01:41 +08:00
u u3 = 1 ; // expected-error{{no viable conversion}}
2009-02-05 06:46:25 +08:00
u u4 = { 0 , " asdf " } ; // expected-error{{excess elements in union initializer}}
2010-09-05 08:04:01 +08:00
u u5 = { " asdf " } ; // expected-error{{cannot initialize a member subobject of type 'int' with an lvalue of type 'const char [5]'}}