@@ -234,16 +234,58 @@ struct Parent {
234
234
void member () {
235
235
Parent arr[2 ];
236
236
237
- // FIXME: Ideally these are TRUE, but at the moment InitListExpr has no
238
- // knowledge about where the initializer list is used, so we can't bind
239
- // the initializer list to the required region.
240
- clang_analyzer_eval (arr[0 ].arr [0 ].x == 1 ); // expected-warning{{UNKNOWN}}
241
- clang_analyzer_eval (arr[0 ].arr [0 ].y == 2 ); // expected-warning{{UNKNOWN}}
242
- clang_analyzer_eval (arr[0 ].arr [1 ].x == 3 ); // expected-warning{{UNKNOWN}}
243
- clang_analyzer_eval (arr[0 ].arr [1 ].y == 4 ); // expected-warning{{UNKNOWN}}
244
-
245
- clang_analyzer_eval (arr[1 ].arr [0 ].x == 1 ); // expected-warning{{UNKNOWN}}
246
- clang_analyzer_eval (arr[1 ].arr [0 ].y == 2 ); // expected-warning{{UNKNOWN}}
247
- clang_analyzer_eval (arr[1 ].arr [1 ].x == 3 ); // expected-warning{{UNKNOWN}}
248
- clang_analyzer_eval (arr[1 ].arr [1 ].y == 4 ); // expected-warning{{UNKNOWN}}
237
+ clang_analyzer_eval (arr[0 ].arr [0 ].x == 1 ); // expected-warning{{TRUE}}
238
+ clang_analyzer_eval (arr[0 ].arr [0 ].y == 2 ); // expected-warning{{TRUE}}
239
+ clang_analyzer_eval (arr[0 ].arr [1 ].x == 3 ); // expected-warning{{TRUE}}
240
+ clang_analyzer_eval (arr[0 ].arr [1 ].y == 4 ); // expected-warning{{TRUE}}
241
+
242
+ clang_analyzer_eval (arr[1 ].arr [0 ].x == 1 ); // expected-warning{{TRUE}}
243
+ clang_analyzer_eval (arr[1 ].arr [0 ].y == 2 ); // expected-warning{{TRUE}}
244
+ clang_analyzer_eval (arr[1 ].arr [1 ].x == 3 ); // expected-warning{{TRUE}}
245
+ clang_analyzer_eval (arr[1 ].arr [1 ].y == 4 ); // expected-warning{{TRUE}}
246
+ }
247
+
248
+ struct HasArr {
249
+ int arrDefault[2 ] = {1 , 2 };
250
+ int arr[2 ];
251
+ HasArr (int x, int y) : arr{x, y} {}
252
+ };
253
+
254
+ struct ArrCombination : public HasArr {
255
+ HasArr membDefault = {5 , 6 };
256
+ HasArr memb;
257
+ ArrCombination (int x) : HasArr(3 , 4 ), memb{7 , x} {}
258
+ };
259
+
260
+ void derived_and_member () {
261
+ ArrCombination a{8 };
262
+ // FIXME: Default initializers for array members are not modeled.
263
+ clang_analyzer_eval (a.arrDefault [0 ] == 1 ); // expected-warning{{UNKNOWN}}
264
+ clang_analyzer_eval (a.arrDefault [1 ] == 2 ); // expected-warning{{UNKNOWN}}
265
+ clang_analyzer_eval (a.arr [0 ] == 3 ); // expected-warning{{TRUE}}
266
+ clang_analyzer_eval (a.arr [1 ] == 4 ); // expected-warning{{TRUE}}
267
+ clang_analyzer_eval (a.membDefault .arrDefault [0 ] == 1 ); // expected-warning{{UNKNOWN}}
268
+ clang_analyzer_eval (a.membDefault .arrDefault [1 ] == 2 ); // expected-warning{{UNKNOWN}}
269
+ clang_analyzer_eval (a.membDefault .arr [0 ] == 5 ); // expected-warning{{UNKNOWN}}
270
+ clang_analyzer_eval (a.membDefault .arr [1 ] == 6 ); // expected-warning{{UNKNOWN}}
271
+ clang_analyzer_eval (a.memb .arrDefault [0 ] == 1 ); // expected-warning{{UNKNOWN}}
272
+ clang_analyzer_eval (a.memb .arrDefault [1 ] == 2 ); // expected-warning{{UNKNOWN}}
273
+ clang_analyzer_eval (a.memb .arr [0 ] == 7 ); // expected-warning{{TRUE}}
274
+ clang_analyzer_eval (a.memb .arr [1 ] == 8 ); // expected-warning{{TRUE}}
275
+
276
+ }
277
+
278
+ struct IncompleteArrInit {
279
+ int arr[2 ];
280
+ int arrDefault[3 ] = {1 , 2 , 3 };
281
+ IncompleteArrInit () : arr{1 }, arrDefault{2 , 3 } {}
282
+ };
283
+
284
+ void incomplete_array_init () {
285
+ IncompleteArrInit a;
286
+ clang_analyzer_eval (a.arr [0 ] == 1 ); // expected-warning{{TRUE}}
287
+ clang_analyzer_eval (a.arr [1 ] == 0 ); // expected-warning{{TRUE}}
288
+ clang_analyzer_eval (a.arrDefault [0 ] == 2 ); // expected-warning{{TRUE}}
289
+ clang_analyzer_eval (a.arrDefault [1 ] == 3 ); // expected-warning{{TRUE}}
290
+ clang_analyzer_eval (a.arrDefault [2 ] == 0 ); // expected-warning{{TRUE}}
249
291
}
0 commit comments