diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2019-06-06 23:24:18 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2019-06-06 23:24:18 +0000 |
commit | 0f5e4884231254c5acaaafa9e0a55e554ef67f73 (patch) | |
tree | e0d3691d64edb789f09c3b4b818e853153a0aa57 /lib/Sema/SemaExprMember.cpp | |
parent | ae3e0f386d742bffcf5b5e79dc0157f4c34571e2 (diff) | |
download | clang-0f5e4884231254c5acaaafa9e0a55e554ef67f73.tar.gz |
Factor out duplicated code building a MemberExpr and marking it
referenced.
This reinstates r362563, reverted in r362597.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@362757 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaExprMember.cpp')
-rw-r--r-- | lib/Sema/SemaExprMember.cpp | 71 |
1 files changed, 43 insertions, 28 deletions
diff --git a/lib/Sema/SemaExprMember.cpp b/lib/Sema/SemaExprMember.cpp index 3d7b8db2f6..f7b46a5e0f 100644 --- a/lib/Sema/SemaExprMember.cpp +++ b/lib/Sema/SemaExprMember.cpp @@ -893,18 +893,31 @@ BuildMSPropertyRefExpr(Sema &S, Expr *BaseExpr, bool IsArrow, NameInfo.getLoc()); } -/// Build a MemberExpr AST node. -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, OpLoc, SS.getWithLocInContext(C), TemplateKWLoc, Member, - FoundDecl, MemberNameInfo, TemplateArgs, Ty, VK, OK); - SemaRef.MarkMemberReferenced(E); +MemberExpr *Sema::BuildMemberExpr( + Expr *Base, bool IsArrow, SourceLocation OpLoc, const CXXScopeSpec *SS, + SourceLocation TemplateKWLoc, ValueDecl *Member, DeclAccessPair FoundDecl, + bool HadMultipleCandidates, const DeclarationNameInfo &MemberNameInfo, + QualType Ty, ExprValueKind VK, ExprObjectKind OK, + const TemplateArgumentListInfo *TemplateArgs) { + NestedNameSpecifierLoc NNS = + SS ? SS->getWithLocInContext(Context) : NestedNameSpecifierLoc(); + return BuildMemberExpr(Base, IsArrow, OpLoc, NNS, TemplateKWLoc, Member, + FoundDecl, HadMultipleCandidates, MemberNameInfo, Ty, + VK, OK, TemplateArgs); +} + +MemberExpr *Sema::BuildMemberExpr( + Expr *Base, bool IsArrow, SourceLocation OpLoc, NestedNameSpecifierLoc NNS, + SourceLocation TemplateKWLoc, ValueDecl *Member, DeclAccessPair FoundDecl, + bool HadMultipleCandidates, const DeclarationNameInfo &MemberNameInfo, + QualType Ty, ExprValueKind VK, ExprObjectKind OK, + const TemplateArgumentListInfo *TemplateArgs) { + assert((!IsArrow || Base->isRValue()) && "-> base must be a pointer rvalue"); + MemberExpr *E = MemberExpr::Create(Context, Base, IsArrow, OpLoc, NNS, + TemplateKWLoc, Member, FoundDecl, + MemberNameInfo, TemplateArgs, Ty, VK, OK); + E->setHadMultipleCandidates(HadMultipleCandidates); + MarkMemberReferenced(E); return E; } @@ -1115,10 +1128,10 @@ Sema::BuildMemberReferenceExpr(Expr *BaseExpr, QualType BaseExprType, OpLoc); if (VarDecl *Var = dyn_cast<VarDecl>(MemberDecl)) { - return BuildMemberExpr(*this, Context, BaseExpr, IsArrow, OpLoc, SS, - TemplateKWLoc, Var, FoundDecl, MemberNameInfo, - Var->getType().getNonReferenceType(), VK_LValue, - OK_Ordinary); + return BuildMemberExpr(BaseExpr, IsArrow, OpLoc, &SS, TemplateKWLoc, Var, + FoundDecl, /*MultipleCandidates=*/false, + MemberNameInfo, Var->getType().getNonReferenceType(), + VK_LValue, OK_Ordinary); } if (CXXMethodDecl *MemberFn = dyn_cast<CXXMethodDecl>(MemberDecl)) { @@ -1132,24 +1145,25 @@ Sema::BuildMemberReferenceExpr(Expr *BaseExpr, QualType BaseExprType, type = MemberFn->getType(); } - return BuildMemberExpr(*this, Context, BaseExpr, IsArrow, OpLoc, SS, - TemplateKWLoc, MemberFn, FoundDecl, MemberNameInfo, - type, valueKind, OK_Ordinary); + return BuildMemberExpr(BaseExpr, IsArrow, OpLoc, &SS, TemplateKWLoc, + MemberFn, FoundDecl, /*MultipleCandidates=*/false, + 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, OpLoc, SS, - TemplateKWLoc, Enum, FoundDecl, MemberNameInfo, - Enum->getType(), VK_RValue, OK_Ordinary); + return BuildMemberExpr(BaseExpr, IsArrow, OpLoc, &SS, TemplateKWLoc, Enum, + FoundDecl, /*MultipleCandidates=*/false, + MemberNameInfo, Enum->getType(), VK_RValue, + OK_Ordinary); } if (VarTemplateDecl *VarTempl = dyn_cast<VarTemplateDecl>(MemberDecl)) { if (VarDecl *Var = getVarTemplateSpecialization( *this, VarTempl, TemplateArgs, MemberNameInfo, TemplateKWLoc)) - return BuildMemberExpr(*this, Context, BaseExpr, IsArrow, OpLoc, SS, - TemplateKWLoc, Var, FoundDecl, MemberNameInfo, - Var->getType().getNonReferenceType(), VK_LValue, - OK_Ordinary); + return BuildMemberExpr( + BaseExpr, IsArrow, OpLoc, &SS, TemplateKWLoc, Var, FoundDecl, + /*MultipleCandidates=*/false, MemberNameInfo, + Var->getType().getNonReferenceType(), VK_LValue, OK_Ordinary); return ExprError(); } @@ -1805,9 +1819,10 @@ Sema::BuildFieldReferenceExpr(Expr *BaseExpr, bool IsArrow, } } - return BuildMemberExpr(*this, Context, Base.get(), IsArrow, OpLoc, SS, + return BuildMemberExpr(Base.get(), IsArrow, OpLoc, &SS, /*TemplateKWLoc=*/SourceLocation(), Field, FoundDecl, - MemberNameInfo, MemberType, VK, OK); + /*MultipleCandidates=*/false, MemberNameInfo, + MemberType, VK, OK); } /// Builds an implicit member access expression. The current context |