aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/c-common.c11
2 files changed, 13 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8eb81d2..9670a1b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+Thu Oct 29 12:39:35 1998 Jim Wilson <wilson@cygnus.com>
+
+ * c-common.c (c_get_alias_set): Handle ARRAY_REF of union field.
+
Thu Oct 29 14:10:22 EST 1998 Andrew MacLeod <amacleod@cygnus.com>
* except.c (emit_eh_context): Make the EH context register stay alive
diff --git a/gcc/c-common.c b/gcc/c-common.c
index 508a8c2..ddb87cd 100644
--- a/gcc/c-common.c
+++ b/gcc/c-common.c
@@ -3155,8 +3155,15 @@ c_get_alias_set (t)
the conservative assumption. */
return 0;
- if (TREE_CODE (t) == COMPONENT_REF
- && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == UNION_TYPE)
+ if ((TREE_CODE (t) == COMPONENT_REF
+ && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == UNION_TYPE)
+ /* Also permit punning when accessing an array which is a union
+ member. This makes the current sparc va_arg macro work, but may
+ not be otherwise necessary. */
+ || (TREE_CODE (t) == ARRAY_REF
+ && TREE_CODE (TREE_OPERAND (t, 0)) == COMPONENT_REF
+ && (TREE_CODE (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (t, 0), 0)))
+ == UNION_TYPE)))
/* Permit type-punning when accessing a union, provided the
access is directly through the union. For example, this code does
not permit taking the address of a union member and then