1 /* PR middle-end/91490 - bogus argument missing terminating nul warning
2    on strlen of a flexible array member
3    { dg-do compile }
4    { dg-options "-Wall -ftrack-macro-expansion=0" } */
5 
6 #define INT_MAX       __INT_MAX__
7 #define PTRDIFF_MAX   __PTRDIFF_MAX__
8 #define SIZE_MAX      __SIZE_MAX__
9 
10 struct A0 { char n, a[0]; };
11 struct A1 { char n, a[1]; };
12 struct Ax { char n, a[]; };
13 
14 const struct A0 a0 = { };
15 const struct A0 a0_0 = { 0 };
16 const struct A0 a0_0_ = { 0, { } };
17 
18 const struct A0 a1 = { };
19 const struct A0 a1_0 = { 0 };
20 const struct A0 a1_0_ = { 0, { } };
21 
22 const struct Ax ax= { };
23 const struct Ax ax_0 = { 0 };
24 const struct Ax ax_0_ = { 0, { } };
25 
26 void sink (unsigned);
27 
28 #define T(x)   sink (__builtin_strlen (x))
29 
test_zero_length_array(void)30 void test_zero_length_array (void)
31 {
32   T (a0.a);                   // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
33   T (a0.a - 1);               // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
34   T (a0.a + 1);               // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
35   T (a0.a + 9);               // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
36   T (a0.a + INT_MAX);         // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
37   T (a0.a + PTRDIFF_MAX);     // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
38   T (a0.a + SIZE_MAX);        // { dg-warning "\\\[-Warray-bounds" }
39 
40   T (a0_0.a);                 // { dg-warning "\\\[-Warray-bounds" }
41   T (a0_0.a - 1);             // { dg-warning "\\\[-Warray-bounds" }
42   T (a0_0.a + 1);             // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
43   T (a0_0.a + 9);             // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
44   T (a0_0.a + INT_MAX);       // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
45   T (a0_0.a + PTRDIFF_MAX);   // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
46   T (a0_0.a + SIZE_MAX);      // { dg-warning "\\\[-Warray-bounds" }
47 
48   T (a0_0_.a);                // { dg-warning "\\\[-Warray-bounds" }
49   T (a0_0_.a - 1);            // { dg-warning "\\\[-Warray-bounds" }
50   T (a0_0_.a + 1);            // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
51   T (a0_0_.a + 9);            // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
52   T (a0_0_.a + INT_MAX);      // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
53   T (a0_0_.a + PTRDIFF_MAX);  // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
54   T (a0_0_.a + SIZE_MAX);     // { dg-warning "\\\[-Warray-bounds" }
55 }
56 
test_one_element_array(void)57 void test_one_element_array (void)
58 {
59   T (a1.a - 1);               // { dg-warning "\\\[-Warray-bounds" }
60   T (a1.a + 1);               // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
61   T (a1.a + 9);               // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
62   T (a1.a + INT_MAX);         // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
63   T (a1.a + PTRDIFF_MAX);     // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
64   T (a1.a + SIZE_MAX);        // { dg-warning "\\\[-Warray-bounds" }
65 
66   T (a1_0.a - 1);             // { dg-warning "\\\[-Warray-bounds" }
67   T (a1_0.a + 1);             // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
68   T (a1_0.a + 9);             // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
69   T (a1_0.a + INT_MAX);       // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
70   T (a1_0.a + PTRDIFF_MAX);   // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
71   T (a1_0.a + SIZE_MAX);      // { dg-warning "\\\[-Warray-bounds" }
72 
73   T (a1_0_.a - 1);            // { dg-warning "\\\[-Warray-bounds" }
74   T (a1_0_.a + 1);            // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
75   T (a1_0_.a + 9);            // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
76   T (a1_0_.a + INT_MAX);      // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
77   T (a1_0_.a + PTRDIFF_MAX);  // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
78   T (a1_0_.a + SIZE_MAX);     // { dg-warning "\\\[-Warray-bounds" }
79 }
80 
test_flexible_array_member(void)81 void test_flexible_array_member (void)
82 {
83   T (ax.a);                   // { dg-warning "\\\[-Warray-bounds" }
84   T (ax.a - 1);               // { dg-warning "\\\[-Warray-bounds" }
85   T (ax.a + 1);               // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
86   T (ax.a + 9);               // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
87   T (ax.a + INT_MAX);         // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
88   T (ax.a + PTRDIFF_MAX);     // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
89   T (ax.a + SIZE_MAX);        // { dg-warning "\\\[-Warray-bounds" }
90 
91   T (ax_0.a);                 // { dg-warning "\\\[-Warray-bounds" }
92   T (ax_0.a - 1);             // { dg-warning "\\\[-Warray-bounds" }
93   T (ax_0.a + 1);             // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
94   T (ax_0.a + 9);             // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
95   T (ax_0.a + INT_MAX);       // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
96   T (ax_0.a + PTRDIFF_MAX);   // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
97   T (ax_0.a + SIZE_MAX);      // { dg-warning "\\\[-Warray-bounds" }
98 
99   T (ax_0_.a);                // { dg-warning "\\\[-Warray-bounds" }
100   T (ax_0_.a - 1);            // { dg-warning "\\\[-Warray-bounds" }
101   T (ax_0_.a + 1);            // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
102   T (ax_0_.a + 9);            // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
103   T (ax_0_.a + INT_MAX);      // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
104   T (ax_0_.a + PTRDIFF_MAX);  // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
105   T (ax_0_.a + SIZE_MAX);     // { dg-warning "\\\[-Warray-bounds" }
106 }
107