From e2261bde80c7e23419eec6dac308f88d246fe989 Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Sun, 5 Feb 2017 20:06:38 +0000 Subject: [PATCH] Change the base class of std::bad_optional_access. This is a (subtle) ABI change, and is in response to http://http://wg21.link/LWG2806, which I *expect* to be adopted in Kona. I am making this change now in anticipation, and will get it into 4.0, because (a) 4.0 is the first release with std::optional, and (b) I don't want to make an ABI-change later, when the user base should be significantly larger. Note that I didn't change std::experimental::bad_optional_access, because that's still specified to derive from std::logic_error. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@294133 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/experimental/optional | 2 +- include/optional | 8 +++----- src/optional.cpp | 8 ++++++-- .../optional/optional.bad_optional_access/derive.pass.cpp | 6 +++--- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/include/experimental/optional b/include/experimental/optional index f32941b1a..ba06972a1 100644 --- a/include/experimental/optional +++ b/include/experimental/optional @@ -152,7 +152,7 @@ public: bad_optional_access() : std::logic_error("Bad optional Access") {} // Get the key function ~bad_optional_access() into the dylib - virtual ~bad_optional_access() _NOEXCEPT; + virtual ~bad_optional_access(); }; _LIBCPP_END_NAMESPACE_EXPERIMENTAL diff --git a/include/optional b/include/optional index b13a2d5f7..ff3e929e1 100644 --- a/include/optional +++ b/include/optional @@ -160,14 +160,12 @@ namespace std // purposefully not using versioning namespace { class _LIBCPP_EXCEPTION_ABI bad_optional_access - : public logic_error + : public exception { public: - _LIBCPP_INLINE_VISIBILITY - bad_optional_access() : logic_error("bad optional access") {} - // Get the key function ~bad_optional_access() into the dylib - virtual ~bad_optional_access() _NOEXCEPT; + virtual ~bad_optional_access(); + virtual const char* what() const _NOEXCEPT; }; } // std diff --git a/src/optional.cpp b/src/optional.cpp index f2fbfdfec..baee026ac 100644 --- a/src/optional.cpp +++ b/src/optional.cpp @@ -13,12 +13,16 @@ namespace std { -bad_optional_access::~bad_optional_access() _NOEXCEPT = default; +bad_optional_access::~bad_optional_access() = default; + +const char* bad_optional_access::what() const _NOEXCEPT { + return "bad_optional_access"; + } } // std _LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL -bad_optional_access::~bad_optional_access() _NOEXCEPT = default; +bad_optional_access::~bad_optional_access() = default; _LIBCPP_END_NAMESPACE_EXPERIMENTAL diff --git a/test/std/utilities/optional/optional.bad_optional_access/derive.pass.cpp b/test/std/utilities/optional/optional.bad_optional_access/derive.pass.cpp index 85e36d2c1..d96f70bb7 100644 --- a/test/std/utilities/optional/optional.bad_optional_access/derive.pass.cpp +++ b/test/std/utilities/optional/optional.bad_optional_access/derive.pass.cpp @@ -11,7 +11,7 @@ // -// class bad_optional_access : public logic_error +// class bad_optional_access : public exception #include #include @@ -20,6 +20,6 @@ int main() { using std::bad_optional_access; - static_assert(std::is_base_of::value, ""); - static_assert(std::is_convertible::value, ""); + static_assert(std::is_base_of::value, ""); + static_assert(std::is_convertible::value, ""); }