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