1 // PR c++/69662 - -Wplacement-new on allocated one element array members
2 // Exercising -Wplacement-new=2.
4 // { dg-options "-Wno-pedantic -Wplacement-new=2" }
6 typedef __typeof__ (sizeof 0) size_t;
8 void* operator new (size_t, void *p) { return p; }
9 void* operator new[] (size_t, void *p) { return p; }
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]; };
16 typedef __INT16_TYPE__ Int16;
17 typedef __INT32_TYPE__ Int32;
19 void fAx (Ax *px, Ax &rx)
23 new (ax.a) Int32; // { dg-warning "placement" }
24 new (ax.a) Int32[1]; // { dg-warning "placement" }
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" }
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" }
50 static Ax ax3 = { 1, { 2, 3, 4 } };
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" }
59 static Ax ax4 = { 1, { 2, 3, 4, 5 } };
68 new (ax4.a) Int32[2]; // { dg-warning "placement" }
71 void fA0 (A0 *p0, A0 &r0)
75 new (a0.a) Int32; // { dg-warning "placement" }
76 new (a0.a) Int32[1]; // { dg-warning "placement" }
87 void fA1 (A1 *p1, A1 &r1)
91 new (a1.a) Int32; // { dg-warning "placement" }
92 new (a1.a) Int32[1]; // { dg-warning "placement" }
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" }
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" }
103 void fA2 (A2 *p2, A2 &r2)
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" }
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" }
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" }
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; };
124 void fBx (BAx *pbx, BAx &rbx)
127 // The uninitialized flexible array takes up the bytes of padding.
128 new (bax.ax.a) char; // { dg-warning "placement" "" { target default_packed } }
129 new (bax.ax.a) Int16; // { dg-warning "placement" "" { target default_packed } }
130 new (bax.ax.a) char[3]; // { dg-warning "placement" "" { target default_packed } }
131 new (bax.ax.a) Int32; // { dg-warning "placement" }
132 new (bax.ax.a) char[4]; // { dg-warning "placement" }
133 new (bax.ax.a) char[5]; // { dg-warning "placement" }
135 new (pbx->ax.a) char;
137 new (pbx->ax.a) Int16;
138 new (rbx.ax.a) Int16;
139 new (pbx->ax.a) Int32;
140 new (rbx.ax.a) Int32;
141 new (pbx->ax.a) int[1234];
142 new (rbx.ax.a) int[5678];
147 static BAx bax1 = { 1, /* Ax = */ { 2, /* a[] = */ {} } };
149 // The empty flexible array takes up the bytes of padding.
150 new (bax1.ax.a) char; // { dg-warning "placement" "" { target default_packed } }
151 new (bax1.ax.a) char[2]; // { dg-warning "placement" "" { target default_packed } }
152 new (bax1.ax.a) Int16; // { dg-warning "placement" "" { target default_packed } }
153 new (bax1.ax.a) char[3]; // { dg-warning "placement" "" { target default_packed } }
154 new (bax1.ax.a) Int32; // { dg-warning "placement" }
155 new (bax1.ax.a) char[4]; // { dg-warning "placement" }
156 new (bax1.ax.a) char[5]; // { dg-warning "placement" }
159 void fB0 (BA0 *pb0, BA0 &rb0)
162 new (ba0.a0.a) Int32; // { dg-warning "placement" }
163 new (pb0->a0.a) Int32;
164 new (rb0.a0.a) Int32;
167 void fB1 (BA1 *pb1, BA1 &rb1)
170 new (ba1.a1.a) Int32; // { dg-warning "placement" }
171 new (pb1->a1.a) Int32; // { dg-warning "placement" }
172 new (rb1.a1.a) Int32; // { dg-warning "placement" }
175 void fB2 (BA2 *pb2, BA2 &rb2)
178 new (ba2.a2.a) Int32; // { dg-warning "placement" }
179 new (pb2->a2.a) Int32; // { dg-warning "placement" }
180 new (rb2.a2.a) Int32; // { dg-warning "placement" }