diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2023-09-02 21:17:18 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2024-01-07 17:46:17 +0000 | 
| commit | fe013be447cd855ccaf6094a1d06aea570450629 (patch) | |
| tree | 9adc1e0a5d25b6280995832bb29d592fb80554a6 /contrib/llvm-project/libcxx/include/__exception/exception.h | |
| parent | 2f3b605b2e159522ecab77fd518e8139aaf581e9 (diff) | |
Diffstat (limited to 'contrib/llvm-project/libcxx/include/__exception/exception.h')
| -rw-r--r-- | contrib/llvm-project/libcxx/include/__exception/exception.h | 91 | 
1 files changed, 91 insertions, 0 deletions
diff --git a/contrib/llvm-project/libcxx/include/__exception/exception.h b/contrib/llvm-project/libcxx/include/__exception/exception.h new file mode 100644 index 000000000000..3db0126da296 --- /dev/null +++ b/contrib/llvm-project/libcxx/include/__exception/exception.h @@ -0,0 +1,91 @@ +//===----------------------------------------------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#ifndef _LIBCPP___EXCEPTION_EXCEPTION_H +#define _LIBCPP___EXCEPTION_EXCEPTION_H + +#include <__config> + +// <vcruntime_exception.h> defines its own std::exception and std::bad_exception types, +// which we use in order to be ABI-compatible with other STLs on Windows. +#if defined(_LIBCPP_ABI_VCRUNTIME) +#  include <vcruntime_exception.h> +#endif + +#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) +#  pragma GCC system_header +#endif + +namespace std { // purposefully not using versioning namespace + +#if defined(_LIBCPP_ABI_VCRUNTIME) && (!defined(_HAS_EXCEPTIONS) || _HAS_EXCEPTIONS != 0) +// The std::exception class was already included above, but we're explicit about this condition here for clarity. + +#elif defined(_LIBCPP_ABI_VCRUNTIME) && _HAS_EXCEPTIONS == 0 +// However, <vcruntime_exception.h> does not define std::exception and std::bad_exception +// when _HAS_EXCEPTIONS == 0. +// +// Since libc++ still wants to provide the std::exception hierarchy even when _HAS_EXCEPTIONS == 0 +// (after all those are simply types like any other), we define an ABI-compatible version +// of the VCRuntime std::exception and std::bad_exception types in that mode. + +struct __std_exception_data { +  char const* _What; +  bool _DoFree; +}; + +class exception { // base of all library exceptions +public: +  exception() _NOEXCEPT : __data_() {} + +  explicit exception(char const* __message) _NOEXCEPT : __data_() { +    __data_._What   = __message; +    __data_._DoFree = true; +  } + +  exception(exception const&) _NOEXCEPT {} + +  exception& operator=(exception const&) _NOEXCEPT { return *this; } + +  virtual ~exception() _NOEXCEPT {} + +  virtual char const* what() const _NOEXCEPT { return __data_._What ? __data_._What : "Unknown exception"; } + +private: +  __std_exception_data __data_; +}; + +class bad_exception : public exception { +public: +  bad_exception() _NOEXCEPT : exception("bad exception") {} +}; + +#else  // !defined(_LIBCPP_ABI_VCRUNTIME) +// On all other platforms, we define our own std::exception and std::bad_exception types +// regardless of whether exceptions are turned on as a language feature. + +class _LIBCPP_EXPORTED_FROM_ABI exception { +public: +  _LIBCPP_HIDE_FROM_ABI exception() _NOEXCEPT {} +  _LIBCPP_HIDE_FROM_ABI exception(const exception&) _NOEXCEPT = default; + +  virtual ~exception() _NOEXCEPT; +  virtual const char* what() const _NOEXCEPT; +}; + +class _LIBCPP_EXPORTED_FROM_ABI bad_exception : public exception { +public: +  _LIBCPP_HIDE_FROM_ABI bad_exception() _NOEXCEPT {} +  ~bad_exception() _NOEXCEPT override; +  const char* what() const _NOEXCEPT override; +}; +#endif // !_LIBCPP_ABI_VCRUNTIME + +} // namespace std + +#endif // _LIBCPP___EXCEPTION_EXCEPTION_H  | 
