diff --git a/clang/include/clang/AST/DeclObjC.h b/clang/include/clang/AST/DeclObjC.h index 576b588e8985..e2063cfc43d3 100644 --- a/clang/include/clang/AST/DeclObjC.h +++ b/clang/include/clang/AST/DeclObjC.h @@ -288,7 +288,11 @@ public: return SourceRange(getLocation(), EndLoc); } - SourceLocation getSelectorStartLoc() const { return getSelectorLoc(0); } + SourceLocation getSelectorStartLoc() const { + if (isImplicit()) + return getLocStart(); + return getSelectorLoc(0); + } SourceLocation getSelectorLoc(unsigned Index) const { assert(Index < getNumSelectorLocs() && "Index out of range!"); if (hasStandardSelLocs()) diff --git a/clang/include/clang/AST/ExprObjC.h b/clang/include/clang/AST/ExprObjC.h index 5e4b5b23104d..faccf815548a 100644 --- a/clang/include/clang/AST/ExprObjC.h +++ b/clang/include/clang/AST/ExprObjC.h @@ -487,7 +487,11 @@ class ObjCMessageExpr : public Expr { /// \brief Whether this message send is a "delegate init call", /// i.e. a call of an init method on self from within an init method. unsigned IsDelegateInitCall : 1; - + + /// \brief Whether this message send was implicitly generated by + /// the implementation rather than explicitly written by the user. + unsigned IsImplicit : 1; + /// \brief Whether the locations of the selector identifiers are in a /// "standard" position, a enum SelectorLocationsKind. unsigned SelLocsKind : 2; @@ -502,7 +506,7 @@ class ObjCMessageExpr : public Expr { ObjCMessageExpr(EmptyShell Empty, unsigned NumArgs) : Expr(ObjCMessageExprClass, Empty), SelectorOrMethod(0), Kind(0), - HasMethod(0), IsDelegateInitCall(0) { + HasMethod(0), IsDelegateInitCall(0), IsImplicit(0), SelLocsKind(0) { setNumArgs(NumArgs); } @@ -516,7 +520,8 @@ class ObjCMessageExpr : public Expr { SelectorLocationsKind SelLocsK, ObjCMethodDecl *Method, ArrayRef Args, - SourceLocation RBracLoc); + SourceLocation RBracLoc, + bool isImplicit); ObjCMessageExpr(QualType T, ExprValueKind VK, SourceLocation LBracLoc, TypeSourceInfo *Receiver, @@ -525,7 +530,8 @@ class ObjCMessageExpr : public Expr { SelectorLocationsKind SelLocsK, ObjCMethodDecl *Method, ArrayRef Args, - SourceLocation RBracLoc); + SourceLocation RBracLoc, + bool isImplicit); ObjCMessageExpr(QualType T, ExprValueKind VK, SourceLocation LBracLoc, Expr *Receiver, @@ -534,7 +540,8 @@ class ObjCMessageExpr : public Expr { SelectorLocationsKind SelLocsK, ObjCMethodDecl *Method, ArrayRef Args, - SourceLocation RBracLoc); + SourceLocation RBracLoc, + bool isImplicit); void initArgsAndSelLocs(ArrayRef Args, ArrayRef SelLocs, @@ -635,7 +642,8 @@ public: ArrayRef SelLocs, ObjCMethodDecl *Method, ArrayRef Args, - SourceLocation RBracLoc); + SourceLocation RBracLoc, + bool isImplicit); /// \brief Create a class message send. /// @@ -670,7 +678,8 @@ public: ArrayRef SelLocs, ObjCMethodDecl *Method, ArrayRef Args, - SourceLocation RBracLoc); + SourceLocation RBracLoc, + bool isImplicit); /// \brief Create an instance message send. /// @@ -705,7 +714,8 @@ public: ArrayRef SeLocs, ObjCMethodDecl *Method, ArrayRef Args, - SourceLocation RBracLoc); + SourceLocation RBracLoc, + bool isImplicit); /// \brief Create an empty Objective-C message expression, to be /// filled in by subsequent calls. @@ -718,6 +728,11 @@ public: unsigned NumArgs, unsigned NumStoredSelLocs); + /// \brief Indicates whether the message send was implicitly + /// generated by the implementation. If false, it was written explicitly + /// in the source code. + bool isImplicit() const { return IsImplicit; } + /// \brief Determine the kind of receiver that this message is being /// sent to. ReceiverKind getReceiverKind() const { return (ReceiverKind)Kind; } @@ -887,7 +902,11 @@ public: SourceLocation getLeftLoc() const { return LBracLoc; } SourceLocation getRightLoc() const { return RBracLoc; } - SourceLocation getSelectorStartLoc() const { return getSelectorLoc(0); } + SourceLocation getSelectorStartLoc() const { + if (isImplicit()) + return getLocStart(); + return getSelectorLoc(0); + } SourceLocation getSelectorLoc(unsigned Index) const { assert(Index < getNumSelectorLocs() && "Index out of range!"); if (hasStandardSelLocs()) @@ -902,6 +921,8 @@ public: void getSelectorLocs(SmallVectorImpl &SelLocs) const; unsigned getNumSelectorLocs() const { + if (isImplicit()) + return 0; Selector Sel = getSelector(); if (Sel.isUnarySelector()) return 1; diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 2d6d743087d0..aa0a7ef957a7 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -5465,7 +5465,15 @@ public: SourceLocation LBracLoc, ArrayRef SelectorLocs, SourceLocation RBracLoc, - MultiExprArg Args); + MultiExprArg Args, + bool isImplicit = false); + + ExprResult BuildClassMessageImplicit(QualType ReceiverType, + bool isSuperReceiver, + SourceLocation Loc, + Selector Sel, + ObjCMethodDecl *Method, + MultiExprArg Args); ExprResult ActOnClassMessage(Scope *S, ParsedType Receiver, @@ -5483,7 +5491,15 @@ public: SourceLocation LBracLoc, ArrayRef SelectorLocs, SourceLocation RBracLoc, - MultiExprArg Args); + MultiExprArg Args, + bool isImplicit = false); + + ExprResult BuildInstanceMessageImplicit(Expr *Receiver, + QualType ReceiverType, + SourceLocation Loc, + Selector Sel, + ObjCMethodDecl *Method, + MultiExprArg Args); ExprResult ActOnInstanceMessage(Scope *S, Expr *Receiver, diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp index f87d60f7fbee..e7177aabe2b6 100644 --- a/clang/lib/AST/Expr.cpp +++ b/clang/lib/AST/Expr.cpp @@ -2789,7 +2789,8 @@ ObjCMessageExpr::ObjCMessageExpr(QualType T, SelectorLocationsKind SelLocsK, ObjCMethodDecl *Method, ArrayRef Args, - SourceLocation RBracLoc) + SourceLocation RBracLoc, + bool isImplicit) : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, /*TypeDependent=*/false, /*ValueDependent=*/false, /*InstantiationDependent=*/false, @@ -2797,8 +2798,8 @@ ObjCMessageExpr::ObjCMessageExpr(QualType T, SelectorOrMethod(reinterpret_cast(Method? Method : Sel.getAsOpaquePtr())), Kind(IsInstanceSuper? SuperInstance : SuperClass), - HasMethod(Method != 0), IsDelegateInitCall(false), SuperLoc(SuperLoc), - LBracLoc(LBracLoc), RBracLoc(RBracLoc) + HasMethod(Method != 0), IsDelegateInitCall(false), IsImplicit(isImplicit), + SuperLoc(SuperLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc) { initArgsAndSelLocs(Args, SelLocs, SelLocsK); setReceiverPointer(SuperType.getAsOpaquePtr()); @@ -2813,14 +2814,15 @@ ObjCMessageExpr::ObjCMessageExpr(QualType T, SelectorLocationsKind SelLocsK, ObjCMethodDecl *Method, ArrayRef Args, - SourceLocation RBracLoc) + SourceLocation RBracLoc, + bool isImplicit) : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, T->isDependentType(), T->isDependentType(), T->isInstantiationDependentType(), T->containsUnexpandedParameterPack()), SelectorOrMethod(reinterpret_cast(Method? Method : Sel.getAsOpaquePtr())), Kind(Class), - HasMethod(Method != 0), IsDelegateInitCall(false), + HasMethod(Method != 0), IsDelegateInitCall(false), IsImplicit(isImplicit), LBracLoc(LBracLoc), RBracLoc(RBracLoc) { initArgsAndSelLocs(Args, SelLocs, SelLocsK); @@ -2836,7 +2838,8 @@ ObjCMessageExpr::ObjCMessageExpr(QualType T, SelectorLocationsKind SelLocsK, ObjCMethodDecl *Method, ArrayRef Args, - SourceLocation RBracLoc) + SourceLocation RBracLoc, + bool isImplicit) : Expr(ObjCMessageExprClass, T, VK, OK_Ordinary, Receiver->isTypeDependent(), Receiver->isTypeDependent(), Receiver->isInstantiationDependent(), @@ -2844,7 +2847,7 @@ ObjCMessageExpr::ObjCMessageExpr(QualType T, SelectorOrMethod(reinterpret_cast(Method? Method : Sel.getAsOpaquePtr())), Kind(Instance), - HasMethod(Method != 0), IsDelegateInitCall(false), + HasMethod(Method != 0), IsDelegateInitCall(false), IsImplicit(isImplicit), LBracLoc(LBracLoc), RBracLoc(RBracLoc) { initArgsAndSelLocs(Args, SelLocs, SelLocsK); @@ -2884,12 +2887,19 @@ ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T, ArrayRef SelLocs, ObjCMethodDecl *Method, ArrayRef Args, - SourceLocation RBracLoc) { - SelectorLocationsKind SelLocsK; - ObjCMessageExpr *Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK); + SourceLocation RBracLoc, + bool isImplicit) { + assert((!SelLocs.empty() || isImplicit) && + "No selector locs for non-implicit message"); + ObjCMessageExpr *Mem; + SelectorLocationsKind SelLocsK = SelectorLocationsKind(); + if (isImplicit) + Mem = alloc(Context, Args.size(), 0); + else + Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK); return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, SuperLoc, IsInstanceSuper, SuperType, Sel, SelLocs, SelLocsK, - Method, Args, RBracLoc); + Method, Args, RBracLoc, isImplicit); } ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T, @@ -2900,11 +2910,19 @@ ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T, ArrayRef SelLocs, ObjCMethodDecl *Method, ArrayRef Args, - SourceLocation RBracLoc) { - SelectorLocationsKind SelLocsK; - ObjCMessageExpr *Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK); + SourceLocation RBracLoc, + bool isImplicit) { + assert((!SelLocs.empty() || isImplicit) && + "No selector locs for non-implicit message"); + ObjCMessageExpr *Mem; + SelectorLocationsKind SelLocsK = SelectorLocationsKind(); + if (isImplicit) + Mem = alloc(Context, Args.size(), 0); + else + Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK); return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel, - SelLocs, SelLocsK, Method, Args, RBracLoc); + SelLocs, SelLocsK, Method, Args, RBracLoc, + isImplicit); } ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T, @@ -2915,11 +2933,19 @@ ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T, ArrayRef SelLocs, ObjCMethodDecl *Method, ArrayRef Args, - SourceLocation RBracLoc) { - SelectorLocationsKind SelLocsK; - ObjCMessageExpr *Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK); + SourceLocation RBracLoc, + bool isImplicit) { + assert((!SelLocs.empty() || isImplicit) && + "No selector locs for non-implicit message"); + ObjCMessageExpr *Mem; + SelectorLocationsKind SelLocsK = SelectorLocationsKind(); + if (isImplicit) + Mem = alloc(Context, Args.size(), 0); + else + Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK); return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel, - SelLocs, SelLocsK, Method, Args, RBracLoc); + SelLocs, SelLocsK, Method, Args, RBracLoc, + isImplicit); } ObjCMessageExpr *ObjCMessageExpr::CreateEmpty(ASTContext &Context, diff --git a/clang/lib/Rewrite/RewriteObjC.cpp b/clang/lib/Rewrite/RewriteObjC.cpp index 0227b5d8a770..4d26eb817d52 100644 --- a/clang/lib/Rewrite/RewriteObjC.cpp +++ b/clang/lib/Rewrite/RewriteObjC.cpp @@ -1299,7 +1299,8 @@ Stmt *RewriteObjC::RewritePropertyOrImplicitSetter(PseudoObjectExpr *PseudoOp) { SelLocs, OldMsg->getMethodDecl(), RHS, - OldMsg->getRightLoc()); + OldMsg->getRightLoc(), + OldMsg->isImplicit()); break; case ObjCMessageExpr::Instance: @@ -1311,7 +1312,8 @@ Stmt *RewriteObjC::RewritePropertyOrImplicitSetter(PseudoObjectExpr *PseudoOp) { SelLocs, OldMsg->getMethodDecl(), RHS, - OldMsg->getRightLoc()); + OldMsg->getRightLoc(), + OldMsg->isImplicit()); break; case ObjCMessageExpr::SuperClass: @@ -1326,7 +1328,8 @@ Stmt *RewriteObjC::RewritePropertyOrImplicitSetter(PseudoObjectExpr *PseudoOp) { SelLocs, OldMsg->getMethodDecl(), RHS, - OldMsg->getRightLoc()); + OldMsg->getRightLoc(), + OldMsg->isImplicit()); break; } @@ -1372,7 +1375,8 @@ Stmt *RewriteObjC::RewritePropertyOrImplicitGetter(PseudoObjectExpr *PseudoOp) { SelLocs, OldMsg->getMethodDecl(), Args, - OldMsg->getRightLoc()); + OldMsg->getRightLoc(), + OldMsg->isImplicit()); break; case ObjCMessageExpr::Instance: @@ -1384,7 +1388,8 @@ Stmt *RewriteObjC::RewritePropertyOrImplicitGetter(PseudoObjectExpr *PseudoOp) { SelLocs, OldMsg->getMethodDecl(), Args, - OldMsg->getRightLoc()); + OldMsg->getRightLoc(), + OldMsg->isImplicit()); break; case ObjCMessageExpr::SuperClass: @@ -1399,7 +1404,8 @@ Stmt *RewriteObjC::RewritePropertyOrImplicitGetter(PseudoObjectExpr *PseudoOp) { SelLocs, OldMsg->getMethodDecl(), Args, - OldMsg->getRightLoc()); + OldMsg->getRightLoc(), + OldMsg->isImplicit()); break; } diff --git a/clang/lib/Sema/SemaExprObjC.cpp b/clang/lib/Sema/SemaExprObjC.cpp index d229c18c93da..e9742a988ff9 100644 --- a/clang/lib/Sema/SemaExprObjC.cpp +++ b/clang/lib/Sema/SemaExprObjC.cpp @@ -1010,6 +1010,24 @@ ExprResult Sema::ActOnSuperMessage(Scope *S, LBracLoc, SelectorLocs, RBracLoc, move(Args)); } + +ExprResult Sema::BuildClassMessageImplicit(QualType ReceiverType, + bool isSuperReceiver, + SourceLocation Loc, + Selector Sel, + ObjCMethodDecl *Method, + MultiExprArg Args) { + TypeSourceInfo *receiverTypeInfo = 0; + if (!ReceiverType.isNull()) + receiverTypeInfo = Context.getTrivialTypeSourceInfo(ReceiverType); + + return BuildClassMessage(receiverTypeInfo, ReceiverType, + /*SuperLoc=*/isSuperReceiver ? Loc : SourceLocation(), + Sel, Method, Loc, Loc, Loc, Args, + /*isImplicit=*/true); + +} + /// \brief Build an Objective-C class message expression. /// /// This routine takes care of both normal class messages and @@ -1046,7 +1064,8 @@ ExprResult Sema::BuildClassMessage(TypeSourceInfo *ReceiverTypeInfo, SourceLocation LBracLoc, ArrayRef SelectorLocs, SourceLocation RBracLoc, - MultiExprArg ArgsIn) { + MultiExprArg ArgsIn, + bool isImplicit) { SourceLocation Loc = SuperLoc.isValid()? SuperLoc : ReceiverTypeInfo->getTypeLoc().getSourceRange().getBegin(); if (LBracLoc.isInvalid()) { @@ -1064,7 +1083,8 @@ ExprResult Sema::BuildClassMessage(TypeSourceInfo *ReceiverTypeInfo, return Owned(ObjCMessageExpr::Create(Context, ReceiverType, VK_RValue, LBracLoc, ReceiverTypeInfo, Sel, SelectorLocs, /*Method=*/0, - makeArrayRef(Args, NumArgs),RBracLoc)); + makeArrayRef(Args, NumArgs),RBracLoc, + isImplicit)); } // Find the class to which we are sending this message. @@ -1130,12 +1150,12 @@ ExprResult Sema::BuildClassMessage(TypeSourceInfo *ReceiverTypeInfo, SuperLoc, /*IsInstanceSuper=*/false, ReceiverType, Sel, SelectorLocs, Method, makeArrayRef(Args, NumArgs), - RBracLoc); + RBracLoc, isImplicit); else Result = ObjCMessageExpr::Create(Context, ReturnType, VK, LBracLoc, ReceiverTypeInfo, Sel, SelectorLocs, Method, makeArrayRef(Args, NumArgs), - RBracLoc); + RBracLoc, isImplicit); return MaybeBindToTemporary(Result); } @@ -1163,6 +1183,18 @@ ExprResult Sema::ActOnClassMessage(Scope *S, LBracLoc, SelectorLocs, RBracLoc, move(Args)); } +ExprResult Sema::BuildInstanceMessageImplicit(Expr *Receiver, + QualType ReceiverType, + SourceLocation Loc, + Selector Sel, + ObjCMethodDecl *Method, + MultiExprArg Args) { + return BuildInstanceMessage(Receiver, ReceiverType, + /*SuperLoc=*/!Receiver ? Loc : SourceLocation(), + Sel, Method, Loc, Loc, Loc, Args, + /*isImplicit=*/true); +} + /// \brief Build an Objective-C instance message expression. /// /// This routine takes care of both normal instance messages and @@ -1199,7 +1231,8 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver, SourceLocation LBracLoc, ArrayRef SelectorLocs, SourceLocation RBracLoc, - MultiExprArg ArgsIn) { + MultiExprArg ArgsIn, + bool isImplicit) { // The location of the receiver. SourceLocation Loc = SuperLoc.isValid()? SuperLoc : Receiver->getLocStart(); @@ -1232,7 +1265,7 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver, VK_RValue, LBracLoc, Receiver, Sel, SelectorLocs, /*Method=*/0, makeArrayRef(Args, NumArgs), - RBracLoc)); + RBracLoc, isImplicit)); } // If necessary, apply function/array conversion to the receiver. @@ -1522,11 +1555,13 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver, Result = ObjCMessageExpr::Create(Context, ReturnType, VK, LBracLoc, SuperLoc, /*IsInstanceSuper=*/true, ReceiverType, Sel, SelectorLocs, Method, - makeArrayRef(Args, NumArgs), RBracLoc); + makeArrayRef(Args, NumArgs), RBracLoc, + isImplicit); else Result = ObjCMessageExpr::Create(Context, ReturnType, VK, LBracLoc, Receiver, Sel, SelectorLocs, Method, - makeArrayRef(Args, NumArgs), RBracLoc); + makeArrayRef(Args, NumArgs), RBracLoc, + isImplicit); if (getLangOptions().ObjCAutoRefCount) { // In ARC, annotate delegate init calls. diff --git a/clang/lib/Sema/SemaPseudoObject.cpp b/clang/lib/Sema/SemaPseudoObject.cpp index 08b3fc82ca34..fa56b258daa9 100644 --- a/clang/lib/Sema/SemaPseudoObject.cpp +++ b/clang/lib/Sema/SemaPseudoObject.cpp @@ -492,11 +492,9 @@ ExprResult ObjCPropertyOpBuilder::buildGet() { assert(Getter); QualType receiverType; - SourceLocation superLoc; if (RefExpr->isClassReceiver()) { receiverType = S.Context.getObjCInterfaceType(RefExpr->getClassReceiver()); } else if (RefExpr->isSuperReceiver()) { - superLoc = RefExpr->getReceiverLocation(); receiverType = RefExpr->getSuperReceiverType(); } else { assert(InstanceReceiver); @@ -507,19 +505,14 @@ ExprResult ObjCPropertyOpBuilder::buildGet() { ExprResult msg; if (Getter->isInstanceMethod() || RefExpr->isObjectReceiver()) { assert(InstanceReceiver || RefExpr->isSuperReceiver()); - msg = S.BuildInstanceMessage(InstanceReceiver, receiverType, superLoc, - Getter->getSelector(), Getter, - GenericLoc, GenericLoc, GenericLoc, - MultiExprArg()); + msg = S.BuildInstanceMessageImplicit(InstanceReceiver, receiverType, + GenericLoc, Getter->getSelector(), + Getter, MultiExprArg()); } else { - TypeSourceInfo *receiverTypeInfo = 0; - if (!RefExpr->isSuperReceiver()) - receiverTypeInfo = S.Context.getTrivialTypeSourceInfo(receiverType); - - msg = S.BuildClassMessage(receiverTypeInfo, receiverType, superLoc, - Getter->getSelector(), Getter, - GenericLoc, GenericLoc, GenericLoc, - MultiExprArg()); + msg = S.BuildClassMessageImplicit(receiverType, RefExpr->isSuperReceiver(), + GenericLoc, + Getter->getSelector(), Getter, + MultiExprArg()); } return msg; } @@ -534,11 +527,9 @@ ExprResult ObjCPropertyOpBuilder::buildSet(Expr *op, SourceLocation opcLoc, assert(hasSetter); (void) hasSetter; QualType receiverType; - SourceLocation superLoc; if (RefExpr->isClassReceiver()) { receiverType = S.Context.getObjCInterfaceType(RefExpr->getClassReceiver()); } else if (RefExpr->isSuperReceiver()) { - superLoc = RefExpr->getReceiverLocation(); receiverType = RefExpr->getSuperReceiverType(); } else { assert(InstanceReceiver); @@ -570,19 +561,14 @@ ExprResult ObjCPropertyOpBuilder::buildSet(Expr *op, SourceLocation opcLoc, // Build a message-send. ExprResult msg; if (Setter->isInstanceMethod() || RefExpr->isObjectReceiver()) { - msg = S.BuildInstanceMessage(InstanceReceiver, receiverType, superLoc, - SetterSelector, Setter, - GenericLoc, GenericLoc, GenericLoc, - MultiExprArg(args, 1)); + msg = S.BuildInstanceMessageImplicit(InstanceReceiver, receiverType, + GenericLoc, SetterSelector, Setter, + MultiExprArg(args, 1)); } else { - TypeSourceInfo *receiverTypeInfo = 0; - if (!RefExpr->isSuperReceiver()) - receiverTypeInfo = S.Context.getTrivialTypeSourceInfo(receiverType); - - msg = S.BuildClassMessage(receiverTypeInfo, receiverType, superLoc, - SetterSelector, Setter, - GenericLoc, GenericLoc, GenericLoc, - MultiExprArg(args, 1)); + msg = S.BuildClassMessageImplicit(receiverType, RefExpr->isSuperReceiver(), + GenericLoc, + SetterSelector, Setter, + MultiExprArg(args, 1)); } if (!msg.isInvalid() && captureSetValueAsResult) { diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp index 65081c356085..bdb7cd54a131 100644 --- a/clang/lib/Serialization/ASTReaderStmt.cpp +++ b/clang/lib/Serialization/ASTReaderStmt.cpp @@ -879,6 +879,7 @@ void ASTStmtReader::VisitObjCMessageExpr(ObjCMessageExpr *E) { unsigned NumStoredSelLocs = Record[Idx++]; E->SelLocsKind = Record[Idx++]; E->setDelegateInitCall(Record[Idx++]); + E->IsImplicit = Record[Idx++]; ObjCMessageExpr::ReceiverKind Kind = static_cast(Record[Idx++]); switch (Kind) { diff --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp index 9f976f4a1064..e3202a783036 100644 --- a/clang/lib/Serialization/ASTWriterStmt.cpp +++ b/clang/lib/Serialization/ASTWriterStmt.cpp @@ -848,6 +848,7 @@ void ASTStmtWriter::VisitObjCMessageExpr(ObjCMessageExpr *E) { Record.push_back(E->getNumStoredSelLocs()); Record.push_back(E->SelLocsKind); Record.push_back(E->isDelegateInitCall()); + Record.push_back(E->IsImplicit); Record.push_back((unsigned)E->getReceiverKind()); // FIXME: stable encoding switch (E->getReceiverKind()) { case ObjCMessageExpr::Instance: diff --git a/clang/tools/libclang/IndexBody.cpp b/clang/tools/libclang/IndexBody.cpp index bac7e02514b2..177cad7ccaaf 100644 --- a/clang/tools/libclang/IndexBody.cpp +++ b/clang/tools/libclang/IndexBody.cpp @@ -10,7 +10,6 @@ #include "IndexingContext.h" #include "clang/AST/RecursiveASTVisitor.h" -#include "clang/Analysis/Support/SaveAndRestore.h" using namespace clang; using namespace cxindex; @@ -21,14 +20,12 @@ class BodyIndexer : public RecursiveASTVisitor { IndexingContext &IndexCtx; const NamedDecl *Parent; const DeclContext *ParentDC; - bool InPseudoObject; typedef RecursiveASTVisitor base; public: BodyIndexer(IndexingContext &indexCtx, const NamedDecl *Parent, const DeclContext *DC) - : IndexCtx(indexCtx), Parent(Parent), ParentDC(DC), - InPseudoObject(false) { } + : IndexCtx(indexCtx), Parent(Parent), ParentDC(DC) { } bool shouldWalkTypesOfTypeLocs() const { return false; } @@ -62,8 +59,8 @@ public: if (ObjCMethodDecl *MD = E->getMethodDecl()) IndexCtx.handleReference(MD, E->getSelectorStartLoc(), Parent, ParentDC, E, - InPseudoObject ? CXIdxEntityRef_Implicit - : CXIdxEntityRef_Direct); + E->isImplicit() ? CXIdxEntityRef_Implicit + : CXIdxEntityRef_Direct); return true; } @@ -82,11 +79,6 @@ public: return true; } - bool TraversePseudoObjectExpr(PseudoObjectExpr *E) { - SaveAndRestore InPseudo(InPseudoObject, true); - return base::TraversePseudoObjectExpr(E); - } - bool VisitCXXConstructExpr(CXXConstructExpr *E) { IndexCtx.handleReference(E->getConstructor(), E->getLocation(), Parent, ParentDC, E);