lto-common.c (lto_register_canonical_types_for_odr_types): Copy CXX_ODR_P from the...
authorJan Hubicka <jh@suse.cz>
Tue, 2 Jul 2019 08:23:02 +0000 (10:23 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Tue, 2 Jul 2019 08:23:02 +0000 (08:23 +0000)
* lto-common.c (lto_register_canonical_types_for_odr_types):
Copy CXX_ODR_P from the main variant.

From-SVN: r272923

gcc/lto/ChangeLog
gcc/lto/lto-common.c

index e853f5c..ae4e157 100644 (file)
@@ -1,5 +1,10 @@
 2019-06-27  Jan Hubicka  <jh@suse.cz>
 
+       * lto-common.c (lto_register_canonical_types_for_odr_types):
+       Copy CXX_ODR_P from the main variant.
+
+2019-06-27  Jan Hubicka  <jh@suse.cz>
+
        * lto-common.c: tree-pretty-print.h
        (type_streaming_finished): New static var.
        (gimple_register_canonical_type_1): Return updated hash; handle ODR
index 1275b67..2b3165a 100644 (file)
@@ -568,8 +568,17 @@ lto_register_canonical_types_for_odr_types ()
 
   /* Register all remaining types.  */
   FOR_EACH_VEC_ELT (*types_to_register, i, t)
-    if (!TYPE_CANONICAL (t))
-      gimple_register_canonical_type (t);
+    {
+      /* For pre-streamed types like va-arg it is possible that main variant
+        is !CXX_ODR_P while the variant (which is streamed) is.
+        Copy CXX_ODR_P to make type verifier happy.  This is safe because
+        in canonical type calculation we only consider main variants.
+        However we can not change this flag before streaming is finished
+        to not affect tree merging.  */
+      TYPE_CXX_ODR_P (t) = TYPE_CXX_ODR_P (TYPE_MAIN_VARIANT (t));
+      if (!TYPE_CANONICAL (t))
+        gimple_register_canonical_type (t);
+    }
 }