1 // { dg-do compile { target c++20 } }
3 union U { int a; int b; int c[2]; };
5 constexpr int test1() {
8 *&u.b = 20; // { dg-error "accessing" }
11 constexpr int x1 = test1(); // { dg-message "in .constexpr. expansion" }
13 constexpr int test2() {
16 (0, u.b) = 20; // { dg-error "accessing" }
19 constexpr int x2 = test2(); // { dg-message "in .constexpr. expansion" }
21 constexpr int test3() {
25 p[u.a] = 10; // { dg-error "accessing" }
28 constexpr int x3 = test3(); // { dg-message "in .constexpr. expansion" }
30 constexpr int test4() {
34 u.a[p] = 10; // { dg-error "accessing" }
37 constexpr int x4 = test4(); // { dg-message "in .constexpr. expansion" }
39 struct S { U u[10]; };
40 constexpr int test5() {
44 return 4[s.u].a + s.u[6].b;
46 static_assert(test5() == 25);
48 constexpr int test6() {
53 return 1[u.c] + u.c[0];
55 static_assert(test6() == 11);
57 constexpr int test7() {
58 U u; // default initialisation leaves no member initialised
60 *p = 10; // { dg-error "accessing" }
63 constexpr int x7 = test7(); // { dg-message "in .constexpr. expansion" }
65 constexpr int test8() {
66 U u {}; // value initialisation initialises first member
71 static_assert(test8() == 8);
73 union V { int :0; static int x; void foo(); int a; };
74 constexpr int test9() {
75 V v {}; // should skip zero-width bit fields, static members, and functions
80 static_assert(test9() == 9);