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