1 // PR c++/69662 - -Wplacement-new on allocated one element array members
2 // Exercising -Wplacement-new=2.
3 // { dg-do compile }
4 // { dg-options "-Wno-pedantic -Wplacement-new=2" }
5
6 typedef __typeof__ (sizeof 0) size_t;
7
new(size_t,void * p)8 void* operator new (size_t, void *p) { return p; }
9 void* operator new[] (size_t, void *p) { return p; }
10
11 struct Ax { char n, a []; };
12 struct A0 { char n, a [0]; };
13 struct A1 { char n, a [1]; };
14 struct A2 { char n, a [2]; };
15
16 typedef __INT16_TYPE__ Int16;
17 typedef __INT32_TYPE__ Int32;
18
fAx(Ax * px,Ax & rx)19 void fAx (Ax *px, Ax &rx)
20 {
21 Ax ax;
22
23 new (ax.a) Int32; // { dg-warning "placement" }
24 new (ax.a) Int32[1]; // { dg-warning "placement" }
25
26 new (px->a) Int32;
27 new (px->a) Int32[1];
28
29 new (rx.a) Int32;
30 new (rx.a) Int32[2];
31 }
32
fAx2()33 void fAx2 ()
34 {
35 // Initialization of non-static objects with flexible array members
36 // isn't allowed in C and had to be be disallowed in C++ as
37 // well to avoid c++/69696 - incorrect initialization of block-scope
38 // flexible array members.
39 Ax ax2 = { 1, { 2, 3 } }; // { dg-error "non-static initialization of a flexible array member" }
40
41 new (ax2.a) Int16; // { dg-warning "placement" }
42 new (ax2.a) Int16[1]; // { dg-warning "placement" }
43 new (ax2.a) Int16[2]; // { dg-warning "placement" }
44 new (ax2.a) Int32; // { dg-warning "placement" }
45 new (ax2.a) Int32[2]; // { dg-warning "placement" }
46 }
47
fAx3()48 void fAx3 ()
49 {
50 static Ax ax3 = { 1, { 2, 3, 4 } };
51
52 new (ax3.a) Int16;
53 new (ax3.a) Int16[1];
54 new (ax3.a) Int16[2]; // { dg-warning "placement" }
55 new (ax3.a) Int32; // { dg-warning "placement" }
56 new (ax3.a) Int32[1]; // { dg-warning "placement" }
57 }
58
59 static Ax ax4 = { 1, { 2, 3, 4, 5 } };
60
fAx4()61 void fAx4 ()
62 {
63 new (ax4.a) Int16;
64 new (ax4.a) Int16[1];
65 new (ax4.a) Int16[2];
66 new (ax4.a) Int32;
67 new (ax4.a) Int32[1];
68 new (ax4.a) Int32[2]; // { dg-warning "placement" }
69 }
70
fA0(A0 * p0,A0 & r0)71 void fA0 (A0 *p0, A0 &r0)
72 {
73 A0 a0;
74
75 new (a0.a) Int32; // { dg-warning "placement" }
76 new (a0.a) Int32[1]; // { dg-warning "placement" }
77
78 new (p0->a) Int32;
79 new (p0->a) Int32[1];
80 new (p0->a) Int32[2];
81
82 new (r0.a) Int32;
83 new (r0.a) Int32[1];
84 new (r0.a) Int32[2];
85 }
86
fA1(A1 * p1,A1 & r1)87 void fA1 (A1 *p1, A1 &r1)
88 {
89 A1 a1;
90
91 new (a1.a) Int32; // { dg-warning "placement" }
92 new (a1.a) Int32[1]; // { dg-warning "placement" }
93
94 new (p1->a) Int32; // { dg-warning "placement" }
95 new (p1->a) Int32[1]; // { dg-warning "placement" }
96 new (p1->a) Int32[2]; // { dg-warning "placement" }
97
98 new (r1.a) Int32; // { dg-warning "placement" }
99 new (r1.a) Int32[1]; // { dg-warning "placement" }
100 new (r1.a) Int32[2]; // { dg-warning "placement" }
101 }
102
fA2(A2 * p2,A2 & r2)103 void fA2 (A2 *p2, A2 &r2)
104 {
105 A2 a2;
106 new (a2.a) Int32; // { dg-warning "placement" }
107 new (a2.a) Int32[1]; // { dg-warning "placement" }
108 new (a2.a) Int32[2]; // { dg-warning "placement" }
109
110 new (p2->a) Int32; // { dg-warning "placement" }
111 new (p2->a) Int32[1]; // { dg-warning "placement" }
112 new (p2->a) Int32[2]; // { dg-warning "placement" }
113
114 new (r2.a) Int32; // { dg-warning "placement" }
115 new (r2.a) Int32[1]; // { dg-warning "placement" }
116 new (r2.a) Int32[2]; // { dg-warning "placement" }
117 }
118
119 struct BAx { int i; Ax ax; };
120 struct BA0 { int i; A0 a0; };
121 struct BA1 { int i; A1 a1; };
122 struct BA2 { int i; A2 a2; };
123
fBx(BAx * pbx,BAx & rbx)124 void fBx (BAx *pbx, BAx &rbx)
125 {
126 BAx bax;
127 new (bax.ax.a) char; // { dg-warning "placement" }
128 new (bax.ax.a) Int16; // { dg-warning "placement" }
129 new (bax.ax.a) Int32; // { dg-warning "placement" }
130
131 new (pbx->ax.a) char;
132 new (rbx.ax.a) char;
133 new (pbx->ax.a) Int16;
134 new (rbx.ax.a) Int16;
135 new (pbx->ax.a) Int32;
136 new (rbx.ax.a) Int32;
137 new (pbx->ax.a) int[1234];
138 new (rbx.ax.a) int[5678];
139 }
140
fBx1()141 void fBx1 ()
142 {
143 static BAx bax1 = { 1, /* Ax = */ { 2, /* a[] = */ {} } };
144
145 new (bax1.ax.a) char; // { dg-warning "placement" }
146 new (bax1.ax.a) char[2]; // { dg-warning "placement" }
147 new (bax1.ax.a) Int16; // { dg-warning "placement" }
148 new (bax1.ax.a) Int32; // { dg-warning "placement" }
149 }
150
fB0(BA0 * pb0,BA0 & rb0)151 void fB0 (BA0 *pb0, BA0 &rb0)
152 {
153 BA0 ba0;
154 new (ba0.a0.a) Int32; // { dg-warning "placement" }
155 new (pb0->a0.a) Int32;
156 new (rb0.a0.a) Int32;
157 }
158
fB1(BA1 * pb1,BA1 & rb1)159 void fB1 (BA1 *pb1, BA1 &rb1)
160 {
161 BA1 ba1;
162 new (ba1.a1.a) Int32; // { dg-warning "placement" }
163 new (pb1->a1.a) Int32; // { dg-warning "placement" }
164 new (rb1.a1.a) Int32; // { dg-warning "placement" }
165 }
166
fB2(BA2 * pb2,BA2 & rb2)167 void fB2 (BA2 *pb2, BA2 &rb2)
168 {
169 BA2 ba2;
170 new (ba2.a2.a) Int32; // { dg-warning "placement" }
171 new (pb2->a2.a) Int32; // { dg-warning "placement" }
172 new (rb2.a2.a) Int32; // { dg-warning "placement" }
173 }
174