On Wed, Jun 20, 2018 at 10:32 AM, Jakub Jelinek <ja...@redhat.com> wrote: > Hi! > > This patch fixes a regression caused by C++ delayed folding, when > check_nonnull_arg is called, the arguments aren't folded yet and so unlike > GCC 4.8 and earlier we don't report -Wnonnull warning unless the argument is > literal NULL without any folding. > > Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for > trunk? Is this something we should backport (at least to 8.2) or not?
OK for trunk and 8.2. > 2018-06-20 Jakub Jelinek <ja...@redhat.com> > > PR c++/86210 > * c-common.c (check_nonnull_arg): Use fold_for_warn. Adjust obsolete > comment. > > * g++.dg/warn/Wnonnull4.C: New test. > > --- gcc/c-family/c-common.c.jj 2018-06-20 08:15:20.697849713 +0200 > +++ gcc/c-family/c-common.c 2018-06-20 12:14:27.828098317 +0200 > @@ -5404,10 +5404,8 @@ check_nonnull_arg (void *ctx, tree param > if (TREE_CODE (TREE_TYPE (param)) != POINTER_TYPE) > return; > > - /* When not optimizing diagnose the simple cases of null arguments. > - When optimization is enabled defer the checking until expansion > - when more cases can be detected. */ > - if (integer_zerop (param)) > + /* Diagnose the simple cases of null arguments. */ > + if (integer_zerop (fold_for_warn (param))) > { > warning_at (pctx->loc, OPT_Wnonnull, "null argument where non-null " > "required (argument %lu)", (unsigned long) param_num); > --- gcc/testsuite/g++.dg/warn/Wnonnull4.C.jj 2018-06-20 12:21:50.424552232 > +0200 > +++ gcc/testsuite/g++.dg/warn/Wnonnull4.C 2018-06-20 12:20:47.356487553 > +0200 > @@ -0,0 +1,21 @@ > +// PR c++/86210 > +// { dg-do compile } > +// { dg-options "-Wnonnull" } > + > +void *declared_not_defined (void *p) __attribute__((nonnull)); > + > +inline void *declared_and_defined (void *p) __attribute__((nonnull)); > + > +int > +main () > +{ > + int *const p = 0; > + declared_not_defined (p); // { dg-warning "null argument where non-null > required" } > + declared_and_defined (p); // { dg-warning "null argument where non-null > required" } > +} > + > +void * > +declared_and_defined (void *p) > +{ > + return p; > +} > > Jakub