|
@@ -2716,7 +2716,8 @@ ObjCMessageExpr::ObjCMessageExpr(QualType T,
|
|
|
bool IsInstanceSuper,
|
|
|
QualType SuperType,
|
|
|
Selector Sel,
|
|
|
- SourceLocation SelLoc,
|
|
|
+ ArrayRef<SourceLocation> SelLocs,
|
|
|
+ SelectorLocationsKind SelLocsK,
|
|
|
ObjCMethodDecl *Method,
|
|
|
ArrayRef<Expr *> Args,
|
|
|
SourceLocation RBracLoc)
|
|
@@ -2728,12 +2729,10 @@ ObjCMessageExpr::ObjCMessageExpr(QualType T,
|
|
|
HasMethod(Method != 0), IsDelegateInitCall(false), SuperLoc(SuperLoc),
|
|
|
SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
|
|
|
: Sel.getAsOpaquePtr())),
|
|
|
- SelectorLoc(SelLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc)
|
|
|
+ LBracLoc(LBracLoc), RBracLoc(RBracLoc)
|
|
|
{
|
|
|
- setNumArgs(Args.size());
|
|
|
+ initArgsAndSelLocs(Args, SelLocs, SelLocsK);
|
|
|
setReceiverPointer(SuperType.getAsOpaquePtr());
|
|
|
- if (!Args.empty())
|
|
|
- std::copy(Args.begin(), Args.end(), getArgs());
|
|
|
}
|
|
|
|
|
|
ObjCMessageExpr::ObjCMessageExpr(QualType T,
|
|
@@ -2741,7 +2740,8 @@ ObjCMessageExpr::ObjCMessageExpr(QualType T,
|
|
|
SourceLocation LBracLoc,
|
|
|
TypeSourceInfo *Receiver,
|
|
|
Selector Sel,
|
|
|
- SourceLocation SelLoc,
|
|
|
+ ArrayRef<SourceLocation> SelLocs,
|
|
|
+ SelectorLocationsKind SelLocsK,
|
|
|
ObjCMethodDecl *Method,
|
|
|
ArrayRef<Expr *> Args,
|
|
|
SourceLocation RBracLoc)
|
|
@@ -2752,23 +2752,10 @@ ObjCMessageExpr::ObjCMessageExpr(QualType T,
|
|
|
HasMethod(Method != 0), IsDelegateInitCall(false),
|
|
|
SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
|
|
|
: Sel.getAsOpaquePtr())),
|
|
|
- SelectorLoc(SelLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc)
|
|
|
+ LBracLoc(LBracLoc), RBracLoc(RBracLoc)
|
|
|
{
|
|
|
- setNumArgs(Args.size());
|
|
|
+ initArgsAndSelLocs(Args, SelLocs, SelLocsK);
|
|
|
setReceiverPointer(Receiver);
|
|
|
- Expr **MyArgs = getArgs();
|
|
|
- for (unsigned I = 0; I != Args.size(); ++I) {
|
|
|
- if (Args[I]->isTypeDependent())
|
|
|
- ExprBits.TypeDependent = true;
|
|
|
- if (Args[I]->isValueDependent())
|
|
|
- ExprBits.ValueDependent = true;
|
|
|
- if (Args[I]->isInstantiationDependent())
|
|
|
- ExprBits.InstantiationDependent = true;
|
|
|
- if (Args[I]->containsUnexpandedParameterPack())
|
|
|
- ExprBits.ContainsUnexpandedParameterPack = true;
|
|
|
-
|
|
|
- MyArgs[I] = Args[I];
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
ObjCMessageExpr::ObjCMessageExpr(QualType T,
|
|
@@ -2776,7 +2763,8 @@ ObjCMessageExpr::ObjCMessageExpr(QualType T,
|
|
|
SourceLocation LBracLoc,
|
|
|
Expr *Receiver,
|
|
|
Selector Sel,
|
|
|
- SourceLocation SelLoc,
|
|
|
+ ArrayRef<SourceLocation> SelLocs,
|
|
|
+ SelectorLocationsKind SelLocsK,
|
|
|
ObjCMethodDecl *Method,
|
|
|
ArrayRef<Expr *> Args,
|
|
|
SourceLocation RBracLoc)
|
|
@@ -2788,10 +2776,16 @@ ObjCMessageExpr::ObjCMessageExpr(QualType T,
|
|
|
HasMethod(Method != 0), IsDelegateInitCall(false),
|
|
|
SelectorOrMethod(reinterpret_cast<uintptr_t>(Method? Method
|
|
|
: Sel.getAsOpaquePtr())),
|
|
|
- SelectorLoc(SelLoc), LBracLoc(LBracLoc), RBracLoc(RBracLoc)
|
|
|
+ LBracLoc(LBracLoc), RBracLoc(RBracLoc)
|
|
|
{
|
|
|
- setNumArgs(Args.size());
|
|
|
+ initArgsAndSelLocs(Args, SelLocs, SelLocsK);
|
|
|
setReceiverPointer(Receiver);
|
|
|
+}
|
|
|
+
|
|
|
+void ObjCMessageExpr::initArgsAndSelLocs(ArrayRef<Expr *> Args,
|
|
|
+ ArrayRef<SourceLocation> SelLocs,
|
|
|
+ SelectorLocationsKind SelLocsK) {
|
|
|
+ setNumArgs(Args.size());
|
|
|
Expr **MyArgs = getArgs();
|
|
|
for (unsigned I = 0; I != Args.size(); ++I) {
|
|
|
if (Args[I]->isTypeDependent())
|
|
@@ -2805,6 +2799,10 @@ ObjCMessageExpr::ObjCMessageExpr(QualType T,
|
|
|
|
|
|
MyArgs[I] = Args[I];
|
|
|
}
|
|
|
+
|
|
|
+ SelLocsKind = SelLocsK;
|
|
|
+ if (SelLocsK == SelLoc_NonStandard)
|
|
|
+ std::copy(SelLocs.begin(), SelLocs.end(), getStoredSelLocs());
|
|
|
}
|
|
|
|
|
|
ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
|
|
@@ -2818,12 +2816,11 @@ ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
|
|
|
ObjCMethodDecl *Method,
|
|
|
ArrayRef<Expr *> Args,
|
|
|
SourceLocation RBracLoc) {
|
|
|
- unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
|
|
|
- Args.size() * sizeof(Expr *);
|
|
|
- void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment);
|
|
|
+ SelectorLocationsKind SelLocsK;
|
|
|
+ ObjCMessageExpr *Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK);
|
|
|
return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, SuperLoc, IsInstanceSuper,
|
|
|
- SuperType, Sel, SelLocs.front(), Method,
|
|
|
- Args, RBracLoc);
|
|
|
+ SuperType, Sel, SelLocs, SelLocsK,
|
|
|
+ Method, Args, RBracLoc);
|
|
|
}
|
|
|
|
|
|
ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
|
|
@@ -2835,12 +2832,10 @@ ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
|
|
|
ObjCMethodDecl *Method,
|
|
|
ArrayRef<Expr *> Args,
|
|
|
SourceLocation RBracLoc) {
|
|
|
- unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
|
|
|
- Args.size() * sizeof(Expr *);
|
|
|
- void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment);
|
|
|
+ SelectorLocationsKind SelLocsK;
|
|
|
+ ObjCMessageExpr *Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK);
|
|
|
return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel,
|
|
|
- SelLocs.front(),
|
|
|
- Method, Args, RBracLoc);
|
|
|
+ SelLocs, SelLocsK, Method, Args, RBracLoc);
|
|
|
}
|
|
|
|
|
|
ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
|
|
@@ -2852,22 +2847,46 @@ ObjCMessageExpr *ObjCMessageExpr::Create(ASTContext &Context, QualType T,
|
|
|
ObjCMethodDecl *Method,
|
|
|
ArrayRef<Expr *> Args,
|
|
|
SourceLocation RBracLoc) {
|
|
|
- unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
|
|
|
- Args.size() * sizeof(Expr *);
|
|
|
- void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment);
|
|
|
+ SelectorLocationsKind SelLocsK;
|
|
|
+ ObjCMessageExpr *Mem = alloc(Context, Args, RBracLoc, SelLocs, Sel, SelLocsK);
|
|
|
return new (Mem) ObjCMessageExpr(T, VK, LBracLoc, Receiver, Sel,
|
|
|
- SelLocs.front(),
|
|
|
- Method, Args, RBracLoc);
|
|
|
+ SelLocs, SelLocsK, Method, Args, RBracLoc);
|
|
|
}
|
|
|
|
|
|
ObjCMessageExpr *ObjCMessageExpr::CreateEmpty(ASTContext &Context,
|
|
|
- unsigned NumArgs) {
|
|
|
- unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
|
|
|
- NumArgs * sizeof(Expr *);
|
|
|
- void *Mem = Context.Allocate(Size, llvm::AlignOf<ObjCMessageExpr>::Alignment);
|
|
|
+ unsigned NumArgs,
|
|
|
+ unsigned NumStoredSelLocs) {
|
|
|
+ ObjCMessageExpr *Mem = alloc(Context, NumArgs, NumStoredSelLocs);
|
|
|
return new (Mem) ObjCMessageExpr(EmptyShell(), NumArgs);
|
|
|
}
|
|
|
|
|
|
+ObjCMessageExpr *ObjCMessageExpr::alloc(ASTContext &C,
|
|
|
+ ArrayRef<Expr *> Args,
|
|
|
+ SourceLocation RBraceLoc,
|
|
|
+ ArrayRef<SourceLocation> SelLocs,
|
|
|
+ Selector Sel,
|
|
|
+ SelectorLocationsKind &SelLocsK) {
|
|
|
+ SelLocsK = hasStandardSelectorLocs(Sel, SelLocs, Args, RBraceLoc);
|
|
|
+ unsigned NumStoredSelLocs = (SelLocsK == SelLoc_NonStandard) ? SelLocs.size()
|
|
|
+ : 0;
|
|
|
+ return alloc(C, Args.size(), NumStoredSelLocs);
|
|
|
+}
|
|
|
+
|
|
|
+ObjCMessageExpr *ObjCMessageExpr::alloc(ASTContext &C,
|
|
|
+ unsigned NumArgs,
|
|
|
+ unsigned NumStoredSelLocs) {
|
|
|
+ unsigned Size = sizeof(ObjCMessageExpr) + sizeof(void *) +
|
|
|
+ NumArgs * sizeof(Expr *) + NumStoredSelLocs * sizeof(SourceLocation);
|
|
|
+ return (ObjCMessageExpr *)C.Allocate(Size,
|
|
|
+ llvm::AlignOf<ObjCMessageExpr>::Alignment);
|
|
|
+}
|
|
|
+
|
|
|
+void ObjCMessageExpr::getSelectorLocs(
|
|
|
+ SmallVectorImpl<SourceLocation> &SelLocs) const {
|
|
|
+ for (unsigned i = 0, e = getNumSelectorLocs(); i != e; ++i)
|
|
|
+ SelLocs.push_back(getSelectorLoc(i));
|
|
|
+}
|
|
|
+
|
|
|
SourceRange ObjCMessageExpr::getReceiverRange() const {
|
|
|
switch (getReceiverKind()) {
|
|
|
case Instance:
|