1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9// UNSUPPORTED: c++03
10
11#include <cxxabi.h>
12#include <cassert>
13#include <stdlib.h>
14#include <exception>
15#include <typeinfo>
16
17#include "test_macros.h"
18
19class Base {
20 virtual void foo() {};
21};
22
23class Derived : public Base {};
24
25Derived &test_bad_cast(Base& b) {
26 return dynamic_cast<Derived&>(b);
27}
28
29Base gB;
30
31void my_terminate() { exit(status: 0); }
32
33int main ()
34{
35 // swap-out the terminate handler
36 void (*default_handler)() = std::get_terminate();
37 std::set_terminate(my_terminate);
38
39#ifndef TEST_HAS_NO_EXCEPTIONS
40 try {
41#endif
42 Derived &d = test_bad_cast(b&: gB);
43 assert(false);
44 ((void)d);
45#ifndef TEST_HAS_NO_EXCEPTIONS
46 } catch (std::bad_cast const&) {
47 // success
48 return 0;
49 } catch (...) {
50 assert(false);
51 }
52#endif
53
54 // failure, restore the default terminate handler and fire
55 std::set_terminate(default_handler);
56 std::terminate();
57}
58

source code of libcxxabi/test/cxa_bad_cast.pass.cpp