Douglas Gregor wrote: > > On Jan 25, 2009, at 11:43 AM, Sebastian Redl wrote: > >> Author: cornedbee >> Date: Sun Jan 25 13:43:20 2009 >> New Revision: 62971 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=62971&view=rev >> Log: >> Implement implicit conversions for pointers-to-member. > > Great! > >> +/// CheckMemberPointerConversion - Check the member pointer >> conversion from the >> +/// expression From to the type ToType. This routine checks for >> ambiguous or >> +/// virtual (FIXME: or inaccessible) base-to-derived member pointer >> conversions >> +/// for which IsMemberPointerConversion has already returned true. >> It returns >> +/// true and produces a diagnostic if there was an error, or returns >> false >> +/// otherwise. >> +bool Sema::CheckMemberPointerConversion(Expr *From, QualType ToType) { >> + QualType FromType = From->getType(); >> + >> + if (const MemberPointerType *FromPtrType = >> + FromType->getAsMemberPointerType()) { >> + if (const MemberPointerType *ToPtrType = >> + ToType->getAsMemberPointerType()) { > > Why not just assert(FromType->isMemberPointerType() && > ToType->isMemberPointerType())? We shouldn't be in here if we don't > already know that this is a pointer-to-member conversion. 1) Because you don't in CheckPointerConversion. 2) Actually From may be a null pointer constant. >> + >> + std::string PathDisplayStr = >> getAmbiguousPathsDisplayString(Paths); >> + Diag(From->getExprLoc(), >> + diag::err_ambiguous_base_to_derived_memptr_conv) >> + << FromClass << ToClass << PathDisplayStr << >> From->getSourceRange(); >> + return true; >> + } >> + >> + if (const CXXRecordType *VBase = Paths.getDetectedVirtual()) { >> + Diag(From->getExprLoc(), diag::err_memptr_conv_via_virtual) >> + << FromClass << ToClass << QualType(VBase, 0) >> + << From->getSourceRange(); >> + return true; >> + } > > I didn't see a test for this diagnostic? Indeed. >> - // FIXME: pointer-to-member types >> + const MemberPointerType *T1MPType = T1->getAsMemberPointerType(), >> + *T2MPType = T2->getAsMemberPointerType(); >> + if (T1MPType && T2MPType) { >> + T1 = T1MPType->getPointeeType(); >> + T2 = T2MPType->getPointeeType(); >> + return true; >> + } >> return false; >> } > > There's another FIXME up in the comment for UnwrapSimilarPointerTypes > that you get to remove :)
Yay! Sebastian _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
