aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2020-03-30 22:55:36 +0200
committerJakub Jelinek <jakub@redhat.com>2020-03-30 22:55:36 +0200
commit1cb1986cb596336e688c079b821205ec212a46a3 (patch)
tree57cc305c98471cdb9b06d0655f52c101704f5050 /gcc/cp
parent48e331d63827a0500670d685c0fe7d609e0a807a (diff)
downloadgcc-1cb1986cb596336e688c079b821205ec212a46a3.zip
gcc-1cb1986cb596336e688c079b821205ec212a46a3.tar.gz
gcc-1cb1986cb596336e688c079b821205ec212a46a3.tar.bz2
c++: Fix handling of internal fn calls in statement expressions [PR94385]
The following testcase ICEs, because the FE when processing the statement expression changes the .VEC_CONVERT internal fn CALL_EXPR into .PHI call. That is because the internal fn call is recorded in the base.u.ifn field, which overlaps base.u.bits.lang_flag_1 which is used for STMT_IS_FULL_EXPR_P, so this essentially does ifn |= 2 on little-endian. STMT_IS_FULL_EXPR_P bit is used in: cp-gimplify.c- if (STATEMENT_CODE_P (code)) cp-gimplify.c- { cp-gimplify.c- saved_stmts_are_full_exprs_p = stmts_are_full_exprs_p (); cp-gimplify.c- current_stmt_tree ()->stmts_are_full_exprs_p cp-gimplify.c: = STMT_IS_FULL_EXPR_P (*expr_p); cp-gimplify.c- } and pt.c- if (STATEMENT_CODE_P (TREE_CODE (t))) pt.c: current_stmt_tree ()->stmts_are_full_exprs_p = STMT_IS_FULL_EXPR_P (t); so besides being wrong on some other codes, it actually isn't beneficial at all to set it on anything else, so the following patch restricts it to trees with STATEMENT_CODE_P TREE_CODE. 2020-03-30 Jakub Jelinek <jakub@redhat.com> PR c++/94385 * semantics.c (add_stmt): Only set STMT_IS_FULL_EXPR_P on trees with STATEMENT_CODE_P code. * c-c++-common/pr94385.c: New test.
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/semantics.c3
2 files changed, 8 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index e7c248a..be22bc0 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2020-03-30 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/94385
+ * semantics.c (add_stmt): Only set STMT_IS_FULL_EXPR_P on trees with
+ STATEMENT_CODE_P code.
+
2020-03-28 Patrick Palka <ppalka@redhat.com>
PR c++/94306
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 38637bd..c7a6064 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -380,7 +380,8 @@ add_stmt (tree t)
/* When we expand a statement-tree, we must know whether or not the
statements are full-expressions. We record that fact here. */
- STMT_IS_FULL_EXPR_P (t) = stmts_are_full_exprs_p ();
+ if (STATEMENT_CODE_P (TREE_CODE (t)))
+ STMT_IS_FULL_EXPR_P (t) = stmts_are_full_exprs_p ();
}
if (code == LABEL_EXPR || code == CASE_LABEL_EXPR)