1 //===---------------- exception_object_alignment.pass.cpp -----------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 // UNSUPPORTED: libcxxabi-no-exceptions
11 
12 // Check that the pointer __cxa_allocate_exception returns is aligned to the
13 // default alignment for the target architecture.
14 
15 #include <cassert>
16 #include <cstdint>
17 #include <cxxabi.h>
18 #include <type_traits>
19 #include <__cxxabi_config.h>
20 
21 struct S {
22   int a[4];
23 } __attribute__((aligned));
24 
25 int main() {
26 #if !defined(_LIBCXXABI_ARM_EHABI)
27   void *p = __cxxabiv1::__cxa_allocate_exception(16);
28   auto i = reinterpret_cast<uintptr_t>(p);
29   auto a = std::alignment_of<S>::value;
30   assert(i % a == 0);
31   __cxxabiv1::__cxa_free_exception(p);
32 #endif
33   return 0;
34 }
35