19ca5c425SRichard Smith // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 2938f40b5SRichard Smith 3938f40b5SRichard Smith int n; 4938f40b5SRichard Smith struct S { 5938f40b5SRichard Smith int &a; // expected-note 2{{here}} 6938f40b5SRichard Smith int &b = n; 7938f40b5SRichard Smith 812d5ed88SRichard Smith union { 912d5ed88SRichard Smith const int k = 42; 1012d5ed88SRichard Smith }; 1112d5ed88SRichard Smith SS12938f40b5SRichard Smith S() {} // expected-error {{constructor for 'S' must explicitly initialize the reference member 'a'}} SS13938f40b5SRichard Smith S(int) : a(n) {} // ok SS14938f40b5SRichard Smith S(char) : b(n) {} // expected-error {{constructor for 'S' must explicitly initialize the reference member 'a'}} SS15938f40b5SRichard Smith S(double) : a(n), b(n) {} // ok 1612d5ed88SRichard Smith } s(0); 17938f40b5SRichard Smith 18938f40b5SRichard Smith union U { 19*ab44d5baSRichard Smith int a = 0; // expected-note {{previous initialization}} 20*ab44d5baSRichard Smith char b = 'x'; // expected-error {{initializing multiple members of union}} 21938f40b5SRichard Smith U()22*ab44d5baSRichard Smith U() {} U(int)23*ab44d5baSRichard Smith U(int) : a(1) {} U(char)24*ab44d5baSRichard Smith U(char) : b('y') {} U(double)25*ab44d5baSRichard Smith U(double) : a(1), // expected-note{{previous initialization is here}} 260f65d59eSDavid Blaikie b('y') {} // expected-error{{initializing multiple members of union}} 27938f40b5SRichard Smith }; 2812d5ed88SRichard Smith 2912d5ed88SRichard Smith // PR10954: variant members do not acquire an implicit initializer. 3012d5ed88SRichard Smith namespace VariantMembers { 3112d5ed88SRichard Smith struct NoDefaultCtor { 3212d5ed88SRichard Smith NoDefaultCtor(int); 3312d5ed88SRichard Smith }; 3412d5ed88SRichard Smith union V { 3512d5ed88SRichard Smith NoDefaultCtor ndc; 3612d5ed88SRichard Smith int n; 3712d5ed88SRichard Smith V()3812d5ed88SRichard Smith V() {} V(int n)3912d5ed88SRichard Smith V(int n) : n(n) {} V(int n,bool)4012d5ed88SRichard Smith V(int n, bool) : ndc(n) {} 4112d5ed88SRichard Smith }; 4212d5ed88SRichard Smith struct K { 4312d5ed88SRichard Smith union { 4412d5ed88SRichard Smith NoDefaultCtor ndc; 4512d5ed88SRichard Smith int n; 4612d5ed88SRichard Smith }; KVariantMembers::K4712d5ed88SRichard Smith K() {} KVariantMembers::K4812d5ed88SRichard Smith K(int n) : n(n) {} KVariantMembers::K4912d5ed88SRichard Smith K(int n, bool) : ndc(n) {} 5012d5ed88SRichard Smith }; 51c94ec84aSRichard Smith struct Nested { NestedVariantMembers::Nested52c94ec84aSRichard Smith Nested() {} 53c94ec84aSRichard Smith union { 54c94ec84aSRichard Smith struct { 55c94ec84aSRichard Smith NoDefaultCtor ndc; 56c94ec84aSRichard Smith }; 57c94ec84aSRichard Smith }; 58c94ec84aSRichard Smith }; 5912d5ed88SRichard Smith } 60