c++: better fixup_type_variants

Message ID bbc3dc44-73b0-9f30-45dd-31abd2e9dec1@acm.org
State New
Headers show
Series
  • c++: better fixup_type_variants
Related show

Commit Message

Nathan Sidwell July 28, 2020, 3:56 p.m.
fixup_type_variants was almost doing all that finish_struct needs. May 
as well make it do it all.  That this is helpful for modules is entirely 
coincidental :)

             gcc/cp/
             * class.c (fixup_type_variants): Copy TYPE_SIZE and
             TYPE_SIZE_UINIT.
             (finish_struct): Call it.

nathan

-- 
Nathan Sidwell

Patch

diff --git i/gcc/cp/class.c w/gcc/cp/class.c
index ba96113bc88..7a25d8fc76c 100644
--- i/gcc/cp/class.c
+++ w/gcc/cp/class.c
@@ -1967,6 +1967,9 @@  fixup_type_variants (tree t)
       /* Copy whatever these are holding today.  */
       TYPE_VFIELD (variants) = TYPE_VFIELD (t);
       TYPE_FIELDS (variants) = TYPE_FIELDS (t);
+
+      TYPE_SIZE (variants) = TYPE_SIZE (t);
+      TYPE_SIZE_UNIT (variants) = TYPE_SIZE_UNIT (t);
     }
 }
 
@@ -7610,12 +7613,7 @@  finish_struct (tree t, tree attributes)
 	CLASSTYPE_NON_AGGREGATE (t) = 1;
 
       /* Fix up any variants we've already built.  */
-      for (x = TYPE_NEXT_VARIANT (t); x; x = TYPE_NEXT_VARIANT (x))
-	{
-	  TYPE_SIZE (x) = TYPE_SIZE (t);
-	  TYPE_SIZE_UNIT (x) = TYPE_SIZE_UNIT (t);
-	  TYPE_FIELDS (x) = TYPE_FIELDS (t);
-	}
+      fixup_type_variants (t);
     }
   else
     finish_struct_1 (t);