OSDN Git Service

* sh.c (sh_gimplify_va_arg_expr): Don't substitute a RECORD_TYPE
authoramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 17 Aug 2005 19:44:24 +0000 (19:44 +0000)
committeramylaar <amylaar@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 17 Aug 2005 19:44:24 +0000 (19:44 +0000)
record with the type of its only member if the modes don't match.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@103223 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/config/sh/sh.c

index c9cd3c8..1205540 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)
        {