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.
This commit is contained in:
Jason Merrill 2021-05-18 17:15:42 -04:00
parent 061fe8c58a
commit 01b2864757
2 changed files with 20 additions and 1 deletions

View file

@ -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)

View file

@ -0,0 +1,19 @@
// PR c++/100261
// { dg-do compile }
#include <typeinfo>
namespace std {
namespace decimal {
class decimal32 {
float private__decfloat32;
};
}
}
void
foo ()
{
typeid (float);
typeid (std::decimal::decimal32);
}