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