diff --git a/Dockerfile.dev b/Dockerfile.dev index da847cd..7d9d9b2 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -75,7 +75,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; do \ + for test in hello-cpp hello-exception tlstest-main exception-locale exception-reduced; 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 5f53da3..133cbb8 100755 --- a/run-tests.sh +++ b/run-tests.sh @@ -49,7 +49,7 @@ TESTS_C_LINK_DLL="autoimport-main" TESTS_C_NO_BUILTIN="crt-test" TESTS_CPP="hello-cpp" TESTS_CPP_LOAD_DLL="tlstest-main" -TESTS_CPP_EXCEPTIONS="hello-exception exception-locale" +TESTS_CPP_EXCEPTIONS="hello-exception exception-locale exception-reduced" TESTS_CPP_DLL="tlstest-lib" TESTS_SSP="stacksmash" TESTS_ASAN="stacksmash" diff --git a/test/exception-reduced.cpp b/test/exception-reduced.cpp new file mode 100644 index 0000000..2d53b5d --- /dev/null +++ b/test/exception-reduced.cpp @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2019 Marc Aldorasi + * + * 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 + +typedef void (*func_ptr)(int); +struct h { + func_ptr z; +}; +struct c { + h* e; +}; +struct as { + as() { at = static_cast(operator new(sizeof(int))); } + ~as() { operator delete(at); } + int *at; +}; +void am(int) { + static as au; + as av; + throw 0; +} +int main(int argc, char* argv[]) { + h hh{am}; + c *u = new c{&hh}; + try { + u->e->z(0); + } catch (...) { + } + return 0; +}