1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s 27a614d8380297fcd2bc23986241905d97222948cRichard Smith 37a614d8380297fcd2bc23986241905d97222948cRichard Smithint n; 47a614d8380297fcd2bc23986241905d97222948cRichard Smithstruct S { 57a614d8380297fcd2bc23986241905d97222948cRichard Smith int &a; // expected-note 2{{here}} 67a614d8380297fcd2bc23986241905d97222948cRichard Smith int &b = n; 77a614d8380297fcd2bc23986241905d97222948cRichard Smith 8c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith union { 9c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith const int k = 42; 10c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith }; 11c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith 127a614d8380297fcd2bc23986241905d97222948cRichard Smith S() {} // expected-error {{constructor for 'S' must explicitly initialize the reference member 'a'}} 137a614d8380297fcd2bc23986241905d97222948cRichard Smith S(int) : a(n) {} // ok 147a614d8380297fcd2bc23986241905d97222948cRichard Smith S(char) : b(n) {} // expected-error {{constructor for 'S' must explicitly initialize the reference member 'a'}} 157a614d8380297fcd2bc23986241905d97222948cRichard Smith S(double) : a(n), b(n) {} // ok 16c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith} s(0); 177a614d8380297fcd2bc23986241905d97222948cRichard Smith 187a614d8380297fcd2bc23986241905d97222948cRichard Smithunion U { 196fe2965ce722826ae7c3af85271f900286ef20c3David Blaikie int a = 0; // desired-note 5 {{previous initialization is here}} 207a614d8380297fcd2bc23986241905d97222948cRichard Smith char b = 'x'; 217a614d8380297fcd2bc23986241905d97222948cRichard Smith 227a614d8380297fcd2bc23986241905d97222948cRichard Smith // FIXME: these should all be rejected 236fe2965ce722826ae7c3af85271f900286ef20c3David Blaikie U() {} // desired-error {{initializing multiple members of union}} 246fe2965ce722826ae7c3af85271f900286ef20c3David Blaikie U(int) : a(1) {} // desired-error {{initializing multiple members of union}} 256fe2965ce722826ae7c3af85271f900286ef20c3David Blaikie U(char) : b('y') {} // desired-error {{initializing multiple members of union}} 266fe2965ce722826ae7c3af85271f900286ef20c3David Blaikie // this expected note should be removed & the note should appear on the 276fe2965ce722826ae7c3af85271f900286ef20c3David Blaikie // declaration of 'a' when this set of cases is handled correctly. 286fe2965ce722826ae7c3af85271f900286ef20c3David Blaikie U(double) : a(1), // expected-note{{previous initialization is here}} desired-error {{initializing multiple members of union}} 296fe2965ce722826ae7c3af85271f900286ef20c3David Blaikie b('y') {} // expected-error{{initializing multiple members of union}} 307a614d8380297fcd2bc23986241905d97222948cRichard Smith}; 31c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith 32c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith// PR10954: variant members do not acquire an implicit initializer. 33c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smithnamespace VariantMembers { 34c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith struct NoDefaultCtor { 35c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith NoDefaultCtor(int); 36c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith }; 37c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith union V { 38c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith NoDefaultCtor ndc; 39c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith int n; 40c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith 41c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith V() {} 42c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith V(int n) : n(n) {} 43c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith V(int n, bool) : ndc(n) {} 44c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith }; 45c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith struct K { 46c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith union { 47c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith NoDefaultCtor ndc; 48c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith int n; 49c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith }; 50c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith K() {} 51c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith K(int n) : n(n) {} 52c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith K(int n, bool) : ndc(n) {} 53c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith }; 54a495066d3cc094b3eb5edb4efbdb169da1f67841Richard Smith struct Nested { 55a495066d3cc094b3eb5edb4efbdb169da1f67841Richard Smith Nested() {} 56a495066d3cc094b3eb5edb4efbdb169da1f67841Richard Smith union { 57a495066d3cc094b3eb5edb4efbdb169da1f67841Richard Smith struct { 58a495066d3cc094b3eb5edb4efbdb169da1f67841Richard Smith NoDefaultCtor ndc; 59a495066d3cc094b3eb5edb4efbdb169da1f67841Richard Smith }; 60a495066d3cc094b3eb5edb4efbdb169da1f67841Richard Smith }; 61a495066d3cc094b3eb5edb4efbdb169da1f67841Richard Smith }; 62c115f630b748b2f27cff34137fb6a50b10a471a5Richard Smith} 63