1 // { dg-do compile }
2 
3 // Test for PR c++/67927 - array new expression with excessive number
4 // of elements not diagnosed.
5 
6 // GCC uses a different maximum value at compile time and at runtime:
7 // 1) The compile-time maximum, MAX, is SIZE_MAX / 2 minus the size
8 //    of a cookie (sizeof (size_t)).  Exceeding the compile-time
9 //    maximum is ill-formed and diagnosed.  This test verifies this
10 //    diagnostic.
11 // 2) The runtime runtime maximum is the most significant 7 bits,
12 //    starting with the first most significant non-zero bit, of
13 //    the dividend of the compile-time constant MAX and the product
14 //    of the constant array dimensions and the element size, minus
15 //    the size of the "cookie."  This is also roughly (though not
16 //    exactly) SIZE_MAX / 2.  Exceeding the runtime maximum is
17 //    diagnosed at runtime by throwing a bad_array_new_length
18 //    exception.
19 //    The cookie is the number of elements in the array, and is
20 //    only added for non-POD types, but the its size factors into
21 //    the maximum size formula regardless.
22 
23 // See also PR c++/19351 - integer overflow in operator new[].
24 
25 // For convenience.
26 #define MAX __SIZE_MAX__
27 
28 typedef __typeof__ (sizeof 0) size_t;
29 
30 void* operator new (size_t, void*);
31 void* operator new[] (size_t, void*);
32 
33 void *p;
34 
35 // Exercise new expression with one-dimensional arrays of char.
36 static void __attribute__ ((used))
test_one_dim_char_array()37 test_one_dim_char_array ()
38 {
39     p = new char [MAX];                 // { dg-error "size of array" }
40     p = new char [MAX - 1];             // { dg-error "size of array" }
41     p = new char [MAX - 2];             // { dg-error "size of array" }
42     p = new char [MAX - 99];            // { dg-error "size of array" }
43     p = new char [MAX / 2];             // { dg-error "size of array" }
44     p = new char [MAX / 2 - 1];         // { dg-error "size of array" }
45     p = new char [MAX / 2 - 2];         // { dg-error "size of array" }
46 
47     // Avoid testing the expressions below since whether or not they
48     // are accepted depends on the precision of size_t (which also
49     // determines the size of the cookie).
50     // p = new char [MAX / 2 - 3];
51     // p = new char [MAX / 2 - 4];
52     // p = new char [MAX / 2 - 5];
53     // p = new char [MAX / 2 - 6];
54 
55     // The following expressions are accepted on ILP32 as well LP64
56     // (they will be diagnosed on LP128 if there ever is such a data
57     // model).
58     p = new char [MAX / 2 - 7];         // okay
59     p = new char [MAX / 2 - 8];         // okay
60 }
61 
62 static void __attribute__ ((used))
test_one_dim_short_array()63 test_one_dim_short_array ()
64 {
65     p = new short [MAX];                // { dg-error "size of array" }
66     p = new short [MAX - 1];            // { dg-error "size of array" }
67     p = new short [MAX - 2];            // { dg-error "size of array" }
68     p = new short [MAX - 99];           // { dg-error "size of array" }
69     p = new short [MAX / 2];            // { dg-error "size of array" }
70     p = new short [MAX / 2 - 1];        // { dg-error "size of array" }
71     p = new short [MAX / 2 - 2];        // { dg-error "size of array" }
72     p = new short [MAX / 2 - 3];        // { dg-error "size of array" }
73     p = new short [MAX / 2 - 4];        // { dg-error "size of array" }
74     p = new short [MAX / 2 - 5];        // { dg-error "size of array" }
75     p = new short [MAX / 2 - 6];        // { dg-error "size of array" }
76     p = new short [MAX / 2 - 7];        // { dg-error "size of array" }
77     p = new short [MAX / 2 - 8];        // { dg-error "size of array" }
78     p = new short [MAX / 4];            // { dg-error "size of array" }
79 
80     // Avoid exercising data model-dependent expressions.
81     // p = new short [MAX / 4 - 1];
82 
83     p = new short [MAX / 4 - 4];        // okay
84 }
85 
86 // Exercise new expression with two-dimensional arrays or char.
87 static void __attribute__ ((used))
test_two_dim_char_array()88 test_two_dim_char_array ()
89 {
90     p = new char [1][MAX];              // { dg-error "size of (unnamed )?array" }
91     p = new char [1][MAX - 1];          // { dg-error "size of (unnamed )?array" }
92     p = new char [1][MAX - 2];          // { dg-error "size of (unnamed )?array" }
93     p = new char [1][MAX - 99];         // { dg-error "size of (unnamed )?array" }
94     p = new char [1][MAX / 2];          // { dg-error "size of array" }
95     p = new char [1][MAX / 2 - 1];      // { dg-error "size of array" }
96     p = new char [1][MAX / 2 - 2];      // { dg-error "size of array" }
97 
98     // Avoid exercising data model-dependent expressions.
99     // p = new char [1][MAX / 2 - 3];
100     // p = new char [1][MAX / 2 - 4];
101     // p = new char [1][MAX / 2 - 5];
102     // p = new char [1][MAX / 2 - 6];
103 
104     p = new char [1][MAX / 2 - 7];      // okay
105     p = new char [1][MAX / 2 - 8];      // okay
106 
107     p = new char [2][MAX];              // { dg-error "size of (unnamed )?array" }
108     p = new char [2][MAX - 1];          // { dg-error "size of (unnamed )?array" }
109     p = new char [2][MAX - 2];          // { dg-error "size of (unnamed )?array" }
110     p = new char [2][MAX / 2];          // { dg-error "size of array" }
111     p = new char [2][MAX / 2 - 1];      // { dg-error "size of array" }
112     p = new char [2][MAX / 2 - 2];      // { dg-error "size of array" }
113     p = new char [2][MAX / 2 - 7];      // { dg-error "size of array" }
114     p = new char [2][MAX / 2 - 8];      // { dg-error "size of array" }
115 
116     p = new char [MAX][MAX];            // { dg-error "size of (unnamed )?array" }
117     p = new char [MAX][MAX - 1];        // { dg-error "size of (unnamed )?array" }
118     p = new char [MAX][MAX - 2];        // { dg-error "size of (unnamed )?array" }
119     p = new char [MAX][MAX / 2];        // { dg-error "size of array" }
120     p = new char [MAX][MAX / 2 - 1];    // { dg-error "size of array" }
121     p = new char [MAX][MAX / 2 - 2];    // { dg-error "size of array" }
122     p = new char [MAX][MAX / 2 - 7];    // { dg-error "size of array" }
123     p = new char [MAX][MAX / 2 - 8];    // { dg-error "size of array" }
124     p = new char [MAX][2];              // { dg-error "size of array" }
125     p = new char [MAX][1];              // { dg-error "size of array" }
126     p = new char [MAX / 2][1];          // { dg-error "size of array" }
127     p = new char [MAX / 2 - 1][1];      // { dg-error "size of array" }
128     p = new char [MAX / 2 - 2][1];      // { dg-error "size of array" }
129 
130     // Avoid exercising data model-dependent expressions.
131     // p = new char [MAX / 2 - 3][1];
132     // p = new char [MAX / 2 - 4][1];
133     // p = new char [MAX / 2 - 5][1];
134     // p = new char [MAX / 2 - 6][1];
135 
136     p = new char [MAX / 2 - 7][1];      // okay
137     p = new char [MAX / 2 - 8][1];      // okay
138 }
139 
140 
141 // Exercise new expression with three-dimensional arrays.
142 static __attribute__ ((used)) void
test_three_dim_char_array()143 test_three_dim_char_array ()
144 {
145     p = new char [1][1][MAX];           // { dg-error "size of (unnamed )?array" }
146     p = new char [1][1][MAX - 1];       // { dg-error "size of (unnamed )?array" }
147     p = new char [1][1][MAX - 2];       // { dg-error "size of (unnamed )?array" }
148     p = new char [1][1][MAX - 99];      // { dg-error "size of (unnamed )?array" }
149     p = new char [1][1][MAX / 2];       // { dg-error "size of array" }
150     p = new char [1][1][MAX / 2 - 1];   // { dg-error "size of array" }
151     p = new char [1][1][MAX / 2 - 2];   // { dg-error "size of array" }
152 
153     // Avoid exercising data model-dependent expressions.
154     // p = new char [1][1][MAX / 2 - 3];
155     // p = new char [1][1][MAX / 2 - 4];
156     // p = new char [1][1][MAX / 2 - 5];
157     // p = new char [1][1][MAX / 2 - 6];
158 
159     p = new char [1][1][MAX / 2 - 7];   // okay
160     p = new char [1][1][MAX / 2 - 8];   // okay
161 
162     p = new char [1][2][MAX];           // { dg-error "size of (unnamed )?array" }
163     p = new char [1][2][MAX - 1];       // { dg-error "size of (unnamed )?array" }
164     p = new char [1][2][MAX - 2];       // { dg-error "size of (unnamed )?array" }
165     p = new char [1][2][MAX - 99];      // { dg-error "size of (unnamed )?array" }
166     p = new char [1][2][MAX / 2];       // { dg-error "size of (unnamed )?array" }
167     p = new char [1][2][MAX / 2 - 1];   // { dg-error "size of (unnamed )?array" }
168     p = new char [1][2][MAX / 2 - 2];   // { dg-error "size of (unnamed )?array" }
169     p = new char [1][2][MAX / 2 - 3];   // { dg-error "size of (unnamed )?array" }
170     p = new char [1][2][MAX / 2 - 4];   // { dg-error "size of (unnamed )?array" }
171     p = new char [1][2][MAX / 2 - 5];   // { dg-error "size of (unnamed )?array" }
172     p = new char [1][2][MAX / 2 - 6];   // { dg-error "size of (unnamed )?array" }
173     p = new char [1][2][MAX / 2 - 7];   // { dg-error "size of (unnamed )?array" }
174     p = new char [1][2][MAX / 2 - 8];   // { dg-error "size of (unnamed )?array" }
175     p = new char [1][2][MAX / 4];       // { dg-error "size of array" }
176 
177     // Avoid exercising data model-dependent expressions.
178     // p = new char [1][2][MAX / 4 - 1];
179     // p = new char [1][2][MAX / 4 - 2];
180 
181     p = new char [1][2][MAX / 4 - 3];   // okay
182     p = new char [1][2][MAX / 4 - 4];   // okay
183 
184     p = new char [2][1][MAX];           // { dg-error "size of (unnamed )?array" }
185     p = new char [2][1][MAX - 1];       // { dg-error "size of (unnamed )?array" }
186     p = new char [2][1][MAX - 2];       // { dg-error "size of (unnamed )?array" }
187     p = new char [2][1][MAX - 99];      // { dg-error "size of (unnamed )?array" }
188     p = new char [2][1][MAX / 2];       // { dg-error "size of array" }
189     p = new char [2][1][MAX / 2 - 1];   // { dg-error "size of array" }
190     p = new char [2][1][MAX / 2 - 2];   // { dg-error "size of array" }
191     p = new char [2][1][MAX / 2 - 3];   // { dg-error "size of array" }
192     p = new char [2][1][MAX / 2 - 4];   // { dg-error "size of array" }
193     p = new char [2][1][MAX / 2 - 5];   // { dg-error "size of array" }
194     p = new char [2][1][MAX / 2 - 6];   // { dg-error "size of array" }
195     p = new char [2][1][MAX / 2 - 7];   // { dg-error "size of array" }
196     p = new char [2][1][MAX / 2 - 8];   // { dg-error "size of array" }
197     p = new char [2][1][MAX / 4];       // { dg-error "size of array" }
198 
199     // Avoid exercising data model-dependent expressions.
200     // p = new char [2][1][MAX / 4 - 1];
201     // p = new char [2][1][MAX / 4 - 2];
202 
203     p = new char [2][1][MAX / 4 - 3];   // okay
204     p = new char [2][1][MAX / 4 - 4];   // okay
205 
206     p = new char [2][2][MAX];           // { dg-error "size of (unnamed )?array" }
207     p = new char [2][2][MAX - 1];       // { dg-error "size of (unnamed )?array" }
208     p = new char [2][2][MAX - 2];       // { dg-error "size of (unnamed )?array" }
209     p = new char [2][2][MAX - 99];      // { dg-error "size of (unnamed )?array" }
210     p = new char [2][2][MAX / 2];       // { dg-error "size of (unnamed )?array" }
211     p = new char [2][2][MAX / 2 - 1];   // { dg-error "size of (unnamed )?array" }
212     p = new char [2][2][MAX / 2 - 2];   // { dg-error "size of (unnamed )?array" }
213     p = new char [2][2][MAX / 2 - 3];   // { dg-error "size of (unnamed )?array" }
214     p = new char [2][2][MAX / 2 - 4];   // { dg-error "size of (unnamed )?array" }
215     p = new char [2][2][MAX / 2 - 5];   // { dg-error "size of (unnamed )?array" }
216     p = new char [2][2][MAX / 2 - 6];   // { dg-error "size of (unnamed )?array" }
217     p = new char [2][2][MAX / 2 - 7];   // { dg-error "size of (unnamed )?array" }
218     p = new char [2][2][MAX / 2 - 8];   // { dg-error "size of (unnamed )?array" }
219     p = new char [2][2][MAX / 4];       // { dg-error "size of array" }
220     p = new char [2][2][MAX / 4 - 1];   // { dg-error "size of array" }
221     p = new char [2][2][MAX / 4 - 2];   // { dg-error "size of array" }
222 
223     // Avoid exercising data model-dependent expressions.
224     // p = new char [2][2][MAX / 8];
225     // p = new char [2][2][MAX / 8 - 1];
226 
227     p = new char [2][2][MAX / 8 - 2];
228     p = new char [2][2][MAX / 8 - 3];
229 
230     p = new char [2][MAX][2];           // { dg-error "size of (unnamed )?array" }
231     p = new char [2][MAX - 1][2];       // { dg-error "size of (unnamed )?array" }
232     p = new char [2][MAX - 2][2];       // { dg-error "size of (unnamed )?array" }
233     p = new char [2][MAX - 99][2];      // { dg-error "size of (unnamed )?array" }
234     p = new char [2][MAX / 2][2];       // { dg-error "size of (unnamed )?array" }
235     p = new char [2][MAX / 2 - 1][2];   // { dg-error "size of (unnamed )?array" }
236     p = new char [2][MAX / 2 - 2][2];   // { dg-error "size of (unnamed )?array" }
237     p = new char [2][MAX / 2 - 3][2];   // { dg-error "size of (unnamed )?array" }
238     p = new char [2][MAX / 2 - 4][2];   // { dg-error "size of (unnamed )?array" }
239     p = new char [2][MAX / 2 - 5][2];   // { dg-error "size of (unnamed )?array" }
240     p = new char [2][MAX / 2 - 6][2];   // { dg-error "size of (unnamed )?array" }
241     p = new char [2][MAX / 2 - 7][2];   // { dg-error "size of (unnamed )?array" }
242     p = new char [2][MAX / 2 - 8][2];   // { dg-error "size of (unnamed )?array" }
243     p = new char [2][MAX / 4][2];       // { dg-error "size of array" }
244     p = new char [2][MAX / 4 - 1][2];   // { dg-error "size of array" }
245     p = new char [2][MAX / 4 - 2][2];   // { dg-error "size of array" }
246 
247     // Avoid exercising data model-dependent expressions.
248     // p = new char [2][MAX / 8][2];
249     // p = new char [2][MAX / 8 - 1][2];
250 
251     p = new char [2][MAX / 8 - 2][2];
252     p = new char [2][MAX / 8 - 3][2];
253 
254     p = new char [MAX][2][2];           // { dg-error "size of array" }
255     p = new char [MAX - 1][2][2];       // { dg-error "size of array" }
256     p = new char [MAX - 2][2][2];       // { dg-error "size of array" }
257     p = new char [MAX - 99][2][2];      // { dg-error "size of array" }
258     p = new char [MAX / 2][2][2];       // { dg-error "size of array" }
259     p = new char [MAX / 2 - 1][2][2];   // { dg-error "size of array" }
260     p = new char [MAX / 2 - 2][2][2];   // { dg-error "size of array" }
261     p = new char [MAX / 2 - 3][2][2];   // { dg-error "size of array" }
262     p = new char [MAX / 2 - 4][2][2];   // { dg-error "size of array" }
263     p = new char [MAX / 2 - 5][2][2];   // { dg-error "size of array" }
264     p = new char [MAX / 2 - 6][2][2];   // { dg-error "size of array" }
265     p = new char [MAX / 2 - 7][2][2];   // { dg-error "size of array" }
266     p = new char [MAX / 2 - 8][2][2];   // { dg-error "size of array" }
267     p = new char [MAX / 4][2][2];       // { dg-error "size of array" }
268     p = new char [MAX / 4 - 1][2][2];   // { dg-error "size of array" }
269     p = new char [MAX / 4 - 2][2][2];   // { dg-error "size of array" }
270 
271     // Avoid exercising data model-dependent expressions.
272     // p = new char [MAX / 8][2][2];
273     // p = new char [MAX / 8 - 1][2][2];
274 
275     p = new char [MAX / 8 - 2][2][2];
276     p = new char [MAX / 8 - 3][2][2];
277 
278     p = new char [MAX][MAX][MAX];         // { dg-error "size of (unnamed )?array" }
279     p = new char [MAX][MAX][MAX / 2];     // { dg-error "size of (unnamed )?array" }
280     p = new char [MAX][MAX / 2][MAX];     // { dg-error "size of (unnamed )?array" }
281     p = new char [MAX][MAX / 2][MAX / 2]; // { dg-error "size of (unnamed )?array" }
282     p = new char [MAX / 2][MAX / 2][MAX / 2]; // { dg-error "size of (unnamed )?array" }
283 }
284 
285 // Exercise new expression with N-dimensional arrays where N is
286 // sizeof(size_t).
287 static __attribute__ ((used)) void
test_N_dim_char_array()288 test_N_dim_char_array ()
289 {
290 #if __SIZEOF_SIZE_T__ == 8
291     enum { N = 256 };
292 #else
293     enum { N = 16 };
294 #endif
295 
296     p = new char        [N][N][N][N][N][N][N];
297     p = new char [N / 2][2][N][N][N][N][N][N];
298     p = new char [N - 1][N / 2][N][N][N][N][N][N];
299     p = new char [N / 2][N][N][N][N][N][N][N];  // { dg-error "size of array" }
300     p = new char [N - 1][N][N][N][N][N][N][N];  // { dg-error "size of array" }
301     p = new char [N]    [N][N][N][N][N][N][N];  // { dg-error "size of array" }
302 }
303 
304 typedef struct Byte {
305     char c;
306 
307     void* operator new (size_t, void*);
308     void* operator new[] (size_t, void*);
309 } B;
310 
311 void* operator new (size_t, B*);
312 void* operator new[] (size_t, B*);
313 
314 // Exercise placement new expression with one-dimensional arrays of a struct.
315 static void __attribute__ ((used))
test_one_dim_byte_array(void * p)316 test_one_dim_byte_array (void *p)
317 {
318     p = new (p) B [MAX];                // { dg-error "size of array" }
319     p = new (p) B [MAX - 1];            // { dg-error "size of array" }
320     p = new (p) B [MAX - 2];            // { dg-error "size of array" }
321     p = new (p) B [MAX - 99];           // { dg-error "size of array" }
322     p = new (p) B [MAX / 2];            // { dg-error "size of array" }
323     p = new (p) B [MAX / 2 - 1];        // { dg-error "size of array" }
324     p = new (p) B [MAX / 2 - 2];        // { dg-error "size of array" }
325 
326     // Avoid testing the expressions below since whether or not they
327     // are accepted depends on the precision of size_t (which determines
328     // the size of the cookie).
329     // p = new (p) B [MAX / 2 - 3];
330     // p = new (p) B [MAX / 2 - 4];
331     // p = new (p) B [MAX / 2 - 5];
332     // p = new (p) B [MAX / 2 - 6];
333 
334     // The following expressions are accepted on ILP32 as well LP64
335     // (they will be diagnosed on LP128 if there ever is such a data
336     // model).
337     p = new (p) B [MAX / 2 - 7];         // okay
338     p = new (p) B [MAX / 2 - 8];         // okay
339 }
340 
341 // Exercise placement new expression with two-dimensional arrays.
342 static void __attribute__ ((used))
test_placement_two_dim_byte_struct_array(void * p)343 test_placement_two_dim_byte_struct_array (void *p)
344 {
345     p = new (p) B [1][MAX];             // { dg-error "size of (unnamed )?array" }
346     p = new (p) B [1][MAX - 1];         // { dg-error "size of (unnamed )?array" }
347     p = new (p) B [1][MAX - 2];         // { dg-error "size of (unnamed )?array" }
348     p = new (p) B [1][MAX - 99];        // { dg-error "size of (unnamed )?array" }
349     p = new (p) B [1][MAX / 2];         // { dg-error "size of array" }
350     p = new (p) B [1][MAX / 2 - 1];     // { dg-error "size of array" }
351     p = new (p) B [1][MAX / 2 - 2];     // { dg-error "size of array" }
352 
353     // Avoid exercising data model-dependent expressions.
354     // p = new (p) B [1][MAX / 2 - 3];
355     // p = new (p) B [1][MAX / 2 - 4];
356     // p = new (p) B [1][MAX / 2 - 5];
357     // p = new (p) B [1][MAX / 2 - 6];
358 
359     p = new (p) B [1][MAX / 2 - 7];      // okay
360     p = new (p) B [1][MAX / 2 - 8];      // okay
361 
362     p = new (p) B [2][MAX];             // { dg-error "size of (unnamed )?array" }
363     p = new (p) B [2][MAX - 1];         // { dg-error "size of (unnamed )?array" }
364     p = new (p) B [2][MAX - 2];         // { dg-error "size of (unnamed )?array" }
365     p = new (p) B [2][MAX / 2];         // { dg-error "size of array" }
366     p = new (p) B [2][MAX / 2 - 1];     // { dg-error "size of array" }
367     p = new (p) B [2][MAX / 2 - 2];     // { dg-error "size of array" }
368     p = new (p) B [2][MAX / 2 - 7];     // { dg-error "size of array" }
369     p = new (p) B [2][MAX / 2 - 8];     // { dg-error "size of array" }
370 
371     p = new (p) B [MAX][MAX];           // { dg-error "size of (unnamed )?array" }
372     p = new (p) B [MAX][MAX - 1];       // { dg-error "size of (unnamed )?array" }
373     p = new (p) B [MAX][MAX - 2];       // { dg-error "size of (unnamed )?array" }
374     p = new (p) B [MAX][MAX / 2];       // { dg-error "size of array" }
375     p = new (p) B [MAX][MAX / 2 - 1];   // { dg-error "size of array" }
376     p = new (p) B [MAX][MAX / 2 - 2];   // { dg-error "size of array" }
377     p = new (p) B [MAX][MAX / 2 - 7];   // { dg-error "size of array" }
378     p = new (p) B [MAX][MAX / 2 - 8];   // { dg-error "size of array" }
379     p = new (p) B [MAX][2];             // { dg-error "size of array" }
380     p = new (p) B [MAX][1];             // { dg-error "size of array" }
381     p = new (p) B [MAX / 2][1];         // { dg-error "size of array" }
382     p = new (p) B [MAX / 2 - 1][1];     // { dg-error "size of array" }
383     p = new (p) B [MAX / 2 - 2][1];     // { dg-error "size of array" }
384 
385     // Avoid exercising data model-dependent expressions.
386     // p = new (p) B [MAX / 2 - 3][1];
387     // p = new (p) B [MAX / 2 - 4][1];
388     // p = new (p) B [MAX / 2 - 5][1];
389     // p = new (p) B [MAX / 2 - 6][1];
390 
391     p = new (p) B [MAX / 2 - 7][1];      // okay
392     p = new (p) B [MAX / 2 - 8][1];      // okay
393 }
394 
395 
396 // Exercise placement new expression with three-dimensional arrays.
397 static __attribute__ ((used)) void
test_placement_three_dim_byte_struct_array(void * p)398 test_placement_three_dim_byte_struct_array (void *p)
399 {
400     p = new (p) B [1][1][MAX];          // { dg-error "size of (unnamed )?array" }
401     p = new (p) B [1][1][MAX - 1];      // { dg-error "size of (unnamed )?array" }
402     p = new (p) B [1][1][MAX - 2];      // { dg-error "size of (unnamed )?array" }
403     p = new (p) B [1][1][MAX - 99];     // { dg-error "size of (unnamed )?array" }
404     p = new (p) B [1][1][MAX / 2];      // { dg-error "size of array" }
405     p = new (p) B [1][1][MAX / 2 - 1];  // { dg-error "size of array" }
406     p = new (p) B [1][1][MAX / 2 - 2];  // { dg-error "size of array" }
407 
408     // Avoid exercising data model-dependent expressions.
409     // p = new (p) B [1][1][MAX / 2 - 3];
410     // p = new (p) B [1][1][MAX / 2 - 4];
411     // p = new (p) B [1][1][MAX / 2 - 5];
412     // p = new (p) B [1][1][MAX / 2 - 6];
413 
414     p = new (p) B [1][1][MAX / 2 - 7];   // okay
415     p = new (p) B [1][1][MAX / 2 - 8];   // okay
416 
417     p = new (p) B [1][2][MAX];          // { dg-error "size of (unnamed )?array" }
418     p = new (p) B [1][2][MAX - 1];      // { dg-error "size of (unnamed )?array" }
419     p = new (p) B [1][2][MAX - 2];      // { dg-error "size of (unnamed )?array" }
420     p = new (p) B [1][2][MAX - 99];     // { dg-error "size of (unnamed )?array" }
421     p = new (p) B [1][2][MAX / 2];      // { dg-error "size of (unnamed )?array" }
422     p = new (p) B [1][2][MAX / 2 - 1];  // { dg-error "size of (unnamed )?array" }
423     p = new (p) B [1][2][MAX / 2 - 2];  // { dg-error "size of (unnamed )?array" }
424     p = new (p) B [1][2][MAX / 2 - 3];  // { dg-error "size of (unnamed )?array" }
425     p = new (p) B [1][2][MAX / 2 - 4];  // { dg-error "size of (unnamed )?array" }
426     p = new (p) B [1][2][MAX / 2 - 5];  // { dg-error "size of (unnamed )?array" }
427     p = new (p) B [1][2][MAX / 2 - 6];  // { dg-error "size of (unnamed )?array" }
428     p = new (p) B [1][2][MAX / 2 - 7];  // { dg-error "size of (unnamed )?array" }
429     p = new (p) B [1][2][MAX / 2 - 8];  // { dg-error "size of (unnamed )?array" }
430     p = new (p) B [1][2][MAX / 4];      // { dg-error "size of array" }
431 
432     // Avoid exercising data model-dependent expressions.
433     // p = new (p) B [1][2][MAX / 4 - 1];
434     // p = new (p) B [1][2][MAX / 4 - 2];
435 
436     p = new (p) B [1][2][MAX / 4 - 3];   // okay
437     p = new (p) B [1][2][MAX / 4 - 4];   // okay
438 
439     p = new (p) B [2][1][MAX];          // { dg-error "size of (unnamed )?array" }
440     p = new (p) B [2][1][MAX - 1];      // { dg-error "size of (unnamed )?array" }
441     p = new (p) B [2][1][MAX - 2];      // { dg-error "size of (unnamed )?array" }
442     p = new (p) B [2][1][MAX - 99];     // { dg-error "size of (unnamed )?array" }
443     p = new (p) B [2][1][MAX / 2];      // { dg-error "size of array" }
444     p = new (p) B [2][1][MAX / 2 - 1];  // { dg-error "size of array" }
445     p = new (p) B [2][1][MAX / 2 - 2];  // { dg-error "size of array" }
446     p = new (p) B [2][1][MAX / 2 - 3];  // { dg-error "size of array" }
447     p = new (p) B [2][1][MAX / 2 - 4];  // { dg-error "size of array" }
448     p = new (p) B [2][1][MAX / 2 - 5];  // { dg-error "size of array" }
449     p = new (p) B [2][1][MAX / 2 - 6];  // { dg-error "size of array" }
450     p = new (p) B [2][1][MAX / 2 - 7];  // { dg-error "size of array" }
451     p = new (p) B [2][1][MAX / 2 - 8];  // { dg-error "size of array" }
452     p = new (p) B [2][1][MAX / 4];      // { dg-error "size of array" }
453 
454     // Avoid exercising data model-dependent expressions.
455     // p = new (p) B [2][1][MAX / 4 - 1];
456     // p = new (p) B [2][1][MAX / 4 - 2];
457 
458     p = new (p) B [2][1][MAX / 4 - 3];   // okay
459     p = new (p) B [2][1][MAX / 4 - 4];   // okay
460 
461     p = new (p) B [2][2][MAX];          // { dg-error "size of (unnamed )?array" }
462     p = new (p) B [2][2][MAX - 1];      // { dg-error "size of (unnamed )?array" }
463     p = new (p) B [2][2][MAX - 2];      // { dg-error "size of (unnamed )?array" }
464     p = new (p) B [2][2][MAX - 99];     // { dg-error "size of (unnamed )?array" }
465     p = new (p) B [2][2][MAX / 2];      // { dg-error "size of (unnamed )?array" }
466     p = new (p) B [2][2][MAX / 2 - 1];  // { dg-error "size of (unnamed )?array" }
467     p = new (p) B [2][2][MAX / 2 - 2];  // { dg-error "size of (unnamed )?array" }
468     p = new (p) B [2][2][MAX / 2 - 3];  // { dg-error "size of (unnamed )?array" }
469     p = new (p) B [2][2][MAX / 2 - 4];  // { dg-error "size of (unnamed )?array" }
470     p = new (p) B [2][2][MAX / 2 - 5];  // { dg-error "size of (unnamed )?array" }
471     p = new (p) B [2][2][MAX / 2 - 6];  // { dg-error "size of (unnamed )?array" }
472     p = new (p) B [2][2][MAX / 2 - 7];  // { dg-error "size of (unnamed )?array" }
473     p = new (p) B [2][2][MAX / 2 - 8];  // { dg-error "size of (unnamed )?array" }
474     p = new (p) B [2][2][MAX / 4];      // { dg-error "size of array" }
475     p = new (p) B [2][2][MAX / 4 - 1];  // { dg-error "size of array" }
476     p = new (p) B [2][2][MAX / 4 - 2];  // { dg-error "size of array" }
477 
478     // Avoid exercising data model-dependent expressions.
479     // p = new (p) B [2][2][MAX / 8];
480     // p = new (p) B [2][2][MAX / 8 - 1];
481 
482     p = new (p) B [2][2][MAX / 8 - 2];
483     p = new (p) B [2][2][MAX / 8 - 3];
484 
485     p = new (p) B [2][MAX][2];          // { dg-error "size of (unnamed )?array" }
486     p = new (p) B [2][MAX - 1][2];      // { dg-error "size of (unnamed )?array" }
487     p = new (p) B [2][MAX - 2][2];      // { dg-error "size of (unnamed )?array" }
488     p = new (p) B [2][MAX - 99][2];     // { dg-error "size of (unnamed )?array" }
489     p = new (p) B [2][MAX / 2][2];      // { dg-error "size of (unnamed )?array" }
490     p = new (p) B [2][MAX / 2 - 1][2];  // { dg-error "size of (unnamed )?array" }
491     p = new (p) B [2][MAX / 2 - 2][2];  // { dg-error "size of (unnamed )?array" }
492     p = new (p) B [2][MAX / 2 - 3][2];  // { dg-error "size of (unnamed )?array" }
493     p = new (p) B [2][MAX / 2 - 4][2];  // { dg-error "size of (unnamed )?array" }
494     p = new (p) B [2][MAX / 2 - 5][2];  // { dg-error "size of (unnamed )?array" }
495     p = new (p) B [2][MAX / 2 - 6][2];  // { dg-error "size of (unnamed )?array" }
496     p = new (p) B [2][MAX / 2 - 7][2];  // { dg-error "size of (unnamed )?array" }
497     p = new (p) B [2][MAX / 2 - 8][2];  // { dg-error "size of (unnamed )?array" }
498     p = new (p) B [2][MAX / 4][2];      // { dg-error "size of array" }
499     p = new (p) B [2][MAX / 4 - 1][2];  // { dg-error "size of array" }
500     p = new (p) B [2][MAX / 4 - 2][2];  // { dg-error "size of array" }
501 
502     // Avoid exercising data model-dependent expressions.
503     // p = new (p) B [2][MAX / 8][2];
504     // p = new (p) B [2][MAX / 8 - 1][2];
505 
506     p = new (p) B [2][MAX / 8 - 2][2];
507     p = new (p) B [2][MAX / 8 - 3][2];
508 
509     p = new (p) B [MAX][2][2];          // { dg-error "size of array" }
510     p = new (p) B [MAX - 1][2][2];      // { dg-error "size of array" }
511     p = new (p) B [MAX - 2][2][2];      // { dg-error "size of array" }
512     p = new (p) B [MAX - 99][2][2];     // { dg-error "size of array" }
513     p = new (p) B [MAX / 2][2][2];      // { dg-error "size of array" }
514     p = new (p) B [MAX / 2 - 1][2][2];  // { dg-error "size of array" }
515     p = new (p) B [MAX / 2 - 2][2][2];  // { dg-error "size of array" }
516     p = new (p) B [MAX / 2 - 3][2][2];  // { dg-error "size of array" }
517     p = new (p) B [MAX / 2 - 4][2][2];  // { dg-error "size of array" }
518     p = new (p) B [MAX / 2 - 5][2][2];  // { dg-error "size of array" }
519     p = new (p) B [MAX / 2 - 6][2][2];  // { dg-error "size of array" }
520     p = new (p) B [MAX / 2 - 7][2][2];  // { dg-error "size of array" }
521     p = new (p) B [MAX / 2 - 8][2][2];  // { dg-error "size of array" }
522     p = new (p) B [MAX / 4][2][2];      // { dg-error "size of array" }
523     p = new (p) B [MAX / 4 - 1][2][2];  // { dg-error "size of array" }
524     p = new (p) B [MAX / 4 - 2][2][2];  // { dg-error "size of array" }
525 
526     // Avoid exercising data model-dependent expressions.
527     // p = new (p) B [MAX / 8][2][2];
528     // p = new (p) B [MAX / 8 - 1][2][2];
529 
530     p = new (p) B [MAX / 8 - 2][2][2];
531     p = new (p) B [MAX / 8 - 3][2][2];
532 }
533