72 lines
2.0 KiB
Diff
72 lines
2.0 KiB
Diff
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
|
|
|