1540d2a8bSDimitry Andric// -*- C++ -*-
2540d2a8bSDimitry Andric//===----------------------------------------------------------------------===//
3540d2a8bSDimitry Andric//
4540d2a8bSDimitry Andric//                     The LLVM Compiler Infrastructure
5540d2a8bSDimitry Andric//
6540d2a8bSDimitry Andric// This file is dual licensed under the MIT and the University of Illinois Open
7540d2a8bSDimitry Andric// Source Licenses. See LICENSE.TXT for details.
8540d2a8bSDimitry Andric//
9540d2a8bSDimitry Andric//===----------------------------------------------------------------------===//
10540d2a8bSDimitry Andric
11540d2a8bSDimitry Andric#ifndef _LIBCPP_ABI_MICROSOFT
12540d2a8bSDimitry Andric#error this header can only be used when targeting the MSVC ABI
13540d2a8bSDimitry Andric#endif
14540d2a8bSDimitry Andric
15540d2a8bSDimitry Andric#include <stdio.h>
16540d2a8bSDimitry Andric#include <stdlib.h>
17b2c7081bSDimitry Andric
18b2c7081bSDimitry Andricextern "C" {
19*4ba319b5SDimitry Andrictypedef void (__cdecl* terminate_handler)();
20*4ba319b5SDimitry Andric_LIBCPP_CRT_FUNC terminate_handler __cdecl set_terminate(
21b2c7081bSDimitry Andric    terminate_handler _NewTerminateHandler) throw();
22*4ba319b5SDimitry Andric_LIBCPP_CRT_FUNC terminate_handler __cdecl _get_terminate();
23b2c7081bSDimitry Andric
24*4ba319b5SDimitry Andrictypedef void (__cdecl* unexpected_handler)();
25*4ba319b5SDimitry Andricunexpected_handler __cdecl set_unexpected(
26b2c7081bSDimitry Andric    unexpected_handler _NewUnexpectedHandler) throw();
27*4ba319b5SDimitry Andricunexpected_handler __cdecl _get_unexpected();
28b2c7081bSDimitry Andric
29*4ba319b5SDimitry Andricint __cdecl __uncaught_exceptions();
30b2c7081bSDimitry Andric}
31540d2a8bSDimitry Andric
32540d2a8bSDimitry Andricnamespace std {
33540d2a8bSDimitry Andric
34540d2a8bSDimitry Andricunexpected_handler
35540d2a8bSDimitry Andricset_unexpected(unexpected_handler func) _NOEXCEPT {
36540d2a8bSDimitry Andric  return ::set_unexpected(func);
37540d2a8bSDimitry Andric}
38540d2a8bSDimitry Andric
39540d2a8bSDimitry Andricunexpected_handler get_unexpected() _NOEXCEPT {
40540d2a8bSDimitry Andric  return ::_get_unexpected();
41540d2a8bSDimitry Andric}
42540d2a8bSDimitry Andric
43540d2a8bSDimitry Andric_LIBCPP_NORETURN
44540d2a8bSDimitry Andricvoid unexpected() {
45540d2a8bSDimitry Andric    (*get_unexpected())();
46540d2a8bSDimitry Andric    // unexpected handler should not return
47540d2a8bSDimitry Andric    terminate();
48540d2a8bSDimitry Andric}
49540d2a8bSDimitry Andric
50540d2a8bSDimitry Andricterminate_handler set_terminate(terminate_handler func) _NOEXCEPT {
51540d2a8bSDimitry Andric  return ::set_terminate(func);
52540d2a8bSDimitry Andric}
53540d2a8bSDimitry Andric
54540d2a8bSDimitry Andricterminate_handler get_terminate() _NOEXCEPT {
55540d2a8bSDimitry Andric  return ::_get_terminate();
56540d2a8bSDimitry Andric}
57540d2a8bSDimitry Andric
58540d2a8bSDimitry Andric_LIBCPP_NORETURN
59540d2a8bSDimitry Andricvoid terminate() _NOEXCEPT
60540d2a8bSDimitry Andric{
61540d2a8bSDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
62540d2a8bSDimitry Andric    try
63540d2a8bSDimitry Andric    {
64540d2a8bSDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
65540d2a8bSDimitry Andric        (*get_terminate())();
66540d2a8bSDimitry Andric        // handler should not return
67540d2a8bSDimitry Andric        fprintf(stderr, "terminate_handler unexpectedly returned\n");
68540d2a8bSDimitry Andric        ::abort();
69540d2a8bSDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
70540d2a8bSDimitry Andric    }
71540d2a8bSDimitry Andric    catch (...)
72540d2a8bSDimitry Andric    {
73540d2a8bSDimitry Andric        // handler should not throw exception
74540d2a8bSDimitry Andric        fprintf(stderr, "terminate_handler unexpectedly threw an exception\n");
75540d2a8bSDimitry Andric        ::abort();
76540d2a8bSDimitry Andric    }
77540d2a8bSDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
78540d2a8bSDimitry Andric}
79540d2a8bSDimitry Andric
80540d2a8bSDimitry Andricbool uncaught_exception() _NOEXCEPT { return uncaught_exceptions() > 0; }
81540d2a8bSDimitry Andric
82540d2a8bSDimitry Andricint uncaught_exceptions() _NOEXCEPT {
83540d2a8bSDimitry Andric    return __uncaught_exceptions();
84540d2a8bSDimitry Andric}
85540d2a8bSDimitry Andric
86*4ba319b5SDimitry Andric#if defined(_LIBCPP_NO_VCRUNTIME)
87b2c7081bSDimitry Andricbad_cast::bad_cast() _NOEXCEPT
88b2c7081bSDimitry Andric{
89b2c7081bSDimitry Andric}
90b2c7081bSDimitry Andric
91b2c7081bSDimitry Andricbad_cast::~bad_cast() _NOEXCEPT
92b2c7081bSDimitry Andric{
93b2c7081bSDimitry Andric}
94b2c7081bSDimitry Andric
95b2c7081bSDimitry Andricconst char *
96b2c7081bSDimitry Andricbad_cast::what() const _NOEXCEPT
97b2c7081bSDimitry Andric{
98b2c7081bSDimitry Andric  return "std::bad_cast";
99b2c7081bSDimitry Andric}
100b2c7081bSDimitry Andric
101b2c7081bSDimitry Andricbad_typeid::bad_typeid() _NOEXCEPT
102b2c7081bSDimitry Andric{
103b2c7081bSDimitry Andric}
104b2c7081bSDimitry Andric
105b2c7081bSDimitry Andricbad_typeid::~bad_typeid() _NOEXCEPT
106b2c7081bSDimitry Andric{
107b2c7081bSDimitry Andric}
108b2c7081bSDimitry Andric
109b2c7081bSDimitry Andricconst char *
110b2c7081bSDimitry Andricbad_typeid::what() const _NOEXCEPT
111b2c7081bSDimitry Andric{
112b2c7081bSDimitry Andric  return "std::bad_typeid";
113b2c7081bSDimitry Andric}
114b2c7081bSDimitry Andric
115b2c7081bSDimitry Andricexception::~exception() _NOEXCEPT
116b2c7081bSDimitry Andric{
117b2c7081bSDimitry Andric}
118b2c7081bSDimitry Andric
119b2c7081bSDimitry Andricconst char* exception::what() const _NOEXCEPT
120b2c7081bSDimitry Andric{
121b2c7081bSDimitry Andric  return "std::exception";
122b2c7081bSDimitry Andric}
123b2c7081bSDimitry Andric
124b2c7081bSDimitry Andric
125b2c7081bSDimitry Andricbad_exception::~bad_exception() _NOEXCEPT
126b2c7081bSDimitry Andric{
127b2c7081bSDimitry Andric}
128b2c7081bSDimitry Andric
129b2c7081bSDimitry Andricconst char* bad_exception::what() const _NOEXCEPT
130b2c7081bSDimitry Andric{
131b2c7081bSDimitry Andric  return "std::bad_exception";
132b2c7081bSDimitry Andric}
133b2c7081bSDimitry Andric
134b2c7081bSDimitry Andric
135b2c7081bSDimitry Andricbad_alloc::bad_alloc() _NOEXCEPT
136b2c7081bSDimitry Andric{
137b2c7081bSDimitry Andric}
138b2c7081bSDimitry Andric
139b2c7081bSDimitry Andricbad_alloc::~bad_alloc() _NOEXCEPT
140b2c7081bSDimitry Andric{
141b2c7081bSDimitry Andric}
142b2c7081bSDimitry Andric
143b2c7081bSDimitry Andricconst char*
144b2c7081bSDimitry Andricbad_alloc::what() const _NOEXCEPT
145b2c7081bSDimitry Andric{
146b2c7081bSDimitry Andric    return "std::bad_alloc";
147b2c7081bSDimitry Andric}
148b2c7081bSDimitry Andric
149b2c7081bSDimitry Andricbad_array_new_length::bad_array_new_length() _NOEXCEPT
150b2c7081bSDimitry Andric{
151b2c7081bSDimitry Andric}
152b2c7081bSDimitry Andric
153b2c7081bSDimitry Andricbad_array_new_length::~bad_array_new_length() _NOEXCEPT
154b2c7081bSDimitry Andric{
155b2c7081bSDimitry Andric}
156b2c7081bSDimitry Andric
157b2c7081bSDimitry Andricconst char*
158b2c7081bSDimitry Andricbad_array_new_length::what() const _NOEXCEPT
159b2c7081bSDimitry Andric{
160b2c7081bSDimitry Andric    return "bad_array_new_length";
161b2c7081bSDimitry Andric}
162b2c7081bSDimitry Andric#endif // _LIBCPP_NO_VCRUNTIME
163b2c7081bSDimitry Andric
164540d2a8bSDimitry Andric} // namespace std
165