diff options
| author | Eric Fiselier <eric@efcs.ca> | 2016-10-25 19:33:14 +0000 |
|---|---|---|
| committer | Eric Fiselier <eric@efcs.ca> | 2016-10-25 19:33:14 +0000 |
| commit | a624409cb54230d304a2c6e19209176166b49085 (patch) | |
| tree | 97006a38b87a5356dda21d18250ba392b16ed4a4 /libcxx/include/stdexcept | |
| parent | 601f4cb9f7e2aae28f01448fed3fd7595447c861 (diff) | |
| download | bcm5719-llvm-a624409cb54230d304a2c6e19209176166b49085.tar.gz bcm5719-llvm-a624409cb54230d304a2c6e19209176166b49085.zip | |
[libc++] Fix modules build - Rework __refstring definition
Summary:
`__libcpp_refstring` currently has two different definitions. First there is the complete definition in `<__refstring>` but there is also a second in `<stdexcept>`. The historical reason for this split is because both libc++ and libc++abi need to see the inline definitions of __libcpp_refstrings methods, but the `<stdexcept>` header doesn't. However this is an ODR violation and breaks the modules build.
This patch fixes the issue by creating a single class definition in `<stdexcept>` and changing `<__refstring>` to contain only the inline method definitions. This way both `libcxx/src/stdexcept.cpp` and `libcxxabi/src/stdexcept.cpp` see the same declaration in `<stdexcept>` and definitions in `<__refstring>`
Reviewers: mclow.lists, EricWF
Subscribers: cfe-commits
Differential Revision: https://reviews.llvm.org/D25603
llvm-svn: 285100
Diffstat (limited to 'libcxx/include/stdexcept')
| -rw-r--r-- | libcxx/include/stdexcept | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/libcxx/include/stdexcept b/libcxx/include/stdexcept index b78d5d60273..b9dd2853f28 100644 --- a/libcxx/include/stdexcept +++ b/libcxx/include/stdexcept @@ -53,17 +53,23 @@ public: #pragma GCC system_header #endif -#ifndef _LIBCPP___REFSTRING _LIBCPP_BEGIN_NAMESPACE_STD -class _LIBCPP_HIDDEN __libcpp_refstring { -#ifdef __clang__ - const char *__imp_ __attribute__((__unused__)); // only clang emits a warning -#else - const char *__imp_; -#endif + +class _LIBCPP_HIDDEN __libcpp_refstring +{ + const char* __imp_; + + bool __uses_refcount() const; +public: + explicit __libcpp_refstring(const char* msg); + __libcpp_refstring(const __libcpp_refstring& s) _NOEXCEPT; + __libcpp_refstring& operator=(const __libcpp_refstring& s) _NOEXCEPT; + ~__libcpp_refstring(); + + const char* c_str() const _NOEXCEPT {return __imp_;} }; + _LIBCPP_END_NAMESPACE_STD -#endif namespace std // purposefully not using versioning namespace { |

