/* Tests for handling constraints on results of unknown fns. */ #include #include "analyzer-decls.h" void unknown_fn (void *); void test_1 (void) { int i; unknown_fn (&i); if (i) __analyzer_eval (i); /* { dg-warning "TRUE" } */ else __analyzer_eval (i); /* { dg-warning "FALSE" } */ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */ } struct foo { int i; int j; }; void test_2 (void) { struct foo f; unknown_fn (&f); if (f.j) __analyzer_eval (f.j); /* { dg-warning "TRUE" } */ else __analyzer_eval (f.j); /* { dg-warning "FALSE" } */ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */ } void test_3 (int flag) { int i; unknown_fn (&i); if (i) { __analyzer_eval (i); /* { dg-warning "TRUE" } */ if (flag) __analyzer_eval (flag); /* { dg-warning "TRUE" } */ else __analyzer_eval (flag); /* { dg-warning "FALSE" } */ } else __analyzer_eval (i); /* { dg-warning "FALSE" } */ if (flag) __analyzer_eval (flag); /* { dg-warning "TRUE" } */ else __analyzer_eval (flag); /* { dg-warning "FALSE" } */ __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */ } void test_4 (int y) { int x; unknown_fn (&x); if (x) { __analyzer_eval (x); /* { dg-warning "TRUE" } */ x = 0; } __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */ }