diff --git a/libcxxabi/test/exception_object_alignment.2.pass.cpp b/libcxxabi/test/exception_object_alignment.2.pass.cpp new file mode 100644 index 000000000000..33f0f9e5825a --- /dev/null +++ b/libcxxabi/test/exception_object_alignment.2.pass.cpp @@ -0,0 +1,34 @@ +//===----------------------------------------------------------------------===// +// +// 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: libcxxabi-no-exceptions + +// This test checks that the compiler does not make incorrect assumptions +// about the alignment of the exception (only in that specific case, of +// course). +// +// There was a bug where Clang would emit a call to memset assuming a 16-byte +// aligned exception even when back-deploying to older Darwin systems where +// exceptions are 8-byte aligned, which caused a segfault on those systems. + +struct exception { + exception() : x(0) { } + virtual ~exception() { } + int x; +}; + +struct foo : exception { }; + +int main() { + try { + throw foo(); + } catch (...) { + + } + return 0; +}