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