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.
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