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