Skip to content

Commit

Permalink
[libc++] Remove the std::string base class
Browse files Browse the repository at this point in the history
Removing the base class of std::basic_string is not an ABI break, so we can remove any references to it from the header.

Reviewed By: ldionne, Mordante, #libc

Spies: libcxx-commits

Differential Revision: https://reviews.llvm.org/D118733
  • Loading branch information
philnik777 committed Feb 3, 2022
1 parent 3d0b619 commit 5173f43
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 21 deletions.
2 changes: 1 addition & 1 deletion libcxx/include/__config
Expand Up @@ -115,7 +115,7 @@
// about ABI compatibility.
# define _LIBCPP_ABI_NO_RANDOM_DEVICE_COMPATIBILITY_LAYOUT
// Remove basic_string common base
# define _LIBCPP_ABI_NO_BASIC_STRING_BASE_CLASS
# define _LIBCPP_ABI_DO_NOT_EXPORT_BASIC_STRING_COMMON
#elif _LIBCPP_ABI_VERSION == 1
# if !defined(_LIBCPP_OBJECT_FORMAT_COFF)
// Enable compiling copies of now inline methods into the dylib to support
Expand Down
15 changes: 0 additions & 15 deletions libcxx/include/string
Expand Up @@ -618,18 +618,6 @@ operator+(const basic_string<_CharT, _Traits, _Allocator>& __x, _CharT __y);

_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS string operator+<char, char_traits<char>, allocator<char> >(char const*, string const&))

#ifndef _LIBCPP_ABI_NO_BASIC_STRING_BASE_CLASS
template <bool>
struct __basic_string_common;

template <>
struct __basic_string_common<true> {
// Both are defined in string.cpp
_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 <class _Iter>
struct __string_is_trivial_iterator : public false_type {};

Expand Down Expand Up @@ -682,9 +670,6 @@ class
_LIBCPP_PREFERRED_NAME(u32string)
#endif
basic_string
#ifndef _LIBCPP_ABI_NO_BASIC_STRING_BASE_CLASS
: private __basic_string_common<true> // This base class is historical, but it needs to remain for ABI compatibility
#endif
{
public:
typedef basic_string __self;
Expand Down
21 changes: 16 additions & 5 deletions libcxx/src/string.cpp
Expand Up @@ -21,15 +21,26 @@

_LIBCPP_BEGIN_NAMESPACE_STD

#ifndef _LIBCPP_ABI_NO_BASIC_STRING_BASE_CLASS
#ifndef _LIBCPP_ABI_DO_NOT_EXPORT_BASIC_STRING_COMMON

template <bool>
struct __basic_string_common;

// The struct isn't declared anymore in the headers. It's only here for ABI compatibility.
template <>
struct __basic_string_common<true> {
_LIBCPP_NORETURN _LIBCPP_EXPORTED_FROM_ABI void __throw_length_error() const;
_LIBCPP_NORETURN _LIBCPP_EXPORTED_FROM_ABI void __throw_out_of_range() const;
};

void __basic_string_common<true>::__throw_length_error() const {
_VSTD::__throw_length_error("basic_string");
std::__throw_length_error("basic_string");
}

void __basic_string_common<true>::__throw_out_of_range() const {
_VSTD::__throw_out_of_range("basic_string");
std::__throw_out_of_range("basic_string");
}
#endif

#endif // _LIBCPP_ABI_DO_NOT_EXPORT_BASIC_STRING_COMMON

#define _LIBCPP_EXTERN_TEMPLATE_DEFINE(...) template __VA_ARGS__;
#ifdef _LIBCPP_ABI_STRING_OPTIMIZED_EXTERNAL_INSTANTIATION
Expand Down

0 comments on commit 5173f43

Please sign in to comment.