111
|
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
|
|
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
|
|
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
|
|
33 void fAx2 ()
|
|
34 {
|
|
35 // Initialization of non-static objects with flexible array members
|
|
36 // isn't allowed in C and should perhaps 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 } };
|
|
40
|
|
41 new (ax2.a) Int16;
|
|
42 new (ax2.a) Int16[1];
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
141 void fBx1 ()
|
|
142 {
|
131
|
143 BAx bax1 = { 1, /* Ax = */ { 2, /* a[] = */ {} } };
|
111
|
144
|
131
|
145 new (bax1.ax.a) char; // { dg-warning "placement" }
|
111
|
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
|
|
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
|
|
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
|
|
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 }
|