/* { dg-additional-options "-fanalyzer-transitivity" } */

#include "analyzer-decls.h"

void test (int i)
{
  switch (i)
    {
    case 0:
      __analyzer_eval (i == 0); /* { dg-warning "TRUE" } */
      __analyzer_eval (i != -1); /* { dg-warning "TRUE" } */
      __analyzer_eval (i != 0); /* { dg-warning "FALSE" } */
      __analyzer_eval (i != 1); /* { dg-warning "TRUE" } */
      break;

    case 3 ... 5:
      __analyzer_eval (i != 0); /* { dg-warning "TRUE" } */
      __analyzer_eval (i > 1); /* { dg-warning "TRUE" } */
      __analyzer_eval (i > 2); /* { dg-warning "TRUE" } */
      __analyzer_eval (i >= 2); /* { dg-warning "TRUE" } */
      __analyzer_eval (i >= 3); /* { dg-warning "TRUE" } */
      __analyzer_eval (i <= 5); /* { dg-warning "TRUE" } */
      __analyzer_eval (i < 6); /* { dg-warning "TRUE" } */
      __analyzer_eval (i <= 6); /* { dg-warning "TRUE" } */
      __analyzer_eval (i < 7); /* { dg-warning "TRUE" } */
      __analyzer_eval (i != 6); /* { dg-warning "TRUE" } */
      __analyzer_eval (i != 3); /* { dg-warning "UNKNOWN" } */
      __analyzer_eval (i != 4); /* { dg-warning "UNKNOWN" } */
      __analyzer_eval (i != 5); /* { dg-warning "UNKNOWN" } */
      __analyzer_eval (i >= 4); /* { dg-warning "UNKNOWN" } */
      __analyzer_eval (i >= 5); /* { dg-warning "UNKNOWN" } */
      __analyzer_eval (i <= 3); /* { dg-warning "UNKNOWN" } */
      __analyzer_eval (i <= 4); /* { dg-warning "UNKNOWN" } */
      break;

    default:
      __analyzer_eval (i == -1); /* { dg-warning "UNKNOWN" } */
      __analyzer_eval (i == 0); /* { dg-warning "FALSE" } */
      __analyzer_eval (i == 2); /* { dg-warning "UNKNOWN" } */
      __analyzer_eval (i == 3); /* { dg-warning "FALSE" } */
      __analyzer_eval (i == 4); /* { dg-warning "FALSE" } */
      __analyzer_eval (i == 5); /* { dg-warning "FALSE" } */
      __analyzer_eval (i == 6); /* { dg-warning "UNKNOWN" } */
      __analyzer_eval (i != 0); /* { dg-warning "TRUE" } */
      __analyzer_eval (i != 1); /* { dg-warning "UNKNOWN" } */
      __analyzer_eval (i != 3); /* { dg-warning "TRUE" } */
      __analyzer_eval (i != 4); /* { dg-warning "TRUE" } */
      __analyzer_eval (i != 5); /* { dg-warning "TRUE" } */
      __analyzer_eval (i != 6); /* { dg-warning "UNKNOWN" } */
      break;
    }
}

/* Verify that the analyzer follows the correct paths on a
   switch statement guarded by an if, using noinline to defeat
   optimizations.  */

static void __attribute__((noinline))
__analyzer_called_by_test_2 (int y)
{
  switch (y)
    {
    case 0:
      __analyzer_dump_path (); /* { dg-bogus "path" } */
      break;
    case 1:
      __analyzer_dump_path (); /* { dg-message "path" } */
      break;
    case 2:
      __analyzer_dump_path (); /* { dg-bogus "path" } */
      break;
    default:
      __analyzer_dump_path (); /* { dg-bogus "path" } */
      break;
    }
}

void test_2 (int x)
{
  if (x == 1)
    __analyzer_called_by_test_2 (x);
}

void test_3 (int x, int y)
{
  if (y == 3)
    switch (x)
      {
      case 0 ... 9:
      case 20 ... 29:
	if (x == y)
	  __analyzer_dump_path (); /* { dg-message "path" } */
	else
	  __analyzer_dump_path (); /* { dg-message "path" } */
      }
}

struct s4
{
  unsigned char level:3;
  unsigned char key_id_mode:2;
  unsigned char reserved:3;
};

void test_4 (struct s4 *p)
{
  switch (p->key_id_mode)
    {
    case 0:
      __analyzer_dump_path (); /* { dg-message "path" } */
      break;
    case 1:
      __analyzer_dump_path (); /* { dg-message "path" } */
      break;
    case 2:
      __analyzer_dump_path (); /* { dg-message "path" } */
      break;
    case 3:
      __analyzer_dump_path (); /* { dg-message "path" } */
      break;
    }
  __analyzer_dump_path (); /* { dg-message "path" } */
}

int test_5 (unsigned v)
{
  switch (v)
    {
    case 0:
      return 7;
      break;
    case 1:
      return 23;
      break;
    default:
      return v * 2;
    }
}

int test_6 (unsigned v)
{
  switch (v)
    {
    case 0:
      return 3;
    case -1:
      return 22;
    }
  return -3;
}

int g7 = -1;
int test_7 ()
{
	switch (g7++) {
	case 0:
	  return 32;

	case 100:
	  return 42;
	}
	return 0;
}
