blob: 70c00ce386751d930735eba35b13f8a6f1d9ff78 [file] [log] [blame]
#include "analyzer-decls.h"
struct foo
{
int ival;
int iarr[10];
};
void test_1 (int i, int j)
{
struct foo fooarr[4];
fooarr[1].ival = 42;
fooarr[1].iarr[3] = 27;
fooarr[2].iarr[1] = 17;
__analyzer_eval (fooarr[1].ival == 42); /* { dg-warning "TRUE" } */
__analyzer_eval (fooarr[1].iarr[3] == 27); /* { dg-warning "TRUE" } */
__analyzer_eval (fooarr[2].iarr[1] == 17); /* { dg-warning "TRUE" } */
/* Symbolic binding. */
fooarr[2].iarr[i] = j;
__analyzer_eval (fooarr[2].iarr[i] == j); /* { dg-warning "TRUE" } */
/* We should have lost our knowledge about fooarr[2].
It's not clear to me if we should also lose our knowledge about
fooarr[1] (for the case where i is negative). For now, we do. */
__analyzer_eval (fooarr[1].ival == 42); /* { dg-warning "UNKNOWN" } */
__analyzer_eval (fooarr[1].iarr[3] == 27); /* { dg-warning "UNKNOWN" } */
__analyzer_eval (fooarr[2].iarr[1] == 17); /* { dg-warning "UNKNOWN" } */
/* Should also be safe to read from fooarr[2];
it isn't known to be uninit anymore. */
__analyzer_eval (fooarr[2].iarr[10] == 17); /* { dg-warning "UNKNOWN" } */
}