summaryrefslogtreecommitdiff
path: root/test/test_exception_address_alignment.pass.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/test_exception_address_alignment.pass.cpp')
-rw-r--r--test/test_exception_address_alignment.pass.cpp17
1 files changed, 13 insertions, 4 deletions
diff --git a/test/test_exception_address_alignment.pass.cpp b/test/test_exception_address_alignment.pass.cpp
index 8a41f0c..138fb4d 100644
--- a/test/test_exception_address_alignment.pass.cpp
+++ b/test/test_exception_address_alignment.pass.cpp
@@ -15,8 +15,8 @@
// working around this failure.
// XFAIL: darwin && libcxxabi-has-system-unwinder
-// Test that the address of the exception object is properly aligned to the
-// largest supported alignment for the system.
+// Test that the address of the exception object is properly aligned as required
+// by the relevant ABI
#include <cstdint>
#include <cassert>
@@ -24,7 +24,16 @@
#include <unwind.h>
struct __attribute__((aligned)) AlignedType {};
-static_assert(alignof(AlignedType) == alignof(_Unwind_Exception),
+
+// EHABI : 8-byte aligned
+// Itanium: Largest supported alignment for the system
+#if defined(_LIBUNWIND_ARM_EHABI)
+# define EXPECTED_ALIGNMENT 8
+#else
+# define EXPECTED_ALIGNMENT alignof(AlignedType)
+#endif
+
+static_assert(alignof(_Unwind_Exception) == EXPECTED_ALIGNMENT,
"_Unwind_Exception is incorrectly aligned. This test is expected to fail");
struct MinAligned { };
@@ -35,7 +44,7 @@ int main() {
try {
throw MinAligned{};
} catch (MinAligned const& ref) {
- assert(reinterpret_cast<uintptr_t>(&ref) % alignof(AlignedType) == 0);
+ assert(reinterpret_cast<uintptr_t>(&ref) % EXPECTED_ALIGNMENT == 0);
}
}
}