https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89370
Bug ID: 89370 Summary: Output std::string in diagnostics instead of std::__cxx11::basic_string<_CharT, _Traits, _Alloc> Product: gcc Version: 9.0 Status: UNCONFIRMED Keywords: diagnostic Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: redi at gcc dot gnu.org Target Milestone: --- Errors involving std::string are unreadable (see Bug 88512 comment 8). Nobody cares that it's: 'std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::iterator std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::insert(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::__const_iterator, _CharT) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::iterator = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; typename __gnu_cxx::__alloc_traits<typename __gnu_cxx::__alloc_traits<_Alloc>::rebind<_CharT>::other>::pointer = char*; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::__const_iterator = __gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> >; typename __gnu_cxx::__alloc_traits<typename __gnu_cxx::__alloc_traits<_Alloc>::rebind<_CharT>::other>::const_pointer = const char*]' 1745 | insert(__const_iterator __p, _CharT __c) | ^~~~~~ The type std::__cxx11::basic_string<_CharT, _Traits, _Alloc> should be shown as std::string. That alone makes it far more readable. And if we don't show it as a template specialization maybe we don't need the entire "[with ...]" part at all, but if we do need it, we should reduce it ... I don't think expanding the return type or the __const_iterator type in the "[with ...]" part is very useful: std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::iterator = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::iterator = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >; And why on Earth is it telling us what the pointer and const_pointer types are?! They don't appear in the member function signature at all! typename __gnu_cxx::__alloc_traits<typename __gnu_cxx::__alloc_traits<_Alloc>::rebind<_CharT>::other>::pointer = char*; typename __gnu_cxx::__alloc_traits<typename __gnu_cxx::__alloc_traits<_Alloc>::rebind<_CharT>::other>::const_pointer = const char* Cool story bro. Those types are not relevant.