https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92906

--- Comment #5 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
The safer variant:
--- gcc/cp/cp-tree.h.jj 2020-01-20 10:04:52.335091019 +0100
+++ gcc/cp/cp-tree.h    2020-01-20 17:09:15.350260384 +0100
@@ -206,6 +206,10 @@ enum cp_tree_index

     CPTI_SOURCE_LOCATION_IMPL,

+    CPTI_FALLBACK_DFLOAT32_TYPE,
+    CPTI_FALLBACK_DFLOAT64_TYPE,
+    CPTI_FALLBACK_DFLOAT128_TYPE,
+
     CPTI_MAX
 };

@@ -366,6 +370,12 @@ extern GTY(()) tree cp_global_trees[CPTI

 #define access_default_node            null_node

+/* Variant of dfloat{32,64,128}_type_node only used for fundamental
+   rtti purposes if DFP is disabled.  */
+#define fallback_dfloat32_type        
cp_global_trees[CPTI_FALLBACK_DFLOAT32_TYPE]
+#define fallback_dfloat64_type        
cp_global_trees[CPTI_FALLBACK_DFLOAT64_TYPE]
+#define fallback_dfloat128_type               
cp_global_trees[CPTI_FALLBACK_DFLOAT128_TYPE]
+


 #include "name-lookup.h"

--- gcc/cp/mangle.c.jj  2020-01-12 11:54:36.487412292 +0100
+++ gcc/cp/mangle.c     2020-01-20 17:10:44.424920025 +0100
@@ -2569,11 +2569,11 @@ write_builtin_type (tree type)
        write_char ('d');
       else if (type == long_double_type_node)
        write_char ('e');
-      else if (type == dfloat32_type_node)
+      else if (type == dfloat32_type_node || type == fallback_dfloat32_type)
        write_string ("Df");
-      else if (type == dfloat64_type_node)
+      else if (type == dfloat64_type_node || type == fallback_dfloat64_type)
        write_string ("Dd");
-      else if (type == dfloat128_type_node)
+      else if (type == dfloat128_type_node || type == fallback_dfloat128_type)
        write_string ("De");
       else
        gcc_unreachable ();
--- gcc/cp/rtti.c.jj    2020-01-15 00:26:26.605526740 +0100
+++ gcc/cp/rtti.c       2020-01-20 17:10:06.683487951 +0100
@@ -1588,6 +1588,20 @@ emit_support_tinfos (void)
       }
   for (tree t = registered_builtin_types; t; t = TREE_CHAIN (t))
     emit_support_tinfo_1 (TREE_VALUE (t));
+  /* For compatibility, emit DFP typeinfos even DFP isn't enabled,
+     because we've emitted that in the past.  */
+  if (!targetm.decimal_float_supported_p ())
+    {
+      gcc_assert (dfloat32_type_node == NULL_TREE
+                 && dfloat64_type_node == NULL_TREE
+                 && dfloat128_type_node == NULL_TREE);
+      fallback_dfloat32_type = make_node (REAL_TYPE);
+      fallback_dfloat64_type = make_node (REAL_TYPE);
+      fallback_dfloat128_type = make_node (REAL_TYPE);
+      emit_support_tinfo_1 (fallback_dfloat32_type);
+      emit_support_tinfo_1 (fallback_dfloat64_type);
+      emit_support_tinfo_1 (fallback_dfloat128_type);
+    }
   input_location = saved_loc;
 }

[

Reply via email to