[Bug c++/67269] New: demangler does not handle constructor of substituted name correctly
ian at airs dot com
gcc-bugzilla@gcc.gnu.org
Wed Aug 19 05:59:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67269
Bug ID: 67269
Summary: demangler does not handle constructor of substituted
name correctly
Product: gcc
Version: 5.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
Assignee: unassigned at gcc dot gnu.org
Reporter: ian at airs dot com
CC: gbenson at redhat dot com
Target Milestone: ---
The demangler picks the constructor name based on the last name that it sees.
It does not do this correctly when the last name is actually substituted.
Here is a test case, which I concede is fairly insane.
_ZNSt10_HashtableI12basic_stringIcSt11char_traitsIcESaIcEESt4pairIKS4_N1C1D1EEESaISA_ENSt8__detail10_Select1stESt8equal_toIS4_ESt4hashIS4_ENSC_18_Mod_range_hashingENSC_20_Default_ranged_hashENSC_20_Prime_rehash_policyENSC_17_Hashtable_traitsILb1ELb0ELb1EEEE9_M_assignIZNSN_C1ERKSN_EUlPKNSC_10_Hash_nodeISA_Lb1EEEE_EEvSQ_RKT_
The demangler turns this into
void std::_Hashtable<basic_string<char, std::char_traits<char>,
std::allocator<char> >, std::pair<basic_string<char, std::char_traits<char>,
std::allocator<char> > const, C::D::E>,
std::allocator<std::pair<basic_string<char, std::char_traits<char>,
std::allocator<char> > const, C::D::E> >, std::__detail::_Select1st,
std::equal_to<basic_string<char, std::char_traits<char>, std::allocator<char> >
>, std::hash<basic_string<char, std::char_traits<char>, std::allocator<char> >
>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash,
std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true,
false, true> >::_M_assign<std::_Hashtable<basic_string<char,
std::char_traits<char>, std::allocator<char> >, std::pair<basic_string<char,
std::char_traits<char>, std::allocator<char> > const, C::D::E>,
std::allocator<std::pair<basic_string<char, std::char_traits<char>,
std::allocator<char> > const, C::D::E> >, std::__detail::_Select1st,
std::equal_to<basic_string<char, std::char_traits<char>, std::allocator<char> >
>, std::hash<basic_string<char, std::char_traits<char>, std::allocator<char> >
>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash,
std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true,
false, true> >::_M_assign(std::_Hashtable<basic_string<char,
std::char_traits<char>, std::allocator<char> >, std::pair<basic_string<char,
std::char_traits<char>, std::allocator<char> > const, C::D::E>,
std::allocator<std::pair<basic_string<char, std::char_traits<char>,
std::allocator<char> > const, C::D::E> >, std::__detail::_Select1st,
std::equal_to<basic_string<char, std::char_traits<char>, std::allocator<char> >
>, std::hash<basic_string<char, std::char_traits<char>, std::allocator<char> >
>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash,
std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true,
false, true> >
const&)::{lambda(std::__detail::_Hash_node<std::pair<basic_string<char,
std::char_traits<char>, std::allocator<char> > const, C::D::E>, true>
const*)#1}>(std::_Hashtable<basic_string<char, std::char_traits<char>,
std::allocator<char> >, std::pair<basic_string<char, std::char_traits<char>,
std::allocator<char> > const, C::D::E>,
std::allocator<std::pair<basic_string<char, std::char_traits<char>,
std::allocator<char> > const, C::D::E> >, std::__detail::_Select1st,
std::equal_to<basic_string<char, std::char_traits<char>, std::allocator<char> >
>, std::hash<basic_string<char, std::char_traits<char>, std::allocator<char> >
>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash,
std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true,
false, true> > const&, std::_Hashtable<basic_string<char,
std::char_traits<char>, std::allocator<char> >, std::pair<basic_string<char,
std::char_traits<char>, std::allocator<char> > const, C::D::E>,
std::allocator<std::pair<basic_string<char, std::char_traits<char>,
std::allocator<char> > const, C::D::E> >, std::__detail::_Select1st,
std::equal_to<basic_string<char, std::char_traits<char>, std::allocator<char> >
>, std::hash<basic_string<char, std::char_traits<char>, std::allocator<char> >
>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash,
std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true,
false, true> >::_M_assign(std::_Hashtable<basic_string<char,
std::char_traits<char>, std::allocator<char> >, std::pair<basic_string<char,
std::char_traits<char>, std::allocator<char> > const, C::D::E>,
std::allocator<std::pair<basic_string<char, std::char_traits<char>,
std::allocator<char> > const, C::D::E> >, std::__detail::_Select1st,
std::equal_to<basic_string<char, std::char_traits<char>, std::allocator<char> >
>, std::hash<basic_string<char, std::char_traits<char>, std::allocator<char> >
>, std::__detail::_Mod_range_hashing, std::__detail::_Default_ranged_hash,
std::__detail::_Prime_rehash_policy, std::__detail::_Hashtable_traits<true,
false, true> >
const&)::{lambda(std::__detail::_Hash_node<std::pair<basic_string<char,
std::char_traits<char>, std::allocator<char> > const, C::D::E>, true>
const*)#1} const&)
I'm fairly sure that the second and third ::_M_assign should actually be
::_Hashtable. They are appearing in local-name productions. The relevant part
of the mangled string is ZNSN_C1E. That is, a local-name with a constructor
where the scope is from a substitution.
More information about the Gcc-bugs
mailing list