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 | bfdea0f13684f5ae3eaef75c44ac2a2ea97dff21 (patch) | |
tree | d09986f3d05750fde9bc47f1ff938e761ab1b43c /clang/lib/Sema/SemaOverload.cpp | |
parent | 62a3124fb836831d22f09bf6bb454390bd23aa14 (diff) | |
download | bcm5719-llvm-bfdea0f13684f5ae3eaef75c44ac2a2ea97dff21.tar.gz bcm5719-llvm-bfdea0f13684f5ae3eaef75c44ac2a2ea97dff21.zip |
Get rid of the implicit deref call when calling member functions where the base is a pointer.
llvm-svn: 70562
Diffstat (limited to 'clang/lib/Sema/SemaOverload.cpp')
-rw-r--r-- | clang/lib/Sema/SemaOverload.cpp | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/clang/lib/Sema/SemaOverload.cpp b/clang/lib/Sema/SemaOverload.cpp index ab66939656e..eb4c4e6706d 100644 --- a/clang/lib/Sema/SemaOverload.cpp +++ b/clang/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())) { |