Author: cornedbee Date: Wed Nov 18 12:10:53 2009 New Revision: 89215 URL: http://llvm.org/viewvc/llvm-project?rev=89215&view=rev Log: CastsAwayConstness shouldn't care if member pointers point into different classes. Fixes PR5545.
Modified: cfe/trunk/lib/Sema/SemaCXXCast.cpp cfe/trunk/test/SemaCXX/reinterpret-cast.cpp Modified: cfe/trunk/lib/Sema/SemaCXXCast.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaCXXCast.cpp?rev=89215&r1=89214&r2=89215&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaCXXCast.cpp (original) +++ cfe/trunk/lib/Sema/SemaCXXCast.cpp Wed Nov 18 12:10:53 2009 @@ -175,6 +175,30 @@ return ExprError(); } +/// UnwrapDissimilarPointerTypes - Like Sema::UnwrapSimilarPointerTypes, +/// this removes one level of indirection from both types, provided that they're +/// the same kind of pointer (plain or to-member). Unlike the Sema function, +/// this one doesn't care if the two pointers-to-member don't point into the +/// same class. This is because CastsAwayConstness doesn't care. +bool UnwrapDissimilarPointerTypes(QualType& T1, QualType& T2) { + const PointerType *T1PtrType = T1->getAs<PointerType>(), + *T2PtrType = T2->getAs<PointerType>(); + if (T1PtrType && T2PtrType) { + T1 = T1PtrType->getPointeeType(); + T2 = T2PtrType->getPointeeType(); + return true; + } + + const MemberPointerType *T1MPType = T1->getAs<MemberPointerType>(), + *T2MPType = T2->getAs<MemberPointerType>(); + if (T1MPType && T2MPType) { + T1 = T1MPType->getPointeeType(); + T2 = T2MPType->getPointeeType(); + return true; + } + return false; +} + /// CastsAwayConstness - Check if the pointer conversion from SrcType to /// DestType casts away constness as defined in C++ 5.2.11p8ff. This is used by /// the cast checkers. Both arguments must denote pointer (possibly to member) @@ -195,7 +219,7 @@ llvm::SmallVector<Qualifiers, 8> cv1, cv2; // Find the qualifications. - while (Self.UnwrapSimilarPointerTypes(UnwrappedSrcType, UnwrappedDestType)) { + while (UnwrapDissimilarPointerTypes(UnwrappedSrcType, UnwrappedDestType)) { cv1.push_back(UnwrappedSrcType.getQualifiers()); cv2.push_back(UnwrappedDestType.getQualifiers()); } Modified: cfe/trunk/test/SemaCXX/reinterpret-cast.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/reinterpret-cast.cpp?rev=89215&r1=89214&r2=89215&view=diff ============================================================================== --- cfe/trunk/test/SemaCXX/reinterpret-cast.cpp (original) +++ cfe/trunk/test/SemaCXX/reinterpret-cast.cpp Wed Nov 18 12:10:53 2009 @@ -88,3 +88,9 @@ (void)reinterpret_cast<void (structure::*)()>(0); // expected-error {{reinterpret_cast from 'int' to 'void (struct structure::*)()' is not allowed}} (void)reinterpret_cast<int structure::*>(0); // expected-error {{reinterpret_cast from 'int' to 'int struct structure::*' is not allowed}} } + +// PR5545 +class A; +class B; +void (A::*a)(); +void (B::*b)() = reinterpret_cast<void (B::*)()>(a); _______________________________________________ cfe-commits mailing list cfe-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits