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; } [