Mercurial > hg > CbC > CbC_gcc
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 } |