diff --git a/Dockerfile.dev b/Dockerfile.dev index 3f10fa6..d85e1c9 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -85,7 +85,7 @@ COPY test/*.cpp ./test/ RUN cd test && \ for arch in $TOOLCHAIN_ARCHS; do \ mkdir -p $arch && \ - for test in hello-cpp hello-exception tlstest-main exception-locale exception-reduced; do \ + for test in hello-cpp hello-exception tlstest-main exception-locale exception-reduced global-terminate; do \ $arch-w64-mingw32-clang++ $test.cpp -o $arch/$test.exe || exit 1; \ done; \ for test in tlstest-lib; do \ diff --git a/run-tests.sh b/run-tests.sh index 21f246b..95ad63b 100755 --- a/run-tests.sh +++ b/run-tests.sh @@ -62,7 +62,7 @@ TESTS_C_DLL="autoimport-lib" TESTS_C_LINK_DLL="autoimport-main" TESTS_C_NO_BUILTIN="crt-test" TESTS_C_ANSI_STDIO="crt-test" -TESTS_CPP="hello-cpp" +TESTS_CPP="hello-cpp global-terminate" TESTS_CPP_LOAD_DLL="tlstest-main" TESTS_CPP_EXCEPTIONS="hello-exception exception-locale exception-reduced" TESTS_CPP_DLL="tlstest-lib" diff --git a/test/global-terminate.cpp b/test/global-terminate.cpp new file mode 100644 index 0000000..54e9002 --- /dev/null +++ b/test/global-terminate.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 Liu Hao + * + * This file is part of llvm-mingw. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include + +void whoa() { + ::puts("whoa!"); // expected output + ::exit(0); +} + +int main(int argc, char *argv[]) { +#ifdef __aarch64__ + // This test succeeds with latest mingw-w64 (since 9718ecee1b95, Sept + // 2020) and latest clang (since 20f7773bb4bb458, Sept 2020, on the + // clang 12.0 branch), but fails before that. + // Additionally it uses the __C_specific_handler function, which + // isn't implemented in wine for aarch64 yet. + return 0; +#else + ::std::set_terminate(whoa); + throw 42; +#endif +}