diff options
author | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-11-27 14:13:22 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2017-11-27 14:13:22 +0100 |
commit | cb358080c908eedc600855bd689f5bd349f5ac98 (patch) | |
tree | f6d8a5086d6acee3218bc636a68083d0ac0969c2 | |
parent | 04f915037850166c05c73baf3d6e2ba10c790ea1 (diff) | |
download | gcc-cb358080c908eedc600855bd689f5bd349f5ac98.zip gcc-cb358080c908eedc600855bd689f5bd349f5ac98.tar.gz gcc-cb358080c908eedc600855bd689f5bd349f5ac98.tar.bz2 |
re PR c++/81675 (attribute(noreturn) of destructor in :? not honored)
PR c++/81675
* cp-gimplify.c (cp_fold) <case COND_EXPR>: Don't return immediately
for VOID_TYPE_P COND_EXPRs, instead fold the operands and if op0 is
INTEGER_CST, ensure that both op1 and op2 are non-NULL and fall
through into normal folding, otherwise just rebuild x if any op
changed.
* g++.dg/warn/pr81675.C: New test.
From-SVN: r255167
-rw-r--r-- | gcc/cp/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/cp/cp-gimplify.c | 30 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/warn/pr81675.C | 15 |
4 files changed, 55 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 854df5a..5dda604 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,4 +1,15 @@ -2017-11-14 Boris Kolpackov <boris@codesynthesis.com> +2017-11-27 Jakub Jelinek <jakub@redhat.com> + + PR c++/81675 + * cp-gimplify.c (cp_fold) <case COND_EXPR>: Don't return immediately + for VOID_TYPE_P COND_EXPRs, instead fold the operands and if op0 is + INTEGER_CST, ensure that both op1 and op2 are non-NULL and fall + through into normal folding, otherwise just rebuild x if any op + changed. + + * g++.dg/warn/pr81675.C: New test. + +2017-11-14 Boris Kolpackov <boris@codesynthesis.com> * Make-lang.in (c++.install-plugin): Install backend import library. diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c index d597ed9..734b156 100644 --- a/gcc/cp/cp-gimplify.c +++ b/gcc/cp/cp-gimplify.c @@ -2299,13 +2299,6 @@ cp_fold (tree x) case VEC_COND_EXPR: case COND_EXPR: - - /* Don't bother folding a void condition, since it can't produce a - constant value. Also, some statement-level uses of COND_EXPR leave - one of the branches NULL, so folding would crash. */ - if (VOID_TYPE_P (TREE_TYPE (x))) - return x; - loc = EXPR_LOCATION (x); op0 = cp_fold_rvalue (TREE_OPERAND (x, 0)); op1 = cp_fold (TREE_OPERAND (x, 1)); @@ -2319,6 +2312,29 @@ cp_fold (tree x) if (!VOID_TYPE_P (TREE_TYPE (op2))) op2 = cp_truthvalue_conversion (op2); } + else if (VOID_TYPE_P (TREE_TYPE (x))) + { + if (TREE_CODE (op0) == INTEGER_CST) + { + /* If the condition is constant, fold can fold away + the COND_EXPR. If some statement-level uses of COND_EXPR + have one of the branches NULL, avoid folding crash. */ + if (!op1) + op1 = build_empty_stmt (loc); + if (!op2) + op2 = build_empty_stmt (loc); + } + else + { + /* Otherwise, don't bother folding a void condition, since + it can't produce a constant value. */ + if (op0 != TREE_OPERAND (x, 0) + || op1 != TREE_OPERAND (x, 1) + || op2 != TREE_OPERAND (x, 2)) + x = build3_loc (loc, code, TREE_TYPE (x), op0, op1, op2); + break; + } + } if (op0 != TREE_OPERAND (x, 0) || op1 != TREE_OPERAND (x, 1) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cb3835b..a525509 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-11-27 Jakub Jelinek <jakub@redhat.com> + + PR c++/81675 + * g++.dg/warn/pr81675.C: New test. + 2017-11-27 Eric Botcazou <ebotcazou@adacore.com> * gnat.dg/unroll1.ads: Remove alignment clause. diff --git a/gcc/testsuite/g++.dg/warn/pr81675.C b/gcc/testsuite/g++.dg/warn/pr81675.C new file mode 100644 index 0000000..24a7a3b --- /dev/null +++ b/gcc/testsuite/g++.dg/warn/pr81675.C @@ -0,0 +1,15 @@ +// PR c++/81675 +// { dg-do compile } +// { dg-options "-Wall" } + +struct S +{ + ~S () __attribute__((noreturn)); + int a; +}; + +int +foo () +{ + false ? 5 : S ().a; +} |