1 /* PR middle-end/92349 - ICE in -Warray-bounds on a VLA member
2 { dg-do compile }
3 { dg-options "-O2 -Wall" }
4 { dg-require-effective-target alloca } */
5
6 typedef __SIZE_TYPE__ size_t;
7
8 void sink (void*, ...);
9
10 void mem_vla_cst_store_idx (void)
11 {
12 int n = 3;
13
14 struct {
15 char a[n], b;
16 } s;
17
18 char *p = s.a;
19
20 s.a[0] = 0;
21 s.b = 0;
22
23 *++p = 1;
24 *++p = 2;
25
26 sink (&s, p);
27 }
28
29 void mem_vla_range_store_idx (int n)
30 {
31 if (n < 3 || 4 < n)
32 n = 3;
33
34 struct {
35 char a[n], b;
36 } s;
37
38 char *p = s.a;
39
40 s.a[0] = 0;
41 s.b = 0;
42
43 *++p = 1;
44 *++p = 2;
45
46 sink (&s, p);
47 }
48
49 void mem_vla_var_store_idx (size_t n)
50 {
51 struct {
52 char a[n], b;
53 } s;
54
55 char *p = s.a;
56
57 s.a[0] = 0;
58 s.b = 0;
59
60 *++p = 1;
61 *++p = 2;
62
63 sink (&s, p);
64 }
65
66
67 void mem_vla_cst_store_ptr (void)
68 {
69 int n = 3;
70
71 struct {
72 char a[n], b;
73 } s;
74
75 char *p = s.a;
76
77 *p++ = __LINE__;
78 *p++ = __LINE__;
79 *p++ = __LINE__;
80
81 sink (&s, p);
82 }
83
84 void mem_vla_range_store_ptr (int n)
85 {
86 if (n < 3 || 4 < n)
87 n = 3;
88
89 struct {
90 char a[n], b;
91 } s;
92
93 char *p = s.a;
94
95 *p++ = __LINE__;
96 *p++ = __LINE__;
97 *p++ = __LINE__;
98
99 sink (&s, p);
100 }
101
102 void mem_vla_var_store_ptr (size_t n)
103 {
104 struct {
105 char a[n], b;
106 } s;
107
108 char *p = s.a;
109
110 *p++ = __LINE__;
111 *p++ = __LINE__;
112 *p++ = __LINE__;
113
114 sink (&s, p);
115 }