/ test / exception_object_alignment.2.pass.cpp
exception_object_alignment.2.pass.cpp
 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  
19  struct exception {
20      exception() : x(0) { }
21      virtual ~exception() { }
22      int x;
23  };
24  
25  struct foo : exception { };
26  
27  int main(int, char**) {
28      try {
29        throw foo();
30      } catch (...) {
31  
32      }
33      return 0;
34  }