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? 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