On Wed, Apr 25, 2012 at 9:04 AM, Dodji Seketeli <do...@redhat.com> wrote: > In gcc/testsuite/gcc.dg/pr30457.c, the first warning was not being > emitted because the relevant location was inside the var_start macro > defined in a system header. It can even point to a token for a > builtin macro there. This patch unwinds to the first token in real > source code in that case.
While you are at it, could you also use a non-zero value for the second argument argument to warning_at? > > Tested on x86_64-unknown-linux-gnu against trunk. > > * builtins.c (fold_builtin_next_arg): Unwinds to the first > location in real source code. > --- > gcc/builtins.c | 16 ++++++++++++++-- > 1 files changed, 14 insertions(+), 2 deletions(-) > > diff --git a/gcc/builtins.c b/gcc/builtins.c > index b47f218..ef90b25 100644 > --- a/gcc/builtins.c > +++ b/gcc/builtins.c > @@ -12164,8 +12164,20 @@ fold_builtin_next_arg (tree exp, bool va_start_p) > the default argument promotions, the behavior is undefined." > */ > else if (DECL_REGISTER (arg)) > - warning (0, "undefined behaviour when second parameter of " > - "%<va_start%> is declared with %<register%> storage"); > + { > + /* There is good chance the current input_location points > + inside the definition of the va_start macro (perhaps on > + the token for builtin) in a system header, so the warning > + will not be emitted. Use the location in real source > + code. */ > + source_location current_location = > + linemap_unwind_to_first_non_reserved_loc (line_table, > input_location, > + NULL); > + warning_at (current_location, > + 0, > + "undefined behaviour when second parameter of " > + "%<va_start%> is declared with %<register%> storage"); > + } > > /* We want to verify the second parameter just once before the tree > optimizers are run and then avoid keeping it in the tree, > -- > Dodji