https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83127

            Bug ID: 83127
           Summary: Missing overload for operator << of std::stringstream
                    for old ABI
           Product: gcc
           Version: 6.3.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: libstdc++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ghjghj530-bubu at yahoo dot de
  Target Milestone: ---

Compiling the following testcode

#include <string>
#include <sstream>

void Main(void)
{
        std::string testStr("Hello");
        std::string testStr2("World");
        std::stringstream ss;

        ss << testStr;

        testStr2 = ss.str();
}

with flag: -D_GLIBCXX_USE_CXX11_ABI=0 leads to linker error:
undefined reference to `std::basic_ostream<char, std::char_traits<char> >&
std::operator<< <char, std::char_traits<char>, std::allocator<char>
>(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char,
std::char_traits<char>, std::allocator<char> > const&)'

Setting -D_GLIBCXX_USE_CXX11_ABI=1 fixes the bug.

We narrowed the problem down to a missing overload in libstdc++.a using:
nm.exe -gC "libstdc++.a" > libstdc++.a.out

There is only one overload for operator << and string:
"std::__cxx11::basic_string"
00000000 W std::basic_ostream<char, std::char_traits<char> >& std::operator<<
<char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char,
std::char_traits<char> >&, std::__cxx11::basic_string<char,
std::char_traits<char>, std::allocator<char> > const&)

But two overloads for operator >>:
"std::__cxx11::basic_string" and "std::basic_string"
00000000 W std::basic_istream<wchar_t, std::char_traits<wchar_t> >&
std::operator>><wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>
>(std::basic_istream<wchar_t, std::char_traits<wchar_t> >&,
std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>,
std::allocator<wchar_t> >&)
00000000 W std::basic_istream<wchar_t, std::char_traits<wchar_t> >&
std::operator>><wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>
>(std::basic_istream<wchar_t, std::char_traits<wchar_t> >&,
std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t>
>&)

Reply via email to