[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / libcxx / src / support / runtime / exception_msvc.ipp
blob0114d5adee1675623cbf9764040b58819aef1506
1 // -*- C++ -*-
2 //===----------------------------------------------------------------------===//
3 //
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //
8 //===----------------------------------------------------------------------===//
10 #ifndef _LIBCPP_ABI_MICROSOFT
11 #error this header can only be used when targeting the MSVC ABI
12 #endif
14 #include <stdio.h>
15 #include <stdlib.h>
17 extern "C" {
18 typedef void (__cdecl* terminate_handler)();
19 _LIBCPP_CRT_FUNC terminate_handler __cdecl set_terminate(
20     terminate_handler _NewTerminateHandler) throw();
21 _LIBCPP_CRT_FUNC terminate_handler __cdecl _get_terminate();
23 typedef void (__cdecl* unexpected_handler)();
24 unexpected_handler __cdecl set_unexpected(
25     unexpected_handler _NewUnexpectedHandler) throw();
26 unexpected_handler __cdecl _get_unexpected();
28 int __cdecl __uncaught_exceptions();
31 namespace std {
33 unexpected_handler
34 set_unexpected(unexpected_handler func) noexcept {
35   return ::set_unexpected(func);
38 unexpected_handler get_unexpected() noexcept {
39   return ::_get_unexpected();
42 _LIBCPP_NORETURN
43 void unexpected() {
44     (*get_unexpected())();
45     // unexpected handler should not return
46     terminate();
49 terminate_handler set_terminate(terminate_handler func) noexcept {
50   return ::set_terminate(func);
53 terminate_handler get_terminate() noexcept {
54   return ::_get_terminate();
57 _LIBCPP_NORETURN
58 void terminate() noexcept
60 #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
61     try
62     {
63 #endif // _LIBCPP_HAS_NO_EXCEPTIONS
64         (*get_terminate())();
65         // handler should not return
66         fprintf(stderr, "terminate_handler unexpectedly returned\n");
67         ::abort();
68 #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
69     }
70     catch (...)
71     {
72         // handler should not throw exception
73         fprintf(stderr, "terminate_handler unexpectedly threw an exception\n");
74         ::abort();
75     }
76 #endif // _LIBCPP_HAS_NO_EXCEPTIONS
79 bool uncaught_exception() noexcept { return uncaught_exceptions() > 0; }
81 int uncaught_exceptions() noexcept {
82     return __uncaught_exceptions();
85 #if !defined(_LIBCPP_ABI_VCRUNTIME)
86 bad_cast::bad_cast() noexcept
90 bad_cast::~bad_cast() noexcept
94 const char *
95 bad_cast::what() const noexcept
97   return "std::bad_cast";
100 bad_typeid::bad_typeid() noexcept
104 bad_typeid::~bad_typeid() noexcept
108 const char *
109 bad_typeid::what() const noexcept
111   return "std::bad_typeid";
114 exception::~exception() noexcept
118 const char* exception::what() const noexcept
120   return "std::exception";
124 bad_exception::~bad_exception() noexcept
128 const char* bad_exception::what() const noexcept
130   return "std::bad_exception";
134 bad_alloc::bad_alloc() noexcept
138 bad_alloc::~bad_alloc() noexcept
142 const char*
143 bad_alloc::what() const noexcept
145     return "std::bad_alloc";
148 bad_array_new_length::bad_array_new_length() noexcept
152 bad_array_new_length::~bad_array_new_length() noexcept
156 const char*
157 bad_array_new_length::what() const noexcept
159     return "bad_array_new_length";
161 #endif // !_LIBCPP_ABI_VCRUNTIME
163 } // namespace std