/* Spurious uninitialized variable warnings, case 2.
   Taken from cpphash.c (macroexpand) */
/* { dg-do compile } */
/* { dg-options "-O -Wuninitialized" } */

struct definition
{
  int nargs;
  int rest_args;
};

struct cpp_reader;

enum cpp_token
{
  CPP_EOF, CPP_POP, CPP_COMMA, CPP_RPAREN
};

extern enum cpp_token macarg (struct cpp_reader *, int);

void
macroexpand (struct cpp_reader *pfile, struct definition *defn)
{
  int nargs = defn->nargs;

  if (nargs >= 0)
    {
      enum cpp_token token;  /* { dg-bogus "token" "uninitialized variable warning" } */
      int i, rest_args;
      i = 0;
      rest_args = 0;
      do
	{
	  if (rest_args)
	    continue;
	  if (i < nargs || (nargs == 0 && i == 0))
	    {
	      /* if we are working on last arg which absorbs rest of args... */
	      if (i == nargs - 1 && defn->rest_args)
		rest_args = 1;
	      token = macarg (pfile, rest_args);
	    }
	  else
	    token = macarg (pfile, 0);
	  if (token == CPP_EOF || token == CPP_POP)
	    return;

	  i++;
	}
      while (token == CPP_COMMA);
    }
}
