diff options
author | Alexey Bataev <a.bataev@hotmail.com> | 2015-10-14 04:05:42 +0000 |
---|---|---|
committer | Alexey Bataev <a.bataev@hotmail.com> | 2015-10-14 04:05:42 +0000 |
commit | 56640d8209fa9197603f2b876ca7ca8645f0946d (patch) | |
tree | b9ae03d841cf2104fee589e343770442d2a807e8 /lib/Sema/SemaPseudoObject.cpp | |
parent | fb7d1d842ea81555a442590e2b5293618e1eaa67 (diff) |
[MSVC] Fix for http://llvm.org/PR24132: __declspec(property): double invocations of foo() when compiling foo()->propertyName
Removes extra codegen for base expression of MS property call
Differential Revision: http://reviews.llvm.org/D13375
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@250265 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaPseudoObject.cpp')
-rw-r--r-- | lib/Sema/SemaPseudoObject.cpp | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/lib/Sema/SemaPseudoObject.cpp b/lib/Sema/SemaPseudoObject.cpp index a7029fa07c..8998a7e8bc 100644 --- a/lib/Sema/SemaPseudoObject.cpp +++ b/lib/Sema/SemaPseudoObject.cpp @@ -328,11 +328,12 @@ namespace { class MSPropertyOpBuilder : public PseudoOpBuilder { MSPropertyRefExpr *RefExpr; + OpaqueValueExpr *InstanceBase; public: MSPropertyOpBuilder(Sema &S, MSPropertyRefExpr *refExpr) : PseudoOpBuilder(S, refExpr->getSourceRange().getBegin()), - RefExpr(refExpr) {} + RefExpr(refExpr), InstanceBase(nullptr) {} Expr *rebuildAndCaptureObject(Expr *) override; ExprResult buildGet() override; @@ -1400,10 +1401,10 @@ ExprResult ObjCSubscriptOpBuilder::buildSet(Expr *op, SourceLocation opcLoc, //===----------------------------------------------------------------------===// Expr *MSPropertyOpBuilder::rebuildAndCaptureObject(Expr *syntacticBase) { - Expr *NewBase = capture(RefExpr->getBaseExpr()); + InstanceBase = capture(RefExpr->getBaseExpr()); syntacticBase = - MSPropertyRefRebuilder(S, NewBase).rebuild(syntacticBase); + MSPropertyRefRebuilder(S, InstanceBase).rebuild(syntacticBase); return syntacticBase; } @@ -1420,10 +1421,10 @@ ExprResult MSPropertyOpBuilder::buildGet() { GetterName.setIdentifier(II, RefExpr->getMemberLoc()); CXXScopeSpec SS; SS.Adopt(RefExpr->getQualifierLoc()); - ExprResult GetterExpr = S.ActOnMemberAccessExpr( - S.getCurScope(), RefExpr->getBaseExpr(), SourceLocation(), - RefExpr->isArrow() ? tok::arrow : tok::period, SS, SourceLocation(), - GetterName, nullptr); + ExprResult GetterExpr = + S.ActOnMemberAccessExpr(S.getCurScope(), InstanceBase, SourceLocation(), + RefExpr->isArrow() ? tok::arrow : tok::period, SS, + SourceLocation(), GetterName, nullptr); if (GetterExpr.isInvalid()) { S.Diag(RefExpr->getMemberLoc(), diag::error_cannot_find_suitable_accessor) << 0 /* getter */ @@ -1450,10 +1451,10 @@ ExprResult MSPropertyOpBuilder::buildSet(Expr *op, SourceLocation sl, SetterName.setIdentifier(II, RefExpr->getMemberLoc()); CXXScopeSpec SS; SS.Adopt(RefExpr->getQualifierLoc()); - ExprResult SetterExpr = S.ActOnMemberAccessExpr( - S.getCurScope(), RefExpr->getBaseExpr(), SourceLocation(), - RefExpr->isArrow() ? tok::arrow : tok::period, SS, SourceLocation(), - SetterName, nullptr); + ExprResult SetterExpr = + S.ActOnMemberAccessExpr(S.getCurScope(), InstanceBase, SourceLocation(), + RefExpr->isArrow() ? tok::arrow : tok::period, SS, + SourceLocation(), SetterName, nullptr); if (SetterExpr.isInvalid()) { S.Diag(RefExpr->getMemberLoc(), diag::error_cannot_find_suitable_accessor) << 1 /* setter */ |