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

Reply via email to