[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