1 | // RUN: %clang_cc1 -fsyntax-only -verify %s |
2 | // RUN: %clang_cc1 -fsyntax-only -verify -std=c++98 %s |
3 | // RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s |
4 | |
5 | struct X1 { // has no implicit default constructor |
6 | X1(int); |
7 | }; |
8 | |
9 | struct X2 : X1 { |
10 | #if __cplusplus <= 199711L |
11 | // expected-note@-2 2 {{'X2' declared here}} |
12 | #endif |
13 | |
14 | X2(int); |
15 | }; |
16 | |
17 | struct X3 : public X2 { |
18 | #if __cplusplus <= 199711L |
19 | // expected-error@-2 {{implicit default constructor for 'X3' must explicitly initialize the base class 'X2' which does not have a default constructor}} |
20 | #else |
21 | // expected-note@-4 {{default constructor of 'X3' is implicitly deleted because base class 'X2' has no default constructor}} |
22 | #endif |
23 | }; |
24 | |
25 | X3 x3; |
26 | #if __cplusplus <= 199711L |
27 | // expected-note@-2 {{first required here}} |
28 | #else |
29 | // expected-error@-4 {{call to implicitly-deleted default constructor of 'X3'}} |
30 | #endif |
31 | |
32 | struct X4 { |
33 | #if __cplusplus <= 199711L |
34 | // expected-error@-2 {{must explicitly initialize the member 'x2'}} |
35 | // expected-error@-3 {{must explicitly initialize the reference member 'rx2'}} |
36 | #endif |
37 | |
38 | X2 x2; |
39 | #if __cplusplus <= 199711L |
40 | // expected-note@-2 {{member is declared here}} |
41 | #else |
42 | // expected-note@-4 {{default constructor of 'X4' is implicitly deleted because field 'x2' has no default constructor}} |
43 | #endif |
44 | |
45 | X2 & rx2; |
46 | #if __cplusplus <= 199711L |
47 | // expected-note@-2 {{declared here}} |
48 | #endif |
49 | }; |
50 | |
51 | X4 x4; |
52 | #if __cplusplus <= 199711L |
53 | // expected-note@-2 {{first required here}} |
54 | #else |
55 | // expected-error@-4 {{call to implicitly-deleted default constructor of 'X4'}} |
56 | #endif |
57 | |
58 | struct Y1 { // has no implicit default constructor |
59 | Y1(int); |
60 | }; |
61 | |
62 | struct Y2 : Y1 { |
63 | Y2(int); |
64 | Y2(); |
65 | }; |
66 | |
67 | struct Y3 : public Y2 { |
68 | }; |
69 | Y3 y3; |
70 | |
71 | struct Y4 { |
72 | Y2 y2; |
73 | }; |
74 | |
75 | Y4 y4; |
76 | |
77 | // More tests |
78 | |
79 | struct Z1 { |
80 | #if __cplusplus <= 199711L |
81 | // expected-error@-2 {{must explicitly initialize the reference member 'z'}} |
82 | // expected-error@-3 {{must explicitly initialize the const member 'c1'}} |
83 | #endif |
84 | |
85 | int& z; |
86 | #if __cplusplus <= 199711L |
87 | // expected-note@-2 {{declared here}} |
88 | #else |
89 | // expected-note@-4 {{default constructor of 'Z1' is implicitly deleted because field 'z' of reference type 'int &' would not be initialized}} |
90 | #endif |
91 | |
92 | const int c1; |
93 | #if __cplusplus <= 199711L |
94 | // expected-note@-2 {{declared here}} |
95 | #endif |
96 | volatile int v1; |
97 | }; |
98 | |
99 | // Test default initialization which *requires* a constructor call for non-POD. |
100 | Z1 z1; |
101 | #if __cplusplus <= 199711L |
102 | // expected-note@-2 {{first required here}} |
103 | #else |
104 | // expected-error@-4 {{call to implicitly-deleted default constructor of 'Z1'}} |
105 | #endif |
106 | |
107 | // Ensure that value initialization doesn't use trivial implicit constructors. |
108 | namespace PR7948 { |
109 | // Note that this is also non-POD to ensure we don't just special case PODs. |
110 | struct S { const int x; ~S(); }; |
111 | const S arr[2] = { { 42 } }; |
112 | } |
113 | |
114 | // This is valid |
115 | union U { |
116 | const int i; |
117 | float f; |
118 | }; |
119 | U u; |
120 | |