/* PR c/7652 */
/* { dg-do compile } */
/* { dg-require-effective-target alloca } */
/* { dg-options "-Wimplicit-fallthrough" } */

extern void bar (int);
extern int bar2 (void);
extern int *map;
void
f (int i)
{
  switch (i)
    {
    case 1:
      bar (0); /* { dg-warning "statement may fall through" } */
      static int i = 10;
    case 2:
      bar (99);
    }

  switch (i)
    {
    case 1:
      { /* { dg-warning "statement may fall through" "" { target c } . } */
	int a[i]; /* { dg-warning "statement may fall through" "" { target c++ } . } */
      }
    case 2:
      bar (99);
    }

  switch (i)
    {
    case 1:
      for (int j = 0; j < 10; j++) /* { dg-warning "statement may fall through" "" { target c } . } */
	map[j] = j; /* { dg-warning "statement may fall through" "" { target c++ } . } */
    case 2:
      bar (99);
    }

  switch (i)
    {
    case 1:
      do
	bar (2);
      while (--i); /* { dg-warning "statement may fall through" } */
    case 2:
      bar (99);
    }

  switch (i)
    {
    case 1:
      {
	switch (i + 2)
	  case 4:
	    bar (1); /* { dg-warning "statement may fall through" } */
	  case 5:
	    bar (5);
	    return;
      }
    case 2:
      bar (99);
    }

  switch (i)
    {
    case 1:;
    case 2:;
    }

  switch (i)
    {
    }

  switch (i)
    {
    case 1:
      if (i & 1) /* { dg-warning "statement may fall through" } */
	{
	  bar (23);
	  break;
	}
    case 2:
      bar (99);
    }

  switch (i)
    {
    case 1:
      if (i > 9) /* { dg-warning "statement may fall through" } */
	{
	  bar (9);
	  if (i == 10)
	    {
	      bar (10);
	      break;
	    }
	}
    case 2:
      bar (99);
    }

  int r;
  switch (i)
    {
    case 1:
      r = bar2 ();
      if (r) /* { dg-warning "statement may fall through" } */
	break;
      case 2:
	bar (99);
    }

  switch (i)
    {
      case 1:
	r = bar2 ();
	if (r)
	  return;
	if (!i) /* { dg-warning "statement may fall through" } */
	  return;
      case 2:
	bar (99);
    }
}
