sh.c (sh_gimplify_va_arg_expr): Don't substitute a RECORD_TYPE record with the type...
authorJoern Rennecke <amylaar@gcc.gnu.org>
Wed, 17 Aug 2005 19:44:24 +0000 (20:44 +0100)
committerJoern Rennecke <amylaar@gcc.gnu.org>
Wed, 17 Aug 2005 19:44:24 +0000 (20:44 +0100)
* sh.c (sh_gimplify_va_arg_expr): Don't substitute a RECORD_TYPE
record with the type of its only member if the modes don't match.

From-SVN: r103223

gcc/config/sh/sh.c

index c9cd3c83d4555f1f3772e9da1192c814a27a6f57..12055408dd240fff34d0f087ebd2952a05dc9787 100644 (file)
@@ -6684,7 +6684,15 @@ sh_gimplify_va_arg_expr (tree valist, tree type, tree *pre_p,
          && (TREE_CODE (TREE_TYPE (TYPE_FIELDS (type))) == REAL_TYPE
              || TREE_CODE (TREE_TYPE (TYPE_FIELDS (type))) == COMPLEX_TYPE)
           && TREE_CHAIN (TYPE_FIELDS (type)) == NULL_TREE)
-       type = TREE_TYPE (TYPE_FIELDS (type));
+       {
+         tree field_type = TREE_TYPE (TYPE_FIELDS (type));
+
+         if (TYPE_MODE (type) == TYPE_MODE (field_type))
+           type = field_type;
+         else
+           gcc_assert (TYPE_ALIGN (type)
+                       < GET_MODE_ALIGNMENT (TYPE_MODE (field_type)));
+       }
 
       if (TARGET_SH4)
        {