diff options
author | Reid Kleckner <reid@kleckner.net> | 2013-03-28 23:11:29 +0000 |
---|---|---|
committer | Reid Kleckner <reid@kleckner.net> | 2013-03-28 23:11:29 +0000 |
commit | 557a0352299ffe3d843682c66324c3975ca4c6d1 (patch) | |
tree | ab6c8c28bd4d6df7e891c51bf041682d455a4c8b /clang/test/SemaCXX/member-pointer-ms.cpp | |
parent | ba64859e6e193ef29ceee5da1b55a81cefe2b7dd (diff) | |
download | bcm5719-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.cpp | 33 |
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)(); +}; |