From e67bf044ae4ad40fd0cc24f428ca9758cd920f97 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 23 Feb 2016 13:58:53 +0100 Subject: [PATCH] re PR c++/69902 (Bogus -Wnonnull-compare for: dynamic_cast(&ref) == nullptr) 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. From-SVN: r233631 --- gcc/ChangeLog | 4 ++++ gcc/fold-const.c | 7 +++++-- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/warn/Wnonnull-compare-5.C | 18 ++++++++++++++++++ 4 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/warn/Wnonnull-compare-5.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 020a1b3485ae..951f2084cef6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2016-02-23 Jakub Jelinek + PR c++/69902 + * fold-const.c (fold_truth_not_expr): Propagate TREE_NO_WARNING + when inverting comparison. + PR c/69900 * common.opt (Wunreachable-code): Add Warning flag. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 41c652e43ee5..5376d4d499c0 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -3589,8 +3589,11 @@ fold_truth_not_expr (location_t loc, tree arg) 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) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f83aa50ff2e1..2b7fe37821d2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2016-02-23 Jakub Jelinek + PR c++/69902 + * g++.dg/warn/Wnonnull-compare-5.C: New test. + PR c/69900 * gcc.dg/pr69900.c: New test. diff --git a/gcc/testsuite/g++.dg/warn/Wnonnull-compare-5.C b/gcc/testsuite/g++.dg/warn/Wnonnull-compare-5.C new file mode 100644 index 000000000000..8b31e6cf86e9 --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wnonnull-compare-5.C @@ -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(&a) == (B *) 0; // { dg-bogus "nonnull argument" } +} + +bool +bar (A &a) +{ + return dynamic_cast(&a) != (B *) 0; // { dg-bogus "nonnull argument" } +} -- 2.47.2