(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
analyzer/
pattern-test-2.c
       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  }