summaryrefslogtreecommitdiffstats
path: root/libcxx/include/stdexcept
diff options
context:
space:
mode:
authorEric Fiselier <eric@efcs.ca>2016-10-25 19:33:14 +0000
committerEric Fiselier <eric@efcs.ca>2016-10-25 19:33:14 +0000
commita624409cb54230d304a2c6e19209176166b49085 (patch)
tree97006a38b87a5356dda21d18250ba392b16ed4a4 /libcxx/include/stdexcept
parent601f4cb9f7e2aae28f01448fed3fd7595447c861 (diff)
downloadbcm5719-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/stdexcept22
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
{
OpenPOWER on IntegriCloud