From: Jason Merrill Date: Tue, 18 May 2021 21:15:42 +0000 (-0400) Subject: c++: ICE with bad definition of decimal32 [PR100261] X-Git-Tag: releases/gcc-11.2.0~368 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=fff482625ab184210d9121515b9ea98945dc0b6f;p=thirdparty%2Fgcc.git c++: ICE with bad definition of decimal32 [PR100261] The change to only look at the global binding for non-classes meant that here, when dealing with decimal32 which is magically mangled like its first non-static data member, we got a collision with the mangling for float. Fixed by also looking up an existing binding for such magical classes. PR c++/100261 gcc/cp/ChangeLog: * rtti.c (get_tinfo_decl_direct): Check TYPE_TRANSPARENT_AGGR. gcc/testsuite/ChangeLog: * g++.dg/dfp/mangle-6.C: New test. --- diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c index 5a33b83afd0c..82eaa286514d 100644 --- a/gcc/cp/rtti.c +++ b/gcc/cp/rtti.c @@ -433,7 +433,7 @@ get_tinfo_decl_direct (tree type, tree name, int pseudo_ix) if (!name) name = mangle_typeinfo_for_type (type); - if (!CLASS_TYPE_P (type)) + if (!CLASS_TYPE_P (type) || TYPE_TRANSPARENT_AGGR (type)) d = get_global_binding (name); if (!d) diff --git a/gcc/testsuite/g++.dg/dfp/mangle-6.C b/gcc/testsuite/g++.dg/dfp/mangle-6.C new file mode 100644 index 000000000000..9cfb2a974bb4 --- /dev/null +++ b/gcc/testsuite/g++.dg/dfp/mangle-6.C @@ -0,0 +1,19 @@ +// PR c++/100261 +// { dg-do compile } + +#include + +namespace std { + namespace decimal { + class decimal32 { + float private__decfloat32; + }; + } +} + +void +foo () +{ + typeid (float); + typeid (std::decimal::decimal32); +}