/// MemberLoc - This is the location of the member name.
SourceLocation MemberLoc;
+ /// This is the location of the -> or . in the expression.
+ SourceLocation OperatorLoc;
+
/// IsArrow - True if this is "X->F", false if this is "X.F".
bool IsArrow : 1;
}
public:
- MemberExpr(Expr *base, bool isarrow, ValueDecl *memberdecl,
- const DeclarationNameInfo &NameInfo, QualType ty,
- ExprValueKind VK, ExprObjectKind OK)
- : Expr(MemberExprClass, ty, VK, OK,
- base->isTypeDependent(),
- base->isValueDependent(),
- base->isInstantiationDependent(),
- base->containsUnexpandedParameterPack()),
- Base(base), MemberDecl(memberdecl), MemberDNLoc(NameInfo.getInfo()),
- MemberLoc(NameInfo.getLoc()), IsArrow(isarrow),
- HasQualifierOrFoundDecl(false), HasTemplateKWAndArgsInfo(false),
- HadMultipleCandidates(false) {
+ MemberExpr(Expr *base, bool isarrow, SourceLocation operatorloc,
+ ValueDecl *memberdecl, const DeclarationNameInfo &NameInfo,
+ QualType ty, ExprValueKind VK, ExprObjectKind OK)
+ : Expr(MemberExprClass, ty, VK, OK, base->isTypeDependent(),
+ base->isValueDependent(), base->isInstantiationDependent(),
+ base->containsUnexpandedParameterPack()),
+ Base(base), MemberDecl(memberdecl), MemberDNLoc(NameInfo.getInfo()),
+ MemberLoc(NameInfo.getLoc()), OperatorLoc(operatorloc),
+ IsArrow(isarrow), HasQualifierOrFoundDecl(false),
+ HasTemplateKWAndArgsInfo(false), HadMultipleCandidates(false) {
assert(memberdecl->getDeclName() == NameInfo.getName());
}
// the member name can not provide additional syntactic info
// (i.e., source locations for C++ operator names or type source info
// for constructors, destructors and conversion operators).
- MemberExpr(Expr *base, bool isarrow, ValueDecl *memberdecl,
- SourceLocation l, QualType ty,
+ MemberExpr(Expr *base, bool isarrow, SourceLocation operatorloc,
+ ValueDecl *memberdecl, SourceLocation l, QualType ty,
ExprValueKind VK, ExprObjectKind OK)
- : Expr(MemberExprClass, ty, VK, OK,
- base->isTypeDependent(), base->isValueDependent(),
- base->isInstantiationDependent(),
- base->containsUnexpandedParameterPack()),
- Base(base), MemberDecl(memberdecl), MemberDNLoc(), MemberLoc(l),
- IsArrow(isarrow),
- HasQualifierOrFoundDecl(false), HasTemplateKWAndArgsInfo(false),
- HadMultipleCandidates(false) {}
+ : Expr(MemberExprClass, ty, VK, OK, base->isTypeDependent(),
+ base->isValueDependent(), base->isInstantiationDependent(),
+ base->containsUnexpandedParameterPack()),
+ Base(base), MemberDecl(memberdecl), MemberDNLoc(), MemberLoc(l),
+ OperatorLoc(operatorloc), IsArrow(isarrow),
+ HasQualifierOrFoundDecl(false), HasTemplateKWAndArgsInfo(false),
+ HadMultipleCandidates(false) {}
static MemberExpr *Create(const ASTContext &C, Expr *base, bool isarrow,
+ SourceLocation OperatorLoc,
NestedNameSpecifierLoc QualifierLoc,
- SourceLocation TemplateKWLoc,
- ValueDecl *memberdecl, DeclAccessPair founddecl,
+ SourceLocation TemplateKWLoc, ValueDecl *memberdecl,
+ DeclAccessPair founddecl,
DeclarationNameInfo MemberNameInfo,
- const TemplateArgumentListInfo *targs,
- QualType ty, ExprValueKind VK, ExprObjectKind OK);
+ const TemplateArgumentListInfo *targs, QualType ty,
+ ExprValueKind VK, ExprObjectKind OK);
void setBase(Expr *E) { Base = E; }
Expr *getBase() const { return cast<Expr>(Base); }
MemberLoc, MemberDNLoc);
}
+ SourceLocation getOperatorLoc() const LLVM_READONLY { return OperatorLoc; }
+
bool isArrow() const { return IsArrow; }
void setArrow(bool A) { IsArrow = A; }
}
}
-MemberExpr *MemberExpr::Create(const ASTContext &C, Expr *base, bool isarrow,
- NestedNameSpecifierLoc QualifierLoc,
- SourceLocation TemplateKWLoc,
- ValueDecl *memberdecl,
- DeclAccessPair founddecl,
- DeclarationNameInfo nameinfo,
- const TemplateArgumentListInfo *targs,
- QualType ty,
- ExprValueKind vk,
- ExprObjectKind ok) {
+MemberExpr *MemberExpr::Create(
+ const ASTContext &C, Expr *base, bool isarrow, SourceLocation OperatorLoc,
+ NestedNameSpecifierLoc QualifierLoc, SourceLocation TemplateKWLoc,
+ ValueDecl *memberdecl, DeclAccessPair founddecl,
+ DeclarationNameInfo nameinfo, const TemplateArgumentListInfo *targs,
+ QualType ty, ExprValueKind vk, ExprObjectKind ok) {
std::size_t Size = sizeof(MemberExpr);
bool hasQualOrFound = (QualifierLoc ||
Size += ASTTemplateKWAndArgsInfo::sizeFor(0);
void *Mem = C.Allocate(Size, llvm::alignOf<MemberExpr>());
- MemberExpr *E = new (Mem) MemberExpr(base, isarrow, memberdecl, nameinfo,
- ty, vk, ok);
+ MemberExpr *E = new (Mem)
+ MemberExpr(base, isarrow, OperatorLoc, memberdecl, nameinfo, ty, vk, ok);
if (hasQualOrFound) {
// FIXME: Wrong. We should be looking at the member declaration we found.
FieldDecl *FD = FieldDecl::Create(*Context, nullptr, SourceLocation(),
SourceLocation(),
&Context->Idents.get(D->getNameAsString()),
- IvarT, nullptr,
- /*BitWidth=*/nullptr, /*Mutable=*/true,
- ICIS_NoInit);
- MemberExpr *ME = new (Context) MemberExpr(PE, true, FD, SourceLocation(),
- FD->getType(), VK_LValue,
- OK_Ordinary);
- IvarT = Context->getDecltypeType(ME, ME->getType());
- }
- }
+ IvarT, nullptr,\r
+ /*BitWidth=*/nullptr, /*Mutable=*/true,\r
+ ICIS_NoInit);\r
+ MemberExpr *ME = new (Context)\r
+ MemberExpr(PE, true, SourceLocation(), FD, SourceLocation(),\r
+ FD->getType(), VK_LValue, OK_Ordinary);\r
+ IvarT = Context->getDecltypeType(ME, ME->getType());\r
+ }\r
+ }\r
convertObjCTypeToCStyleType(IvarT);
QualType castT = Context->getPointerType(IvarT);
std::string TypeString(castT.getAsString(Context->getPrintingPolicy()));
FieldDecl *ARRFD = FieldDecl::Create(*Context, nullptr, SourceLocation(),
SourceLocation(),
&Context->Idents.get("arr"),
- Context->getPointerType(Context->VoidPtrTy),
- nullptr, /*BitWidth=*/nullptr,
- /*Mutable=*/true, ICIS_NoInit);
- MemberExpr *ArrayLiteralME =
- new (Context) MemberExpr(NSArrayCallExpr, false, ARRFD,
- SourceLocation(),
- ARRFD->getType(), VK_LValue,
- OK_Ordinary);
- QualType ConstIdT = Context->getObjCIdType().withConst();
- CStyleCastExpr * ArrayLiteralObjects =
- NoTypeInfoCStyleCastExpr(Context,
+ Context->getPointerType(Context->VoidPtrTy),\r
+ nullptr, /*BitWidth=*/nullptr,\r
+ /*Mutable=*/true, ICIS_NoInit);\r
+ MemberExpr *ArrayLiteralME = new (Context)\r
+ MemberExpr(NSArrayCallExpr, false, SourceLocation(), ARRFD,\r
+ SourceLocation(), ARRFD->getType(), VK_LValue, OK_Ordinary);\r
+ QualType ConstIdT = Context->getObjCIdType().withConst();\r
+ CStyleCastExpr * ArrayLiteralObjects = \r
+ NoTypeInfoCStyleCastExpr(Context, \r
Context->getPointerType(ConstIdT),
CK_BitCast,
ArrayLiteralME);
FieldDecl *ARRFD = FieldDecl::Create(*Context, nullptr, SourceLocation(),
SourceLocation(),
&Context->Idents.get("arr"),
- Context->getPointerType(Context->VoidPtrTy),
- nullptr, /*BitWidth=*/nullptr,
- /*Mutable=*/true, ICIS_NoInit);
- MemberExpr *DictLiteralValueME =
- new (Context) MemberExpr(NSValueCallExpr, false, ARRFD,
- SourceLocation(),
- ARRFD->getType(), VK_LValue,
- OK_Ordinary);
- QualType ConstIdT = Context->getObjCIdType().withConst();
- CStyleCastExpr * DictValueObjects =
- NoTypeInfoCStyleCastExpr(Context,
+ Context->getPointerType(Context->VoidPtrTy),\r
+ nullptr, /*BitWidth=*/nullptr,\r
+ /*Mutable=*/true, ICIS_NoInit);\r
+ MemberExpr *DictLiteralValueME = new (Context)\r
+ MemberExpr(NSValueCallExpr, false, SourceLocation(), ARRFD,\r
+ SourceLocation(), ARRFD->getType(), VK_LValue, OK_Ordinary);\r
+ QualType ConstIdT = Context->getObjCIdType().withConst();\r
+ CStyleCastExpr * DictValueObjects = \r
+ NoTypeInfoCStyleCastExpr(Context, \r
Context->getPointerType(ConstIdT),
CK_BitCast,
DictLiteralValueME);
// (const id <NSCopying> [])keys
- Expr *NSKeyCallExpr =
- new (Context) CallExpr(*Context, NSDictDRE, KeyExprs,
- NSDictFType, VK_LValue, SourceLocation());
-
- MemberExpr *DictLiteralKeyME =
- new (Context) MemberExpr(NSKeyCallExpr, false, ARRFD,
- SourceLocation(),
- ARRFD->getType(), VK_LValue,
- OK_Ordinary);
-
- CStyleCastExpr * DictKeyObjects =
- NoTypeInfoCStyleCastExpr(Context,
- Context->getPointerType(ConstIdT),
+ Expr *NSKeyCallExpr = \r
+ new (Context) CallExpr(*Context, NSDictDRE, KeyExprs,\r
+ NSDictFType, VK_LValue, SourceLocation());\r
+\r
+ MemberExpr *DictLiteralKeyME = new (Context)\r
+ MemberExpr(NSKeyCallExpr, false, SourceLocation(), ARRFD,\r
+ SourceLocation(), ARRFD->getType(), VK_LValue, OK_Ordinary);\r
+\r
+ CStyleCastExpr * DictKeyObjects = \r
+ NoTypeInfoCStyleCastExpr(Context, \r
+ Context->getPointerType(ConstIdT),\r
CK_BitCast,
DictLiteralKeyME);
FieldDecl *FieldD = FieldDecl::Create(*Context, nullptr, SourceLocation(),
SourceLocation(),
&Context->Idents.get("s"),
- returnType, nullptr,
- /*BitWidth=*/nullptr,
- /*Mutable=*/true, ICIS_NoInit);
- MemberExpr *ME = new (Context) MemberExpr(STCE, false, FieldD, SourceLocation(),
- FieldD->getType(), VK_LValue,
- OK_Ordinary);
-
- return ME;
-}
+ returnType, nullptr,\r
+ /*BitWidth=*/nullptr,\r
+ /*Mutable=*/true, ICIS_NoInit);\r
+ MemberExpr *ME = new (Context)\r
+ MemberExpr(STCE, false, SourceLocation(), FieldD, SourceLocation(),\r
+ FieldD->getType(), VK_LValue, OK_Ordinary);\r
+\r
+ return ME;\r
+}\r
Stmt *RewriteModernObjC::SynthMessageExpr(ObjCMessageExpr *Exp,
SourceLocation StartLoc,
FieldDecl *FD = FieldDecl::Create(*Context, nullptr, SourceLocation(),
SourceLocation(),
&Context->Idents.get("FuncPtr"),
- Context->VoidPtrTy, nullptr,
- /*BitWidth=*/nullptr, /*Mutable=*/true,
- ICIS_NoInit);
- MemberExpr *ME = new (Context) MemberExpr(PE, true, FD, SourceLocation(),
- FD->getType(), VK_LValue,
- OK_Ordinary);
-
-
- CastExpr *FunkCast = NoTypeInfoCStyleCastExpr(Context, PtrToFuncCastType,
- CK_BitCast, ME);
- PE = new (Context) ParenExpr(SourceLocation(), SourceLocation(), FunkCast);
+ Context->VoidPtrTy, nullptr,\r
+ /*BitWidth=*/nullptr, /*Mutable=*/true,\r
+ ICIS_NoInit);\r
+ MemberExpr *ME =\r
+ new (Context) MemberExpr(PE, true, SourceLocation(), FD, SourceLocation(),\r
+ FD->getType(), VK_LValue, OK_Ordinary);\r
+\r
+ CastExpr *FunkCast = NoTypeInfoCStyleCastExpr(Context, PtrToFuncCastType,\r
+ CK_BitCast, ME);\r
+ PE = new (Context) ParenExpr(SourceLocation(), SourceLocation(), FunkCast);\r
SmallVector<Expr*, 8> BlkExprs;
// Add the implicit argument.
FieldDecl *FD = FieldDecl::Create(*Context, nullptr, SourceLocation(),
SourceLocation(),
&Context->Idents.get("__forwarding"),
- Context->VoidPtrTy, nullptr,
- /*BitWidth=*/nullptr, /*Mutable=*/true,
- ICIS_NoInit);
- MemberExpr *ME = new (Context) MemberExpr(DeclRefExp, isArrow,
- FD, SourceLocation(),
- FD->getType(), VK_LValue,
- OK_Ordinary);
-
- StringRef Name = VD->getName();
- FD = FieldDecl::Create(*Context, nullptr, SourceLocation(), SourceLocation(),
+ Context->VoidPtrTy, nullptr,\r
+ /*BitWidth=*/nullptr, /*Mutable=*/true,\r
+ ICIS_NoInit);\r
+ MemberExpr *ME = new (Context)\r
+ MemberExpr(DeclRefExp, isArrow, SourceLocation(), FD, SourceLocation(),\r
+ FD->getType(), VK_LValue, OK_Ordinary);\r
+\r
+ StringRef Name = VD->getName();\r
+ FD = FieldDecl::Create(*Context, nullptr, SourceLocation(), SourceLocation(),\r
&Context->Idents.get(Name),
- Context->VoidPtrTy, nullptr,
- /*BitWidth=*/nullptr, /*Mutable=*/true,
- ICIS_NoInit);
- ME = new (Context) MemberExpr(ME, true, FD, SourceLocation(),
- DeclRefExp->getType(), VK_LValue, OK_Ordinary);
-
-
-
- // Need parens to enforce precedence.
- ParenExpr *PE = new (Context) ParenExpr(DeclRefExp->getExprLoc(),
- DeclRefExp->getExprLoc(),
+ Context->VoidPtrTy, nullptr,\r
+ /*BitWidth=*/nullptr, /*Mutable=*/true,\r
+ ICIS_NoInit);\r
+ ME =\r
+ new (Context) MemberExpr(ME, true, SourceLocation(), FD, SourceLocation(),\r
+ DeclRefExp->getType(), VK_LValue, OK_Ordinary);\r
+\r
+ // Need parens to enforce precedence.\r
+ ParenExpr *PE = new (Context) ParenExpr(DeclRefExp->getExprLoc(), \r
+ DeclRefExp->getExprLoc(), \r
ME);
ReplaceStmt(DeclRefExp, PE);
return PE;
FieldDecl *FD = FieldDecl::Create(*Context, nullptr, SourceLocation(),
SourceLocation(),
&Context->Idents.get(D->getNameAsString()),
- IvarT, nullptr,
- /*BitWidth=*/nullptr,
- /*Mutable=*/true, ICIS_NoInit);
- MemberExpr *ME = new (Context) MemberExpr(PE, true, FD, SourceLocation(),
- FD->getType(), VK_LValue,
- OK_Ordinary);
- IvarT = Context->getDecltypeType(ME, ME->getType());
- }
- }
+ IvarT, nullptr,\r
+ /*BitWidth=*/nullptr,\r
+ /*Mutable=*/true, ICIS_NoInit);\r
+ MemberExpr *ME = new (Context)\r
+ MemberExpr(PE, true, SourceLocation(), FD, SourceLocation(),\r
+ FD->getType(), VK_LValue, OK_Ordinary);\r
+ IvarT = Context->getDecltypeType(ME, ME->getType());\r
+ }\r
+ }\r
convertObjCTypeToCStyleType(IvarT);
QualType castT = Context->getPointerType(IvarT);
FieldDecl *FD = FieldDecl::Create(*Context, nullptr, SourceLocation(),
SourceLocation(),
&Context->Idents.get(D->getNameAsString()),
- D->getType(), nullptr,
- /*BitWidth=*/D->getBitWidth(),
- /*Mutable=*/true, ICIS_NoInit);
- MemberExpr *ME = new (Context) MemberExpr(PE, /*isArrow*/false, FD, SourceLocation(),
- FD->getType(), VK_LValue,
- OK_Ordinary);
- Replacement = ME;
-
- }
+ D->getType(), nullptr,\r
+ /*BitWidth=*/D->getBitWidth(),\r
+ /*Mutable=*/true, ICIS_NoInit);\r
+ MemberExpr *ME = new (Context)\r
+ MemberExpr(PE, /*isArrow*/ false, SourceLocation(), FD,\r
+ SourceLocation(), FD->getType(), VK_LValue, OK_Ordinary);\r
+ Replacement = ME;\r
+\r
+ }\r
else
Replacement = PE;
}
FieldDecl *FD = FieldDecl::Create(*Context, nullptr, SourceLocation(),
SourceLocation(),
&Context->Idents.get("FuncPtr"),
- Context->VoidPtrTy, nullptr,
- /*BitWidth=*/nullptr, /*Mutable=*/true,
- ICIS_NoInit);
- MemberExpr *ME = new (Context) MemberExpr(PE, true, FD, SourceLocation(),
- FD->getType(), VK_LValue,
- OK_Ordinary);
-
-
- CastExpr *FunkCast = NoTypeInfoCStyleCastExpr(Context, PtrToFuncCastType,
- CK_BitCast, ME);
- PE = new (Context) ParenExpr(SourceLocation(), SourceLocation(), FunkCast);
+ Context->VoidPtrTy, nullptr,\r
+ /*BitWidth=*/nullptr, /*Mutable=*/true,\r
+ ICIS_NoInit);\r
+ MemberExpr *ME =\r
+ new (Context) MemberExpr(PE, true, SourceLocation(), FD, SourceLocation(),\r
+ FD->getType(), VK_LValue, OK_Ordinary);\r
+\r
+ CastExpr *FunkCast = NoTypeInfoCStyleCastExpr(Context, PtrToFuncCastType,\r
+ CK_BitCast, ME);\r
+ PE = new (Context) ParenExpr(SourceLocation(), SourceLocation(), FunkCast);\r
SmallVector<Expr*, 8> BlkExprs;
// Add the implicit argument.
FieldDecl *FD = FieldDecl::Create(*Context, nullptr, SourceLocation(),
SourceLocation(),
&Context->Idents.get("__forwarding"),
- Context->VoidPtrTy, nullptr,
- /*BitWidth=*/nullptr, /*Mutable=*/true,
- ICIS_NoInit);
- MemberExpr *ME = new (Context) MemberExpr(DeclRefExp, isArrow,
- FD, SourceLocation(),
- FD->getType(), VK_LValue,
- OK_Ordinary);
-
- StringRef Name = VD->getName();
- FD = FieldDecl::Create(*Context, nullptr, SourceLocation(), SourceLocation(),
+ Context->VoidPtrTy, nullptr,\r
+ /*BitWidth=*/nullptr, /*Mutable=*/true,\r
+ ICIS_NoInit);\r
+ MemberExpr *ME = new (Context)\r
+ MemberExpr(DeclRefExp, isArrow, SourceLocation(), FD, SourceLocation(),\r
+ FD->getType(), VK_LValue, OK_Ordinary);\r
+\r
+ StringRef Name = VD->getName();\r
+ FD = FieldDecl::Create(*Context, nullptr, SourceLocation(), SourceLocation(),\r
&Context->Idents.get(Name),
- Context->VoidPtrTy, nullptr,
- /*BitWidth=*/nullptr, /*Mutable=*/true,
- ICIS_NoInit);
- ME = new (Context) MemberExpr(ME, true, FD, SourceLocation(),
- DeclRefExp->getType(), VK_LValue, OK_Ordinary);
-
-
-
- // Need parens to enforce precedence.
- ParenExpr *PE = new (Context) ParenExpr(DeclRefExp->getExprLoc(),
- DeclRefExp->getExprLoc(),
+ Context->VoidPtrTy, nullptr,\r
+ /*BitWidth=*/nullptr, /*Mutable=*/true,\r
+ ICIS_NoInit);\r
+ ME =\r
+ new (Context) MemberExpr(ME, true, SourceLocation(), FD, SourceLocation(),\r
+ DeclRefExp->getType(), VK_LValue, OK_Ordinary);\r
+\r
+ // Need parens to enforce precedence.\r
+ ParenExpr *PE = new (Context) ParenExpr(DeclRefExp->getExprLoc(), \r
+ DeclRefExp->getExprLoc(), \r
ME);
ReplaceStmt(DeclRefExp, PE);
return PE;
// Don't forget the parens to enforce the proper binding.
ParenExpr *PE = new (Context) ParenExpr(OldRange.getBegin(),
OldRange.getEnd(),
- castExpr);
- if (IV->isFreeIvar() &&
- declaresSameEntity(CurMethodDef->getClassInterface(), iFaceDecl->getDecl())) {
- MemberExpr *ME = new (Context) MemberExpr(PE, true, D,
- IV->getLocation(),
- D->getType(),
- VK_LValue, OK_Ordinary);
- Replacement = ME;
- } else {
- IV->setBase(PE);
+ castExpr);\r
+ if (IV->isFreeIvar() &&\r
+ declaresSameEntity(CurMethodDef->getClassInterface(), iFaceDecl->getDecl())) {\r
+ MemberExpr *ME = new (Context)\r
+ MemberExpr(PE, true, SourceLocation(), D, IV->getLocation(),\r
+ D->getType(), VK_LValue, OK_Ordinary);\r
+ Replacement = ME;\r
+ } else {\r
+ IV->setBase(PE);\r
}
}
} else { // we are outside a method.
if (Exp.isInvalid())
return true;
- MemberExpr *ME =
- new (Context) MemberExpr(Exp.get(), /*IsArrow=*/false, Method,
- SourceLocation(), Context.BoundMemberTy,
- VK_RValue, OK_Ordinary);
+ MemberExpr *ME = new (Context) MemberExpr(
+ Exp.get(), /*IsArrow=*/false, SourceLocation(), Method, SourceLocation(),
+ Context.BoundMemberTy, VK_RValue, OK_Ordinary);
if (HadMultipleCandidates)
ME->setHadMultipleCandidates(true);
MarkMemberReferenced(ME);
static ExprResult
BuildFieldReferenceExpr(Sema &S, Expr *BaseExpr, bool IsArrow,
- const CXXScopeSpec &SS, FieldDecl *Field,
- DeclAccessPair FoundDecl,
+ SourceLocation OpLoc, const CXXScopeSpec &SS,
+ FieldDecl *Field, DeclAccessPair FoundDecl,
const DeclarationNameInfo &MemberNameInfo);
ExprResult
// Make a nameInfo that properly uses the anonymous name.
DeclarationNameInfo memberNameInfo(field->getDeclName(), loc);
-
+
result = BuildFieldReferenceExpr(*this, result, baseObjectIsPointer,
- EmptySS, field, foundDecl,
- memberNameInfo).get();
+ SourceLocation(), EmptySS, field,
+ foundDecl, memberNameInfo).get();
if (!result)
return ExprError();
DeclAccessPair fakeFoundDecl =
DeclAccessPair::make(field, field->getAccess());
- result = BuildFieldReferenceExpr(*this, result, /*isarrow*/ false,
- (FI == FEnd? SS : EmptySS), field,
- fakeFoundDecl, memberNameInfo).get();
+ result =
+ BuildFieldReferenceExpr(*this, result, /*isarrow*/ false,
+ SourceLocation(), (FI == FEnd ? SS : EmptySS),
+ field, fakeFoundDecl, memberNameInfo).get();
}
return result;
}
/// \brief Build a MemberExpr AST node.
-static MemberExpr *
-BuildMemberExpr(Sema &SemaRef, ASTContext &C, Expr *Base, bool isArrow,
- const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
- ValueDecl *Member, DeclAccessPair FoundDecl,
- const DeclarationNameInfo &MemberNameInfo, QualType Ty,
- ExprValueKind VK, ExprObjectKind OK,
- const TemplateArgumentListInfo *TemplateArgs = nullptr) {
+static MemberExpr *BuildMemberExpr(
+ Sema &SemaRef, ASTContext &C, Expr *Base, bool isArrow,
+ SourceLocation OpLoc, const CXXScopeSpec &SS, SourceLocation TemplateKWLoc,
+ ValueDecl *Member, DeclAccessPair FoundDecl,
+ const DeclarationNameInfo &MemberNameInfo, QualType Ty, ExprValueKind VK,
+ ExprObjectKind OK, const TemplateArgumentListInfo *TemplateArgs = nullptr) {
assert((!isArrow || Base->isRValue()) && "-> base must be a pointer rvalue");
- MemberExpr *E =
- MemberExpr::Create(C, Base, isArrow, SS.getWithLocInContext(C),
- TemplateKWLoc, Member, FoundDecl, MemberNameInfo,
- TemplateArgs, Ty, VK, OK);
+ MemberExpr *E = MemberExpr::Create(
+ C, Base, isArrow, OpLoc, SS.getWithLocInContext(C), TemplateKWLoc, Member,
+ FoundDecl, MemberNameInfo, TemplateArgs, Ty, VK, OK);
SemaRef.MarkMemberReferenced(E);
return E;
}
return ExprError();
if (FieldDecl *FD = dyn_cast<FieldDecl>(MemberDecl))
- return BuildFieldReferenceExpr(*this, BaseExpr, IsArrow,
- SS, FD, FoundDecl, MemberNameInfo);
+ return BuildFieldReferenceExpr(*this, BaseExpr, IsArrow, OpLoc, SS, FD,
+ FoundDecl, MemberNameInfo);
if (MSPropertyDecl *PD = dyn_cast<MSPropertyDecl>(MemberDecl))
return BuildMSPropertyRefExpr(*this, BaseExpr, IsArrow, SS, PD,
OpLoc);
if (VarDecl *Var = dyn_cast<VarDecl>(MemberDecl)) {
- return BuildMemberExpr(*this, Context, BaseExpr, IsArrow, SS, TemplateKWLoc,
- Var, FoundDecl, MemberNameInfo,
+ return BuildMemberExpr(*this, Context, BaseExpr, IsArrow, OpLoc, SS,
+ TemplateKWLoc, Var, FoundDecl, MemberNameInfo,
Var->getType().getNonReferenceType(), VK_LValue,
OK_Ordinary);
}
type = MemberFn->getType();
}
- return BuildMemberExpr(*this, Context, BaseExpr, IsArrow, SS, TemplateKWLoc,
- MemberFn, FoundDecl, MemberNameInfo, type, valueKind,
- OK_Ordinary);
+ return BuildMemberExpr(*this, Context, BaseExpr, IsArrow, OpLoc, SS,
+ TemplateKWLoc, MemberFn, FoundDecl, MemberNameInfo,
+ type, valueKind, OK_Ordinary);
}
assert(!isa<FunctionDecl>(MemberDecl) && "member function not C++ method?");
if (EnumConstantDecl *Enum = dyn_cast<EnumConstantDecl>(MemberDecl)) {
- return BuildMemberExpr(*this, Context, BaseExpr, IsArrow, SS, TemplateKWLoc,
- Enum, FoundDecl, MemberNameInfo, Enum->getType(),
- VK_RValue, OK_Ordinary);
+ return BuildMemberExpr(*this, Context, BaseExpr, IsArrow, OpLoc, SS,
+ TemplateKWLoc, Enum, FoundDecl, MemberNameInfo,
+ Enum->getType(), VK_RValue, OK_Ordinary);
}
// We found something that we didn't expect. Complain.
static ExprResult
BuildFieldReferenceExpr(Sema &S, Expr *BaseExpr, bool IsArrow,
- const CXXScopeSpec &SS, FieldDecl *Field,
- DeclAccessPair FoundDecl,
+ SourceLocation OpLoc, const CXXScopeSpec &SS,
+ FieldDecl *Field, DeclAccessPair FoundDecl,
const DeclarationNameInfo &MemberNameInfo) {
// x.a is an l-value if 'a' has a reference type. Otherwise:
// x.a is an l-value/x-value/pr-value if the base is (and note
FoundDecl, Field);
if (Base.isInvalid())
return ExprError();
- return BuildMemberExpr(S, S.Context, Base.get(), IsArrow, SS,
+ return BuildMemberExpr(S, S.Context, Base.get(), IsArrow, OpLoc, SS,
/*TemplateKWLoc=*/SourceLocation(), Field, FoundDecl,
MemberNameInfo, MemberType, VK, OK);
}
type = Fn->getType();
} else {
valueKind = VK_RValue;
- type = Context.BoundMemberTy;
- }
-
- MemberExpr *ME = MemberExpr::Create(Context, Base,
- MemExpr->isArrow(),
- MemExpr->getQualifierLoc(),
- MemExpr->getTemplateKeywordLoc(),
- Fn,
- Found,
- MemExpr->getMemberNameInfo(),
- TemplateArgs,
- type, valueKind, OK_Ordinary);
- ME->setHadMultipleCandidates(true);
- MarkMemberReferenced(ME);
- return ME;
+ type = Context.BoundMemberTy;\r
+ }\r
+\r
+ MemberExpr *ME = MemberExpr::Create(\r
+ Context, Base, MemExpr->isArrow(), MemExpr->getOperatorLoc(),\r
+ MemExpr->getQualifierLoc(), MemExpr->getTemplateKeywordLoc(), Fn, Found,\r
+ MemExpr->getMemberNameInfo(), TemplateArgs, type, valueKind,\r
+ OK_Ordinary);\r
+ ME->setHadMultipleCandidates(true);\r
+ MarkMemberReferenced(ME);\r
+ return ME;\r
}
llvm_unreachable("Invalid reference to overloaded function");
return ExprError();
Base = BaseResult.get();
ExprValueKind VK = isArrow ? VK_LValue : Base->getValueKind();
- MemberExpr *ME =
- new (getSema().Context) MemberExpr(Base, isArrow,
- Member, MemberNameInfo,
- cast<FieldDecl>(Member)->getType(),
- VK, OK_Ordinary);
+ MemberExpr *ME = new (getSema().Context)
+ MemberExpr(Base, isArrow, OpLoc, Member, MemberNameInfo,
+ cast<FieldDecl>(Member)->getType(), VK, OK_Ordinary);
return ME;
}
ExprObjectKind OK = static_cast<ExprObjectKind>(Record[Idx++]);
Expr *Base = ReadSubExpr();
ValueDecl *MemberD = ReadDeclAs<ValueDecl>(F, Record, Idx);
- SourceLocation MemberLoc = ReadSourceLocation(F, Record, Idx);
- DeclarationNameInfo MemberNameInfo(MemberD->getDeclName(), MemberLoc);
- bool IsArrow = Record[Idx++];
-
- S = MemberExpr::Create(Context, Base, IsArrow, QualifierLoc,
- TemplateKWLoc, MemberD, FoundDecl, MemberNameInfo,
- HasTemplateKWAndArgsInfo ? &ArgInfo : nullptr,
- T, VK, OK);
- ReadDeclarationNameLoc(F, cast<MemberExpr>(S)->MemberDNLoc,
- MemberD->getDeclName(), Record, Idx);
- if (HadMultipleCandidates)
+ SourceLocation MemberLoc = ReadSourceLocation(F, Record, Idx);\r
+ DeclarationNameInfo MemberNameInfo(MemberD->getDeclName(), MemberLoc);\r
+ bool IsArrow = Record[Idx++];\r
+ SourceLocation OperatorLoc = ReadSourceLocation(F, Record, Idx);\r
+\r
+ S = MemberExpr::Create(Context, Base, IsArrow, OperatorLoc, QualifierLoc,\r
+ TemplateKWLoc, MemberD, FoundDecl, MemberNameInfo,\r
+ HasTemplateKWAndArgsInfo ? &ArgInfo : nullptr, T,\r
+ VK, OK);\r
+ ReadDeclarationNameLoc(F, cast<MemberExpr>(S)->MemberDNLoc,\r
+ MemberD->getDeclName(), Record, Idx);\r
+ if (HadMultipleCandidates)\r
cast<MemberExpr>(S)->setHadMultipleCandidates(true);
break;
}
Record.push_back(E->getValueKind());
Record.push_back(E->getObjectKind());
Writer.AddStmt(E->getBase());
- Writer.AddDeclRef(E->getMemberDecl(), Record);
- Writer.AddSourceLocation(E->getMemberLoc(), Record);
- Record.push_back(E->isArrow());
- Writer.AddDeclarationNameLoc(E->MemberDNLoc,
- E->getMemberDecl()->getDeclName(), Record);
- Code = serialization::EXPR_MEMBER;
+ Writer.AddDeclRef(E->getMemberDecl(), Record);\r
+ Writer.AddSourceLocation(E->getMemberLoc(), Record);\r
+ Record.push_back(E->isArrow());\r
+ Writer.AddSourceLocation(E->getOperatorLoc(), Record);\r
+ Writer.AddDeclarationNameLoc(E->MemberDNLoc,\r
+ E->getMemberDecl()->getDeclName(), Record);\r
+ Code = serialization::EXPR_MEMBER;\r
}
void ASTStmtWriter::VisitObjCIsaExpr(ObjCIsaExpr *E) {
Verifier.expectRange(2, 30, 2, 30);
EXPECT_TRUE(Verifier.match("struct S { operator int() const; };\n"
"int foo(const S& s) { return s; }",
- memberExpr()));
-}
-
-TEST(VarDecl, VMTypeFixedVarDeclRange) {
- RangeVerifier<VarDecl> Verifier;
- Verifier.expectRange(1, 1, 1, 23);
+ memberExpr()));\r
+}\r
+\r
+class MemberExprArrowLocVerifier : public RangeVerifier<MemberExpr> {\r
+protected:\r
+ virtual SourceRange getRange(const MemberExpr &Node) {\r
+ return Node.getOperatorLoc();\r
+ }\r
+};\r
+\r
+TEST(MemberExpr, ArrowRange) {\r
+ MemberExprArrowLocVerifier Verifier;\r
+ Verifier.expectRange(2, 19, 2, 19);\r
+ EXPECT_TRUE(Verifier.match("struct S { int x; };\n"\r
+ "void foo(S *s) { s->x = 0; }",\r
+ memberExpr()));\r
+}\r
+\r
+TEST(MemberExpr, MacroArrowRange) {\r
+ MemberExprArrowLocVerifier Verifier;\r
+ Verifier.expectRange(1, 24, 1, 24);\r
+ EXPECT_TRUE(Verifier.match("#define MEMBER(a, b) (a->b)\n"\r
+ "struct S { int x; };\n"\r
+ "void foo(S *s) { MEMBER(s, x) = 0; }",\r
+ memberExpr()));\r
+}\r
+\r
+TEST(MemberExpr, ImplicitArrowRange) {\r
+ MemberExprArrowLocVerifier Verifier;\r
+ Verifier.expectRange(0, 0, 0, 0);\r
+ EXPECT_TRUE(Verifier.match("struct S { int x; void Test(); };\n"\r
+ "void S::Test() { x = 1; }",\r
+ memberExpr()));\r
+}\r
+\r
+TEST(VarDecl, VMTypeFixedVarDeclRange) {\r
+ RangeVerifier<VarDecl> Verifier;\r
+ Verifier.expectRange(1, 1, 1, 23);\r
EXPECT_TRUE(Verifier.match("int a[(int)(void*)1234];",
varDecl(), Lang_C89));
}