diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2019-06-04 21:29:28 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2019-06-04 21:29:28 +0000 |
commit | c32ef4bc0b17f79d96b672143d5e5fba9e39ea8d (patch) | |
tree | a0036f1fb40d62d882f4a7f7ab7b1bdb882a5375 /clang/lib/Serialization/ASTWriterStmt.cpp | |
parent | 8362518c6e51476a97f429477949c6d60d12d9bb (diff) | |
download | bcm5719-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/Serialization/ASTWriterStmt.cpp')
-rw-r--r-- | clang/lib/Serialization/ASTWriterStmt.cpp | 56 |
1 files changed, 31 insertions, 25 deletions
diff --git a/clang/lib/Serialization/ASTWriterStmt.cpp b/clang/lib/Serialization/ASTWriterStmt.cpp index 776aab6bf51..d52a4a85b32 100644 --- a/clang/lib/Serialization/ASTWriterStmt.cpp +++ b/clang/lib/Serialization/ASTWriterStmt.cpp @@ -660,39 +660,45 @@ void ASTStmtWriter::VisitCallExpr(CallExpr *E) { } void ASTStmtWriter::VisitMemberExpr(MemberExpr *E) { - // Don't call VisitExpr, we'll write everything here. - - Record.push_back(E->hasQualifier()); - if (E->hasQualifier()) - Record.AddNestedNameSpecifierLoc(E->getQualifierLoc()); - - Record.push_back(E->hasTemplateKWAndArgsInfo()); - if (E->hasTemplateKWAndArgsInfo()) { - Record.AddSourceLocation(E->getTemplateKeywordLoc()); - unsigned NumTemplateArgs = E->getNumTemplateArgs(); - Record.push_back(NumTemplateArgs); - Record.AddSourceLocation(E->getLAngleLoc()); - Record.AddSourceLocation(E->getRAngleLoc()); - for (unsigned i=0; i != NumTemplateArgs; ++i) - Record.AddTemplateArgumentLoc(E->getTemplateArgs()[i]); - } + VisitExpr(E); - Record.push_back(E->hadMultipleCandidates()); + bool HasQualifier = E->hasQualifier(); + bool HasFoundDecl = + E->hasQualifierOrFoundDecl() && + (E->getFoundDecl().getDecl() != E->getMemberDecl() || + E->getFoundDecl().getAccess() != E->getMemberDecl()->getAccess()); + bool HasTemplateInfo = E->hasTemplateKWAndArgsInfo(); + unsigned NumTemplateArgs = E->getNumTemplateArgs(); - DeclAccessPair FoundDecl = E->getFoundDecl(); - Record.AddDeclRef(FoundDecl.getDecl()); - Record.push_back(FoundDecl.getAccess()); + // Write these first for easy access when deserializing, as they affect the + // size of the MemberExpr. + Record.push_back(HasQualifier); + Record.push_back(HasFoundDecl); + Record.push_back(HasTemplateInfo); + Record.push_back(NumTemplateArgs); - Record.AddTypeRef(E->getType()); - Record.push_back(E->getValueKind()); - Record.push_back(E->getObjectKind()); Record.AddStmt(E->getBase()); Record.AddDeclRef(E->getMemberDecl()); + Record.AddDeclarationNameLoc(E->MemberDNLoc, + E->getMemberDecl()->getDeclName()); Record.AddSourceLocation(E->getMemberLoc()); Record.push_back(E->isArrow()); + Record.push_back(E->hadMultipleCandidates()); Record.AddSourceLocation(E->getOperatorLoc()); - Record.AddDeclarationNameLoc(E->MemberDNLoc, - E->getMemberDecl()->getDeclName()); + + if (HasFoundDecl) { + DeclAccessPair FoundDecl = E->getFoundDecl(); + Record.AddDeclRef(FoundDecl.getDecl()); + Record.push_back(FoundDecl.getAccess()); + } + + if (HasQualifier) + Record.AddNestedNameSpecifierLoc(E->getQualifierLoc()); + + if (HasTemplateInfo) + AddTemplateKWAndArgsInfo(*E->getTrailingObjects<ASTTemplateKWAndArgsInfo>(), + E->getTrailingObjects<TemplateArgumentLoc>()); + Code = serialization::EXPR_MEMBER; } |