From 4cde512c84dfc20a95a01cca838f288e3015cab5 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 22 Mar 2016 09:11:14 +0100 Subject: [PATCH] re PR c++/70295 (bogus -Wnonnull-compare for "dynamic_cast(this) != nullptr") PR c++/70295 * gimplify.c (gimplify_modify_expr): Call gimple_set_no_warning on assign if (*from_p) is a comparison, set it to TREE_NO_WARNING (*from_p). * c-c++-common/nonnull-1.c (func): Remove parens around cp4 != 0. (func2): New function for cond with parens, xfail warning for c++. * g++.dg/warn/Wnonnull-compare-8.C: New test. From-SVN: r234392 --- gcc/ChangeLog | 7 +++++++ gcc/gimplify.c | 2 ++ gcc/testsuite/ChangeLog | 7 +++++++ gcc/testsuite/c-c++-common/nonnull-1.c | 8 +++++++- gcc/testsuite/g++.dg/warn/Wnonnull-compare-8.C | 14 ++++++++++++++ 5 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/warn/Wnonnull-compare-8.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c98a2092ce9..5193c97ecb7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-03-22 Jakub Jelinek + + PR c++/70295 + * gimplify.c (gimplify_modify_expr): Call gimple_set_no_warning + on assign if (*from_p) is a comparison, set it to + TREE_NO_WARNING (*from_p). + 2016-03-21 Jakub Jelinek PR middle-end/70326 diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 3687e7aa183..5d03435cb0a 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -4850,6 +4850,8 @@ gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, { assign = gimple_build_assign (*to_p, *from_p); gimple_set_location (assign, EXPR_LOCATION (*expr_p)); + if (COMPARISON_CLASS_P (*from_p)) + gimple_set_no_warning (assign, TREE_NO_WARNING (*from_p)); } if (gimplify_ctxp->into_ssa && is_gimple_reg (*to_p)) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index dc47ef1a846..25a36ddbc20 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2016-03-22 Jakub Jelinek + + PR c++/70295 + * c-c++-common/nonnull-1.c (func): Remove parens around cp4 != 0. + (func2): New function for cond with parens, xfail warning for c++. + * g++.dg/warn/Wnonnull-compare-8.C: New test. + 2016-03-22 Patrick Palka PR c++/70096 diff --git a/gcc/testsuite/c-c++-common/nonnull-1.c b/gcc/testsuite/c-c++-common/nonnull-1.c index fb2814c4498..2446d6fbcfa 100644 --- a/gcc/testsuite/c-c++-common/nonnull-1.c +++ b/gcc/testsuite/c-c++-common/nonnull-1.c @@ -24,5 +24,11 @@ func (char *cp1, char *cp2, char *cp3, char *cp4) if (NULL != cp3) /* { dg-warning "nonnull argument" "cp3 compared to NULL" } */ return 3; - return (cp4 != 0) ? 0 : 1; /* { dg-warning "nonnull argument" "cp4 compared to NULL" } */ + return cp4 != 0 ? 0 : 1; /* { dg-warning "nonnull argument" "cp4 compared to NULL" } */ +} + +__attribute__((nonnull (1))) int +func2 (char *cp) +{ + return (cp != NULL) ? 1 : 0; /* { dg-warning "nonnull argument" "cp compared to NULL" { xfail c++ } } */ } diff --git a/gcc/testsuite/g++.dg/warn/Wnonnull-compare-8.C b/gcc/testsuite/g++.dg/warn/Wnonnull-compare-8.C new file mode 100644 index 00000000000..28dcac872ad --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/Wnonnull-compare-8.C @@ -0,0 +1,14 @@ +// PR c++/70295 +// { dg-do compile } +// { dg-options "-O2 -Wnonnull-compare" } + +struct A { A (); virtual ~A (); bool foo (bool); }; +struct B : virtual public A { B (); virtual ~B (); }; + +bool +A::foo (bool x) +{ + if (x && dynamic_cast(this) != (B *) 0) // { dg-bogus "nonnull argument" } + return true; + return false; +} -- 2.30.2