aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@gcc.gnu.org>2017-11-27 14:13:22 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2017-11-27 14:13:22 +0100
commitcb358080c908eedc600855bd689f5bd349f5ac98 (patch)
treef6d8a5086d6acee3218bc636a68083d0ac0969c2
parent04f915037850166c05c73baf3d6e2ba10c790ea1 (diff)
downloadgcc-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/ChangeLog13
-rw-r--r--gcc/cp/cp-gimplify.c30
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/warn/pr81675.C15
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;
+}