summaryrefslogtreecommitdiff
path: root/0146-Backport-SME-Fix-PR-middle-end-107705-ICE-after-recl.patch
diff options
context:
space:
mode:
Diffstat (limited to '0146-Backport-SME-Fix-PR-middle-end-107705-ICE-after-recl.patch')
-rw-r--r--0146-Backport-SME-Fix-PR-middle-end-107705-ICE-after-recl.patch71
1 files changed, 71 insertions, 0 deletions
diff --git a/0146-Backport-SME-Fix-PR-middle-end-107705-ICE-after-recl.patch b/0146-Backport-SME-Fix-PR-middle-end-107705-ICE-after-recl.patch
new file mode 100644
index 0000000..4d3168b
--- /dev/null
+++ b/0146-Backport-SME-Fix-PR-middle-end-107705-ICE-after-recl.patch
@@ -0,0 +1,71 @@
+From beb962ec516f152cef482b229c9adf0390dc3b2c Mon Sep 17 00:00:00 2001
+From: Andrew Pinski <apinski@marvell.com>
+Date: Thu, 17 Nov 2022 22:03:08 +0000
+Subject: [PATCH 047/157] [Backport][SME] Fix PR middle-end/107705: ICE after
+ reclaration error
+
+Reference: https://gcc.gnu.org/git/?p=gcc.git;a=commit;h=ceba66ee230bb96b0889fc8ec7333c7ffae96d6e
+
+The problem here is after we created a call expression
+in the C front-end, we replace the decl type with
+an error mark node. We then end up calling
+aggregate_value_p with the call expression
+with the decl with the error mark as the type
+and we ICE.
+
+The fix is to check the function type
+after we process the call expression inside
+aggregate_value_p to get it.
+
+OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions.
+
+Thanks,
+Andrew Pinski
+
+gcc/ChangeLog:
+
+ PR middle-end/107705
+ * function.cc (aggregate_value_p): Return 0 if
+ the function type was an error operand.
+
+gcc/testsuite/ChangeLog:
+
+ * gcc.dg/redecl-22.c: New test.
+---
+ gcc/function.cc | 3 +++
+ gcc/testsuite/gcc.dg/redecl-22.c | 9 +++++++++
+ 2 files changed, 12 insertions(+)
+ create mode 100644 gcc/testsuite/gcc.dg/redecl-22.c
+
+diff --git a/gcc/function.cc b/gcc/function.cc
+index 28de39dd6..99aa738eb 100644
+--- a/gcc/function.cc
++++ b/gcc/function.cc
+@@ -2090,6 +2090,9 @@ aggregate_value_p (const_tree exp, const_tree fntype)
+ if (VOID_TYPE_P (type))
+ return 0;
+
++ if (error_operand_p (fntype))
++ return 0;
++
+ /* If a record should be passed the same as its first (and only) member
+ don't pass it as an aggregate. */
+ if (TREE_CODE (type) == RECORD_TYPE && TYPE_TRANSPARENT_AGGR (type))
+diff --git a/gcc/testsuite/gcc.dg/redecl-22.c b/gcc/testsuite/gcc.dg/redecl-22.c
+new file mode 100644
+index 000000000..7758570fa
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/redecl-22.c
+@@ -0,0 +1,9 @@
++/* We used to ICE in the gimplifier, PR 107705 */
++/* { dg-do compile } */
++/* { dg-options "-w" } */
++int f (void)
++{
++ int (*p) (void) = 0; // { dg-note "" }
++ return p ();
++ int p = 1; // { dg-error "" }
++}
+--
+2.33.0
+