diff options
Diffstat (limited to 'lib/Sema/SemaPseudoObject.cpp')
-rw-r--r-- | lib/Sema/SemaPseudoObject.cpp | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/lib/Sema/SemaPseudoObject.cpp b/lib/Sema/SemaPseudoObject.cpp index aebc0eb608..d52c912457 100644 --- a/lib/Sema/SemaPseudoObject.cpp +++ b/lib/Sema/SemaPseudoObject.cpp @@ -208,6 +208,7 @@ namespace { /// A PseudoOpBuilder for Objective-C @properties. class ObjCPropertyOpBuilder : public PseudoOpBuilder { ObjCPropertyRefExpr *RefExpr; + ObjCPropertyRefExpr *SyntacticRefExpr; OpaqueValueExpr *InstanceReceiver; ObjCMethodDecl *Getter; @@ -217,7 +218,7 @@ namespace { public: ObjCPropertyOpBuilder(Sema &S, ObjCPropertyRefExpr *refExpr) : PseudoOpBuilder(S, refExpr->getLocation()), RefExpr(refExpr), - InstanceReceiver(0), Getter(0), Setter(0) { + SyntacticRefExpr(0), InstanceReceiver(0), Getter(0), Setter(0) { } ExprResult buildRValueOperation(Expr *op); @@ -538,6 +539,10 @@ Expr *ObjCPropertyOpBuilder::rebuildAndCaptureObject(Expr *syntacticBase) { ObjCPropertyRefRebuilder(S, InstanceReceiver).rebuild(syntacticBase); } + if (ObjCPropertyRefExpr * + refE = dyn_cast<ObjCPropertyRefExpr>(syntacticBase->IgnoreParens())) + SyntacticRefExpr = refE; + return syntacticBase; } @@ -545,7 +550,10 @@ Expr *ObjCPropertyOpBuilder::rebuildAndCaptureObject(Expr *syntacticBase) { ExprResult ObjCPropertyOpBuilder::buildGet() { findGetter(); assert(Getter); - + + if (SyntacticRefExpr) + SyntacticRefExpr->setIsMessagingGetter(); + QualType receiverType; if (RefExpr->isClassReceiver()) { receiverType = S.Context.getObjCInterfaceType(RefExpr->getClassReceiver()); @@ -581,6 +589,9 @@ ExprResult ObjCPropertyOpBuilder::buildSet(Expr *op, SourceLocation opcLoc, bool hasSetter = findSetter(); assert(hasSetter); (void) hasSetter; + if (SyntacticRefExpr) + SyntacticRefExpr->setIsMessagingSetter(); + QualType receiverType; if (RefExpr->isClassReceiver()) { receiverType = S.Context.getObjCInterfaceType(RefExpr->getClassReceiver()); |