]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: Fix handling of internal fn calls in statement expressions [PR94385]
authorJakub Jelinek <jakub@redhat.com>
Mon, 30 Mar 2020 20:55:36 +0000 (22:55 +0200)
committerJakub Jelinek <jakub@redhat.com>
Tue, 7 Apr 2020 19:00:35 +0000 (21:00 +0200)
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.

gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/pr94385.c [new file with mode: 0644]

index d11c4c62ddf3ec72e5cce2ee6f9ecc77b5bdf56d..324e133a1250565ea330791b48fc3ba01e58d805 100644 (file)
@@ -1,6 +1,12 @@
 2020-04-07  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       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-19  Jakub Jelinek  <jakub@redhat.com>
 
        PR c++/93931
index 4bfb5d15293435aab282c6a0779127aebbd173da..559e38dbc14e843635dd6ca9f41ad78b70769e6f 100644 (file)
@@ -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)
index 4a1b7fd3e8a3d21af8d7d3139ab3c7eccbaee6cd..c32e6a86b8baadb01c5e88de5617980adb0d94bd 100644 (file)
@@ -3,6 +3,9 @@
        Backported from mainline
        2020-03-30  Jakub Jelinek  <jakub@redhat.com>
 
+       PR c++/94385
+       * c-c++-common/pr94385.c: New test.
+
        PR target/93069
        * gcc.target/i386/avx512vl-pr93069.c: New test.
        * gcc.dg/vect/pr93069.c: New test.
diff --git a/gcc/testsuite/c-c++-common/pr94385.c b/gcc/testsuite/c-c++-common/pr94385.c
new file mode 100644 (file)
index 0000000..0611921
--- /dev/null
@@ -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); }));
+}