1 /* PR c++/87996 - "size of array is negative" error when SIZE_MAX/2 < sizeof(array) <= SIZE_MAX
3 { dg-options "-ftrack-macro-expansion=0" } */
5 #define INT16_MAX __INT16_MAX__
6 #define UINT16_MAX ((INT16_MAX << 1) + 1)
8 #define DIFF_MAX __PTRDIFF_MAX__
9 #define SIZE_MAX __SIZE_MAX__
11 typedef __INT16_TYPE__
int16_t;
12 typedef __INT32_TYPE__
int32_t;
13 typedef __SIZE_TYPE__
size_t;
15 /* Verify errors for types. */
17 typedef char i8a1_d_m1_t
[DIFF_MAX
- 1];
18 /* The following should also be diagnosed because the difference between
19 &i8a1_dx[0] and &i8a1_dx[sizeof i8a1_dx] cannot be represented.
20 typedef char i8a1_d_t[DIFF_MAX];
23 typedef char i8a1_d_p1_t
[(size_t)DIFF_MAX
+ 1]; /* { dg-error "size .\[0-9\]+. of array .i8a1_d_p1_t. exceeds maximum object size .\[0-9\]+.|is too large" } */
25 typedef char i8a1_s_t
[SIZE_MAX
]; /* { dg-error "size .\[0-9\]+. of array .i8a1_s_t. exceeds maximum object size .\[0-9\]+.|is too large" } */
27 typedef int16_t i16a_s_d2_t
[SIZE_MAX
/ 2]; /* { dg-error "size .\[0-9\]+. of array .i16a_s_d2_t. exceeds maximum object size .\[0-9\]+." } */
28 typedef int16_t i16a_s_d3_t
[SIZE_MAX
/ 3]; /* { dg-error "size .\[0-9\]+. of array .i16a_s_d3_t. exceeds maximum object size .\[0-9\]+." } */
29 typedef int16_t i16a_s_d4_m1_t
[SIZE_MAX
/ 4 - 1];
30 typedef int16_t i16a_s_d4_p1_t
[SIZE_MAX
/ 4 + 1]; /* { dg-error "size .\[0-9\]+. of array .i16a_s_d4_p1_t. exceeds maximum object size .\[0-9\]+." } */
32 /* The internal computation overflows the message doesn't show the object
33 size (but GCC should compute the result and print it anyway). */
34 typedef int32_t i32a_s_d2_t
[SIZE_MAX
/ 2]; /* { dg-error "size of array .i32a_s_d2_t. exceeds maximum object size .\[0-9\]+." } */
35 typedef int32_t i32a_s_d3_t
[SIZE_MAX
/ 3]; /* { dg-error "size of array .i32a_s_d3_t. exceeds maximum object size .\[0-9\]+." } */
36 typedef int32_t i32a_s_d4_t
[SIZE_MAX
/ 4]; /* { dg-error "size .\[0-9\]+. of array .i32a_s_d4_t. exceeds maximum object size .\[0-9\]+." } */
39 /* Verify errors for objects. */
41 char i8a1_d_m1
[DIFF_MAX
- 1];
42 /* The following should also be diagnosed because the difference between
43 &i8a1_dx[0] and &i8a1_dx[sizeof i8a1_dx] cannot be represented.
44 char i8a1_d[DIFF_MAX];
47 char i8a_d_p1
[(size_t)DIFF_MAX
+ 1]; /* { dg-error "size .\[0-9\]+. of array .i8a_d_p1. exceeds maximum object size .\[0-9\]+.|is too large" } */
49 char i8a_s
[SIZE_MAX
]; /* { dg-error "size .\[0-9\]+. of array .i8a_s. exceeds maximum object size .\[0-9\]+.|is too large" } */
51 int16_t i16a_s_d2
[SIZE_MAX
/ 2]; /* { dg-error "size .\[0-9\]+. of array .i16a_s_d2. exceeds maximum object size .\[0-9\]+." } */
52 int16_t i16a_s_d3
[SIZE_MAX
/ 3]; /* { dg-error "size .\[0-9\]+. of array .i16a_s_d3. exceeds maximum object size .\[0-9\]+." } */
53 int16_t i16a_sz_d4_m1
[SIZE_MAX
/ 4 - 1];
54 int16_t i16a_sz_d4_p1
[SIZE_MAX
/ 4 + 1]; /* { dg-error "size .\[0-9\]+. of array .i16a_sz_d4_p1. exceeds maximum object size .\[0-9\]+." } */
56 /* The internal computation overflows the message doesn't show the object
57 size (but GCC should compute the result and print it anyway). */
58 int32_t i32a_s_d2
[SIZE_MAX
/ 2]; /* { dg-error "size of array .i32a_s_d2. exceeds maximum object size .\[0-9\]+." } */
59 int32_t i32a_s_d3
[SIZE_MAX
/ 3]; /* { dg-error "size of array .i32a_s_d3. exceeds maximum object size .\[0-9\]+." } */
60 int32_t i32a_s_d4
[SIZE_MAX
/ 4]; /* { dg-error "size .\[0-9\]+. of array .i32a_s_d4. exceeds maximum object size .\[0-9\]+." } */