diff --git a/libcxx/include/__config b/libcxx/include/__config --- a/libcxx/include/__config +++ b/libcxx/include/__config @@ -114,6 +114,8 @@ // compatible. This switch removes these workarounds for platforms that don't care // about ABI compatibility. # define _LIBCPP_ABI_NO_RANDOM_DEVICE_COMPATIBILITY_LAYOUT +// Remove basic_string common base +# define _LIBCPP_ABI_NO_BASIC_STRING_BASE_CLASS #elif _LIBCPP_ABI_VERSION == 1 # if !defined(_LIBCPP_OBJECT_FORMAT_COFF) // Enable compiling copies of now inline methods into the dylib to support diff --git a/libcxx/include/string b/libcxx/include/string --- a/libcxx/include/string +++ b/libcxx/include/string @@ -618,6 +618,7 @@ _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS string operator+, allocator >(char const*, string const&)) +#ifndef _LIBCPP_ABI_NO_BASIC_STRING_BASE_CLASS template struct __basic_string_common; @@ -627,6 +628,7 @@ _LIBCPP_NORETURN _LIBCPP_EXPORTED_FROM_ABI void __throw_length_error() const; _LIBCPP_NORETURN _LIBCPP_EXPORTED_FROM_ABI void __throw_out_of_range() const; }; +#endif template struct __string_is_trivial_iterator : public false_type {}; @@ -680,7 +682,9 @@ _LIBCPP_PREFERRED_NAME(u32string) #endif basic_string +#ifndef _LIBCPP_ABI_NO_BASIC_STRING_BASE_CLASS : private __basic_string_common // This base class is historical, but it needs to remain for ABI compatibility +#endif { public: typedef basic_string __self; @@ -1729,20 +1733,12 @@ _LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI void __throw_length_error() const { -#ifndef _LIBCPP_NO_EXCEPTIONS - __basic_string_common::__throw_length_error(); -#else - _VSTD::abort(); -#endif + _VSTD::__throw_length_error("basic_string"); } _LIBCPP_NORETURN _LIBCPP_HIDE_FROM_ABI void __throw_out_of_range() const { -#ifndef _LIBCPP_NO_EXCEPTIONS - __basic_string_common::__throw_out_of_range(); -#else - _VSTD::abort(); -#endif + _VSTD::__throw_out_of_range("basic_string"); } friend basic_string operator+<>(const basic_string&, const basic_string&); diff --git a/libcxx/src/string.cpp b/libcxx/src/string.cpp --- a/libcxx/src/string.cpp +++ b/libcxx/src/string.cpp @@ -21,6 +21,7 @@ _LIBCPP_BEGIN_NAMESPACE_STD +#ifndef _LIBCPP_ABI_NO_BASIC_STRING_BASE_CLASS void __basic_string_common::__throw_length_error() const { _VSTD::__throw_length_error("basic_string"); } @@ -28,6 +29,7 @@ void __basic_string_common::__throw_out_of_range() const { _VSTD::__throw_out_of_range("basic_string"); } +#endif #define _LIBCPP_EXTERN_TEMPLATE_DEFINE(...) template __VA_ARGS__; #ifdef _LIBCPP_ABI_STRING_OPTIMIZED_EXTERNAL_INSTANTIATION