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 FiselierDerived &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 Rathnayakevoid my_terminate() { exit(0); } 3257e446daSAsiri Rathnayake main()3357e446daSAsiri Rathnayakeint 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