1 // CWG 2096 - constraints on literal unions.
2 // { dg-do compile { target c++11 } }
3 
4 struct literal { };
5 typedef volatile int nonliteral_v;
6 struct nonliteral {
nonliteralnonliteral7   nonliteral() {}
8 };
9 
10 union U {
11   literal l;
12   nonliteral n;
13 
U()14   constexpr U() : l{} {}
15 };
16 
17 constexpr U u{};
18 
19 union U2 {
20   nonliteral n;
21   literal l;
22 
U2()23   constexpr U2() : l{} {}
24 };
25 
26 constexpr U2 u2{};
27 
28 union U3 { // { dg-message "not literal" }
29   nonliteral_v n; // { dg-message "volatile type" }
30 
U3()31   constexpr U3() : n{} {}
32 };
33 
34 constexpr U3 u3{}; // { dg-error "not literal" }
35 
36 union U4 {
37   nonliteral n;
38   nonliteral_v n2;
39   literal l;
40   nonliteral n3;
41 
U4()42   constexpr U4() : l{} {}
43 };
44 
45 constexpr U4 u4{};
46 
47 union U5 {
48   nonliteral_v n;
49   literal l;
50 
U5()51   constexpr U5() : n{} {}
52 };
53 
54 constexpr U5 u5{};
55