diff options
author | Anders Carlsson <andersca@mac.com> | 2009-05-01 18:34:30 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-05-01 18:34:30 +0000 |
commit | a552f7c125d9f70eeb9e9793a2fabe99b806c983 (patch) | |
tree | 1c053180ebd03ed19e7fd1cbd1018a1212ee70e2 /lib/Sema/SemaOverload.cpp | |
parent | 98104728aa36ba6e5cebfa265ece57127091b906 (diff) |
Get rid of the implicit deref call when calling member functions where the base is a pointer.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70562 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaOverload.cpp')
-rw-r--r-- | lib/Sema/SemaOverload.cpp | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/lib/Sema/SemaOverload.cpp b/lib/Sema/SemaOverload.cpp index ab66939656..eb4c4e6706 100644 --- a/lib/Sema/SemaOverload.cpp +++ b/lib/Sema/SemaOverload.cpp @@ -1928,8 +1928,10 @@ Sema::TryObjectArgumentInitialization(Expr *From, CXXMethodDecl *Method) { // We need to have an object of class type. QualType FromType = From->getType(); - if (!FromType->isRecordType()) - return ICS; + if (const PointerType *PT = FromType->getAsPointerType()) + FromType = PT->getPointeeType(); + + assert(FromType->isRecordType()); // The implicit object parmeter is has the type "reference to cv X", // where X is the class of which the function is a member @@ -1972,22 +1974,33 @@ Sema::TryObjectArgumentInitialization(Expr *From, CXXMethodDecl *Method) { /// expression. bool Sema::PerformObjectArgumentInitialization(Expr *&From, CXXMethodDecl *Method) { - QualType ImplicitParamType - = Method->getThisType(Context)->getAsPointerType()->getPointeeType(); + QualType FromRecordType, DestType; + QualType ImplicitParamRecordType = + Method->getThisType(Context)->getAsPointerType()->getPointeeType(); + + if (const PointerType *PT = From->getType()->getAsPointerType()) { + FromRecordType = PT->getPointeeType(); + DestType = Method->getThisType(Context); + } else { + FromRecordType = From->getType(); + DestType = ImplicitParamRecordType; + } + ImplicitConversionSequence ICS = TryObjectArgumentInitialization(From, Method); if (ICS.ConversionKind == ImplicitConversionSequence::BadConversion) return Diag(From->getSourceRange().getBegin(), diag::err_implicit_object_parameter_init) - << ImplicitParamType << From->getType() << From->getSourceRange(); - + << ImplicitParamRecordType << FromRecordType << From->getSourceRange(); + if (ICS.Standard.Second == ICK_Derived_To_Base && - CheckDerivedToBaseConversion(From->getType(), ImplicitParamType, + CheckDerivedToBaseConversion(FromRecordType, + ImplicitParamRecordType, From->getSourceRange().getBegin(), From->getSourceRange())) return true; - ImpCastExprToType(From, ImplicitParamType, /*isLvalue=*/true); + ImpCastExprToType(From, DestType, /*isLvalue=*/true); return false; } @@ -4048,10 +4061,7 @@ Sema::BuildCallToMemberFunction(Scope *S, Expr *MemExprE, // Extract the object argument. Expr *ObjectArg = MemExpr->getBase(); - if (MemExpr->isArrow()) - ObjectArg = new (Context) UnaryOperator(ObjectArg, UnaryOperator::Deref, - ObjectArg->getType()->getAsPointerType()->getPointeeType(), - ObjectArg->getLocStart()); + CXXMethodDecl *Method = 0; if (OverloadedFunctionDecl *Ovl = dyn_cast<OverloadedFunctionDecl>(MemExpr->getMemberDecl())) { |