xref: /aosp_15_r20/external/clang/test/SemaCXX/default-constructor-initializers.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fsyntax-only -verify %s
2*67e74705SXin Li 
3*67e74705SXin Li struct X1 { // has no implicit default constructor
4*67e74705SXin Li    X1(int);
5*67e74705SXin Li };
6*67e74705SXin Li 
7*67e74705SXin Li struct X2  : X1 {  // expected-note 2 {{'X2' declared here}}
8*67e74705SXin Li    X2(int);
9*67e74705SXin Li };
10*67e74705SXin Li 
11*67e74705SXin Li struct X3 : public X2 { // expected-error {{implicit default constructor for 'X3' must explicitly initialize the base class 'X2' which does not have a default constructor}}
12*67e74705SXin Li };
13*67e74705SXin Li X3 x3; // expected-note {{first required here}}
14*67e74705SXin Li 
15*67e74705SXin Li 
16*67e74705SXin Li struct X4 { // expected-error {{must explicitly initialize the member 'x2'}} \
17*67e74705SXin Li             // expected-error {{must explicitly initialize the reference member 'rx2'}}
18*67e74705SXin Li   X2 x2; 	// expected-note {{member is declared here}}
19*67e74705SXin Li   X2 & rx2; // expected-note {{declared here}}
20*67e74705SXin Li };
21*67e74705SXin Li 
22*67e74705SXin Li X4 x4; // expected-note {{first required here}}
23*67e74705SXin Li 
24*67e74705SXin Li 
25*67e74705SXin Li struct Y1 { // has no implicit default constructor
26*67e74705SXin Li    Y1(int);
27*67e74705SXin Li };
28*67e74705SXin Li 
29*67e74705SXin Li struct Y2  : Y1 {
30*67e74705SXin Li    Y2(int);
31*67e74705SXin Li    Y2();
32*67e74705SXin Li };
33*67e74705SXin Li 
34*67e74705SXin Li struct Y3 : public Y2 {
35*67e74705SXin Li };
36*67e74705SXin Li Y3 y3;
37*67e74705SXin Li 
38*67e74705SXin Li struct Y4 {
39*67e74705SXin Li   Y2 y2;
40*67e74705SXin Li };
41*67e74705SXin Li 
42*67e74705SXin Li Y4 y4;
43*67e74705SXin Li 
44*67e74705SXin Li // More tests
45*67e74705SXin Li 
46*67e74705SXin Li struct Z1 { // expected-error {{must explicitly initialize the reference member 'z'}} \
47*67e74705SXin Li             // expected-error {{must explicitly initialize the const member 'c1'}}
48*67e74705SXin Li   int& z;       // expected-note {{declared here}}
49*67e74705SXin Li   const int c1; // expected-note {{declared here}}
50*67e74705SXin Li   volatile int v1;
51*67e74705SXin Li };
52*67e74705SXin Li 
53*67e74705SXin Li // Test default initialization which *requires* a constructor call for non-POD.
54*67e74705SXin Li Z1 z1; // expected-note {{first required here}}
55*67e74705SXin Li 
56*67e74705SXin Li // Ensure that value initialization doesn't use trivial implicit constructors.
57*67e74705SXin Li namespace PR7948 {
58*67e74705SXin Li   // Note that this is also non-POD to ensure we don't just special case PODs.
59*67e74705SXin Li   struct S { const int x; ~S(); };
60*67e74705SXin Li   const S arr[2] = { { 42 } };
61*67e74705SXin Li }
62*67e74705SXin Li 
63*67e74705SXin Li // This is valid
64*67e74705SXin Li union U {
65*67e74705SXin Li   const int i;
66*67e74705SXin Li   float f;
67*67e74705SXin Li };
68*67e74705SXin Li U u;
69