summaryrefslogtreecommitdiffstats
path: root/clang/test/SemaCXX/member-pointer-ms.cpp
diff options
context:
space:
mode:
authorReid Kleckner <reid@kleckner.net>2013-03-28 23:11:29 +0000
committerReid Kleckner <reid@kleckner.net>2013-03-28 23:11:29 +0000
commit557a0352299ffe3d843682c66324c3975ca4c6d1 (patch)
treeab6c8c28bd4d6df7e891c51bf041682d455a4c8b /clang/test/SemaCXX/member-pointer-ms.cpp
parentba64859e6e193ef29ceee5da1b55a81cefe2b7dd (diff)
downloadbcm5719-llvm-557a0352299ffe3d843682c66324c3975ca4c6d1.tar.gz
bcm5719-llvm-557a0352299ffe3d843682c66324c3975ca4c6d1.zip
[ms-cxxabi] Add more tests for r178297
This covers a few cases where the class of a member pointer is not a CXXRecordDecl. llvm-svn: 178307
Diffstat (limited to 'clang/test/SemaCXX/member-pointer-ms.cpp')
-rw-r--r--clang/test/SemaCXX/member-pointer-ms.cpp33
1 files changed, 33 insertions, 0 deletions
diff --git a/clang/test/SemaCXX/member-pointer-ms.cpp b/clang/test/SemaCXX/member-pointer-ms.cpp
index f4919d221d9..7dca1219058 100644
--- a/clang/test/SemaCXX/member-pointer-ms.cpp
+++ b/clang/test/SemaCXX/member-pointer-ms.cpp
@@ -132,3 +132,36 @@ struct MemPtrInBody {
};
static_assert(sizeof(MemPtrInBody::MemPtr) == kSingleDataSize, "");
+
+// Passing a member pointer through a template should get the right size.
+template<typename T>
+struct SingleTemplate;
+template<typename T>
+struct SingleTemplate<void (T::*)(void)> {
+ static_assert(sizeof(int T::*) == kSingleDataSize, "");
+ static_assert(sizeof(void (T::*)()) == kSingleFunctionSize, "");
+};
+
+template<typename T>
+struct UnspecTemplate;
+template<typename T>
+struct UnspecTemplate<void (T::*)(void)> {
+ static_assert(sizeof(int T::*) == kUnspecifiedDataSize, "");
+ static_assert(sizeof(void (T::*)()) == kUnspecifiedFunctionSize, "");
+};
+
+struct NewUnspecified;
+SingleTemplate<void (IncSingle::*)()> tmpl_single;
+UnspecTemplate<void (NewUnspecified::*)()> tmpl_unspec;
+
+struct NewUnspecified { };
+
+static_assert(sizeof(void (NewUnspecified::*)()) == kUnspecifiedFunctionSize, "");
+
+template <typename T>
+struct MemPtrInTemplate {
+ // We can't require that the template arg be complete until we're
+ // instantiated.
+ int T::*data_ptr;
+ void (T::*func_ptr)();
+};
OpenPOWER on IntegriCloud