/* PR middle-end/103597 */
/* { dg-do compile } */
/* { dg-options "-Wimplicit-fallthrough" } */

#define E(c, e) if (c) e

int
fn0 (int n)
{
  switch (n)
    {
    case 0:
      E (1, return 0);
    case 1:
      return -1;
    }
  return 0;
}

int
fn1 (int n)
{
  switch (n)
    {
    case 0:
      E (1, goto out);
    case 1:
      return -1;
    }
out:
  return 0;
}

int
fn2 (int n)
{
  switch (n)
    {
    case 0:
      if (1)
       	n++;	  /* { dg-warning "statement may fall through" } */
    case 1:	  /* { dg-message "here" } */
      return -1;
    }
  return 0;
}

int
fn3 (int n)
{
  switch (n)
    {
    case 0:
      if (0)		/* { dg-warning "statement may fall through" } */
       	return 0;
    case 1:		/* { dg-message "here" } */
      return -1;
    }
  return 0;
}

int
fn4 (int n)
{
  switch (n)
    {
    case 0:
      E (0, n++);
      --n;	  /* { dg-warning "statement may fall through" } */
    case 1:	  /* { dg-message "here" } */
      return -1;
    }
  return 0;
}

int
fn5 (int n)
{
  switch (n)
    {
    case 0:
      if (1)
	return 0;
      else
	return -1;
    case 1:
      return -1;
    }
  return 0;
}

int
fn6 (int n)
{
  switch (n)
    {
    case 0:
      if (1)
	return 0;
      else
	{
meow:
	  n--;  /* { dg-warning "statement may fall through" } */
	}
    case 1:   /* { dg-message "here" } */
      return -1;
    case 2:
      goto meow;
    }
  return 0;
}

int
fn7 (int n)
{
  switch (n)
    {
    case 0:
      if (1)
       	return 0;
woof:
    case 1:
      return -1;
    }
  return 0;
}

int
fn8 (int n)
{
  switch (n)
    {
    case 0:
      if (1) n++; /* { dg-warning "statement may fall through" } */
woof:		  /* { dg-message "here" } */
    case 1:
      return -1;
    }
  return 0;
}