xref: /aosp_15_r20/external/clang/test/SemaCXX/class-base-member-init.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s
2*67e74705SXin Li 
3*67e74705SXin Li class S {
4*67e74705SXin Li public:
5*67e74705SXin Li   S ();
6*67e74705SXin Li };
7*67e74705SXin Li 
8*67e74705SXin Li struct D : S {
DD9*67e74705SXin Li   D() :
10*67e74705SXin Li     b1(0), // expected-note {{previous initialization is here}}
11*67e74705SXin Li     b2(1),
12*67e74705SXin Li     b1(0), // expected-error {{multiple initializations given for non-static member 'b1'}}
13*67e74705SXin Li     S(),   // expected-note {{previous initialization is here}}
14*67e74705SXin Li     S()    // expected-error {{multiple initializations given for base 'S'}}
15*67e74705SXin Li     {}
16*67e74705SXin Li   int b1;
17*67e74705SXin Li   int b2;
18*67e74705SXin Li };
19*67e74705SXin Li 
20*67e74705SXin Li struct A {
21*67e74705SXin Li   struct {
22*67e74705SXin Li     int a;
23*67e74705SXin Li     int b;
24*67e74705SXin Li   };
25*67e74705SXin Li   A();
26*67e74705SXin Li };
27*67e74705SXin Li 
A()28*67e74705SXin Li A::A() : a(10), b(20) { }
29*67e74705SXin Li 
30*67e74705SXin Li namespace Test1 {
31*67e74705SXin Li   template<typename T> struct A {};
32*67e74705SXin Li   template<typename T> struct B : A<T> {
33*67e74705SXin Li 
BTest1::B34*67e74705SXin Li     B() : A<T>(), // expected-note {{previous initialization is here}}
35*67e74705SXin Li       A<T>() { } // expected-error {{multiple initializations given for base 'A<T>'}}
36*67e74705SXin Li   };
37*67e74705SXin Li }
38*67e74705SXin Li 
39*67e74705SXin Li namespace Test2 {
40*67e74705SXin Li   template<typename T> struct A : T {
ATest2::A41*67e74705SXin Li     A() : T(), // expected-note {{previous initialization is here}}
42*67e74705SXin Li       T() { } // expected-error {{multiple initializations given for base 'T'}}
43*67e74705SXin Li   };
44*67e74705SXin Li }
45*67e74705SXin Li 
46*67e74705SXin Li namespace Test3 {
47*67e74705SXin Li   template<typename T> struct A {
48*67e74705SXin Li     T t;
49*67e74705SXin Li 
ATest3::A50*67e74705SXin Li     A() : t(1), // expected-note {{previous initialization is here}}
51*67e74705SXin Li       t(2) { } // expected-error {{multiple initializations given for non-static member 't'}}
52*67e74705SXin Li   };
53*67e74705SXin Li }
54*67e74705SXin Li 
55*67e74705SXin Li namespace test4 {
56*67e74705SXin Li   class A {
57*67e74705SXin Li     union {
58*67e74705SXin Li       struct {
59*67e74705SXin Li         int a;
60*67e74705SXin Li         int b;
61*67e74705SXin Li       };
62*67e74705SXin Li 
63*67e74705SXin Li       int c;
64*67e74705SXin Li 
65*67e74705SXin Li       union {
66*67e74705SXin Li         int d;
67*67e74705SXin Li         int e;
68*67e74705SXin Li       };
69*67e74705SXin Li     };
70*67e74705SXin Li 
A(char _)71*67e74705SXin Li     A(char _) : a(0), b(0) {}
A(short _)72*67e74705SXin Li     A(short _) : a(0), c(0) {} // expected-error {{initializing multiple members of union}} expected-note {{previous initialization is here}}
A(int _)73*67e74705SXin Li     A(int _) : d(0), e(0) {} // expected-error {{initializing multiple members of union}} expected-note {{previous initialization is here}}
A(long _)74*67e74705SXin Li     A(long _) : a(0), d(0) {} // expected-error {{initializing multiple members of union}} expected-note {{previous initialization is here}}
75*67e74705SXin Li   };
76*67e74705SXin Li }
77*67e74705SXin Li 
78*67e74705SXin Li namespace test5 {
79*67e74705SXin Li   struct Base {
80*67e74705SXin Li     Base(int);
81*67e74705SXin Li   };
82*67e74705SXin Li   struct A : Base {
Atest5::A83*67e74705SXin Li     A() : decltype(Base(1))(3) {
84*67e74705SXin Li     }
Atest5::A85*67e74705SXin Li     A(int) : Base(3), // expected-note {{previous initialization is here}}
86*67e74705SXin Li              decltype(Base(1))(2), // expected-error {{multiple initializations given for base 'decltype(test5::Base(1))' (aka 'test5::Base')}}
87*67e74705SXin Li              decltype(int())() { // expected-error {{constructor initializer 'decltype(int())' (aka 'int') does not name a class}}
88*67e74705SXin Li     }
Atest5::A89*67e74705SXin Li     A(float) : decltype(A())(3) {
90*67e74705SXin Li     }
91*67e74705SXin Li   };
92*67e74705SXin Li }
93*67e74705SXin Li 
94*67e74705SXin Li namespace rdar13185264 {
95*67e74705SXin Li   class X {
X()96*67e74705SXin Li     X() : a(), // expected-note{{previous initialization is here}}
97*67e74705SXin Li           a()  { } // expected-error{{multiple initializations given for non-static member 'a'}}
98*67e74705SXin Li     union { void *a; };
99*67e74705SXin Li   };
100*67e74705SXin Li }
101*67e74705SXin Li 
102*67e74705SXin Li namespace PR16596 {
103*67e74705SXin Li   class A { public: virtual ~A(); };
104*67e74705SXin Li   typedef const A Foo;
105*67e74705SXin Li   void Apply(Foo processor);
106*67e74705SXin Li   struct Bar : public Foo {};
Fetch()107*67e74705SXin Li   void Fetch() {
108*67e74705SXin Li     Apply(Bar());
109*67e74705SXin Li   }
110*67e74705SXin Li }
111