1 /* Spurious uninitialized variable warnings, case 2.
2    Taken from cpphash.c (macroexpand) */
3 /* { dg-do compile } */
4 /* { dg-options "-O -Wuninitialized" } */
5 
6 struct definition
7 {
8   int nargs;
9   int rest_args;
10 };
11 
12 struct cpp_reader;
13 
14 enum cpp_token
15 {
16   CPP_EOF, CPP_POP, CPP_COMMA, CPP_RPAREN
17 };
18 
19 extern enum cpp_token macarg (struct cpp_reader *, int);
20 
21 void
macroexpand(struct cpp_reader * pfile,struct definition * defn)22 macroexpand (struct cpp_reader *pfile, struct definition *defn)
23 {
24   int nargs = defn->nargs;
25 
26   if (nargs >= 0)
27     {
28       enum cpp_token token;  /* { dg-bogus "token" "uninitialized variable warning" } */
29       int i, rest_args;
30       i = 0;
31       rest_args = 0;
32       do
33 	{
34 	  if (rest_args)
35 	    continue;
36 	  if (i < nargs || (nargs == 0 && i == 0))
37 	    {
38 	      /* if we are working on last arg which absorbs rest of args... */
39 	      if (i == nargs - 1 && defn->rest_args)
40 		rest_args = 1;
41 	      token = macarg (pfile, rest_args);
42 	    }
43 	  else
44 	    token = macarg (pfile, 0);
45 	  if (token == CPP_EOF || token == CPP_POP)
46 	    return;
47 
48 	  i++;
49 	}
50       while (token == CPP_COMMA);
51     }
52 }
53