#include "analyzer-decls.h"

/* Verify the handling of "switch (enum_value)".  */

enum e
{
 E_VAL0,
 E_VAL1,
 E_VAL2,

 E_VAL10 = 10,
 E_VAL11 = 11,
 E_VAL12 = 12,

 E_VAL20 = 20,
 E_VAL21 = 21,
 E_VAL22 = 22
};

/* Verify that we assume that "switch (enum)" doesn't follow implicit
   "default" if all enum values have cases  */

int test_all_values_covered_implicit_default_1 (enum e x)
{
  switch (x)
    {
    case E_VAL0...E_VAL2:
      return 1066;
    case E_VAL10...E_VAL12:
      return 1776;
    case E_VAL20...E_VAL22:
      return 1945;
    }
  __analyzer_dump_path (); /* { dg-bogus "path" } */
}

int test_all_values_covered_implicit_default_2 (enum e x)
{
  int result;
  switch (x)
    {
    case E_VAL0...E_VAL2:
      result = 1066;
      break;
    case E_VAL10...E_VAL12:
      result = 1776;
      break;
    case E_VAL20...E_VAL22:
      result = 1945;
      break;
    }
  return result; /* { dg-bogus "uninitialized" } */
}

/* Verify that we consider paths that use the implicit default when not
   all enum values are covered by cases.  */

int test_missing_values_implicit_default_1 (enum e x)
{
  switch (x) /* { dg-message "following 'default:' branch" } */
    {
    case E_VAL0...E_VAL2:
      return 1066;
    case E_VAL10...E_VAL12:
      return 1776;
    }
  __analyzer_dump_path (); /* { dg-message "path" } */
  return 0;
}

int test_missing_values_implicit_default_2 (enum e x)
{
  int result;
  switch (x) /* { dg-message "following 'default:' branch" } */
    {
    case E_VAL0...E_VAL2:
      result = 1066;
      break;
    case E_VAL10...E_VAL12:
      result = 1776;
      break;
    }
  return result; /* { dg-warning "uninitialized" } */
}

/* Verify that explicit "default" isn't rejected.  */

int test_all_values_covered_explicit_default_1 (enum e x)
{
  switch (x)
    {
    case E_VAL0...E_VAL2:
      return 1066;
    case E_VAL10...E_VAL12:
      return 1776;
    case E_VAL20...E_VAL22:
      return 1945;
    default:
      __analyzer_dump_path (); /* { dg-message "path" } */
      return 0;
    }
}

int test_missing_values_explicit_default_1 (enum e x)
{
  switch (x)
    {
    default:
    case E_VAL0...E_VAL2:
      return 1066;
    case E_VAL10...E_VAL12:
      return 1776;
    }
  __analyzer_dump_path (); /* { dg-bogus "path" } */
  return 0;
}

int test_missing_values_explicit_default_2 (enum e x)
{
  switch (x)
    {
    case E_VAL0...E_VAL2:
      return 1066;
    case E_VAL10...E_VAL12:
      return 1776;
    default:
      __analyzer_dump_path (); /* { dg-message "path" } */
      return 1945;
    }
  __analyzer_dump_path (); /* { dg-bogus "path" } */
  return 0;
}
