| /* { dg-additional-options "-fanalyzer-transitivity" } */ |
| |
| #include "analyzer-decls.h" |
| |
| void test (int i) |
| { |
| switch (i) |
| { |
| case 0: |
| __analyzer_eval (i == 0); /* { dg-warning "TRUE" } */ |
| __analyzer_eval (i != -1); /* { dg-warning "TRUE" } */ |
| __analyzer_eval (i != 0); /* { dg-warning "FALSE" } */ |
| __analyzer_eval (i != 1); /* { dg-warning "TRUE" } */ |
| break; |
| |
| case 3 ... 5: |
| __analyzer_eval (i != 0); /* { dg-warning "TRUE" } */ |
| __analyzer_eval (i > 1); /* { dg-warning "TRUE" } */ |
| __analyzer_eval (i > 2); /* { dg-warning "TRUE" } */ |
| __analyzer_eval (i >= 2); /* { dg-warning "TRUE" } */ |
| __analyzer_eval (i >= 3); /* { dg-warning "TRUE" } */ |
| __analyzer_eval (i <= 5); /* { dg-warning "TRUE" } */ |
| __analyzer_eval (i < 6); /* { dg-warning "TRUE" } */ |
| __analyzer_eval (i <= 6); /* { dg-warning "TRUE" } */ |
| __analyzer_eval (i < 7); /* { dg-warning "TRUE" } */ |
| __analyzer_eval (i != 6); /* { dg-warning "TRUE" } */ |
| __analyzer_eval (i != 3); /* { dg-warning "UNKNOWN" } */ |
| __analyzer_eval (i != 4); /* { dg-warning "UNKNOWN" } */ |
| __analyzer_eval (i != 5); /* { dg-warning "UNKNOWN" } */ |
| __analyzer_eval (i >= 4); /* { dg-warning "UNKNOWN" } */ |
| __analyzer_eval (i >= 5); /* { dg-warning "UNKNOWN" } */ |
| __analyzer_eval (i <= 3); /* { dg-warning "UNKNOWN" } */ |
| __analyzer_eval (i <= 4); /* { dg-warning "UNKNOWN" } */ |
| break; |
| |
| default: |
| __analyzer_eval (i == -1); /* { dg-warning "UNKNOWN" } */ |
| __analyzer_eval (i == 0); /* { dg-warning "FALSE" } */ |
| __analyzer_eval (i == 2); /* { dg-warning "UNKNOWN" } */ |
| __analyzer_eval (i == 3); /* { dg-warning "FALSE" } */ |
| __analyzer_eval (i == 4); /* { dg-warning "FALSE" } */ |
| __analyzer_eval (i == 5); /* { dg-warning "FALSE" } */ |
| __analyzer_eval (i == 6); /* { dg-warning "UNKNOWN" } */ |
| __analyzer_eval (i != 0); /* { dg-warning "TRUE" } */ |
| __analyzer_eval (i != 1); /* { dg-warning "UNKNOWN" } */ |
| __analyzer_eval (i != 3); /* { dg-warning "TRUE" } */ |
| __analyzer_eval (i != 4); /* { dg-warning "TRUE" } */ |
| __analyzer_eval (i != 5); /* { dg-warning "TRUE" } */ |
| __analyzer_eval (i != 6); /* { dg-warning "UNKNOWN" } */ |
| break; |
| } |
| } |
| |
| /* Verify that the analyzer follows the correct paths on a |
| switch statement guarded by an if, using noinline to defeat |
| optimizations. */ |
| |
| static void __attribute__((noinline)) |
| __analyzer_called_by_test_2 (int y) |
| { |
| switch (y) |
| { |
| case 0: |
| __analyzer_dump_path (); /* { dg-bogus "path" } */ |
| break; |
| case 1: |
| __analyzer_dump_path (); /* { dg-message "path" } */ |
| break; |
| case 2: |
| __analyzer_dump_path (); /* { dg-bogus "path" } */ |
| break; |
| default: |
| __analyzer_dump_path (); /* { dg-bogus "path" } */ |
| break; |
| } |
| } |
| |
| void test_2 (int x) |
| { |
| if (x == 1) |
| __analyzer_called_by_test_2 (x); |
| } |
| |
| void test_3 (int x, int y) |
| { |
| if (y == 3) |
| switch (x) |
| { |
| case 0 ... 9: |
| case 20 ... 29: |
| if (x == y) |
| __analyzer_dump_path (); /* { dg-message "path" } */ |
| else |
| __analyzer_dump_path (); /* { dg-message "path" } */ |
| } |
| } |
| |
| struct s4 |
| { |
| unsigned char level:3; |
| unsigned char key_id_mode:2; |
| unsigned char reserved:3; |
| }; |
| |
| void test_4 (struct s4 *p) |
| { |
| switch (p->key_id_mode) |
| { |
| case 0: |
| __analyzer_dump_path (); /* { dg-message "path" } */ |
| break; |
| case 1: |
| __analyzer_dump_path (); /* { dg-message "path" } */ |
| break; |
| case 2: |
| __analyzer_dump_path (); /* { dg-message "path" } */ |
| break; |
| case 3: |
| __analyzer_dump_path (); /* { dg-message "path" } */ |
| break; |
| } |
| __analyzer_dump_path (); /* { dg-message "path" } */ |
| } |
| |
| int test_5 (unsigned v) |
| { |
| switch (v) |
| { |
| case 0: |
| return 7; |
| break; |
| case 1: |
| return 23; |
| break; |
| default: |
| return v * 2; |
| } |
| } |
| |
| int test_6 (unsigned v) |
| { |
| switch (v) |
| { |
| case 0: |
| return 3; |
| case -1: |
| return 22; |
| } |
| return -3; |
| } |
| |
| int g7 = -1; |
| int test_7 () |
| { |
| switch (g7++) { |
| case 0: |
| return 32; |
| |
| case 100: |
| return 42; |
| } |
| return 0; |
| } |