brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.5 KiB · af04766 Raw
180 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -pedantic -verify %s2// RUN: %clang_cc1 -fsyntax-only -pedantic -verify -std=c++98 %s3// RUN: %clang_cc1 -fsyntax-only -pedantic -verify -std=c++11 %s4// C++ [dcl.init.aggr]p25struct A { 6  int x;7  struct B { 8    int i;9    int j;10  } b; 11} a1 = { 1, { 2, 3 } };12 13struct NonAggregate {14#if __cplusplus >= 201103L15// 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#endif18  NonAggregate();19#if __cplusplus >= 201103L20// expected-note@-2 3 {{candidate constructor not viable: requires 0 arguments, but 2 were provided}}21#endif22  int a, b;23};24NonAggregate non_aggregate_test = { 1, 2 };25#if __cplusplus <= 199711L26// expected-error@-2 {{non-aggregate type 'NonAggregate' cannot be initialized with an initializer list}}27#else28// expected-error@-4 {{no matching constructor for initialization of 'NonAggregate'}}29#endif30 31NonAggregate non_aggregate_test2[2] = { { 1, 2 }, { 3, 4 } };32#if __cplusplus <= 199711L33// expected-error@-2 2 {{non-aggregate type 'NonAggregate' cannot be initialized with an initializer list}}34#else35// expected-error@-4 2 {{no matching constructor for initialization of 'NonAggregate'}}36#endif37 38// C++ [dcl.init.aggr]p339A a_init = A(); 40 41// C++ [dcl.init.aggr]p442int x[] = { 1, 3, 5 };43int x_sizecheck[(sizeof(x) / sizeof(int)) == 3? 1 : -1];44int x2[] = { }; // expected-warning{{zero size arrays are an extension}}45 46// C++ [dcl.init.aggr]p547struct StaticMemberTest {48  int i;49  static int s;50  int *j;51} smt = { 1, &smt.i };52 53// C++ [dcl.init.aggr]p654char cv[4] = { 'a', 's', 'd', 'f', 0 }; // expected-error{{excess elements in array initializer}}55 56// C++ [dcl.init.aggr]p757struct TooFew { int a; char* b; int c; }; 58TooFew too_few = { 1, "asdf" };59#if __cplusplus <= 199711L60// expected-warning@-2 {{conversion from string literal to 'char *' is deprecated}}61#else62// expected-warning@-4 {{ISO C++11 does not allow conversion from string literal to 'char *'}}63#endif64 65struct NoDefaultConstructor {66#if __cplusplus <= 199711L67// expected-note@-2 3 {{candidate constructor (the implicit copy constructor)}}68// expected-note@-3 {{declared here}}69#else70// expected-note@-5 4 {{candidate constructor (the implicit copy constructor)}}71// expected-note@-6 4 {{candidate constructor (the implicit move constructor)}}72#endif73 74  NoDefaultConstructor(int);75#if __cplusplus <= 199711L76  // expected-note@-2 3 {{candidate constructor not viable: requires 1 argument, but 0 were provided}}77#else78  // expected-note@-4 4 {{candidate constructor not viable: requires 1 argument, but 0 were provided}}79#endif80 81};82struct TooFewError {83#if __cplusplus <= 199711L84// expected-error@-2 {{implicit default constructor for}}85#endif86 87  int a;88  NoDefaultConstructor nodef;89#if __cplusplus <= 199711L90// expected-note@-2 {{member is declared here}}91// expected-note@-3 2{{in implicit initialization of field 'nodef' with omitted initializer}}92#else93// expected-note@-5 3{{in implicit initialization of field 'nodef' with omitted initializer}}94#endif95};96TooFewError too_few_okay = { 1, 1 };97TooFewError too_few_error = { 1 }; // expected-error{{no matching constructor}}98 99TooFewError too_few_okay2[2] = { 1, 1 };100#if __cplusplus <= 199711L101// expected-note@-2 {{implicit default constructor for 'TooFewError' first required here}}102#else103// 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#endif106 107TooFewError too_few_error2[2] = { 1 }; // expected-error{{no matching constructor}}108 109NoDefaultConstructor too_few_error3[3] = { }; // expected-error {{no matching constructor}} expected-note {{implicit initialization of array element 0}}110 111// C++ [dcl.init.aggr]p8112struct Empty { };113struct EmptyTest {114  Empty s;115  int i;116} empty_test = { { }, 3 };117 118EmptyTest empty_test2 = { 3 }; // expected-error{{initializer for aggregate with no elements requires explicit braces}}119 120struct NonEmpty { 121  int a;122  Empty empty;123};124struct NonEmptyTest {125  NonEmpty a, b;126} non_empty_test = { { }, { } };127 128// C++ [dcl.init.aggr]p9129struct HasReference {130  int i;131  int &j; // expected-note{{uninitialized reference member is here}}132};133int global_int;134HasReference r1 = { 1, global_int };135HasReference r2 = { 1 } ; // expected-error{{reference member of type 'int &' uninitialized}}136 137// C++ [dcl.init.aggr]p10138// Note: the behavior here is identical to C139int xs[2][2] = { 3, 1, 4, 2 };140float y[4][3] = { { 1 }, { 2 }, { 3 }, { 4 } };141 142// C++ [dcl.init.aggr]p11143// Note: the behavior here is identical to C144float y2[4][3] = { { 1, 3, 5 }, { 2, 4, 6 }, { 3, 5, 7 } };145float same_as_y2[4][3] = { 1, 3, 5, 2, 4, 6, 3, 5, 7 };146 147// C++ [dcl.init.aggr]p12148struct A2 { 149  int i;150  operator int *();151}; 152struct B2 {153  A2 a1, a2; 154  int *z;155}; 156struct C2 {157  operator A2();158};159struct D2 {160  operator int();161};162A2 a2;163C2 c2; 164D2 d2;165B2 b2 = { 4, a2, a2 };166B2 b2_2 = { 4, d2, 0 };167B2 b2_3 = { c2, a2, a2 };168 169// C++ [dcl.init.aggr]p15:170union u { int a; char* b; }; // expected-note{{candidate constructor (the implicit copy constructor)}}171#if __cplusplus >= 201103L172// expected-note@-2 {{candidate constructor (the implicit move constructor)}}173#endif174 175u u1 = { 1 }; 176u u2 = u1; 177u u3 = 1; // expected-error{{no viable conversion}}178u u4 = { 0, "asdf" };  // expected-error{{excess elements in union initializer}}179u u5 = { "asdf" }; // expected-error{{cannot initialize a member subobject of type 'int' with an lvalue of type 'const char[5]'}}180