comparison gcc/testsuite/g++.dg/warn/Wplacement-new-size-5.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents
children
comparison
equal deleted inserted replaced
111:04ced10e8804 131:84e7813d76e9
1 // PR c++/83058 - ICE on C++ code with negative array index: in
2 // warn_placement_new_too_small
3 // { dg-do compile }
4 // { dg-additional-options "-Wplacement-new -Wno-pedantic" }
5 // { dg-require-effective-target alloca }
6
7 #define SIZE_MAX __SIZE_MAX__
8 #define DIFF_MAX __PTRDIFF_MAX__
9 #define DIFF_MIN (-DIFF_MAX - 1)
10
11 void* operator new (__SIZE_TYPE__ n, void *p) { return p; }
12 void* operator new[] (__SIZE_TYPE__ n, void *p) { return p; }
13
14 struct A { };
15
16 char carr[2];
17 int iarr[2];
18
19 struct C0 { char i, carr[0]; };
20 struct I0 { int i, iarr[0]; };
21 struct CX { char i, carr[]; };
22 struct IX { int i, iarr[]; };
23
24 void test_single (C0 *pc, CX *qc, I0 *pi, IX *qi, int n)
25 {
26 new (&carr[DIFF_MIN]) A (); // { dg-warning "placement new constructing an object of type .A. and size .1. in a region of type .char \\\[2]. and size .0." }
27 new (&carr[-1]) A; // { dg-warning "\\\[-Wplacement-new" }
28 new (carr -1 ) A; // { dg-warning "\\\[-Wplacement-new" }
29 new (&carr[0]) A;
30 new (carr) A;
31 new (&carr[1]) A;
32 new (carr + 1) A;
33 new (&carr[n]) A;
34 new (carr + n) A;
35 new (&carr[DIFF_MAX]) A; // { dg-warning "\\\[-Wplacement-new" }
36 new (carr + DIFF_MAX) A; // { dg-warning "\\\[-Wplacement-new" }
37 new (&carr[SIZE_MAX]) A; // { dg-warning "\\\[-Wplacement-new" }
38 new (carr + SIZE_MAX) A; // { dg-warning "\\\[-Wplacement-new" }
39
40 new (&pc->carr[DIFF_MIN]) A; // { dg-warning "\\\[-Wplacement-new" }
41 new (&pc->carr[-1]) A; // { dg-warning "\\\[-Wplacement-new" }
42 new (&pc->carr[0]) A;
43 new (&pc->carr[9]) A;
44 new (&pc->carr[n]) A;
45 new (&pc->carr[DIFF_MAX]) A; // { dg-warning "\\\[-Wplacement-new" }
46 new (&pc->carr[SIZE_MAX]) A; // { dg-warning "\\\[-Wplacement-new" }
47
48 {
49 /* The highest index at which a single A can be constructed. */
50 enum { MAX = DIFF_MAX - sizeof *pc - sizeof (A) };
51 new (&pc->carr[MAX]) A;
52 new (&pc->carr[MAX + 1]) A; // { dg-warning "\\\[-Wplacement-new" }
53 }
54
55 new (&qc->carr[DIFF_MIN]) A; // { dg-warning "\\\[-Wplacement-new" }
56 new (&qc->carr[-1]) A; // { dg-warning "\\\[-Wplacement-new" }
57 new (&qc->carr[0]) A;
58 new (&qc->carr[9]) A;
59 new (&qc->carr[n]) A;
60 new (&qc->carr[DIFF_MAX]) A; // { dg-warning "\\\[-Wplacement-new" }
61 new (&qc->carr[SIZE_MAX]) A; // { dg-warning "\\\[-Wplacement-new" }
62
63 {
64 /* The highest index at which a single A can be constructed. */
65 enum { MAX = DIFF_MAX - sizeof *qc - sizeof (A) };
66 new (&qc->carr[MAX]) A;
67 new (&qc->carr[MAX + 1]) A; // { dg-warning "\\\[-Wplacement-new" }
68 }
69
70 new (&pi->iarr[DIFF_MIN]) A; // { dg-warning "\\\[-Wplacement-new" }
71 new (&pi->iarr[-1]) A; // { dg-warning "\\\[-Wplacement-new" }
72 new (&pi->iarr[0]) A;
73 new (&pi->iarr[9]) A;
74 new (&pi->iarr[n]) A;
75 new (&pi->iarr[DIFF_MAX]) A; // { dg-warning "\\\[-Wplacement-new" }
76 new (&pi->iarr[SIZE_MAX]) A; // { dg-warning "\\\[-Wplacement-new" }
77
78 {
79 enum { MAX = (DIFF_MAX - sizeof *pi) / sizeof *pi->iarr };
80 new (&pi->iarr[MAX]) A;
81 new (&pi->iarr[MAX + 1]) A; // { dg-warning "\\\[-Wplacement-new" }
82 }
83
84 new (&qi->iarr[DIFF_MIN]) A; // { dg-warning "\\\[-Wplacement-new" }
85 new (&qi->iarr[-1]) A; // { dg-warning "\\\[-Wplacement-new" }
86 new (&qi->iarr[0]) A;
87 new (&qi->iarr[9]) A;
88 new (&qi->iarr[n]) A;
89 new (&qi->iarr[DIFF_MAX]) A; // { dg-warning "\\\[-Wplacement-new" }
90 new (&qi->iarr[SIZE_MAX]) A; // { dg-warning "\\\[-Wplacement-new" }
91
92 {
93 enum { MAX = (DIFF_MAX - sizeof *qi) / sizeof *qi->iarr };
94 new (&qi->iarr[MAX]) A;
95 new (&qi->iarr[MAX + 1]) A; // { dg-warning "\\\[-Wplacement-new" }
96 }
97
98 new (&iarr[DIFF_MIN]) A; // { dg-warning "\\\[-Wplacement-new" }
99 new (&iarr[-1]) A; // { dg-warning "\\\[-Wplacement-new" }
100 new (&iarr[1]) A;
101 new (&iarr[n]) A;
102 new (&iarr[DIFF_MAX]) A; // { dg-warning "\\\[-Wplacement-new" }
103 new (&iarr[SIZE_MAX]) A; // { dg-warning "\\\[-Wplacement-new" }
104 }
105
106 void test_array_1 (C0 *pc, CX *qc, I0 *pi, IX *qi)
107 {
108 enum { N = 1 };
109
110 new (&carr[DIFF_MIN]) A[N]; // { dg-warning "placement new constructing an object of type .A \\\[\[0-9\]+]. and size .\[0-9\]+. in a region of type .char \\\[2]. and size .0." }
111 new (&carr[-1]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
112 new (&carr[DIFF_MAX]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
113 new (&carr[SIZE_MAX]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
114
115 new (&pc->carr[DIFF_MIN]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
116 new (&pc->carr[-1]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
117 new (&pc->carr[DIFF_MAX]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
118 new (&pc->carr[SIZE_MAX]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
119
120 {
121 enum { MAX = DIFF_MAX - sizeof *pc - sizeof (A[N]) };
122 new (&pc->carr[MAX]) A[N];
123 new (&pc->carr[MAX + 1]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
124 }
125
126 new (&qc->carr[DIFF_MIN]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
127 new (&qc->carr[-1]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
128 new (&qc->carr[DIFF_MAX]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
129 new (&qc->carr[SIZE_MAX]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
130
131 {
132 enum { MAX = DIFF_MAX - sizeof *qc - sizeof (A[N]) };
133 new (&qc->carr[MAX]) A[N];
134 new (&qc->carr[MAX + 1]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
135 }
136
137 new (&pi->iarr[DIFF_MIN]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
138 new (&pi->iarr[-1]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
139 new (&pi->iarr[DIFF_MAX]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
140 new (&pi->iarr[SIZE_MAX]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
141
142 {
143 enum { MAX = (DIFF_MAX - sizeof *pi) / sizeof *pi->iarr };
144 new (&pi->iarr[MAX]) A[N];
145 new (&pi->iarr[MAX + 1]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
146 }
147
148 new (&qi->iarr[DIFF_MIN]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
149 new (&qi->iarr[-1]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
150 new (&qi->iarr[DIFF_MAX]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
151 new (&qi->iarr[SIZE_MAX]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
152
153 {
154 enum { MAX = (DIFF_MAX - sizeof *qi) / sizeof *qi->iarr };
155 new (&qi->iarr[MAX]) A[N];
156 new (&qi->iarr[MAX + 1]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
157 }
158
159 new (&iarr[DIFF_MIN]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
160 new (&iarr[-1]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
161 new (&iarr[DIFF_MAX]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
162 new (&iarr[SIZE_MAX]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
163 }
164
165
166 void test_array_3 (C0 *pc, CX *qc, I0 *pi, IX *qi)
167 {
168 enum { N = 3 };
169
170 new (&carr[DIFF_MIN]) A[N]; // { dg-warning "placement new constructing an object of type .A \\\[\[0-9\]+]. and size .\[0-9\]+. in a region of type .char \\\[2]. and size .0." }
171 new (&carr[-1]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
172 new (&carr[DIFF_MAX]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
173 new (&carr[SIZE_MAX]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
174
175 new (&pc->carr[DIFF_MIN]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
176 new (&pc->carr[-1]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
177 new (&pc->carr[DIFF_MAX]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
178 new (&pc->carr[SIZE_MAX]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
179
180 {
181 enum { MAX = DIFF_MAX - sizeof *pc - sizeof (A[N]) };
182 new (&pc->carr[MAX]) A[N];
183 new (&pc->carr[MAX + 1]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
184 }
185
186 new (&qc->carr[DIFF_MIN]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
187 new (&qc->carr[-1]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
188 new (&qc->carr[DIFF_MAX]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
189 new (&qc->carr[SIZE_MAX]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
190
191 {
192 enum { MAX = DIFF_MAX - sizeof *qc - sizeof (A[N]) };
193 new (&qc->carr[MAX]) A[N];
194 new (&qc->carr[MAX + 1]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
195 }
196
197 new (&pi->iarr[DIFF_MIN]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
198 new (&pi->iarr[-1]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
199 new (&pi->iarr[DIFF_MAX]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
200 new (&pi->iarr[SIZE_MAX]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
201
202 {
203 enum { MAX = (DIFF_MAX - sizeof *pi) / sizeof *pi->iarr };
204 new (&pi->iarr[MAX]) A[N];
205 new (&pi->iarr[MAX + 1]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
206 }
207
208 new (&qi->iarr[DIFF_MIN]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
209 new (&qi->iarr[-1]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
210 new (&qi->iarr[DIFF_MAX]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
211 new (&qi->iarr[SIZE_MAX]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
212
213 {
214 enum { MAX = (DIFF_MAX - sizeof *qi) / sizeof *qi->iarr };
215 new (&qi->iarr[MAX]) A[N];
216 new (&qi->iarr[MAX + 1]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
217 }
218
219 new (&iarr[DIFF_MIN]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
220 new (&iarr[-1]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
221 new (&iarr[DIFF_MAX]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
222 new (&iarr[SIZE_MAX]) A[N]; // { dg-warning "\\\[-Wplacement-new" }
223 }
224
225
226 void test_vla (unsigned n)
227 {
228 char cvla[n];
229
230 new (&cvla[DIFF_MIN]) A; // { dg-warning "placement new constructing an object of type .A. and size .1. in a region of type .char \\\[n]. and size .0." }
231 new (&cvla[-1]) A; // { dg-warning "\\\[-Wplacement-new" }
232 new (cvla -1) A; // { dg-warning "\\\[-Wplacement-new" }
233 new (&cvla[0]) A;
234 new (&cvla[9]) A;
235 new (&cvla[n - 1]) A;
236 new (cvla + n - 1) A;
237 new (&cvla[DIFF_MAX - 1]) A;
238 new (&cvla[DIFF_MAX]) A; // { dg-warning "\\\[-Wplacement-new" }
239 new (cvla + DIFF_MAX) A; // { dg-warning "\\\[-Wplacement-new" }
240 new (&cvla[SIZE_MAX]) A; // { dg-warning "\\\[-Wplacement-new" }
241 new (cvla + SIZE_MAX) A; // { dg-warning "\\\[-Wplacement-new" }
242 }