| // PR c++/91353 - P1331R2: Allow trivial default init in constexpr contexts. |
| // { dg-do compile { target c++20 } } |
| |
| // This bullet in [dcl.constexpr] is now gone: |
| // - every non-static data member and base class sub-object shall be initialized |
| |
| struct A { |
| int i; |
| constexpr A(int _i) { i = _i; } |
| }; |
| |
| struct B { |
| int i; |
| constexpr B() { } |
| }; |
| |
| // Anonymous members. |
| struct E { |
| int a; |
| union { |
| char b; |
| __extension__ struct { |
| double c; |
| long d; |
| }; |
| union { |
| char e; |
| void *f; |
| }; |
| }; |
| __extension__ struct { |
| long long g; |
| __extension__ struct { |
| int h; |
| double i; |
| }; |
| union { |
| char *j; |
| E *k; |
| }; |
| }; |
| |
| // Completely initialized. |
| constexpr E(int(&)[1]) : a(), b(), g(), h(), i(), j() {} |
| constexpr E(int(&)[3]) : a(), e(), g(), h(), i(), k() {} |
| constexpr E(int(&)[7]) : a(), b(), g(), h(), i(), j() {} |
| constexpr E(int(&)[8]) : a(), f(), g(), h(), i(), k() {} |
| constexpr E(int(&)[9]) : a(), c(), d(), g(), h(), i(), k() {} |
| |
| // Missing d, i, j/k union init. |
| constexpr E(int(&)[2]) : a(), c(), g(), h() {} |
| |
| // Missing h, j/k union init. |
| constexpr E(int(&)[4]) : a(), c(), d(), g(), i() {} |
| |
| // Missing b/c/d/e/f union init. |
| constexpr E(int(&)[5]) : a(), g(), h(), i(), k() {} |
| |
| // Missing a, b/c/d/e/f union, g/h/i/j/k struct init. |
| constexpr E(int(&)[6]) {} |
| }; |