1 /* { dg-do compile }
2    { dg-options "-O2 -Wall -Wno-stringop-overread" } */
3 
4 typedef __SIZE_TYPE__ size_t;
5 
6 extern size_t strlen (const char*);
7 
8 void sink (size_t);
9 
10 struct A0 { char i, a[0]; };
11 
12 extern struct A0 ea0;
13 
fa0_extern(void)14 void fa0_extern (void)
15 {
16   sink (strlen (ea0.a - 2));    // { dg-warning "\\\[-Warray-bounds" }
17   sink (strlen (ea0.a - 1));    // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
18   sink (strlen (ea0.a));        // valid just-past-the-end offset
19   sink (strlen (ea0.a + 1));    // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
20 }
21 
22 static struct A0 sa0 = { 0 };
23 
fa0_static(void)24 void fa0_static (void)
25 {
26   sink (strlen (sa0.a - 2));    // { dg-warning "\\\[-Warray-bounds" }
27   sink (strlen (sa0.a - 1));    // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
28   sink (strlen (sa0.a));        // valid just-past-the-end offset
29   sink (strlen (sa0.a + 1));    // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
30 }
31 
32 
33 struct Ax { char i, a[]; };
34 
35 extern struct Ax ax;
36 
fax_extern(void)37 void fax_extern (void)
38 {
39   sink (strlen (ax.a - 2));     // { dg-warning "\\\[-Warray-bounds" "pr93514" }
40   sink (strlen (ax.a - 1));     // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
41   sink (strlen (ax.a));
42   sink (strlen (ax.a + 123));
43 }
44 
45 static struct Ax ax0 = { 0, { 0 } };
46 static struct Ax ax1 = { 1, { 1, 0 } };
47 static struct Ax ax2 = { 2, { 2, 1, 0 } };
48 static struct Ax ax3 = { 3, { 3, 2, 1, 0 } };
49 
fax_static(void)50 void fax_static (void)
51 {
52   sink (strlen (ax0.a - 2));    // { dg-warning "\\\[-Warray-bounds" }
53   sink (strlen (ax0.a - 1));    // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
54   sink (strlen (ax0.a));
55   sink (strlen (ax0.a + 1));    // valid just-past-the-end offset
56   sink (strlen (ax0.a + 2));    // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
57 
58   sink (strlen (ax1.a - 2));    // { dg-warning "\\\[-Warray-bounds" }
59   sink (strlen (ax1.a - 1));    // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
60   sink (strlen (ax1.a));
61   sink (strlen (ax1.a + 1));
62   sink (strlen (ax1.a + 2));    // valid just-past-the-end offset
63   sink (strlen (ax1.a + 3));    // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
64 
65   sink (strlen (ax2.a - 2));    // { dg-warning "\\\[-Warray-bounds" }
66   sink (strlen (ax2.a - 1));    // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
67   sink (strlen (ax2.a));
68   sink (strlen (ax2.a + 1));
69   sink (strlen (ax2.a + 2));
70   sink (strlen (ax2.a + 3));    // valid just-past-the-end offset
71   sink (strlen (ax2.a + 4));    // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
72 
73   sink (strlen (ax3.a - 2));    // { dg-warning "\\\[-Warray-bounds" }
74   sink (strlen (ax3.a - 1));    // { dg-warning "\\\[-Warray-bounds" "pr93514" { xfail *-*-* } }
75   sink (strlen (ax3.a));
76   sink (strlen (ax3.a + 1));
77   sink (strlen (ax3.a + 2));
78   sink (strlen (ax3.a + 3));
79   sink (strlen (ax3.a + 4));    // valid just-past-the-end offset
80   sink (strlen (ax3.a + 5));    // { dg-warning "\\\[-Warray-bounds|-Wstringop-overread" }
81 }
82