1  #include "analyzer-decls.h"
       2  
       3  /* Verify the handling of "switch (enum_value)".  */
       4  
       5  enum e
       6  {
       7   E_VAL0,
       8   E_VAL1,
       9   E_VAL2
      10  };
      11  
      12  /* Verify that we assume that "switch (enum)" doesn't follow implicit
      13     "default" if all enum values have cases  */
      14  
      15  int test_all_values_covered_implicit_default_1 (enum e x)
      16  {
      17    switch (x)
      18      {
      19      case E_VAL0:
      20        return 1066;
      21      case E_VAL1:
      22        return 1776;
      23      case E_VAL2:
      24        return 1945;
      25      }
      26    __analyzer_dump_path (); /* { dg-bogus "path" } */
      27  }
      28  
      29  int test_all_values_covered_implicit_default_2 (enum e x)
      30  {
      31    int result;
      32    switch (x)
      33      {
      34      case E_VAL0:
      35        result = 1066;
      36        break;
      37      case E_VAL1:
      38        result = 1776;
      39        break;
      40      case E_VAL2:
      41        result = 1945;
      42        break;
      43      }
      44    return result; /* { dg-bogus "uninitialized" } */
      45  }
      46  
      47  /* Verify that we consider paths that use the implicit default when not
      48     all enum values are covered by cases.  */
      49  
      50  int test_missing_values_implicit_default_1 (enum e x)
      51  {
      52    switch (x) /* { dg-message "following 'default:' branch" } */
      53      {
      54      case E_VAL0:
      55        return 1066;
      56      case E_VAL1:
      57        return 1776;
      58      }
      59    __analyzer_dump_path (); /* { dg-message "path" } */
      60    return 0;
      61  }
      62  
      63  int test_missing_values_implicit_default_2 (enum e x)
      64  {
      65    int result;
      66    switch (x) /* { dg-message "following 'default:' branch" } */
      67      {
      68      case E_VAL0:
      69        result = 1066;
      70        break;
      71      case E_VAL1:
      72        result = 1776;
      73        break;
      74      }
      75    return result; /* { dg-warning "uninitialized" } */
      76  }
      77  
      78  /* Verify that explicit "default" isn't rejected.  */
      79  
      80  int test_all_values_covered_explicit_default_1 (enum e x)
      81  {
      82    switch (x)
      83      {
      84      case E_VAL0:
      85        return 1066;
      86      case E_VAL1:
      87        return 1776;
      88      case E_VAL2:
      89        return 1945;
      90      default:
      91        __analyzer_dump_path (); /* { dg-message "path" } */
      92        return 0;
      93      }
      94  }
      95  
      96  int test_missing_values_explicit_default_1 (enum e x)
      97  {
      98    switch (x)
      99      {
     100      default:
     101      case E_VAL0:
     102        return 1066;
     103      case E_VAL1:
     104        return 1776;
     105      }
     106    __analyzer_dump_path (); /* { dg-bogus "path" } */
     107    return 0;
     108  }
     109  
     110  int test_missing_values_explicit_default_2 (enum e x)
     111  {
     112    switch (x)
     113      {
     114      case E_VAL0:
     115        return 1066;
     116      case E_VAL1:
     117        return 1776;
     118      default:
     119        __analyzer_dump_path (); /* { dg-message "path" } */
     120        return 1945;
     121      }
     122    __analyzer_dump_path (); /* { dg-bogus "path" } */
     123    return 0;
     124  }
     125  
     126  int test_just_default (enum e x)
     127  {
     128    switch (x)
     129      {
     130      default:
     131        __analyzer_dump_path (); /* { dg-message "path" } */
     132        return 42;
     133      }
     134    __analyzer_dump_path (); /* { dg-bogus "path" } */
     135    return 0;  
     136  }