1  /* { dg-additional-options "-fanalyzer-transitivity" } */
       2  
       3  #include "analyzer-decls.h"
       4  
       5  void test (int i)
       6  {
       7    switch (i)
       8      {
       9      case 0:
      10        __analyzer_eval (i == 0); /* { dg-warning "TRUE" } */
      11        __analyzer_eval (i != -1); /* { dg-warning "TRUE" } */
      12        __analyzer_eval (i != 0); /* { dg-warning "FALSE" } */
      13        __analyzer_eval (i != 1); /* { dg-warning "TRUE" } */
      14        break;
      15  
      16      case 3 ... 5:
      17        __analyzer_eval (i != 0); /* { dg-warning "TRUE" } */
      18        __analyzer_eval (i > 1); /* { dg-warning "TRUE" } */
      19        __analyzer_eval (i > 2); /* { dg-warning "TRUE" } */
      20        __analyzer_eval (i >= 2); /* { dg-warning "TRUE" } */
      21        __analyzer_eval (i >= 3); /* { dg-warning "TRUE" } */
      22        __analyzer_eval (i <= 5); /* { dg-warning "TRUE" } */
      23        __analyzer_eval (i < 6); /* { dg-warning "TRUE" } */
      24        __analyzer_eval (i <= 6); /* { dg-warning "TRUE" } */
      25        __analyzer_eval (i < 7); /* { dg-warning "TRUE" } */
      26        __analyzer_eval (i != 6); /* { dg-warning "TRUE" } */
      27        __analyzer_eval (i != 3); /* { dg-warning "UNKNOWN" } */
      28        __analyzer_eval (i != 4); /* { dg-warning "UNKNOWN" } */
      29        __analyzer_eval (i != 5); /* { dg-warning "UNKNOWN" } */
      30        __analyzer_eval (i >= 4); /* { dg-warning "UNKNOWN" } */
      31        __analyzer_eval (i >= 5); /* { dg-warning "UNKNOWN" } */
      32        __analyzer_eval (i <= 3); /* { dg-warning "UNKNOWN" } */
      33        __analyzer_eval (i <= 4); /* { dg-warning "UNKNOWN" } */
      34        break;
      35  
      36      default:
      37        __analyzer_eval (i == -1); /* { dg-warning "UNKNOWN" } */
      38        __analyzer_eval (i == 0); /* { dg-warning "FALSE" } */
      39        __analyzer_eval (i == 2); /* { dg-warning "UNKNOWN" } */
      40        __analyzer_eval (i == 3); /* { dg-warning "FALSE" } */
      41        __analyzer_eval (i == 4); /* { dg-warning "FALSE" } */
      42        __analyzer_eval (i == 5); /* { dg-warning "FALSE" } */
      43        __analyzer_eval (i == 6); /* { dg-warning "UNKNOWN" } */
      44        __analyzer_eval (i != 0); /* { dg-warning "TRUE" } */
      45        __analyzer_eval (i != 1); /* { dg-warning "UNKNOWN" } */
      46        __analyzer_eval (i != 3); /* { dg-warning "TRUE" } */
      47        __analyzer_eval (i != 4); /* { dg-warning "TRUE" } */
      48        __analyzer_eval (i != 5); /* { dg-warning "TRUE" } */
      49        __analyzer_eval (i != 6); /* { dg-warning "UNKNOWN" } */
      50        break;
      51      }
      52  }
      53  
      54  /* Verify that the analyzer follows the correct paths on a
      55     switch statement guarded by an if, using noinline to defeat
      56     optimizations.  */
      57  
      58  static void __attribute__((noinline))
      59  __analyzer_called_by_test_2 (int y)
      60  {
      61    switch (y)
      62      {
      63      case 0:
      64        __analyzer_dump_path (); /* { dg-bogus "path" } */
      65        break;
      66      case 1:
      67        __analyzer_dump_path (); /* { dg-message "path" } */
      68        break;
      69      case 2:
      70        __analyzer_dump_path (); /* { dg-bogus "path" } */
      71        break;
      72      default:
      73        __analyzer_dump_path (); /* { dg-bogus "path" } */
      74        break;
      75      }
      76  }
      77  
      78  void test_2 (int x)
      79  {
      80    if (x == 1)
      81      __analyzer_called_by_test_2 (x);
      82  }
      83  
      84  void test_3 (int x, int y)
      85  {
      86    if (y == 3)
      87      switch (x)
      88        {
      89        case 0 ... 9:
      90        case 20 ... 29:
      91  	if (x == y)
      92  	  __analyzer_dump_path (); /* { dg-message "path" } */
      93  	else
      94  	  __analyzer_dump_path (); /* { dg-message "path" } */
      95        }
      96  }
      97  
      98  struct s4
      99  {
     100    unsigned char level:3;
     101    unsigned char key_id_mode:2;
     102    unsigned char reserved:3;
     103  };
     104  
     105  void test_4 (struct s4 *p)
     106  {
     107    switch (p->key_id_mode)
     108      {
     109      case 0:
     110        __analyzer_dump_path (); /* { dg-message "path" } */
     111        break;
     112      case 1:
     113        __analyzer_dump_path (); /* { dg-message "path" } */
     114        break;
     115      case 2:
     116        __analyzer_dump_path (); /* { dg-message "path" } */
     117        break;
     118      case 3:
     119        __analyzer_dump_path (); /* { dg-message "path" } */
     120        break;
     121      }
     122    __analyzer_dump_path (); /* { dg-message "path" } */
     123  }
     124  
     125  int test_5 (unsigned v)
     126  {
     127    switch (v)
     128      {
     129      case 0:
     130        return 7;
     131        break;
     132      case 1:
     133        return 23;
     134        break;
     135      default:
     136        return v * 2;
     137      }
     138  }
     139  
     140  int test_6 (unsigned v)
     141  {
     142    switch (v)
     143      {
     144      case 0:
     145        return 3;
     146      case -1:
     147        return 22;
     148      }
     149    return -3;
     150  }
     151  
     152  int g7 = -1;
     153  int test_7 ()
     154  {
     155  	switch (g7++) {
     156  	case 0:
     157  	  return 32;
     158  
     159  	case 100:
     160  	  return 42;
     161  	}
     162  	return 0;
     163  }
     164  
     165  int test_bitmask_1 (int x)
     166  {
     167    int flag = 0;
     168    if (x & 0x80)
     169      flag = 1;
     170  
     171    switch (x)
     172      {
     173      case 0:
     174        if (flag)
     175  	__analyzer_dump_path ();  /* { dg-bogus "path" } */
     176        else
     177  	__analyzer_dump_path ();  /* { dg-message "path" } */
     178        break;
     179  
     180      case 0x80:
     181        if (flag)
     182  	__analyzer_dump_path ();  /* { dg-message "path" } */
     183        else
     184  	__analyzer_dump_path ();  /* { dg-bogus "path" } */
     185        break;
     186  
     187      case 0x81:
     188        if (flag)
     189  	__analyzer_dump_path ();  /* { dg-message "path" } */
     190        else
     191  	__analyzer_dump_path ();  /* { dg-bogus "path" } */
     192        break;
     193      }
     194  }
     195  
     196  int test_bitmask_2 (int x)
     197  {
     198    int flag = 0;
     199    if ((x & 0xf80) == 0x80)
     200      flag = 1;
     201  
     202    switch (x)
     203      {
     204      case 0:
     205        if (flag)
     206  	__analyzer_dump_path ();  /* { dg-bogus "path" } */
     207        else
     208  	__analyzer_dump_path ();  /* { dg-message "path" } */
     209        break;
     210  
     211      case 0x80:
     212        if (flag)
     213  	__analyzer_dump_path ();  /* { dg-message "path" } */
     214        else
     215  	__analyzer_dump_path ();  /* { dg-bogus "path" } */
     216        break;
     217  
     218      case 0x81:
     219        if (flag)
     220  	__analyzer_dump_path ();  /* { dg-message "path" } */
     221        else
     222  	__analyzer_dump_path ();  /* { dg-bogus "path" } */
     223        break;
     224  
     225      case 0x180:
     226        if (flag)
     227  	__analyzer_dump_path ();  /* { dg-bogus "path" } */
     228        else
     229  	__analyzer_dump_path ();  /* { dg-message "path" } */
     230        break;
     231  
     232      case 0xf80:
     233        if (flag)
     234  	__analyzer_dump_path ();  /* { dg-bogus "path" } */
     235        else
     236  	__analyzer_dump_path ();  /* { dg-message "path" } */
     237        break;
     238      }
     239  }