xref: /llvm-project/clang/test/CXX/special/class.init/class.base.init/p8-0x.cpp (revision ab44d5badf576b5e823a6d78e5972f9ca6a99d68)
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