xref: /aosp_15_r20/external/clang/test/SemaCXX/warn-reorder-ctor-initialization.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1  -fsyntax-only -Wreorder -verify %s
2*67e74705SXin Li 
3*67e74705SXin Li struct BB {};
4*67e74705SXin Li 
5*67e74705SXin Li struct BB1 {};
6*67e74705SXin Li 
7*67e74705SXin Li class complex : public BB, BB1 {
8*67e74705SXin Li public:
complex()9*67e74705SXin Li   complex()
10*67e74705SXin Li     : s2(1), // expected-warning {{field 's2' will be initialized after field 's1'}}
11*67e74705SXin Li       s1(1),
12*67e74705SXin Li       s3(3), // expected-warning {{field 's3' will be initialized after base 'BB1'}}
13*67e74705SXin Li       BB1(), // expected-warning {{base class 'BB1' will be initialized after base 'BB'}}
14*67e74705SXin Li       BB()
15*67e74705SXin Li   {}
16*67e74705SXin Li   int s1;
17*67e74705SXin Li   int s2;
18*67e74705SXin Li   int s3;
19*67e74705SXin Li };
20*67e74705SXin Li 
21*67e74705SXin Li 
22*67e74705SXin Li // testing virtual bases.
23*67e74705SXin Li 
24*67e74705SXin Li 
25*67e74705SXin Li struct V {
26*67e74705SXin Li   V();
27*67e74705SXin Li };
28*67e74705SXin Li 
29*67e74705SXin Li struct A : public virtual V {
30*67e74705SXin Li   A();
31*67e74705SXin Li };
32*67e74705SXin Li 
33*67e74705SXin Li struct B : public virtual V {
34*67e74705SXin Li   B();
35*67e74705SXin Li };
36*67e74705SXin Li 
37*67e74705SXin Li struct Diamond : public A, public B {
DiamondDiamond38*67e74705SXin Li   Diamond() : A(), B() {}
39*67e74705SXin Li };
40*67e74705SXin Li 
41*67e74705SXin Li 
42*67e74705SXin Li struct C : public A, public B, private virtual V {
CC43*67e74705SXin Li   C() { }
44*67e74705SXin Li };
45*67e74705SXin Li 
46*67e74705SXin Li 
47*67e74705SXin Li struct D : public A, public B {
DD48*67e74705SXin Li   D()  : A(), V() {   } // expected-warning {{base class 'A' will be initialized after base 'V'}}
49*67e74705SXin Li };
50*67e74705SXin Li 
51*67e74705SXin Li 
52*67e74705SXin Li struct E : public A, public B, private virtual V {
EE53*67e74705SXin Li   E()  : A(), V() {  } // expected-warning {{base class 'A' will be initialized after base 'V'}}
54*67e74705SXin Li };
55*67e74705SXin Li 
56*67e74705SXin Li 
57*67e74705SXin Li struct A1  {
58*67e74705SXin Li   A1();
59*67e74705SXin Li };
60*67e74705SXin Li 
61*67e74705SXin Li struct B1 {
62*67e74705SXin Li   B1();
63*67e74705SXin Li };
64*67e74705SXin Li 
65*67e74705SXin Li struct F : public A1, public B1, private virtual V {
FF66*67e74705SXin Li   F()  : A1(), V() {  } // expected-warning {{base class 'A1' will be initialized after base 'V'}}
67*67e74705SXin Li };
68*67e74705SXin Li 
69*67e74705SXin Li struct X : public virtual A, virtual V, public virtual B {
XX70*67e74705SXin Li   X(): A(), V(), B() {} // expected-warning {{base class 'A' will be initialized after base 'V'}}
71*67e74705SXin Li };
72*67e74705SXin Li 
73*67e74705SXin Li class Anon {
74*67e74705SXin Li   int c; union {int a,b;}; int d;
Anon()75*67e74705SXin Li   Anon() : c(10), b(1), d(2) {}
76*67e74705SXin Li };
77*67e74705SXin Li class Anon2 {
78*67e74705SXin Li   int c; union {int a,b;}; int d;
Anon2()79*67e74705SXin Li   Anon2() : c(2),
80*67e74705SXin Li             d(10), // expected-warning {{field 'd' will be initialized after field 'b'}}
81*67e74705SXin Li             b(1) {}
82*67e74705SXin Li };
83*67e74705SXin Li class Anon3 {
84*67e74705SXin Li   union {int a,b;};
Anon3()85*67e74705SXin Li   Anon3() : b(1) {}
86*67e74705SXin Li };
87*67e74705SXin Li 
88*67e74705SXin Li namespace T1 {
89*67e74705SXin Li 
90*67e74705SXin Li struct S1 { };
91*67e74705SXin Li struct S2: virtual S1 { };
92*67e74705SXin Li struct S3 { };
93*67e74705SXin Li 
94*67e74705SXin Li struct S4: virtual S3, S2 {
S4T1::S495*67e74705SXin Li   S4() : S2(), // expected-warning {{base class 'T1::S2' will be initialized after base 'T1::S3'}}
96*67e74705SXin Li     S3() { };
97*67e74705SXin Li };
98*67e74705SXin Li }
99*67e74705SXin Li 
100*67e74705SXin Li namespace test2 {
101*67e74705SXin Li   struct Foo { Foo(); };
102*67e74705SXin Li   class A {
A(T * t)103*67e74705SXin Li     template <class T> A(T *t) :
104*67e74705SXin Li       y(),  // expected-warning {{field 'y' will be initialized after field 'x'}}
105*67e74705SXin Li       x()
106*67e74705SXin Li     {}
107*67e74705SXin Li     Foo x;
108*67e74705SXin Li     Foo y;
109*67e74705SXin Li   };
110*67e74705SXin Li }
111*67e74705SXin Li 
112*67e74705SXin Li // PR6575: this should not crash
113*67e74705SXin Li namespace test3 {
114*67e74705SXin Li   struct MyClass {
MyClasstest3::MyClass115*67e74705SXin Li     MyClass() : m_int(0) {}
116*67e74705SXin Li     union {
117*67e74705SXin Li       struct {
118*67e74705SXin Li         int m_int;
119*67e74705SXin Li       };
120*67e74705SXin Li     };
121*67e74705SXin Li   };
122*67e74705SXin Li }
123*67e74705SXin Li 
124*67e74705SXin Li namespace PR7179 {
125*67e74705SXin Li   struct X
126*67e74705SXin Li   {
127*67e74705SXin Li     struct Y
128*67e74705SXin Li     {
YPR7179::X::Y129*67e74705SXin Li       template <class T> Y(T x) : X(x) { }
130*67e74705SXin Li     };
131*67e74705SXin Li   };
132*67e74705SXin Li }
133*67e74705SXin Li 
134*67e74705SXin Li namespace test3 {
135*67e74705SXin Li   struct foo {
136*67e74705SXin Li     struct {
137*67e74705SXin Li       int a;
138*67e74705SXin Li       int b;
139*67e74705SXin Li     };
footest3::foo140*67e74705SXin Li     foo() : b(), a() { // expected-warning {{field 'b' will be initialized after field 'a'}}
141*67e74705SXin Li     }
142*67e74705SXin Li   };
143*67e74705SXin Li }
144