1 /* { dg-additional-options "-fanalyzer-checker=pattern-test -O2" } */
2 // TODO: run this at every optimization level
3
4 extern void foo(void *);
5 extern void bar(void *);
6
7 void test1(void *ptr)
8 {
9 if (ptr) { /* { dg-warning "pattern match on 'ptr != 0'" "ptr != 0" } */
10 /* { dg-warning "pattern match on 'ptr == 0'" "ptr == 0" { target *-*-* } .-1 } */
11 foo(ptr);
12 } else {
13 bar(ptr);
14 }
15 }
16
17 void test_2 (void *p, void *q)
18 {
19 _Bool tmp1 = p == 0;
20 _Bool tmp2 = q == 0;
21 _Bool tmp = tmp1 | tmp2;
22
23 /* Verify that we can detect the implied conditions on p and q here. */
24 if (tmp) /* { dg-line cond_2 } */
25 return;
26 foo(p);
27
28 /* { dg-warning "pattern match on 'p != 0'" "p != 0" { target *-*-* } cond_2 } */
29 /* { dg-warning "pattern match on 'tmp1 | tmp2 != 0'" "tmp1 | tmp2 != 0" { target *-*-* } cond_2 } */
30 /* { dg-warning "pattern match on 'q != 0'" "q != 0" { target *-*-* } cond_2 } */
31 }
32
33 void test_3 (void *p, void *q)
34 {
35 _Bool tmp1 = p == 0;
36 _Bool tmp2 = q == 0;
37 _Bool tmp = tmp1 & tmp2;
38
39 /* Verify that we can detect the implied conditions on p and q here. */
40 if (tmp) /* { dg-line cond_3 } */
41 return;
42 foo(p);
43
44 /* { dg-warning "pattern match on 'p == 0'" "p == 0" { target *-*-* } cond_3 } */
45 /* { dg-warning "pattern match on 'tmp1 & tmp2 == 0'" "tmp1 & tmp2 == 0" { target *-*-* } cond_3 } */
46 /* { dg-warning "pattern match on 'q == 0'" "q == 0" { target *-*-* } cond_3 } */
47 }