[PATCH] Another -Wnonnull-compare false positive fix (PR c++/69902)
Richard Biener
richard.guenther@gmail.com
Tue Feb 23 11:46:00 GMT 2016
On Mon, Feb 22, 2016 at 10:30 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> Here is a fix for another -Wnonnull-compare false positive - the problem
> is that during folding the NE_EXPR of a nonnull_arg_p with NULL (on which
> the C++ FE set TREE_NO_WARNING, because it is an artificial comparison
> for dynamic_cast) is changed by fold-const.c into EQ_EXPR, and the
> TREE_NO_WARNING flag is lost. Unfortunately it is deep enough in an
> expression passed to fold that cp_fold can't easily tweak that.
>
> Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
> trunk?
Ok.
Thanks,
Richard.
> 2016-02-22 Jakub Jelinek <jakub@redhat.com>
>
> PR c++/69902
> * fold-const.c (fold_truth_not_expr): Propagate TREE_NO_WARNING
> when inverting comparison.
>
> * g++.dg/warn/Wnonnull-compare-5.C: New test.
>
> --- gcc/fold-const.c.jj 2016-02-19 08:55:05.000000000 +0100
> +++ gcc/fold-const.c 2016-02-22 17:46:26.870468937 +0100
> @@ -3589,8 +3589,11 @@ fold_truth_not_expr (location_t loc, tre
> if (code == ERROR_MARK)
> return NULL_TREE;
>
> - return build2_loc (loc, code, type, TREE_OPERAND (arg, 0),
> - TREE_OPERAND (arg, 1));
> + tree ret = build2_loc (loc, code, type, TREE_OPERAND (arg, 0),
> + TREE_OPERAND (arg, 1));
> + if (TREE_NO_WARNING (arg))
> + TREE_NO_WARNING (ret) = 1;
> + return ret;
> }
>
> switch (code)
> --- gcc/testsuite/g++.dg/warn/Wnonnull-compare-5.C.jj 2016-02-22 17:48:16.996963704 +0100
> +++ gcc/testsuite/g++.dg/warn/Wnonnull-compare-5.C 2016-02-22 17:56:58.235839294 +0100
> @@ -0,0 +1,18 @@
> +// PR c++/69902
> +// { dg-do compile }
> +// { dg-options "-Wall" }
> +
> +struct A { virtual ~A (); };
> +struct B : A {};
> +
> +bool
> +foo (A &a)
> +{
> + return dynamic_cast<B *>(&a) == (B *) 0; // { dg-bogus "nonnull argument" }
> +}
> +
> +bool
> +bar (A &a)
> +{
> + return dynamic_cast<B *>(&a) != (B *) 0; // { dg-bogus "nonnull argument" }
> +}
>
> Jakub
More information about the Gcc-patches
mailing list