diff --git a/include/ostream b/include/ostream index 42819ce..51778a2 100644 --- a/include/ostream +++ b/include/ostream @@ -964,7 +964,7 @@ operator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Size>& __x) { std::use_facet >(__os.getloc()).widen('1')); } -#if _LIBCPP_STD_VER >= 20 +#if 0 # ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS template diff --git a/src/iostream.cpp b/src/iostream.cpp index c5ad77a..029de4a 100644 --- a/src/iostream.cpp +++ b/src/iostream.cpp @@ -21,80 +21,120 @@ _LIBCPP_BEGIN_NAMESPACE_STD +#if defined(_LIBCPP_ABI_MICROSOFT) && !defined(__clang__) +alignas(istream) char _cin[sizeof(istream)]; +_LIBCPP_EXPORTED_FROM_ABI istream& cin = *reinterpret_cast(_cin); +#else alignas(istream) _LIBCPP_EXPORTED_FROM_ABI char cin[sizeof(istream)] #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__) __asm__("?cin@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_istream@DU?$char_traits@D@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A") #endif ; +#endif alignas(__stdinbuf) static char __cin[sizeof(__stdinbuf)]; static mbstate_t mb_cin; #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +# if defined(_LIBCPP_ABI_MICROSOFT) && !defined(__clang__) +alignas(wistream) char _wcin[sizeof(wistream)]; +_LIBCPP_EXPORTED_FROM_ABI wistream& wcin = *reinterpret_cast(_wcin); +# else alignas(wistream) _LIBCPP_EXPORTED_FROM_ABI char wcin[sizeof(wistream)] # if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__) __asm__("?wcin@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_istream@_WU?$char_traits@_W@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A") # endif ; +#endif alignas(__stdinbuf) static char __wcin[sizeof(__stdinbuf)]; static mbstate_t mb_wcin; #endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS +#if defined(_LIBCPP_ABI_MICROSOFT) && !defined(__clang__) +alignas(ostream) char _cout[sizeof(ostream)]; +_LIBCPP_EXPORTED_FROM_ABI ostream& cout = *reinterpret_cast(_cout); +#else alignas(ostream) _LIBCPP_EXPORTED_FROM_ABI char cout[sizeof(ostream)] #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__) __asm__("?cout@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_ostream@DU?$char_traits@D@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A") #endif ; +#endif alignas(__stdoutbuf) static char __cout[sizeof(__stdoutbuf)]; static mbstate_t mb_cout; #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +# if defined(_LIBCPP_ABI_MICROSOFT) && !defined(__clang__) +alignas(wostream) char _wcout[sizeof(wostream)]; +_LIBCPP_EXPORTED_FROM_ABI wostream& wcout = *reinterpret_cast(_wcout); +# else alignas(wostream) _LIBCPP_EXPORTED_FROM_ABI char wcout[sizeof(wostream)] # if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__) __asm__("?wcout@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_ostream@_WU?$char_traits@_W@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A") # endif ; +#endif alignas(__stdoutbuf) static char __wcout[sizeof(__stdoutbuf)]; static mbstate_t mb_wcout; #endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS +#if defined(_LIBCPP_ABI_MICROSOFT) && !defined(__clang__) +alignas(ostream) char _cerr[sizeof(ostream)]; +_LIBCPP_EXPORTED_FROM_ABI ostream& cerr = *reinterpret_cast(_cerr); +#else alignas(ostream) _LIBCPP_EXPORTED_FROM_ABI char cerr[sizeof(ostream)] #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__) __asm__("?cerr@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_ostream@DU?$char_traits@D@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A") #endif ; +#endif alignas(__stdoutbuf) static char __cerr[sizeof(__stdoutbuf)]; static mbstate_t mb_cerr; #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +# if defined(_LIBCPP_ABI_MICROSOFT) && !defined(__clang__) +alignas(wostream) char _wcerr[sizeof(wostream)]; +_LIBCPP_EXPORTED_FROM_ABI wostream& wcerr = *reinterpret_cast(_wcerr); +# else alignas(wostream) _LIBCPP_EXPORTED_FROM_ABI char wcerr[sizeof(wostream)] # if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__) __asm__("?wcerr@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_ostream@_WU?$char_traits@_W@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A") # endif ; +# endif alignas(__stdoutbuf) static char __wcerr[sizeof(__stdoutbuf)]; static mbstate_t mb_wcerr; #endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS +#if defined(_LIBCPP_ABI_MICROSOFT) && !defined(__clang__) +alignas(ostream) char _clog[sizeof(ostream)]; +_LIBCPP_EXPORTED_FROM_ABI ostream& clog = *reinterpret_cast(_clog); +#else alignas(ostream) _LIBCPP_EXPORTED_FROM_ABI char clog[sizeof(ostream)] #if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__) __asm__("?clog@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_ostream@DU?$char_traits@D@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A") #endif ; +#endif #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS +# if defined(_LIBCPP_ABI_MICROSOFT) && !defined(__clang__) +alignas(wostream) char _wclog[sizeof(wostream)]; +_LIBCPP_EXPORTED_FROM_ABI wostream& wclog = *reinterpret_cast(_wclog); +# else alignas(wostream) _LIBCPP_EXPORTED_FROM_ABI char wclog[sizeof(wostream)] # if defined(_LIBCPP_ABI_MICROSOFT) && defined(__clang__) __asm__("?wclog@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_ostream@_WU?$char_traits@_W@" _LIBCPP_ABI_NAMESPACE_STR "@std@@@12@A") # endif ; +#endif #endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS // Pretend we're inside a system header so the compiler doesn't flag the use of the init_priority @@ -128,19 +168,19 @@ public: DoIOSInit::DoIOSInit() { force_locale_initialization(); - istream* cin_ptr = ::new (cin) istream(::new (__cin) __stdinbuf(stdin, &mb_cin)); - ostream* cout_ptr = ::new (cout) ostream(::new (__cout) __stdoutbuf(stdout, &mb_cout)); - ostream* cerr_ptr = ::new (cerr) ostream(::new (__cerr) __stdoutbuf(stderr, &mb_cerr)); - ::new (clog) ostream(cerr_ptr->rdbuf()); + istream* cin_ptr = ::new (&cin) istream(::new (__cin) __stdinbuf(stdin, &mb_cin)); + ostream* cout_ptr = ::new (&cout) ostream(::new (__cout) __stdoutbuf(stdout, &mb_cout)); + ostream* cerr_ptr = ::new (&cerr) ostream(::new (__cerr) __stdoutbuf(stderr, &mb_cerr)); + ::new (&clog) ostream(cerr_ptr->rdbuf()); cin_ptr->tie(cout_ptr); std::unitbuf(*cerr_ptr); cerr_ptr->tie(cout_ptr); #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS - wistream* wcin_ptr = ::new (wcin) wistream(::new (__wcin) __stdinbuf(stdin, &mb_wcin)); - wostream* wcout_ptr = ::new (wcout) wostream(::new (__wcout) __stdoutbuf(stdout, &mb_wcout)); - wostream* wcerr_ptr = ::new (wcerr) wostream(::new (__wcerr) __stdoutbuf(stderr, &mb_wcerr)); - ::new (wclog) wostream(wcerr_ptr->rdbuf()); + wistream* wcin_ptr = ::new (&wcin) wistream(::new (__wcin) __stdinbuf(stdin, &mb_wcin)); + wostream* wcout_ptr = ::new (&wcout) wostream(::new (__wcout) __stdoutbuf(stdout, &mb_wcout)); + wostream* wcerr_ptr = ::new (&wcerr) wostream(::new (__wcerr) __stdoutbuf(stderr, &mb_wcerr)); + ::new (&wclog) wostream(wcerr_ptr->rdbuf()); wcin_ptr->tie(wcout_ptr); std::unitbuf(*wcerr_ptr); @@ -149,15 +189,15 @@ DoIOSInit::DoIOSInit() { } DoIOSInit::~DoIOSInit() { - ostream* cout_ptr = reinterpret_cast(cout); + ostream* cout_ptr = reinterpret_cast(&cout); cout_ptr->flush(); - ostream* clog_ptr = reinterpret_cast(clog); + ostream* clog_ptr = reinterpret_cast(&clog); clog_ptr->flush(); #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS - wostream* wcout_ptr = reinterpret_cast(wcout); + wostream* wcout_ptr = reinterpret_cast(&wcout); wcout_ptr->flush(); - wostream* wclog_ptr = reinterpret_cast(wclog); + wostream* wclog_ptr = reinterpret_cast(&wclog); wclog_ptr->flush(); #endif }