/* { dg-do compile } */
/* { dg-options "-Wjump-misses-init -Wno-switch-unreachable" } */
int
f1 (int a)
{
  if (a > 0)
    {
      int i = 7;	/* { dg-message "here" } */
    lab:		/* { dg-message "here" } */
      return a;
    }
  else
    {
      if (a < 0)
	goto lab;	/* { dg-warning "jump" } */
      return 1;
    }
}

int
f2 (int a)
{
  if (a > 0)
    {
      if (a < 0)
	goto lab;	/* { dg-warning "jump" } */
      return 1;
    }
  else
    {
      int i = 7;	/* { dg-message "here" } */
    lab:		/* { dg-message "here" } */
      return a;
    }
}

int
f3 (int a)
{
  if (a > 0)
    {
      static int i = 7;
    lab:
      return a;
    }
  else
    {
      if (a < 0)
	goto lab;
      return 1;
    }
}

int
f4 (int a)
{
  if (a > 0)
    {
      if (a < 0)
	goto lab;
      return 1;
    }
  else
    {
      static int i = 7;
    lab:
      return a;
    }
}

int
f5 (int a)
{
  if (a > 0)
    {
      int b = 1;
      if (a < 0)
	goto lab;
    }
 lab:
  return a;
}

int
f6 (int a)
{
  if (a > 0)
    {
    lab:
      return a;
    }
  else
    {
      int b = 1;
      goto lab;
    }
}

int
f7 (int a)
{
  switch (a)		/* { dg-message "switch" } */
    {
      int b = 1;	/* { dg-message "here" } */

    case 1:		/* { dg-warning "jump" } */
      return a;
    }
}

int
f8 (int a)
{
  switch (a)		/* { dg-message "switch" } */
    {
      int b = 1;	/* { dg-message "here" } */

    case 1:		/* { dg-warning "jump" } */
      goto lab;
    }
 lab:
  return a;
}

int
f9 (int a)
{
  switch (a)
    {
    case 0:
      {
	int b = 1;
	return b;
      }
    case 1:
      return a;
    }
}

int
f10 (int a)
{
  switch (a)
    {
    case 0:
      {
	int b = 1;
	goto lab;
      }

    case 1:
      goto lab;
    }
 lab:
  return a;
}
