15db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix,debug.ExprInspection -verify %s
2a8f2362307b436023095e66efd678ae591c02184Anna Zaks
3a8f2362307b436023095e66efd678ae591c02184Anna Zaksint printf(const char *restrict,...);
4a8f2362307b436023095e66efd678ae591c02184Anna Zaks
5a8f2362307b436023095e66efd678ae591c02184Anna Zaks// Testing core functionality of the region store.
6a8f2362307b436023095e66efd678ae591c02184Anna Zaks// radar://10127782
7a8f2362307b436023095e66efd678ae591c02184Anna Zaksint compoundLiteralTest() {
8a8f2362307b436023095e66efd678ae591c02184Anna Zaks    int index = 0;
9a8f2362307b436023095e66efd678ae591c02184Anna Zaks    for (index = 0; index < 2; index++) {
10a8f2362307b436023095e66efd678ae591c02184Anna Zaks        int thing = (int []){0, 1}[index];
11a8f2362307b436023095e66efd678ae591c02184Anna Zaks        printf("thing: %i\n", thing);
12a8f2362307b436023095e66efd678ae591c02184Anna Zaks    }
13a8f2362307b436023095e66efd678ae591c02184Anna Zaks    return 0;
14a8f2362307b436023095e66efd678ae591c02184Anna Zaks}
15a8f2362307b436023095e66efd678ae591c02184Anna Zaks
16a8f2362307b436023095e66efd678ae591c02184Anna Zaksint compoundLiteralTest2() {
17a8f2362307b436023095e66efd678ae591c02184Anna Zaks    int index = 0;
18a8f2362307b436023095e66efd678ae591c02184Anna Zaks    for (index = 0; index < 3; index++) {
19a8f2362307b436023095e66efd678ae591c02184Anna Zaks        int thing = (int [][3]){{0,0,0}, {1,1,1}, {2,2,2}}[index][index];
20a8f2362307b436023095e66efd678ae591c02184Anna Zaks        printf("thing: %i\n", thing);
21a8f2362307b436023095e66efd678ae591c02184Anna Zaks    }
22a8f2362307b436023095e66efd678ae591c02184Anna Zaks    return 0;
23a8f2362307b436023095e66efd678ae591c02184Anna Zaks}
245db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks
255db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaksint concreteOffsetBindingIsInvalidatedBySymbolicOffsetAssignment(int length,
265db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks                                                                 int i) {
275db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks  int values[length];
285db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks  values[i] = 4;
295db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks  return values[0]; // no-warning
305db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks}
315db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks
325db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaksstruct X{
335db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks  int mem;
345db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks};
355db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaksint initStruct(struct X *st);
365db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaksint structOffsetBindingIsInvalidated(int length, int i){
375db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks  struct X l;
385db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks  initStruct(&l);
395db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks  return l.mem; // no-warning
405db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks}
415db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks
425db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaksvoid clang_analyzer_eval(int);
435db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaksvoid testConstraintOnRegionOffset(int *values, int length, int i){
445db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks  if (values[1] == 4) {
455db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks    values[i] = 5;
465db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks    clang_analyzer_eval(values[1] == 4);// expected-warning {{UNKNOWN}}
475db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks  }
485db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks}
495db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks
505db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaksint initArray(int *values);
515db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaksvoid testConstraintOnRegionOffsetStack(int *values, int length, int i) {
525db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks  if (values[0] == 4) {
535db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks    initArray(values);
545db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks    clang_analyzer_eval(values[0] == 4);// expected-warning {{UNKNOWN}}
555db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks  }
565db8fac5f304d9973f724d5aeb4108367d36f781Anna Zaks}
57