Ping. On Wed, Feb 24, 2016 at 05:31:22PM +0100, Marek Polacek wrote: > The following is another issue with macros from system headers. In this case > bool is defined in a system header to expand to _Bool and the "is promoted to" > warning didn't trigger because of that. The fix is to use the expanded > location. > > Bootstrapped/regtested on x86_64-linux, ok for trunk? > > 2016-02-24 Marek Polacek <pola...@redhat.com> > > PR c/67854 > * gimplify.c (gimplify_va_arg_expr): Use expanded location for the > "is promoted to" warning. > > * gcc.dg/pr67854.c: New test. > > diff --git gcc/gimplify.c gcc/gimplify.c > index 7be6bd7..e7ea974 100644 > --- gcc/gimplify.c > +++ gcc/gimplify.c > @@ -11573,24 +11573,28 @@ gimplify_va_arg_expr (tree *expr_p, gimple_seq > *pre_p, > { > static bool gave_help; > bool warned; > + /* Use the expansion point to handle cases such as passing bool > (defined > + in a system header) through `...'. */ > + source_location xloc > + = expansion_point_location_if_in_system_header (loc); > > /* Unfortunately, this is merely undefined, rather than a constraint > violation, so we cannot make this an error. If this call is never > executed, the program is still strictly conforming. */ > - warned = warning_at (loc, 0, > - "%qT is promoted to %qT when passed through %<...%>", > + warned = warning_at (xloc, 0, > + "%qT is promoted to %qT when passed through %<...%>", > type, promoted_type); > if (!gave_help && warned) > { > gave_help = true; > - inform (loc, "(so you should pass %qT not %qT to %<va_arg%>)", > + inform (xloc, "(so you should pass %qT not %qT to %<va_arg%>)", > promoted_type, type); > } > > /* We can, however, treat "undefined" any way we please. > Call abort to encourage the user to fix the program. */ > if (warned) > - inform (loc, "if this code is reached, the program will abort"); > + inform (xloc, "if this code is reached, the program will abort"); > /* Before the abort, allow the evaluation of the va_list > expression to exit or longjmp. */ > gimplify_and_add (valist, pre_p); > diff --git gcc/testsuite/gcc.dg/pr67854.c gcc/testsuite/gcc.dg/pr67854.c > index e69de29..af994c6 100644 > --- gcc/testsuite/gcc.dg/pr67854.c > +++ gcc/testsuite/gcc.dg/pr67854.c > @@ -0,0 +1,11 @@ > +/* PR c/67854 */ > +/* { dg-do compile } */ > + > +#include <stdbool.h> > +#include <stdarg.h> > + > +void > +foo (va_list ap) > +{ > + va_arg (ap, bool); /* { dg-warning "is promoted to .int. when passed > through" } */ > +} > > Marek
Marek