1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9// UNSUPPORTED: no-exceptions
10
11// This test checks that the compiler does not make incorrect assumptions
12// about the alignment of the exception (only in that specific case, of
13// course).
14//
15// There was a bug where Clang would emit a call to memset assuming a 16-byte
16// aligned exception even when back-deploying to older Darwin systems where
17// exceptions are 8-byte aligned, which caused a segfault on those systems.
18
19struct exception {
20 exception() : x(0) { }
21 exception(const exception&) = default;
22 exception& operator=(const exception&) = default;
23 virtual ~exception() { }
24 int x;
25};
26
27struct foo : exception { };
28
29int main(int, char**) {
30 try {
31 throw foo();
32 } catch (...) {
33
34 }
35 return 0;
36}
37

source code of libcxxabi/test/exception_object_alignment.2.pass.cpp