summaryrefslogtreecommitdiffstats
path: root/clang/test/SemaCXX/member-pointer-ms.cpp
diff options
context:
space:
mode:
authorReid Kleckner <reid@kleckner.net>2014-01-31 22:28:50 +0000
committerReid Kleckner <reid@kleckner.net>2014-01-31 22:28:50 +0000
commitbd63b3385429f4b5266048a64429cf81a64914b6 (patch)
tree7e04e4e23d54a51222c47e534eeaba17e4987b89 /clang/test/SemaCXX/member-pointer-ms.cpp
parent6d7a5637f12323c5a692a31d49dd36043a372853 (diff)
downloadbcm5719-llvm-bd63b3385429f4b5266048a64429cf81a64914b6.tar.gz
bcm5719-llvm-bd63b3385429f4b5266048a64429cf81a64914b6.zip
[ms-cxxabi] Raise aggregate memptr alignment to 8 for x86_32
With this change, we give different results for __alignof than MSVC, but our record layout is compatible. Some data member pointers also now have a size that is not a multiple of their alignment. Fixes PR18618. Reviewers: majnemer Differential Revision: http://llvm-reviews.chandlerc.com/D2669 llvm-svn: 200585
Diffstat (limited to 'clang/test/SemaCXX/member-pointer-ms.cpp')
-rw-r--r--clang/test/SemaCXX/member-pointer-ms.cpp27
1 files changed, 24 insertions, 3 deletions
diff --git a/clang/test/SemaCXX/member-pointer-ms.cpp b/clang/test/SemaCXX/member-pointer-ms.cpp
index ca37e07496a..aa3caa74285 100644
--- a/clang/test/SemaCXX/member-pointer-ms.cpp
+++ b/clang/test/SemaCXX/member-pointer-ms.cpp
@@ -19,15 +19,29 @@ struct Foo {
};
enum {
+ kSingleDataAlign = 1 * sizeof(int),
+ kSingleFunctionAlign = 1 * sizeof(void *),
+ kMultipleDataAlign = 1 * sizeof(int),
+ // Everything with more than 1 field is 8 byte aligned, except virtual data
+ // member pointers on x64 (ugh).
+ kMultipleFunctionAlign = 8,
+#ifdef _M_X64
+ kVirtualDataAlign = 4,
+#else
+ kVirtualDataAlign = 8,
+#endif
+ kVirtualFunctionAlign = 8,
+ kUnspecifiedDataAlign = 8,
+ kUnspecifiedFunctionAlign = 8,
+
kSingleDataSize = 1 * sizeof(int),
kSingleFunctionSize = 1 * sizeof(void *),
kMultipleDataSize = 1 * sizeof(int),
kMultipleFunctionSize = 2 * sizeof(void *),
kVirtualDataSize = 2 * sizeof(int),
kVirtualFunctionSize = 2 * sizeof(int) + 1 * sizeof(void *),
- // Unspecified is weird, it's 1 more slot than virtual.
- kUnspecifiedDataSize = kVirtualDataSize + 1 * sizeof(int),
- kUnspecifiedFunctionSize = kVirtualFunctionSize + 1 * sizeof(void *),
+ kUnspecifiedDataSize = 3 * sizeof(int),
+ kUnspecifiedFunctionSize = 2 * sizeof(int) + 2 * sizeof(void *),
};
// incomplete types
@@ -41,6 +55,13 @@ static_assert(sizeof(void (IncSingle::*)()) == kSingleFunctionSize, "");
static_assert(sizeof(void (IncMultiple::*)()) == kMultipleFunctionSize, "");
static_assert(sizeof(void (IncVirtual::*)()) == kVirtualFunctionSize, "");
+static_assert(__alignof(int IncSingle::*) == kSingleDataAlign, "");
+static_assert(__alignof(int IncMultiple::*) == kMultipleDataAlign, "");
+static_assert(__alignof(int IncVirtual::*) == kVirtualDataAlign, "");
+static_assert(__alignof(void (IncSingle::*)()) == kSingleFunctionAlign, "");
+static_assert(__alignof(void (IncMultiple::*)()) == kMultipleFunctionAlign, "");
+static_assert(__alignof(void (IncVirtual::*)()) == kVirtualFunctionAlign, "");
+
// An incomplete type with an unspecified inheritance model seems to take one
// more slot than virtual. It's not clear what it's used for yet.
class IncUnspecified;
OpenPOWER on IntegriCloud