| #include "analyzer-decls.h" |
| |
| struct state |
| { |
| int mode; |
| int data; |
| }; |
| |
| extern void do_stuff (struct state *, int); |
| |
| int test_1 (struct state *s) |
| { |
| __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */ |
| while (1) |
| { |
| __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enode" } */ |
| __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enode" } */ |
| /* TODO: why does the above need an extra stmt to merge state? */ |
| do_stuff (s, s->mode); |
| } |
| } |
| |
| int test_2 (struct state *s) |
| { |
| __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */ |
| while (1) |
| { |
| __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enode" } */ |
| __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enode" } */ |
| /* TODO: why does the above need an extra stmt to merge state? */ |
| switch (s->mode) |
| { |
| case 0: |
| __analyzer_dump_exploded_nodes (0); /* { dg-warning "2 processed enode" } */ |
| do_stuff (s, 0); |
| break; |
| case 1: |
| __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */ |
| do_stuff (s, 17); |
| break; |
| case 2: |
| __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */ |
| do_stuff (s, 5); |
| break; |
| case 3: |
| __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */ |
| return 42; |
| case 4: |
| __analyzer_dump_exploded_nodes (0); /* { dg-warning "1 processed enode" } */ |
| return -3; |
| } |
| } |
| } |