1 /* PR tree-optimization/84526 - ICE in generic_overlap
2 Unrelated to the ICE but rather to PR 84095 that introduced it, verify
3 that calls to strncpy involving multidimensional arrays of structs don't
4 trigger false positive -Wrestrict warnings.
6 { dg-options "-O2 -Wrestrict -ftrack-macro-expansion=0" }
7 { dg-skip-if "too many arguments in function call" { bpf-*-* } } */
9 typedef __SIZE_TYPE__
size_t;
11 extern char* strcpy (char*, const char*);
18 } ma1
[4], ma2
[4][4], ma3
[4][4][4];
20 #define T(dst, src) do { \
21 strcpy (src, "123"); \
26 void test_ma1_cst (const char *s
)
28 T (ma1
[0].a1
, ma1
[0].a1
); /* { dg-warning "\\\[-Wrestrict]" } */
29 T (ma1
[0].a1
, ma1
[1].a1
);
30 T (ma1
[0].a1
, ma1
[2].a1
);
31 T (ma1
[0].a1
, ma1
[3].a1
);
33 T (ma1
[0].a1
, ma1
[0].a1
); /* { dg-warning "\\\[-Wrestrict]" } */
34 T (ma1
[1].a1
, ma1
[0].a1
);
35 T (ma1
[2].a1
, ma1
[0].a1
);
36 T (ma1
[3].a1
, ma1
[0].a1
);
40 void test_ma1_var_cst (const char *s
, int i
)
42 T (ma1
[i
].a1
, ma1
[0].a1
);
43 T (ma1
[i
].a1
, ma1
[1].a1
);
44 T (ma1
[i
].a1
, ma1
[2].a1
);
45 T (ma1
[i
].a1
, ma1
[3].a1
);
47 T (ma1
[0].a1
, ma1
[i
].a1
);
48 T (ma1
[1].a1
, ma1
[i
].a1
);
49 T (ma1
[2].a1
, ma1
[i
].a1
);
50 T (ma1
[3].a1
, ma1
[i
].a1
);
54 void test_ma1_var_var (const char *s
, int i
, int j
)
56 T (ma1
[i
].a1
, ma1
[j
].a1
);
57 T (ma1
[i
].a1
, ma1
[j
].a1
);
58 T (ma1
[i
].a1
, ma1
[j
].a1
);
59 T (ma1
[i
].a1
, ma1
[j
].a1
);
61 T (ma1
[i
].a1
, ma1
[j
].a1
);
62 T (ma1
[i
].a1
, ma1
[j
].a1
);
63 T (ma1
[i
].a1
, ma1
[j
].a1
);
64 T (ma1
[i
].a1
, ma1
[j
].a1
);
68 void test_ma2_cst (const char *s
)
70 T (ma2
[0][0].a1
, ma2
[0][0].a1
); /* { dg-warning "\\\[-Wrestrict]" } */
71 T (ma2
[0][0].a1
, ma2
[0][1].a1
);
72 T (ma2
[0][0].a1
, ma2
[0][2].a1
);
73 T (ma2
[0][0].a1
, ma2
[0][3].a1
);
75 T (ma2
[0][0].a1
, ma2
[1][0].a1
);
76 T (ma2
[0][0].a1
, ma2
[1][1].a1
);
77 T (ma2
[0][0].a1
, ma2
[1][2].a1
);
78 T (ma2
[0][0].a1
, ma2
[1][3].a1
);
80 T (ma2
[0][0].a1
, ma2
[2][0].a1
);
81 T (ma2
[0][0].a1
, ma2
[2][1].a1
);
82 T (ma2
[0][0].a1
, ma2
[2][2].a1
);
83 T (ma2
[0][0].a1
, ma2
[2][3].a1
);
85 T (ma2
[0][0].a1
, ma2
[3][0].a1
);
86 T (ma2
[0][0].a1
, ma2
[3][1].a1
);
87 T (ma2
[0][0].a1
, ma2
[3][2].a1
);
88 T (ma2
[0][0].a1
, ma2
[3][3].a1
);
91 T (ma2
[0][1].a1
, ma2
[0][0].a1
);
92 T (ma2
[0][1].a1
, ma2
[0][1].a1
); /* { dg-warning "\\\[-Wrestrict]" } */
93 T (ma2
[0][1].a1
, ma2
[0][2].a1
);
94 T (ma2
[0][1].a1
, ma2
[0][3].a1
);
96 T (ma2
[0][1].a1
, ma2
[1][0].a1
);
97 T (ma2
[0][1].a1
, ma2
[1][1].a1
);
98 T (ma2
[0][1].a1
, ma2
[1][2].a1
);
99 T (ma2
[0][1].a1
, ma2
[1][3].a1
);
101 T (ma2
[0][1].a1
, ma2
[2][0].a1
);
102 T (ma2
[0][1].a1
, ma2
[2][1].a1
);
103 T (ma2
[0][1].a1
, ma2
[2][2].a1
);
104 T (ma2
[0][1].a1
, ma2
[2][3].a1
);
106 T (ma2
[0][1].a1
, ma2
[3][0].a1
);
107 T (ma2
[0][1].a1
, ma2
[3][1].a1
);
108 T (ma2
[0][1].a1
, ma2
[3][2].a1
);
109 T (ma2
[0][1].a1
, ma2
[3][3].a1
);
112 T (ma2
[0][2].a1
, ma2
[0][0].a1
);
113 T (ma2
[0][2].a1
, ma2
[0][1].a1
);
114 T (ma2
[0][2].a1
, ma2
[0][2].a1
); /* { dg-warning "\\\[-Wrestrict]" } */
115 T (ma2
[0][2].a1
, ma2
[0][3].a1
);
117 T (ma2
[0][2].a1
, ma2
[1][0].a1
);
118 T (ma2
[0][2].a1
, ma2
[1][1].a1
);
119 T (ma2
[0][2].a1
, ma2
[1][2].a1
);
120 T (ma2
[0][2].a1
, ma2
[1][3].a1
);
122 T (ma2
[0][2].a1
, ma2
[2][0].a1
);
123 T (ma2
[0][2].a1
, ma2
[2][1].a1
);
124 T (ma2
[0][2].a1
, ma2
[2][2].a1
);
125 T (ma2
[0][2].a1
, ma2
[2][3].a1
);
127 T (ma2
[0][2].a1
, ma2
[3][0].a1
);
128 T (ma2
[0][2].a1
, ma2
[3][1].a1
);
129 T (ma2
[0][2].a1
, ma2
[3][2].a1
);
130 T (ma2
[0][2].a1
, ma2
[3][3].a1
);
133 T (ma2
[0][3].a1
, ma2
[0][0].a1
);
134 T (ma2
[0][3].a1
, ma2
[0][1].a1
);
135 T (ma2
[0][3].a1
, ma2
[0][2].a1
);
136 T (ma2
[0][3].a1
, ma2
[0][3].a1
); /* { dg-warning "\\\[-Wrestrict]" } */
138 T (ma2
[0][3].a1
, ma2
[1][0].a1
);
139 T (ma2
[0][3].a1
, ma2
[1][1].a1
);
140 T (ma2
[0][3].a1
, ma2
[1][2].a1
);
141 T (ma2
[0][3].a1
, ma2
[1][3].a1
);
143 T (ma2
[0][3].a1
, ma2
[2][0].a1
);
144 T (ma2
[0][3].a1
, ma2
[2][1].a1
);
145 T (ma2
[0][3].a1
, ma2
[2][2].a1
);
146 T (ma2
[0][3].a1
, ma2
[2][3].a1
);
148 T (ma2
[0][3].a1
, ma2
[3][0].a1
);
149 T (ma2
[0][3].a1
, ma2
[3][1].a1
);
150 T (ma2
[0][3].a1
, ma2
[3][2].a1
);
151 T (ma2
[0][3].a1
, ma2
[3][3].a1
);
155 void test_ma2_var (int i0
, int j0
, int i1
, int j1
)
157 T (ma2
[i0
][j0
].a1
, ma2
[i0
][j0
].a1
); /* { dg-warning "\\\[-Wrestrict]" } */
159 T (ma2
[i0
][j0
].a1
, ma2
[i0
][j1
].a1
); /* { dg-bogus "\\\[-Wrestrict]" } */
160 T (ma2
[i0
][j0
].a1
, ma2
[i1
][j1
].a1
); /* { dg-bogus "\\\[-Wrestrict]" } */
162 T (ma2
[0][0].a2
[i0
], ma2
[0][0].a2
[j0
]); /* { dg-bogus "\\\[-Wrestrict]" } */
163 T (ma2
[0][i0
].a2
[0], ma2
[0][i1
].a2
[0]); /* { dg-bogus "\\\[-Wrestrict]" } */
164 T (ma2
[i0
][0].a2
[0], ma2
[i1
][0].a2
[0]); /* { dg-bogus "\\\[-Wrestrict]" } */
165 T (ma2
[i0
][j0
].a2
[0], ma2
[i1
][j1
].a2
[0]); /* { dg-bogus "\\\[-Wrestrict]" } */
169 void test_p2_var (struct MemArrays
**p2
, int i0
, int j0
, int i1
, int j1
)
171 T (p2
[i0
][j0
].a1
, p2
[i0
][j0
].a1
); /* { dg-warning "\\\[-Wrestrict]" } */
173 T (p2
[i0
][j0
].a1
, p2
[i0
][j1
].a1
);
174 T (p2
[i0
][j0
].a1
, p2
[i1
][j1
].a1
);
176 T (p2
[0][0].a2
[i0
], p2
[0][0].a2
[j0
]);
177 T (p2
[0][i0
].a2
[0], p2
[0][i1
].a2
[0]);
178 T (p2
[i0
][0].a2
[0], p2
[i1
][0].a2
[0]);
179 T (p2
[i0
][j0
].a2
[0], p2
[i1
][j1
].a2
[0]);
183 void test_ma3_cst (const char *s
)
185 T (ma3
[0][0][0].a1
, ma3
[0][0][0].a1
); /* { dg-warning "\\\[-Wrestrict]" } */
186 T (ma3
[0][0][0].a1
, ma3
[0][0][3].a1
);
188 T (ma3
[0][0][0].a1
, ma3
[0][1][0].a1
);
189 T (ma3
[0][0][0].a1
, ma3
[0][1][3].a1
);
190 T (ma3
[0][0][0].a1
, ma3
[1][0][0].a1
);
191 T (ma3
[0][0][0].a1
, ma3
[1][0][3].a1
);
192 T (ma3
[0][0][0].a1
, ma3
[3][0][3].a1
);
193 T (ma3
[0][0][0].a1
, ma3
[3][3][3].a1
);
197 void test_ma3_var (const char *s
,
198 int i0
, int j0
, int k0
,
199 int i1
, int j1
, int k1
)
201 T (ma3
[i0
][j0
][k0
].a1
, ma3
[i0
][j0
][k0
].a1
); /* { dg-warning "\\\[-Wrestrict]" } */
203 T (ma3
[i0
][j0
][k0
].a1
, ma3
[i0
][j0
][k1
].a1
); /* { dg-bogus "\\\[-Wrestrict]" } */
204 T (ma3
[i0
][j0
][k0
].a1
, ma3
[i0
][j1
][k1
].a1
); /* { dg-bogus "\\\[-Wrestrict]" } */
205 T (ma3
[i0
][j0
][k0
].a1
, ma3
[i1
][j1
][k1
].a1
); /* { dg-bogus "\\\[-Wrestrict]" } */