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