summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/i386/i386.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/union-3.c10
4 files changed, 25 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 66a41308397..ca5851cc255 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2006-06-08 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+ PR target/27421
+ * config/i386/i386.c (classify_argument): Skip fields with invalid
+ types in unions.
+
2006-06-08 Steven Bosscher <steven@gcc.gnu.org>
* cse.c (flush_hash_table): Use VOIDmode to invalidate a REG.
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 743535cfe71..7903cb2bfdd 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -3045,6 +3045,10 @@ classify_argument (enum machine_mode mode, tree type,
if (TREE_CODE (field) == FIELD_DECL)
{
int num;
+
+ if (TREE_TYPE (field) == error_mark_node)
+ continue;
+
num = classify_argument (TYPE_MODE (TREE_TYPE (field)),
TREE_TYPE (field), subclasses,
bit_offset);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index cfeeaeb83e2..1d5b76aec01 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2006-06-08 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
+
+ PR target/27421
+ * gcc.dg/union-3.c: New test.
+
2006-06-08 Richard Guenther <rguenther@suse.de>
PR middle-end/27116
diff --git a/gcc/testsuite/gcc.dg/union-3.c b/gcc/testsuite/gcc.dg/union-3.c
new file mode 100644
index 00000000000..3e89b755afa
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/union-3.c
@@ -0,0 +1,10 @@
+/* PR target/27421 */
+/* { dg-do compile } */
+
+union A
+{
+ int i;
+ void x[1]; /* { dg-error "array of voids" } */
+};
+
+void foo(union A a) {}
OpenPOWER on IntegriCloud