1 //===------------------------- typeinfo.cpp -------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is dual licensed under the MIT and the University of Illinois Open 6 // Source Licenses. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 #include <stdlib.h> 10 11 #ifndef __has_include 12 #define __has_include(inc) 0 13 #endif 14 15 #ifdef __APPLE__ 16 #include <cxxabi.h> 17 #elif defined(LIBCXXRT) || __has_include(<cxxabi.h>) || defined(__ANDROID__) 18 #include <cxxabi.h> 19 #endif 20 21 #include "typeinfo" 22 23 #if !defined(LIBCXXRT) && !defined(_LIBCPPABI_VERSION) 24 bad_cast()25std::bad_cast::bad_cast() _NOEXCEPT 26 { 27 } 28 bad_typeid()29std::bad_typeid::bad_typeid() _NOEXCEPT 30 { 31 } 32 33 #ifndef __GLIBCXX__ 34 ~bad_cast()35std::bad_cast::~bad_cast() _NOEXCEPT 36 { 37 } 38 39 const char* what() const40std::bad_cast::what() const _NOEXCEPT 41 { 42 return "std::bad_cast"; 43 } 44 ~bad_typeid()45std::bad_typeid::~bad_typeid() _NOEXCEPT 46 { 47 } 48 49 const char* what() const50std::bad_typeid::what() const _NOEXCEPT 51 { 52 return "std::bad_typeid"; 53 } 54 55 #ifdef __APPLE__ 56 // On Darwin, the cxa_bad_* functions cannot be in the lower level library 57 // because bad_cast and bad_typeid are defined in his higher level library __cxa_bad_typeid()58 void __cxxabiv1::__cxa_bad_typeid() 59 { 60 #ifndef _LIBCPP_NO_EXCEPTIONS 61 throw std::bad_typeid(); 62 #endif 63 } __cxa_bad_cast()64 void __cxxabiv1::__cxa_bad_cast() 65 { 66 #ifndef _LIBCPP_NO_EXCEPTIONS 67 throw std::bad_cast(); 68 #endif 69 } 70 #endif 71 72 #endif // !__GLIBCXX__ 73 #endif // !LIBCXXRT && !_LIBCPPABI_VERSION 74