third_party/libcxxabi: Add test suite (#1076)

Added the `libcxxabi` test suite as found in LLVM 17.0.6.

Some tests that do not apply to the current configuration of
comsopolitan are not added. These include:
- `backtrace_test`, `forced_unwind*`: Use unwind function unsupported in
SjLj mode.
- `noexception*`: Designed to test `libcxxabi` in no exceptions mode.

Some tests are added but not enabled due to bugs specific to GCC or
cosmopolitan. These are clearly indicated in the `BUILD.mk` file.
This commit is contained in:
Trung Nguyen 2024-01-09 01:50:06 +07:00 committed by GitHub
parent 8fb24a8f88
commit b0566348b2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
65 changed files with 43262 additions and 2 deletions

View file

@ -0,0 +1,57 @@
//===----------------------------------------------------------------------===//
//
// 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++03
#include "third_party/libcxxabi/include/cxxabi.h"
#include "third_party/libcxx/cassert"
#include "libc/isystem/stdlib.h"
#include "third_party/libcxx/exception"
#include "third_party/libcxx/typeinfo"
#include "third_party/libcxxabi/libcxx/test/support/test_macros.hh"
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 TEST_HAS_NO_EXCEPTIONS
try {
#endif
Derived &d = test_bad_cast(gB);
assert(false);
((void)d);
#ifndef TEST_HAS_NO_EXCEPTIONS
} catch (std::bad_cast const&) {
// success
return 0;
} catch (...) {
assert(false);
}
#endif
// failure, restore the default terminate handler and fire
std::set_terminate(default_handler);
std::terminate();
}