brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.5 KiB · 3206d2e Raw
295 lines · cpp
1// RUN:  %clang_cc1 -std=c++2c -verify %s2 3namespace ex1 {4struct C {5  union {6    int a;7    const char* p;8  };9  int x;10};11 12constexpr C c = { .a = 1, .x = 3 };13static_assert(c.a == 1);14static_assert(c.x == 3);15 16static constexpr C c2 = { .a = 1.0, .x = 3 };17// expected-error@-1 {{type 'double' cannot be narrowed to 'int' in initializer list}}18//   expected-note@-2 {{insert an explicit cast to silence this issue}}19} // namespace ex120 21namespace ex2 {22struct A {23  int x;24  struct B {25    int i;26    int j;27  } b;28};29 30constexpr A a = { 1, { 2, 3 } };31static_assert(a.x == 1);32static_assert(a.b.i == 2);33static_assert(a.b.j == 3);34 35struct base1 { int b1, b2 = 42; };36struct base2 {37  constexpr base2() {38    b3 = 43;39  }40  int b3;41};42struct derived : base1, base2 {43  int d;44};45 46constexpr derived d1{{1, 2}, {}, 4};47static_assert(d1.b1 == 1);48static_assert(d1.b2 == 2);49static_assert(d1.b3 == 43);50static_assert(d1.d == 4);51 52constexpr derived d2{{}, {}, 4};53static_assert(d2.b1 == 0);54static_assert(d2.b2 == 42);55static_assert(d2.b3 == 43);56static_assert(d2.d == 4);57} // namespace ex258 59namespace ex3 {60struct S {61  int a;62  const char* b;63  int c;64  int d = b[a];65};66 67constexpr S ss = { 1, "asdf" };68static_assert(ss.a == 1);69static_assert(__builtin_strcmp(ss.b, "asdf") == 0);70static_assert(ss.c == int{});71static_assert(ss.d == ss.b[ss.a]);72 73struct string {74  int d = 43;75};76 77struct A {78  string a;79  int b = 42;80  int c = -1;81};82 83constexpr A a{.c = 21};84static_assert(a.a.d == string{}.d);85static_assert(a.b == 42);86static_assert(a.c == 21);87} // namespace ex388 89namespace ex4 {90int x[] = { 1, 3, 5 };91static_assert(sizeof(x) / sizeof(int) == 3);92} // namespace ex493 94namespace ex5 {95struct X { int i, j, k; };96 97constexpr X a[] = { 1, 2, 3, 4, 5, 6 };98constexpr X b[2] = { { 1, 2, 3 }, { 4, 5, 6 } };99static_assert(sizeof(a) == sizeof(b));100static_assert(a[0].i == b[0].i);101static_assert(a[0].j == b[0].j);102static_assert(a[0].k == b[0].k);103static_assert(a[1].i == b[1].i);104static_assert(a[1].j == b[1].j);105static_assert(a[1].k == b[1].k);106} // namespace ex5107 108namespace ex6 {109struct S {110  int y[] = { 0 };111  // expected-error@-1 {{array bound cannot be deduced from a default member initializer}}112};113} // namespace ex6114 115namespace ex7 {116struct A {117  int i;118  static int s;119  int j;120  int :17;121  int k;122};123 124constexpr A a = { 1, 2, 3 };125static_assert(a.i == 1);126static_assert(a.j == 2);127static_assert(a.k == 3);128} // namespace ex7129 130namespace ex8 {131struct A;132extern A a;133struct A {134  const A& a1 { A{a,a} };135  const A& a2 { A{} };136  // expected-error@-1 {{default member initializer for 'a2' needed within definition of enclosing class 'A' outside of member functions}}137  //   expected-note@-2 {{default member initializer declared here}}138};139A a{a,a};140 141struct B {142  int n = B{}.n;143  // expected-error@-1 {{default member initializer for 'n' needed within definition of enclosing class 'B' outside of member functions}}144  //   expected-note@-2 {{default member initializer declared here}}145};146} // namespace ex8147 148namespace ex9 {149constexpr int x[2][2] = { 3, 1, 4, 2 };150static_assert(x[0][0] == 3);151static_assert(x[0][1] == 1);152static_assert(x[1][0] == 4);153static_assert(x[1][1] == 2);154 155constexpr float y[4][3] = {156  { 1 }, { 2 }, { 3 }, { 4 }157};158static_assert(y[0][0] == 1);159static_assert(y[0][1] == 0);160static_assert(y[0][2] == 0);161static_assert(y[1][0] == 2);162static_assert(y[1][1] == 0);163static_assert(y[1][2] == 0);164static_assert(y[2][0] == 3);165static_assert(y[2][1] == 0);166static_assert(y[2][2] == 0);167static_assert(y[3][0] == 4);168static_assert(y[3][1] == 0);169static_assert(y[3][2] == 0);170} // namespace ex9171 172namespace ex10 {173struct S1 { int a, b; };174struct S2 { S1 s, t; };175 176constexpr S2 x[2] = { 1, 2, 3, 4, 5, 6, 7, 8 };177constexpr S2 y[2] = {178  {179    { 1, 2 },180    { 3, 4 }181  },182  {183    { 5, 6 },184    { 7, 8 }185  }186};187static_assert(x[0].s.a == 1);188static_assert(x[0].s.b == 2);189static_assert(x[0].t.a == 3);190static_assert(x[0].t.b == 4);191static_assert(x[1].s.a == 5);192static_assert(x[1].s.b == 6);193static_assert(x[1].t.a == 7);194static_assert(x[1].t.b == 8);195} // namespace ex10196 197namespace ex11 {198char cv[4] = { 'a', 's', 'd', 'f', 0 };199// expected-error@-1 {{excess elements in array initializer}}200} // namespace ex11201 202namespace ex12 {203constexpr float y[4][3] = {204  { 1, 3, 5 },205  { 2, 4, 6 },206  { 3, 5, 7 },207};208static_assert(y[0][0] == 1);209static_assert(y[0][1] == 3);210static_assert(y[0][2] == 5);211static_assert(y[1][0] == 2);212static_assert(y[1][1] == 4);213static_assert(y[1][2] == 6);214static_assert(y[2][0] == 3);215static_assert(y[2][1] == 5);216static_assert(y[2][2] == 7);217static_assert(y[3][0] == 0.0);218static_assert(y[3][1] == 0.0);219static_assert(y[3][2] == 0.0);220 221constexpr float z[4][3] = {222  1, 3, 5, 2, 4, 6, 3, 5, 7223};224static_assert(z[0][0] == 1);225static_assert(z[0][1] == 3);226static_assert(z[0][2] == 5);227static_assert(z[1][0] == 2);228static_assert(z[1][1] == 4);229static_assert(z[1][2] == 6);230static_assert(z[2][0] == 3);231static_assert(z[2][1] == 5);232static_assert(z[2][2] == 7);233static_assert(z[3][0] == 0.0);234static_assert(z[3][1] == 0.0);235static_assert(z[3][2] == 0.0);236} // namespace ex12237 238namespace ex13 {239struct S { } s;240struct A {241  S s1;242  int i1;243  S s2;244  int i2;245  S s3;246  int i3;247} a = {248  { },              // Required initialization249  0,250  s,                // Required initialization251  0252};                  // Initialization not required for A​::​s3 because A​::​i3 is also not initialized253} // namespace ex13254 255namespace ex14 {256struct A {257  int i;258  constexpr operator int() const { return 42; };259};260struct B {261  A a1, a2;262  int z;263};264constexpr A a{};265constexpr B b = { 4, a, a };266static_assert(b.a1.i == 4);267static_assert(b.a2.i == a.i);268static_assert(b.z == a.operator int());269} // namespace ex14270 271namespace ex15 {272union u { // #ex15-u273  int a;274  const char* b;275};276 277u a = { 1 };278u b = a;279u c = 1;280// expected-error@-1 {{no viable conversion from 'int' to 'u'}}281//   expected-note@#ex15-u {{candidate constructor (the implicit copy constructor) not viable: no known conversion from 'int' to 'const u &' for 1st argument}}282//   expected-note@#ex15-u {{candidate constructor (the implicit move constructor) not viable: no known conversion from 'int' to 'u &&' for 1st argument}}283u d = { 0, "asdf" };284// expected-error@-1 {{excess elements in union initializer}}285u e = { "asdf" };286// expected-error@-1 {{cannot initialize a member subobject of type 'int' with an lvalue of type 'const char[5]'}}287u f = { .b = "asdf" };288u g = {289  .a = 1, // #ex15-g-a290  .b = "asdf"291  // expected-error@-1 {{initializer partially overrides prior initialization of this subobject}}292  //   expected-note@#ex15-g-a {{previous initialization is here}}293};294} // namespace ex15295