1  /* { dg-additional-options "-fno-analyzer-transitivity" } */
       2  #include "analyzer-decls.h"
       3  
       4  void test (int i, int j)
       5  {
       6    if (i > 4)
       7      {
       8        __analyzer_eval (i > 4); /* { dg-warning "TRUE" } */
       9        __analyzer_eval (i <= 4); /* { dg-warning "FALSE" } */
      10        __analyzer_eval (i > 3); /* { dg-warning "TRUE" } */
      11  
      12        __analyzer_eval (i > 5); /* { dg-warning "UNKNOWN" } */
      13        __analyzer_eval (i != 3); /* { dg-warning "TRUE" } */
      14  
      15        __analyzer_eval (i == 3); /* { dg-warning "FALSE" } */
      16  
      17        __analyzer_eval (i != 4); /* { dg-warning "TRUE" } */
      18        __analyzer_eval (i == 4); /* { dg-warning "FALSE" } */
      19        __analyzer_eval (i == 5); /* { dg-warning "UNKNOWN" } */
      20        __analyzer_eval (i != 5); /* { dg-warning "UNKNOWN" } */
      21        __analyzer_eval (i < 5); /* { dg-warning "FALSE" } */
      22        __analyzer_eval (i <= 5); /* { dg-warning "UNKNOWN" } */
      23  
      24        /* Tests of transitivity.  */
      25        if (j < i)
      26  	{
      27  	  __analyzer_eval (j < i); /* { dg-warning "TRUE" } */
      28  	  __analyzer_eval (j <= 4); /* { dg-warning "UNKNOWN" } */
      29  	}
      30        else
      31  	{
      32  	  __analyzer_eval (j >= i); /* { dg-warning "TRUE" } */
      33  	  __analyzer_eval (j > 4); /* { dg-warning "TRUE" "desired" { xfail *-*-* } } */
      34  	  /* { dg-bogus "UNKNOWN" "status quo" { xfail *-*-* } .-1 } */
      35  	}
      36      }
      37    else
      38      {
      39        __analyzer_eval (i > 4); /* { dg-warning "FALSE" } */
      40        __analyzer_eval (i <= 4); /* { dg-warning "TRUE" } */
      41        __analyzer_eval (i > 3); /* { dg-warning "UNKNOWN" } */
      42  
      43        __analyzer_eval (i > 5); /* { dg-warning "FALSE" } */
      44        __analyzer_eval (i != 3); /* { dg-warning "UNKNOWN" } */
      45  
      46        __analyzer_eval (i == 3); /* { dg-warning "UNKNOWN" } */
      47  
      48        __analyzer_eval (i != 4); /* { dg-warning "UNKNOWN" } */
      49        __analyzer_eval (i == 4); /* { dg-warning "UNKNOWN" } */
      50        __analyzer_eval (i == 5); /* { dg-warning "FALSE" } */
      51        __analyzer_eval (i != 5); /* { dg-warning "TRUE" } */
      52        __analyzer_eval (i < 5); /* { dg-warning "TRUE" } */
      53        __analyzer_eval (i <= 5); /* { dg-warning "TRUE" } */
      54      }
      55  }
      56  
      57  void test_2 (int i, int j, int k)
      58  {
      59    if (i >= j)
      60      {
      61        __analyzer_eval (i == k); /* { dg-warning "UNKNOWN" } */
      62        if (j >= k)
      63  	{
      64  	  __analyzer_eval (i >= k); /* { dg-warning "TRUE" "desired" { xfail *-*-* } } */
      65  	  /* { dg-bogus "UNKNOWN" "status quo" { xfail *-*-* } .-1 } */
      66  	  __analyzer_eval (i == k); /* { dg-warning "UNKNOWN" } */
      67  	  if (k >= i)
      68  	    __analyzer_eval (i == k); /* { dg-warning "TRUE" "desired" { xfail *-*-* } } */
      69  	  /* { dg-bogus "UNKNOWN" "status quo" { xfail *-*-* } .-1 } */
      70  	}
      71      }
      72  }
      73  
      74  void test_3 (int flag, unsigned int i)
      75  {
      76    if (!flag) {
      77      return;
      78    }
      79  
      80    __analyzer_eval (flag); /* { dg-warning "TRUE" } */
      81        
      82    if (i>0) {
      83      __analyzer_eval (i > 0); /* { dg-warning "TRUE" } */
      84      __analyzer_eval (flag); /* { dg-warning "TRUE" } */
      85    } else {
      86      __analyzer_eval (i <= 0); /* { dg-warning "TRUE" } */
      87      __analyzer_eval (flag); /* { dg-warning "TRUE" } */
      88    }
      89  
      90    __analyzer_eval (flag); /* { dg-warning "TRUE" } */
      91  }
      92  
      93  void test_range_int_gt_lt (int i)
      94  {
      95    if (i > 3)
      96      if (i < 5)
      97        __analyzer_eval (i == 4); /* { dg-warning "TRUE" } */
      98  }
      99  
     100  void test_range_float_gt_lt (float f)
     101  {
     102    if (f > 3)
     103      if (f < 5)
     104        __analyzer_eval (f == 4); /* { dg-warning "UNKNOWN" } */
     105  }
     106  
     107  void test_range_int_ge_lt (int i)
     108  {
     109    if (i >= 4)
     110      if (i < 5)
     111        __analyzer_eval (i == 4); /* { dg-warning "TRUE" } */
     112  }
     113  
     114  void test_range_float_ge_lt (float f)
     115  {
     116    if (f >= 4)
     117      if (f < 5)
     118        __analyzer_eval (f == 4); /* { dg-warning "UNKNOWN" } */
     119  }
     120  
     121  void test_range_int_gt_le (int i)
     122  {
     123    if (i > 3)
     124      if (i <= 4)
     125        __analyzer_eval (i == 4); /* { dg-warning "TRUE" } */
     126  }
     127  
     128  void test_range_float_gt_le (float f)
     129  {
     130    if (f > 3)
     131      if (f <= 4)
     132        __analyzer_eval (f == 4); /* { dg-warning "UNKNOWN" } */
     133  }
     134  
     135  void test_range_int_ge_le (int i)
     136  {
     137    if (i >= 4)
     138      if (i <= 4)
     139        __analyzer_eval (i == 4); /* { dg-warning "TRUE" } */
     140  }
     141  
     142  void test_range_float_ge_le (float f)
     143  {
     144    if (f >= 4)
     145      if (f <= 4)
     146        __analyzer_eval (f == 4); /* { dg-warning "TRUE" "desired" { xfail *-*-* } } */
     147        /* { dg-bogus "UNKNOWN" "status quo" { xfail *-*-* } .-1 } */
     148  }
     149  
     150  void test_float_selfcmp (float f)
     151  {
     152    __analyzer_eval (f == f); /* { dg-warning "UNKNOWN" } */
     153    __analyzer_eval (f != f); /* { dg-warning "UNKNOWN" } */
     154  }