summaryrefslogtreecommitdiffstats
path: root/clang/test/SemaCXX/member-pointer-ms.cpp
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2014-02-10 19:50:15 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2014-02-10 19:50:15 +0000
commit4bb0980d96281e62870a2631b4acaf2e44b306dd (patch)
treeb6c40095531c39b23d96b4cdabe089c2925bb878 /clang/test/SemaCXX/member-pointer-ms.cpp
parent756c22cdedd122d2a53b5219a6bce9295d08ca18 (diff)
downloadbcm5719-llvm-4bb0980d96281e62870a2631b4acaf2e44b306dd.tar.gz
bcm5719-llvm-4bb0980d96281e62870a2631b4acaf2e44b306dd.zip
MS ABI: Add support for #pragma pointers_to_members
Introduce a notion of a 'current representation method' for pointers-to-members. When starting out, this is set to 'best case' (representation method is chosen by examining the class, selecting the smallest representation that would work given the class definition or lack thereof). This pragma allows the translation unit to dictate exactly what representation to use, similar to how the inheritance model keywords operate. N.B. PCH support is forthcoming. Differential Revision: http://llvm-reviews.chandlerc.com/D2723 llvm-svn: 201105
Diffstat (limited to 'clang/test/SemaCXX/member-pointer-ms.cpp')
-rw-r--r--clang/test/SemaCXX/member-pointer-ms.cpp23
1 files changed, 23 insertions, 0 deletions
diff --git a/clang/test/SemaCXX/member-pointer-ms.cpp b/clang/test/SemaCXX/member-pointer-ms.cpp
index 8e8094004f6..422b7cfbd18 100644
--- a/clang/test/SemaCXX/member-pointer-ms.cpp
+++ b/clang/test/SemaCXX/member-pointer-ms.cpp
@@ -202,3 +202,26 @@ struct __multiple_inheritance C {}; // expected-error{{inheritance model does no
struct __virtual_inheritance D;
struct D : virtual B {};
}
+
+#pragma pointers_to_members(full_generality, multiple_inheritance)
+struct TrulySingleInheritance;
+static_assert(sizeof(int TrulySingleInheritance::*) == kMultipleDataSize, "");
+#pragma pointers_to_members(best_case)
+// This definition shouldn't conflict with the increased generality that the
+// multiple_inheritance model gave to TrulySingleInheritance.
+struct TrulySingleInheritance {};
+
+// Even if a definition proceeds the first mention of a pointer to member, we
+// still give the record the fully general representation.
+#pragma pointers_to_members(full_generality, virtual_inheritance)
+struct SingleInheritanceAsVirtualAfterPragma {};
+static_assert(sizeof(int SingleInheritanceAsVirtualAfterPragma::*) == 12, "");
+
+#pragma pointers_to_members(best_case)
+
+// The above holds even if the pragma comes after the definition.
+struct SingleInheritanceAsVirtualBeforePragma {};
+#pragma pointers_to_members(virtual_inheritance)
+static_assert(sizeof(int SingleInheritanceAsVirtualBeforePragma::*) == 12, "");
+
+#pragma pointers_to_members(single) // expected-error{{unexpected 'single'}}
OpenPOWER on IntegriCloud