1227825Stheraven//===------------------------- typeinfo.cpp -------------------------------===//
2227825Stheraven//
3227825Stheraven//                     The LLVM Compiler Infrastructure
4227825Stheraven//
5227825Stheraven// This file is dual licensed under the MIT and the University of Illinois Open
6227825Stheraven// Source Licenses. See LICENSE.TXT for details.
7227825Stheraven//
8227825Stheraven//===----------------------------------------------------------------------===//
9227825Stheraven#include <stdlib.h>
10241903Sdim
11241903Sdim#ifndef __has_include
12241903Sdim#define __has_include(inc) 0
13241903Sdim#endif
14241903Sdim
15249998Sdim#ifdef __APPLE__
16227825Stheraven#include <cxxabi.h>
17241903Sdim#elif defined(LIBCXXRT) || __has_include(<cxxabi.h>)
18241903Sdim#include <cxxabi.h>
19227825Stheraven#endif
20227825Stheraven
21227825Stheraven#include "typeinfo"
22227825Stheraven
23232950Stheraven#if !(defined(_LIBCPPABI_VERSION) || defined(LIBCXXRT))
24232950Stheraven
25227825Stheravenstd::bad_cast::bad_cast() _NOEXCEPT
26227825Stheraven{
27227825Stheraven}
28227825Stheraven
29227825Stheravenstd::bad_cast::~bad_cast() _NOEXCEPT
30227825Stheraven{
31227825Stheraven}
32227825Stheraven
33227825Stheravenconst char*
34227825Stheravenstd::bad_cast::what() const _NOEXCEPT
35227825Stheraven{
36227825Stheraven  return "std::bad_cast";
37227825Stheraven}
38227825Stheraven
39227825Stheravenstd::bad_typeid::bad_typeid() _NOEXCEPT
40227825Stheraven{
41227825Stheraven}
42227825Stheraven
43227825Stheravenstd::bad_typeid::~bad_typeid() _NOEXCEPT
44227825Stheraven{
45227825Stheraven}
46227825Stheraven
47227825Stheravenconst char*
48227825Stheravenstd::bad_typeid::what() const _NOEXCEPT
49227825Stheraven{
50227825Stheraven  return "std::bad_typeid";
51227825Stheraven}
52227825Stheraven
53249998Sdim#ifdef __APPLE__
54227825Stheraven  // On Darwin, the cxa_bad_* functions cannot be in the lower level library
55227825Stheraven  // because bad_cast and bad_typeid are defined in his higher level library
56249998Sdim  void __cxxabiv1::__cxa_bad_typeid()
57249998Sdim  {
58249998Sdim#ifndef _LIBCPP_NO_EXCEPTIONS
59249998Sdim     throw std::bad_typeid();
60227825Stheraven#endif
61249998Sdim  }
62249998Sdim  void __cxxabiv1::__cxa_bad_cast()
63249998Sdim  {
64249998Sdim#ifndef _LIBCPP_NO_EXCEPTIONS
65249998Sdim      throw std::bad_cast();
66249998Sdim#endif
67249998Sdim  }
68249998Sdim#endif
69227825Stheraven
70232950Stheraven#endif  // _LIBCPPABI_VERSION
71