[PATCH] Fix missing warning with bool (PR c/67854)
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 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 %)", + inform (xloc, "(so you should pass %qT not %qT to %)", 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 +#include + +void +foo (va_list ap) +{ + va_arg (ap, bool); /* { dg-warning "is promoted to .int. when passed through" } */ +} Marek
Re: [PATCH] Fix missing warning with bool (PR c/67854)
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 > > 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 %)", > + inform (xloc, "(so you should pass %qT not %qT to %)", > 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 > +#include > + > +void > +foo (va_list ap) > +{ > + va_arg (ap, bool); /* { dg-warning "is promoted to .int. when passed > through" } */ > +} > > Marek Marek
Re: [PATCH] Fix missing warning with bool (PR c/67854)
On 02/24/2016 09:31 AM, 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 PR c/67854 * gimplify.c (gimplify_va_arg_expr): Use expanded location for the "is promoted to" warning. * gcc.dg/pr67854.c: New test. This isn't a regression, so I put it in my gcc-7 bucket. Is this something we really need to address in gcc-6? FWIW, I think the patch is technically fine. Jeff
Re: [PATCH] Fix missing warning with bool (PR c/67854)
On Tue, Mar 01, 2016 at 09:31:26AM -0700, Jeff Law wrote: > On 02/24/2016 09:31 AM, 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 > > > > PR c/67854 > > * gimplify.c (gimplify_va_arg_expr): Use expanded location for the > > "is promoted to" warning. > > > > * gcc.dg/pr67854.c: New test. > This isn't a regression, so I put it in my gcc-7 bucket. Is this something > we really need to address in gcc-6? Well, gcc4.7 warned, the warning disappeared in gcc4.8, so I think this is a regression. I'm fine with deferring to 7 though. > FWIW, I think the patch is technically fine. Thanks, Marek
Re: [PATCH] Fix missing warning with bool (PR c/67854)
On Tue, Mar 01, 2016 at 08:08:03PM +0100, Marek Polacek wrote: > On Tue, Mar 01, 2016 at 09:31:26AM -0700, Jeff Law wrote: > > On 02/24/2016 09:31 AM, 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 > > > > > > PR c/67854 > > > * gimplify.c (gimplify_va_arg_expr): Use expanded location for the > > > "is promoted to" warning. > > > > > > * gcc.dg/pr67854.c: New test. > > This isn't a regression, so I put it in my gcc-7 bucket. Is this something > > we really need to address in gcc-6? > > Well, gcc4.7 warned, the warning disappeared in gcc4.8, so I think this is > a regression. I'm fine with deferring to 7 though. > > > FWIW, I think the patch is technically fine. > > Thanks, This is ok for trunk. Jakub