summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST
diff options
context:
space:
mode:
authorRichard Smith <richard-llvm@metafoo.co.uk>2019-06-04 21:29:28 +0000
committerRichard Smith <richard-llvm@metafoo.co.uk>2019-06-04 21:29:28 +0000
commitc32ef4bc0b17f79d96b672143d5e5fba9e39ea8d (patch)
treea0036f1fb40d62d882f4a7f7ab7b1bdb882a5375 /clang/lib/AST
parent8362518c6e51476a97f429477949c6d60d12d9bb (diff)
downloadbcm5719-llvm-c32ef4bc0b17f79d96b672143d5e5fba9e39ea8d.tar.gz
bcm5719-llvm-c32ef4bc0b17f79d96b672143d5e5fba9e39ea8d.zip
Convert MemberExpr creation and serialization to work the same way as
most / all other Expr subclasses. llvm-svn: 362551
Diffstat (limited to 'clang/lib/AST')
-rw-r--r--clang/lib/AST/DeclBase.cpp1
-rw-r--r--clang/lib/AST/Expr.cpp72
2 files changed, 53 insertions, 20 deletions
diff --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp
index 31985486d1d..f5853b49804 100644
--- a/clang/lib/AST/DeclBase.cpp
+++ b/clang/lib/AST/DeclBase.cpp
@@ -920,6 +920,7 @@ bool Decl::AccessDeclContextSanity() const {
if (isa<TranslationUnitDecl>(this) ||
isa<TemplateTypeParmDecl>(this) ||
isa<NonTypeTemplateParmDecl>(this) ||
+ !getDeclContext() ||
!isa<CXXRecordDecl>(getDeclContext()) ||
isInvalidDecl() ||
isa<StaticAssertDecl>(this) ||
diff --git a/clang/lib/AST/Expr.cpp b/clang/lib/AST/Expr.cpp
index 10829c70074..ee9d853f9f8 100644
--- a/clang/lib/AST/Expr.cpp
+++ b/clang/lib/AST/Expr.cpp
@@ -1538,29 +1538,44 @@ UnaryExprOrTypeTraitExpr::UnaryExprOrTypeTraitExpr(
}
}
+MemberExpr::MemberExpr(Expr *Base, bool IsArrow, SourceLocation OperatorLoc,
+ ValueDecl *MemberDecl,
+ const DeclarationNameInfo &NameInfo, QualType T,
+ ExprValueKind VK, ExprObjectKind OK)
+ : Expr(MemberExprClass, T, VK, OK, Base->isTypeDependent(),
+ Base->isValueDependent(), Base->isInstantiationDependent(),
+ Base->containsUnexpandedParameterPack()),
+ Base(Base), MemberDecl(MemberDecl), MemberDNLoc(NameInfo.getInfo()),
+ MemberLoc(NameInfo.getLoc()) {
+ assert(!NameInfo.getName() ||
+ MemberDecl->getDeclName() == NameInfo.getName());
+ MemberExprBits.IsArrow = IsArrow;
+ MemberExprBits.HasQualifierOrFoundDecl = false;
+ MemberExprBits.HasTemplateKWAndArgsInfo = false;
+ MemberExprBits.HadMultipleCandidates = false;
+ MemberExprBits.OperatorLoc = OperatorLoc;
+}
+
MemberExpr *MemberExpr::Create(
- const ASTContext &C, Expr *base, bool isarrow, SourceLocation OperatorLoc,
+ 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) {
-
- bool hasQualOrFound = (QualifierLoc ||
- founddecl.getDecl() != memberdecl ||
- founddecl.getAccess() != memberdecl->getAccess());
-
- bool HasTemplateKWAndArgsInfo = targs || TemplateKWLoc.isValid();
+ ValueDecl *MemberDecl, DeclAccessPair FoundDecl,
+ DeclarationNameInfo NameInfo, const TemplateArgumentListInfo *TemplateArgs,
+ QualType T, ExprValueKind VK, ExprObjectKind OK) {
+ bool HasQualOrFound = QualifierLoc || FoundDecl.getDecl() != MemberDecl ||
+ FoundDecl.getAccess() != MemberDecl->getAccess();
+ bool HasTemplateKWAndArgsInfo = TemplateArgs || TemplateKWLoc.isValid();
std::size_t Size =
totalSizeToAlloc<MemberExprNameQualifier, ASTTemplateKWAndArgsInfo,
- TemplateArgumentLoc>(hasQualOrFound ? 1 : 0,
- HasTemplateKWAndArgsInfo ? 1 : 0,
- targs ? targs->size() : 0);
+ TemplateArgumentLoc>(
+ HasQualOrFound ? 1 : 0, HasTemplateKWAndArgsInfo ? 1 : 0,
+ TemplateArgs ? TemplateArgs->size() : 0);
void *Mem = C.Allocate(Size, alignof(MemberExpr));
MemberExpr *E = new (Mem)
- MemberExpr(base, isarrow, OperatorLoc, memberdecl, nameinfo, ty, vk, ok);
+ MemberExpr(Base, IsArrow, OperatorLoc, MemberDecl, NameInfo, T, VK, OK);
- if (hasQualOrFound) {
+ if (HasQualOrFound) {
// FIXME: Wrong. We should be looking at the member declaration we found.
if (QualifierLoc && QualifierLoc.getNestedNameSpecifier()->isDependent()) {
E->setValueDependent(true);
@@ -1576,19 +1591,20 @@ MemberExpr *MemberExpr::Create(
MemberExprNameQualifier *NQ =
E->getTrailingObjects<MemberExprNameQualifier>();
NQ->QualifierLoc = QualifierLoc;
- NQ->FoundDecl = founddecl;
+ NQ->FoundDecl = FoundDecl;
}
E->MemberExprBits.HasTemplateKWAndArgsInfo =
- (targs || TemplateKWLoc.isValid());
+ TemplateArgs || TemplateKWLoc.isValid();
- if (targs) {
+ if (TemplateArgs) {
bool Dependent = false;
bool InstantiationDependent = false;
bool ContainsUnexpandedParameterPack = false;
E->getTrailingObjects<ASTTemplateKWAndArgsInfo>()->initializeFrom(
- TemplateKWLoc, *targs, E->getTrailingObjects<TemplateArgumentLoc>(),
- Dependent, InstantiationDependent, ContainsUnexpandedParameterPack);
+ TemplateKWLoc, *TemplateArgs,
+ E->getTrailingObjects<TemplateArgumentLoc>(), Dependent,
+ InstantiationDependent, ContainsUnexpandedParameterPack);
if (InstantiationDependent)
E->setInstantiationDependent(true);
} else if (TemplateKWLoc.isValid()) {
@@ -1599,6 +1615,22 @@ MemberExpr *MemberExpr::Create(
return E;
}
+MemberExpr *MemberExpr::CreateEmpty(const ASTContext &Context,
+ bool HasQualifier, bool HasFoundDecl,
+ bool HasTemplateKWAndArgsInfo,
+ unsigned NumTemplateArgs) {
+ assert((!NumTemplateArgs || HasTemplateKWAndArgsInfo) &&
+ "template args but no template arg info?");
+ bool HasQualOrFound = HasQualifier || HasFoundDecl;
+ std::size_t Size =
+ totalSizeToAlloc<MemberExprNameQualifier, ASTTemplateKWAndArgsInfo,
+ TemplateArgumentLoc>(HasQualOrFound ? 1 : 0,
+ HasTemplateKWAndArgsInfo ? 1 : 0,
+ NumTemplateArgs);
+ void *Mem = Context.Allocate(Size, alignof(MemberExpr));
+ return new (Mem) MemberExpr(EmptyShell());
+}
+
SourceLocation MemberExpr::getBeginLoc() const {
if (isImplicitAccess()) {
if (hasQualifier())
OpenPOWER on IntegriCloud