/* Spurious uninit variable warnings, case 4.
   Simplified version of cppexp.c (cpp_parse_expr).

   This one is really fragile, it gets it right if you take out case
   1, or if the structure is replaced by an int, or if the structure
   has fewer members (!) */

/* { dg-do compile } */
/* { dg-options "-O -Wuninitialized" } */

extern void abort (void);

struct operation {
    short op;
    char rprio;
    char flags;
    char unsignedp;
    long value;
};

extern struct operation cpp_lex (void);

void
cpp_parse_expr (void)
{
  int rprio; /* { dg-bogus "rprio" "uninitialized variable warning PR19833" { xfail { powerpc*-*-* && lp64 } } } */
  struct operation op;

  for (;;)
    {
      op = cpp_lex ();

      switch (op.op)
	{
	case 0:
	  break;
	case 1:
	  return;
	case 2:
	  rprio = 1;
	  break;
	default:
	  return;
	}

      if (op.op == 0)
	return;

      if (rprio != 1)
	abort();
    }
}
