Put the exception classes for experimental::optional and experimental::any back in the dylib for binary compatibility

llvm-svn: 323989
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: b87adec4bd8ed164d09ebb1e186210f35ddf6e60
diff --git a/src/any.cpp b/src/any.cpp
index 9685520..3795258 100644
--- a/src/any.cpp
+++ b/src/any.cpp
@@ -14,3 +14,22 @@
     return "bad any cast";
 }
 }
+
+
+#include <experimental/__config>
+
+//  Preserve std::experimental::any_bad_cast for ABI compatibility
+//  Even though it no longer exists in a header file
+_LIBCPP_BEGIN_NAMESPACE_LFTS
+
+class _LIBCPP_EXCEPTION_ABI _LIBCPP_AVAILABILITY_BAD_ANY_CAST bad_any_cast : public bad_cast
+{
+public:
+    virtual const char* what() const _NOEXCEPT;
+};
+
+const char* bad_any_cast::what() const _NOEXCEPT {
+    return "bad any cast";
+}
+
+_LIBCPP_END_NAMESPACE_LFTS
diff --git a/src/optional.cpp b/src/optional.cpp
index 6444987..6099b6b 100644
--- a/src/optional.cpp
+++ b/src/optional.cpp
@@ -20,3 +20,23 @@
 
 } // std
 
+
+#include <experimental/__config>
+
+//  Preserve std::experimental::bad_optional_access for ABI compatibility
+//  Even though it no longer exists in a header file
+_LIBCPP_BEGIN_NAMESPACE_EXPERIMENTAL
+
+class _LIBCPP_EXCEPTION_ABI _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS bad_optional_access
+    : public std::logic_error
+{
+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;
+};
+
+bad_optional_access::~bad_optional_access() _NOEXCEPT = default;
+
+_LIBCPP_END_NAMESPACE_EXPERIMENTAL