From e392b74caad5d93946653d4656f1b354fa0ef713 Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Feb 11 2017 13:25:42 +0000 Subject: Vendor import of libc++ release_40 branch r294803: https://llvm.org/svn/llvm-project/libcxx/branches/release_40@294803 --- diff --git a/docs/conf.py b/docs/conf.py index dee0367..743d0f7 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -47,9 +47,9 @@ copyright = u'2011-2017, LLVM Project' # built documents. # # The short X.Y version. -version = '4.0' +version = '4' # The full version, including alpha/beta/rc tags. -release = '4.0' +release = '4' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/include/optional b/include/optional index c002cc7..8f47986 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 const char* what() const _NOEXCEPT; }; } // std diff --git a/include/variant b/include/variant index f623cdd..bbd4bf4 100644 --- a/include/variant +++ b/include/variant @@ -574,7 +574,7 @@ private: constexpr decltype(auto) operator()(_Alts&&... __alts) const { __std_visit_exhaustive_visitor_check< _Visitor, - decltype(_VSTD::forward<_Alts>(__alts).__value)...>(); + decltype((_VSTD::forward<_Alts>(__alts).__value))...>(); return __invoke_constexpr(_VSTD::forward<_Visitor>(__visitor), _VSTD::forward<_Alts>(__alts).__value...); } diff --git a/src/optional.cpp b/src/optional.cpp index f2fbfdf..2877d17 100644 --- a/src/optional.cpp +++ b/src/optional.cpp @@ -15,6 +15,10 @@ namespace std bad_optional_access::~bad_optional_access() _NOEXCEPT = default; +const char* bad_optional_access::what() const _NOEXCEPT { + return "bad_optional_access"; + } + } // std _LIBCPP_BEGIN_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 85e36d2..d96f70b 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, ""); } diff --git a/test/std/utilities/variant/variant.visit/visit.pass.cpp b/test/std/utilities/variant/variant.visit/visit.pass.cpp index 46d2258..408a65c 100644 --- a/test/std/utilities/variant/variant.visit/visit.pass.cpp +++ b/test/std/utilities/variant/variant.visit/visit.pass.cpp @@ -283,9 +283,20 @@ void test_exceptions() { #endif } +// See http://llvm.org/PR31916 +void test_caller_accepts_nonconst() { + struct A {}; + struct Visitor { + void operator()(A&) {} + }; + std::variant v; + std::visit(Visitor{}, v); +} + int main() { test_call_operator_forwarding(); test_argument_forwarding(); test_constexpr(); test_exceptions(); + test_caller_accepts_nonconst(); }