diff options
author | Jakub Jelinek <jakub@redhat.com> | 2020-03-30 22:55:36 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2020-03-30 22:55:36 +0200 |
commit | 1cb1986cb596336e688c079b821205ec212a46a3 (patch) | |
tree | 57cc305c98471cdb9b06d0655f52c101704f5050 /gcc | |
parent | 48e331d63827a0500670d685c0fe7d609e0a807a (diff) | |
download | gcc-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')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 3 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/pr94385.c | 12 |
4 files changed, 25 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) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 90c9db8..66c71f1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-03-30 Jakub Jelinek <jakub@redhat.com> + + PR c++/94385 + * c-c++-common/pr94385.c: New test. + 2020-03-30 Will Schmidt <will_schmidt@vnet.ibm.com> * gcc.target/powerpc/pragma_power6.c: New. diff --git a/gcc/testsuite/c-c++-common/pr94385.c b/gcc/testsuite/c-c++-common/pr94385.c new file mode 100644 index 0000000..0611921 --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr94385.c @@ -0,0 +1,12 @@ +/* PR c++/94385 */ +/* { dg-do compile } */ +/* { dg-options "" } */ + +typedef int V __attribute__((__vector_size__(16))); +typedef float W __attribute__((__vector_size__(16))); + +void +foo (W *x, V *y) +{ + *y = (({ __builtin_convertvector (*x, V); })); +} |