xref: /llvm-project/libcxxabi/test/cxa_bad_cast.pass.cpp (revision eb8650a75793b2bd079d0c8901ff066f129061da)
1*eb8650a7SLouis Dionne //===----------------------------------------------------------------------===//
257e446daSAsiri Rathnayake //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
657e446daSAsiri Rathnayake //
757e446daSAsiri Rathnayake //===----------------------------------------------------------------------===//
857e446daSAsiri Rathnayake 
931cbe0f2SLouis Dionne // UNSUPPORTED: c++03
1057e446daSAsiri Rathnayake 
1157e446daSAsiri Rathnayake #include <cxxabi.h>
1257e446daSAsiri Rathnayake #include <cassert>
1357e446daSAsiri Rathnayake #include <stdlib.h>
1457e446daSAsiri Rathnayake #include <exception>
1557e446daSAsiri Rathnayake #include <typeinfo>
1657e446daSAsiri Rathnayake 
17e6d94f4bSLouis Dionne #include "test_macros.h"
18e6d94f4bSLouis Dionne 
1957e446daSAsiri Rathnayake class Base {
foo()2057e446daSAsiri Rathnayake   virtual void foo() {};
2157e446daSAsiri Rathnayake };
2257e446daSAsiri Rathnayake 
2357e446daSAsiri Rathnayake class Derived : public Base {};
2457e446daSAsiri Rathnayake 
test_bad_cast(Base & b)25a596ea58SEric Fiselier Derived &test_bad_cast(Base& b) {
2657e446daSAsiri Rathnayake   return dynamic_cast<Derived&>(b);
2757e446daSAsiri Rathnayake }
2857e446daSAsiri Rathnayake 
2957e446daSAsiri Rathnayake Base gB;
3057e446daSAsiri Rathnayake 
my_terminate()3157e446daSAsiri Rathnayake void my_terminate() { exit(0); }
3257e446daSAsiri Rathnayake 
main()3357e446daSAsiri Rathnayake int main ()
3457e446daSAsiri Rathnayake {
3557e446daSAsiri Rathnayake     // swap-out the terminate handler
3657e446daSAsiri Rathnayake     void (*default_handler)() = std::get_terminate();
3757e446daSAsiri Rathnayake     std::set_terminate(my_terminate);
3857e446daSAsiri Rathnayake 
39e6d94f4bSLouis Dionne #ifndef TEST_HAS_NO_EXCEPTIONS
4057e446daSAsiri Rathnayake     try {
4157e446daSAsiri Rathnayake #endif
4257e446daSAsiri Rathnayake         Derived &d = test_bad_cast(gB);
4357e446daSAsiri Rathnayake         assert(false);
44a140cba7SEric Fiselier         ((void)d);
45e6d94f4bSLouis Dionne #ifndef TEST_HAS_NO_EXCEPTIONS
468d313927SLouis Dionne     } catch (std::bad_cast const&) {
4757e446daSAsiri Rathnayake         // success
4857e446daSAsiri Rathnayake         return 0;
4957e446daSAsiri Rathnayake     } catch (...) {
5057e446daSAsiri Rathnayake         assert(false);
5157e446daSAsiri Rathnayake     }
5257e446daSAsiri Rathnayake #endif
5357e446daSAsiri Rathnayake 
5457e446daSAsiri Rathnayake     // failure, restore the default terminate handler and fire
5557e446daSAsiri Rathnayake     std::set_terminate(default_handler);
5657e446daSAsiri Rathnayake     std::terminate();
5757e446daSAsiri Rathnayake }
58