Author: marshall Date: Sun Feb 5 14:06:38 2017 New Revision: 294133 URL: http://llvm.org/viewvc/llvm-project?rev=294133&view=rev Log: 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.
Modified: libcxx/trunk/include/experimental/optional libcxx/trunk/include/optional libcxx/trunk/src/optional.cpp libcxx/trunk/test/std/utilities/optional/optional.bad_optional_access/derive.pass.cpp Modified: libcxx/trunk/include/experimental/optional URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/experimental/optional?rev=294133&r1=294132&r2=294133&view=diff ============================================================================== --- libcxx/trunk/include/experimental/optional (original) +++ libcxx/trunk/include/experimental/optional Sun Feb 5 14:06:38 2017 @@ -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 Modified: libcxx/trunk/include/optional URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/optional?rev=294133&r1=294132&r2=294133&view=diff ============================================================================== --- libcxx/trunk/include/optional (original) +++ libcxx/trunk/include/optional Sun Feb 5 14:06:38 2017 @@ -160,14 +160,12 @@ namespace std // purposefully not using { 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 Modified: libcxx/trunk/src/optional.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/src/optional.cpp?rev=294133&r1=294132&r2=294133&view=diff ============================================================================== --- libcxx/trunk/src/optional.cpp (original) +++ libcxx/trunk/src/optional.cpp Sun Feb 5 14:06:38 2017 @@ -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 Modified: libcxx/trunk/test/std/utilities/optional/optional.bad_optional_access/derive.pass.cpp URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/optional/optional.bad_optional_access/derive.pass.cpp?rev=294133&r1=294132&r2=294133&view=diff ============================================================================== --- libcxx/trunk/test/std/utilities/optional/optional.bad_optional_access/derive.pass.cpp (original) +++ libcxx/trunk/test/std/utilities/optional/optional.bad_optional_access/derive.pass.cpp Sun Feb 5 14:06:38 2017 @@ -11,7 +11,7 @@ // <optional> -// class bad_optional_access : public logic_error +// class bad_optional_access : public exception #include <optional> #include <type_traits> @@ -20,6 +20,6 @@ int main() { using std::bad_optional_access; - static_assert(std::is_base_of<std::logic_error, bad_optional_access>::value, ""); - static_assert(std::is_convertible<bad_optional_access*, std::logic_error*>::value, ""); + static_assert(std::is_base_of<std::exception, bad_optional_access>::value, ""); + static_assert(std::is_convertible<bad_optional_access*, std::exception*>::value, ""); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits