diff options
author | Sebastian Redl <sebastian.redl@getdesigned.at> | 2009-01-26 19:54:48 +0000 |
---|---|---|
committer | Sebastian Redl <sebastian.redl@getdesigned.at> | 2009-01-26 19:54:48 +0000 |
commit | 9e5e4aaf8b8835b552819d68d29b6d94115d8a0b (patch) | |
tree | 816c0a3d90080e9b0ff837be223192588b4b11de | |
parent | 1be3da51d26b4ee95a46c21f48eba5c5caa4b1b0 (diff) |
Remove an implemented FIXME and extend test cases. Follow-up on Doug's review.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63032 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaType.cpp | 17 | ||||
-rw-r--r-- | test/SemaCXX/member-pointer.cpp | 7 |
2 files changed, 15 insertions, 9 deletions
diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index d62e767a1c..719938d9a3 100644 --- a/lib/Sema/SemaType.cpp +++ b/lib/Sema/SemaType.cpp @@ -642,15 +642,14 @@ QualType Sema::ObjCGetTypeForMethodDefinition(DeclTy *D) { return T; } -/// UnwrapSimilarPointerTypes - If T1 and T2 are pointer types (FIXME: -/// or pointer-to-member types) that may be similar (C++ 4.4), -/// replaces T1 and T2 with the type that they point to and return -/// true. If T1 and T2 aren't pointer types or pointer-to-member -/// types, or if they are not similar at this level, returns false and -/// leaves T1 and T2 unchanged. Top-level qualifiers on T1 and T2 are -/// ignored. This function will typically be called in a loop that -/// successively "unwraps" pointer and pointer-to-member types to -/// compare them at each level. +/// UnwrapSimilarPointerTypes - If T1 and T2 are pointer types that +/// may be similar (C++ 4.4), replaces T1 and T2 with the type that +/// they point to and return true. If T1 and T2 aren't pointer types +/// or pointer-to-member types, or if they are not similar at this +/// level, returns false and leaves T1 and T2 unchanged. Top-level +/// qualifiers on T1 and T2 are ignored. This function will typically +/// be called in a loop that successively "unwraps" pointer and +/// pointer-to-member types to compare them at each level. bool Sema::UnwrapSimilarPointerTypes(QualType& T1, QualType& T2) { const PointerType *T1PtrType = T1->getAsPointerType(), diff --git a/test/SemaCXX/member-pointer.cpp b/test/SemaCXX/member-pointer.cpp index 4aa3098461..bcd3dd65e8 100644 --- a/test/SemaCXX/member-pointer.cpp +++ b/test/SemaCXX/member-pointer.cpp @@ -4,6 +4,9 @@ struct A {}; enum B { Dummy }; namespace C {} struct D : A {}; +struct E : A {}; +struct F : D, E {}; +struct G : virtual D {}; int A::*pdi1; int (::A::*pdi2); @@ -29,4 +32,8 @@ void f() { // Conversion to member of derived. int D::*pdid = pdi1; pdid = pdi2; + + // Fail conversion due to ambiguity and virtuality. + int F::*pdif = pdi1; // expected-error {{ambiguous conversion from pointer to member of base class 'struct A' to pointer to member of derived class 'struct F'}} expected-error {{incompatible type}} + int G::*pdig = pdi1; // expected-error {{conversion from pointer to member of class 'struct A' to pointer to member of class 'struct G' via virtual base 'struct D' is not allowed}} expected-error {{incompatible type}} } |