Home | History | Annotate | Download | only in SemaCXX
      1 // RUN: %clang_cc1 -fsyntax-only -pedantic -verify %s
      2 // RUN: %clang_cc1 -fsyntax-only -pedantic -verify -std=c++98 %s
      3 // RUN: %clang_cc1 -fsyntax-only -pedantic -verify -std=c++11 %s
      4 // C++ [dcl.init.aggr]p2
      5 struct A {
      6   int x;
      7   struct B {
      8     int i;
      9     int j;
     10   } b;
     11 } a1 = { 1, { 2, 3 } };
     12 
     13 struct NonAggregate {
     14 #if __cplusplus >= 201103L
     15 // expected-note@-2 3 {{candidate constructor (the implicit copy constructor) not viable}}
     16 // expected-note@-3 3 {{candidate constructor (the implicit move constructor) not viable}}
     17 #endif
     18   NonAggregate();
     19 #if __cplusplus >= 201103L
     20 // expected-note@-2 3 {{candidate constructor not viable: requires 0 arguments, but 2 were provided}}
     21 #endif
     22   int a, b;
     23 };
     24 NonAggregate non_aggregate_test = { 1, 2 };
     25 #if __cplusplus <= 199711L
     26 // expected-error@-2 {{non-aggregate type 'NonAggregate' cannot be initialized with an initializer list}}
     27 #else
     28 // expected-error@-4 {{no matching constructor for initialization of 'NonAggregate'}}
     29 #endif
     30 
     31 NonAggregate non_aggregate_test2[2] = { { 1, 2 }, { 3, 4 } };
     32 #if __cplusplus <= 199711L
     33 // expected-error@-2 2 {{non-aggregate type 'NonAggregate' cannot be initialized with an initializer list}}
     34 #else
     35 // expected-error@-4 2 {{no matching constructor for initialization of 'NonAggregate'}}
     36 #endif
     37 
     38 // C++ [dcl.init.aggr]p3
     39 A a_init = A();
     40 
     41 // C++ [dcl.init.aggr]p4
     42 int x[] = { 1, 3, 5 };
     43 int x_sizecheck[(sizeof(x) / sizeof(int)) == 3? 1 : -1];
     44 int x2[] = { }; // expected-warning{{zero size arrays are an extension}}
     45 
     46 // C++ [dcl.init.aggr]p5
     47 struct StaticMemberTest {
     48   int i;
     49   static int s;
     50   int *j;
     51 } smt = { 1, &smt.i };
     52 
     53 // C++ [dcl.init.aggr]p6
     54 char cv[4] = { 'a', 's', 'd', 'f', 0 }; // expected-error{{excess elements in array initializer}}
     55 
     56 // C++ [dcl.init.aggr]p7
     57 struct TooFew { int a; char* b; int c; };
     58 TooFew too_few = { 1, "asdf" };
     59 #if __cplusplus <= 199711L
     60 // expected-warning@-2 {{conversion from string literal to 'char *' is deprecated}}
     61 #else
     62 // expected-warning@-4 {{ISO C++11 does not allow conversion from string literal to 'char *'}}
     63 #endif
     64 
     65 struct NoDefaultConstructor {
     66 #if __cplusplus <= 199711L
     67 // expected-note@-2 3 {{candidate constructor (the implicit copy constructor)}}
     68 // expected-note@-3 {{declared here}}
     69 #else
     70 // expected-note@-5 4 {{candidate constructor (the implicit copy constructor)}}
     71 // expected-note@-6 4 {{candidate constructor (the implicit move constructor)}}
     72 #endif
     73 
     74   NoDefaultConstructor(int);
     75 #if __cplusplus <= 199711L
     76   // expected-note@-2 3 {{candidate constructor not viable: requires 1 argument, but 0 were provided}}
     77 #else
     78   // expected-note@-4 4 {{candidate constructor not viable: requires 1 argument, but 0 were provided}}
     79 #endif
     80 
     81 };
     82 struct TooFewError {
     83 #if __cplusplus <= 199711L
     84 // expected-error@-2 {{implicit default constructor for}}
     85 #endif
     86 
     87   int a;
     88   NoDefaultConstructor nodef;
     89 #if __cplusplus <= 199711L
     90 // expected-note@-2 {{member is declared here}}
     91 // expected-note@-3 2{{in implicit initialization of field 'nodef' with omitted initializer}}
     92 #else
     93 // expected-note@-5 3{{in implicit initialization of field 'nodef' with omitted initializer}}
     94 #endif
     95 };
     96 TooFewError too_few_okay = { 1, 1 };
     97 TooFewError too_few_error = { 1 }; // expected-error{{no matching constructor}}
     98 
     99 TooFewError too_few_okay2[2] = { 1, 1 };
    100 #if __cplusplus <= 199711L
    101 // expected-note@-2 {{implicit default constructor for 'TooFewError' first required here}}
    102 #else
    103 // expected-error@-4 {{no matching constructor for initialization of 'NoDefaultConstructor'}}
    104 // expected-note@-5 {{in implicit initialization of array element 1 with omitted initializer}}
    105 #endif
    106 
    107 TooFewError too_few_error2[2] = { 1 }; // expected-error{{no matching constructor}}
    108 
    109 NoDefaultConstructor too_few_error3[3] = { }; // expected-error {{no matching constructor}} expected-note {{implicit initialization of array element 0}}
    110 
    111 // C++ [dcl.init.aggr]p8
    112 struct Empty { };
    113 struct EmptyTest {
    114   Empty s;
    115   int i;
    116 } empty_test = { { }, 3 };
    117 
    118 EmptyTest empty_test2 = { 3 }; // expected-error{{initializer for aggregate with no elements requires explicit braces}}
    119 
    120 struct NonEmpty {
    121   int a;
    122   Empty empty;
    123 };
    124 struct NonEmptyTest {
    125   NonEmpty a, b;
    126 } non_empty_test = { { }, { } };
    127 
    128 // C++ [dcl.init.aggr]p9
    129 struct HasReference {
    130   int i;
    131   int &j; // expected-note{{uninitialized reference member is here}}
    132 };
    133 int global_int;
    134 HasReference r1 = { 1, global_int };
    135 HasReference r2 = { 1 } ; // expected-error{{reference member of type 'int &' uninitialized}}
    136 
    137 // C++ [dcl.init.aggr]p10
    138 // Note: the behavior here is identical to C
    139 int xs[2][2] = { 3, 1, 4, 2 };
    140 float y[4][3] = { { 1 }, { 2 }, { 3 }, { 4 } };
    141 
    142 // C++ [dcl.init.aggr]p11
    143 // Note: the behavior here is identical to C
    144 float y2[4][3] = { { 1, 3, 5 }, { 2, 4, 6 }, { 3, 5, 7 } };
    145 float same_as_y2[4][3] = { 1, 3, 5, 2, 4, 6, 3, 5, 7 };
    146 
    147 // C++ [dcl.init.aggr]p12
    148 struct A2 {
    149   int i;
    150   operator int *();
    151 };
    152 struct B2 {
    153   A2 a1, a2;
    154   int *z;
    155 };
    156 struct C2 {
    157   operator A2();
    158 };
    159 struct D2 {
    160   operator int();
    161 };
    162 A2 a2;
    163 C2 c2;
    164 D2 d2;
    165 B2 b2 = { 4, a2, a2 };
    166 B2 b2_2 = { 4, d2, 0 };
    167 B2 b2_3 = { c2, a2, a2 };
    168 
    169 // C++ [dcl.init.aggr]p15:
    170 union u { int a; char* b; }; // expected-note{{candidate constructor (the implicit copy constructor)}}
    171 #if __cplusplus >= 201103L
    172 // expected-note@-2 {{candidate constructor (the implicit move constructor)}}
    173 #endif
    174 
    175 u u1 = { 1 };
    176 u u2 = u1;
    177 u u3 = 1; // expected-error{{no viable conversion}}
    178 u u4 = { 0, "asdf" };  // expected-error{{excess elements in union initializer}}
    179 u u5 = { "asdf" }; // expected-error{{cannot initialize a member subobject of type 'int' with an lvalue of type 'const char [5]'}}
    180