Mercurial > hg > CbC > CbC_llvm
diff libcxxabi/test/cxa_bad_cast.pass.cpp @ 150:1d019706d866
LLVM10
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 15:10:13 +0900 |
parents | |
children | 2e18cbf3894f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcxxabi/test/cxa_bad_cast.pass.cpp Thu Feb 13 15:10:13 2020 +0900 @@ -0,0 +1,55 @@ +//===----------------------- cxa_bad_cast.pass.cpp ------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +// UNSUPPORTED: c++98, c++03 + +#include <cxxabi.h> +#include <cassert> +#include <stdlib.h> +#include <exception> +#include <typeinfo> + +class Base { + virtual void foo() {}; +}; + +class Derived : public Base {}; + +Derived &test_bad_cast(Base& b) { + return dynamic_cast<Derived&>(b); +} + +Base gB; + +void my_terminate() { exit(0); } + +int main () +{ + // swap-out the terminate handler + void (*default_handler)() = std::get_terminate(); + std::set_terminate(my_terminate); + +#ifndef LIBCXXABI_HAS_NO_EXCEPTIONS + try { +#endif + Derived &d = test_bad_cast(gB); + assert(false); + ((void)d); +#ifndef LIBCXXABI_HAS_NO_EXCEPTIONS + } catch (std::bad_cast) { + // success + return 0; + } catch (...) { + assert(false); + } +#endif + + // failure, restore the default terminate handler and fire + std::set_terminate(default_handler); + std::terminate(); +}