diff --git a/clang/lib/ARCMigrate/ObjCMT.cpp b/clang/lib/ARCMigrate/ObjCMT.cpp index c1bc7c762088f..9e23789732711 100644 --- a/clang/lib/ARCMigrate/ObjCMT.cpp +++ b/clang/lib/ARCMigrate/ObjCMT.cpp @@ -7,16 +7,16 @@ //===----------------------------------------------------------------------===// #include "Transforms.h" -#include "clang/Analysis/RetainSummaryManager.h" #include "clang/ARCMigrate/ARCMT.h" #include "clang/ARCMigrate/ARCMTActions.h" #include "clang/AST/ASTConsumer.h" #include "clang/AST/ASTContext.h" #include "clang/AST/Attr.h" +#include "clang/AST/DynamicRecursiveASTVisitor.h" #include "clang/AST/NSAPI.h" #include "clang/AST/ParentMap.h" -#include "clang/AST/RecursiveASTVisitor.h" #include "clang/Analysis/DomainSpecific/CocoaConventions.h" +#include "clang/Analysis/RetainSummaryManager.h" #include "clang/Basic/FileManager.h" #include "clang/Edit/Commit.h" #include "clang/Edit/EditedSource.h" @@ -309,67 +309,68 @@ namespace { return true; } -class ObjCMigrator : public RecursiveASTVisitor { - ObjCMigrateASTConsumer &Consumer; - ParentMap &PMap; - -public: - ObjCMigrator(ObjCMigrateASTConsumer &consumer, ParentMap &PMap) - : Consumer(consumer), PMap(PMap) { } - - bool shouldVisitTemplateInstantiations() const { return false; } - bool shouldWalkTypesOfTypeLocs() const { return false; } + class ObjCMigrator : public DynamicRecursiveASTVisitor { + ObjCMigrateASTConsumer &Consumer; + ParentMap &PMap; - bool VisitObjCMessageExpr(ObjCMessageExpr *E) { - if (Consumer.ASTMigrateActions & FrontendOptions::ObjCMT_Literals) { - edit::Commit commit(*Consumer.Editor); - edit::rewriteToObjCLiteralSyntax(E, *Consumer.NSAPIObj, commit, &PMap); - Consumer.Editor->commit(commit); + public: + ObjCMigrator(ObjCMigrateASTConsumer &consumer, ParentMap &PMap) + : Consumer(consumer), PMap(PMap) { + ShouldVisitTemplateInstantiations = false; + ShouldWalkTypesOfTypeLocs = false; } - if (Consumer.ASTMigrateActions & FrontendOptions::ObjCMT_Subscripting) { - edit::Commit commit(*Consumer.Editor); - edit::rewriteToObjCSubscriptSyntax(E, *Consumer.NSAPIObj, commit); - Consumer.Editor->commit(commit); - } + bool VisitObjCMessageExpr(ObjCMessageExpr *E) override { + if (Consumer.ASTMigrateActions & FrontendOptions::ObjCMT_Literals) { + edit::Commit commit(*Consumer.Editor); + edit::rewriteToObjCLiteralSyntax(E, *Consumer.NSAPIObj, commit, &PMap); + Consumer.Editor->commit(commit); + } - if (Consumer.ASTMigrateActions & FrontendOptions::ObjCMT_PropertyDotSyntax) { - edit::Commit commit(*Consumer.Editor); - rewriteToPropertyDotSyntax(E, Consumer.PP, *Consumer.NSAPIObj, - commit, &PMap); - Consumer.Editor->commit(commit); - } + if (Consumer.ASTMigrateActions & FrontendOptions::ObjCMT_Subscripting) { + edit::Commit commit(*Consumer.Editor); + edit::rewriteToObjCSubscriptSyntax(E, *Consumer.NSAPIObj, commit); + Consumer.Editor->commit(commit); + } - return true; - } + if (Consumer.ASTMigrateActions & + FrontendOptions::ObjCMT_PropertyDotSyntax) { + edit::Commit commit(*Consumer.Editor); + rewriteToPropertyDotSyntax(E, Consumer.PP, *Consumer.NSAPIObj, commit, + &PMap); + Consumer.Editor->commit(commit); + } - bool TraverseObjCMessageExpr(ObjCMessageExpr *E) { - // Do depth first; we want to rewrite the subexpressions first so that if - // we have to move expressions we will move them already rewritten. - for (Stmt *SubStmt : E->children()) - if (!TraverseStmt(SubStmt)) - return false; + return true; + } - return WalkUpFromObjCMessageExpr(E); - } -}; + bool TraverseObjCMessageExpr(ObjCMessageExpr *E) override { + // Do depth first; we want to rewrite the subexpressions first so that if + // we have to move expressions we will move them already rewritten. + for (Stmt *SubStmt : E->children()) + if (!TraverseStmt(SubStmt)) + return false; -class BodyMigrator : public RecursiveASTVisitor { - ObjCMigrateASTConsumer &Consumer; - std::unique_ptr PMap; + return WalkUpFromObjCMessageExpr(E); + } + }; -public: - BodyMigrator(ObjCMigrateASTConsumer &consumer) : Consumer(consumer) { } + class BodyMigrator : public DynamicRecursiveASTVisitor { + ObjCMigrateASTConsumer &Consumer; + std::unique_ptr PMap; - bool shouldVisitTemplateInstantiations() const { return false; } - bool shouldWalkTypesOfTypeLocs() const { return false; } + public: + BodyMigrator(ObjCMigrateASTConsumer &consumer) : Consumer(consumer) { + ShouldVisitTemplateInstantiations = false; + ShouldWalkTypesOfTypeLocs = false; + } - bool TraverseStmt(Stmt *S) { - PMap.reset(new ParentMap(S)); - ObjCMigrator(Consumer, *PMap).TraverseStmt(S); - return true; - } -}; + bool TraverseStmt(Stmt *S) override { + PMap.reset(new ParentMap(S)); + ObjCMigrator(Consumer, *PMap).TraverseStmt(S); + return true; + } + }; } // end anonymous namespace void ObjCMigrateASTConsumer::migrateDecl(Decl *D) { @@ -1672,12 +1673,14 @@ void ObjCMigrateASTConsumer::migrateAddMethodAnnotation( } namespace { -class SuperInitChecker : public RecursiveASTVisitor { +class SuperInitChecker : public DynamicRecursiveASTVisitor { public: - bool shouldVisitTemplateInstantiations() const { return false; } - bool shouldWalkTypesOfTypeLocs() const { return false; } + SuperInitChecker() { + ShouldVisitTemplateInstantiations = false; + ShouldWalkTypesOfTypeLocs = false; + } - bool VisitObjCMessageExpr(ObjCMessageExpr *E) { + bool VisitObjCMessageExpr(ObjCMessageExpr *E) override { if (E->getReceiverKind() == ObjCMessageExpr::SuperInstance) { if (E->getMethodFamily() == OMF_init) return false; diff --git a/clang/lib/ARCMigrate/TransAPIUses.cpp b/clang/lib/ARCMigrate/TransAPIUses.cpp index 8f5d4f4bde06c..7c397c609b3ab 100644 --- a/clang/lib/ARCMigrate/TransAPIUses.cpp +++ b/clang/lib/ARCMigrate/TransAPIUses.cpp @@ -16,9 +16,10 @@ // //===----------------------------------------------------------------------===// -#include "Transforms.h" #include "Internals.h" +#include "Transforms.h" #include "clang/AST/ASTContext.h" +#include "clang/AST/DynamicRecursiveASTVisitor.h" #include "clang/Sema/SemaDiagnostic.h" using namespace clang; @@ -27,7 +28,7 @@ using namespace trans; namespace { -class APIChecker : public RecursiveASTVisitor { +class APIChecker : public DynamicRecursiveASTVisitor { MigrationPass &Pass; Selector getReturnValueSel, setReturnValueSel; @@ -51,7 +52,7 @@ class APIChecker : public RecursiveASTVisitor { zoneSel = sels.getNullarySelector(&ids.get("zone")); } - bool VisitObjCMessageExpr(ObjCMessageExpr *E) { + bool VisitObjCMessageExpr(ObjCMessageExpr *E) override { // NSInvocation. if (E->isInstanceMessage() && E->getReceiverInterface() && diff --git a/clang/lib/ARCMigrate/TransARCAssign.cpp b/clang/lib/ARCMigrate/TransARCAssign.cpp index d1d5b9e014b17..23d03e371dda8 100644 --- a/clang/lib/ARCMigrate/TransARCAssign.cpp +++ b/clang/lib/ARCMigrate/TransARCAssign.cpp @@ -20,9 +20,10 @@ // //===----------------------------------------------------------------------===// -#include "Transforms.h" #include "Internals.h" +#include "Transforms.h" #include "clang/AST/ASTContext.h" +#include "clang/AST/DynamicRecursiveASTVisitor.h" #include "clang/Sema/SemaDiagnostic.h" using namespace clang; @@ -31,14 +32,14 @@ using namespace trans; namespace { -class ARCAssignChecker : public RecursiveASTVisitor { +class ARCAssignChecker : public DynamicRecursiveASTVisitor { MigrationPass &Pass; llvm::DenseSet ModifiedVars; public: ARCAssignChecker(MigrationPass &pass) : Pass(pass) { } - bool VisitBinaryOperator(BinaryOperator *Exp) { + bool VisitBinaryOperator(BinaryOperator *Exp) override { if (Exp->getType()->isDependentType()) return true; diff --git a/clang/lib/ARCMigrate/TransAutoreleasePool.cpp b/clang/lib/ARCMigrate/TransAutoreleasePool.cpp index 6d501228e712b..d64d5d16754a4 100644 --- a/clang/lib/ARCMigrate/TransAutoreleasePool.cpp +++ b/clang/lib/ARCMigrate/TransAutoreleasePool.cpp @@ -26,9 +26,10 @@ // //===----------------------------------------------------------------------===// -#include "Transforms.h" #include "Internals.h" +#include "Transforms.h" #include "clang/AST/ASTContext.h" +#include "clang/AST/DynamicRecursiveASTVisitor.h" #include "clang/Basic/SourceManager.h" #include "clang/Sema/SemaDiagnostic.h" #include @@ -39,7 +40,7 @@ using namespace trans; namespace { -class ReleaseCollector : public RecursiveASTVisitor { +class ReleaseCollector : public DynamicRecursiveASTVisitor { Decl *Dcl; SmallVectorImpl &Releases; @@ -47,7 +48,7 @@ class ReleaseCollector : public RecursiveASTVisitor { ReleaseCollector(Decl *D, SmallVectorImpl &releases) : Dcl(D), Releases(releases) { } - bool VisitObjCMessageExpr(ObjCMessageExpr *E) { + bool VisitObjCMessageExpr(ObjCMessageExpr *E) override { if (!E->isInstanceMessage()) return true; if (E->getMethodFamily() != OMF_release) @@ -60,27 +61,32 @@ class ReleaseCollector : public RecursiveASTVisitor { return true; } }; - } namespace { -class AutoreleasePoolRewriter - : public RecursiveASTVisitor { +class AutoreleasePoolRewriter : public BodyTransform { + bool TraversingBody = false; + public: AutoreleasePoolRewriter(MigrationPass &pass) - : Body(nullptr), Pass(pass) { + : BodyTransform(pass), Body(nullptr) { PoolII = &pass.Ctx.Idents.get("NSAutoreleasePool"); DrainSel = pass.Ctx.Selectors.getNullarySelector( &pass.Ctx.Idents.get("drain")); } - void transformBody(Stmt *body, Decl *ParentD) { + bool TraverseStmt(Stmt *body) override { + if (TraversingBody) + return BodyTransform::TraverseStmt(body); + + llvm::SaveAndRestore Restore{TraversingBody, true}; Body = body; - TraverseStmt(body); + BodyTransform::TraverseStmt(body); + return true; } - ~AutoreleasePoolRewriter() { + ~AutoreleasePoolRewriter() override { SmallVector VarsToHandle; for (std::map::iterator @@ -160,7 +166,7 @@ class AutoreleasePoolRewriter } } - bool VisitCompoundStmt(CompoundStmt *S) { + bool VisitCompoundStmt(CompoundStmt *S) override { SmallVector Scopes; for (Stmt::child_iterator @@ -245,7 +251,7 @@ class AutoreleasePoolRewriter } }; - class NameReferenceChecker : public RecursiveASTVisitor{ + class NameReferenceChecker : public DynamicRecursiveASTVisitor { ASTContext &Ctx; SourceRange ScopeRange; SourceLocation &referenceLoc, &declarationLoc; @@ -260,15 +266,15 @@ class AutoreleasePoolRewriter (*scope.End)->getBeginLoc()); } - bool VisitDeclRefExpr(DeclRefExpr *E) { + bool VisitDeclRefExpr(DeclRefExpr *E) override { return checkRef(E->getLocation(), E->getDecl()->getLocation()); } - bool VisitTypedefTypeLoc(TypedefTypeLoc TL) { + bool VisitTypedefTypeLoc(TypedefTypeLoc TL) override { return checkRef(TL.getBeginLoc(), TL.getTypedefNameDecl()->getLocation()); } - bool VisitTagTypeLoc(TagTypeLoc TL) { + bool VisitTagTypeLoc(TagTypeLoc TL) override { return checkRef(TL.getBeginLoc(), TL.getDecl()->getLocation()); } @@ -411,7 +417,6 @@ class AutoreleasePoolRewriter } Stmt *Body; - MigrationPass &Pass; IdentifierInfo *PoolII; Selector DrainSel; @@ -430,6 +435,6 @@ class AutoreleasePoolRewriter } // anonymous namespace void trans::rewriteAutoreleasePool(MigrationPass &pass) { - BodyTransform trans(pass); + AutoreleasePoolRewriter trans(pass); trans.TraverseDecl(pass.Ctx.getTranslationUnitDecl()); } diff --git a/clang/lib/ARCMigrate/TransBlockObjCVariable.cpp b/clang/lib/ARCMigrate/TransBlockObjCVariable.cpp index 1e4db33135b6a..9c8869ebc8908 100644 --- a/clang/lib/ARCMigrate/TransBlockObjCVariable.cpp +++ b/clang/lib/ARCMigrate/TransBlockObjCVariable.cpp @@ -24,10 +24,11 @@ // //===----------------------------------------------------------------------===// -#include "Transforms.h" #include "Internals.h" +#include "Transforms.h" #include "clang/AST/ASTContext.h" #include "clang/AST/Attr.h" +#include "clang/AST/DynamicRecursiveASTVisitor.h" #include "clang/Basic/SourceManager.h" using namespace clang; @@ -36,18 +37,16 @@ using namespace trans; namespace { -class RootBlockObjCVarRewriter : - public RecursiveASTVisitor { +class RootBlockObjCVarRewriter : public DynamicRecursiveASTVisitor { llvm::DenseSet &VarsToChange; - class BlockVarChecker : public RecursiveASTVisitor { + class BlockVarChecker : public DynamicRecursiveASTVisitor { VarDecl *Var; - typedef RecursiveASTVisitor base; public: BlockVarChecker(VarDecl *var) : Var(var) { } - bool TraverseImplicitCastExpr(ImplicitCastExpr *castE) { + bool TraverseImplicitCastExpr(ImplicitCastExpr *castE) override { if (DeclRefExpr * ref = dyn_cast(castE->getSubExpr())) { if (ref->getDecl() == Var) { @@ -59,10 +58,10 @@ class RootBlockObjCVarRewriter : } } - return base::TraverseImplicitCastExpr(castE); + return DynamicRecursiveASTVisitor::TraverseImplicitCastExpr(castE); } - bool VisitDeclRefExpr(DeclRefExpr *E) { + bool VisitDeclRefExpr(DeclRefExpr *E) override { if (E->getDecl() == Var) return false; // The reference of the variable, and not just its value, // is needed. @@ -74,7 +73,7 @@ class RootBlockObjCVarRewriter : RootBlockObjCVarRewriter(llvm::DenseSet &VarsToChange) : VarsToChange(VarsToChange) { } - bool VisitBlockDecl(BlockDecl *block) { + bool VisitBlockDecl(BlockDecl *block) override { SmallVector BlockVars; for (const auto &I : block->captures()) { @@ -108,14 +107,14 @@ class RootBlockObjCVarRewriter : } }; -class BlockObjCVarRewriter : public RecursiveASTVisitor { +class BlockObjCVarRewriter : public DynamicRecursiveASTVisitor { llvm::DenseSet &VarsToChange; public: BlockObjCVarRewriter(llvm::DenseSet &VarsToChange) : VarsToChange(VarsToChange) { } - bool TraverseBlockDecl(BlockDecl *block) { + bool TraverseBlockDecl(BlockDecl *block) override { RootBlockObjCVarRewriter(VarsToChange).TraverseDecl(block); return true; } diff --git a/clang/lib/ARCMigrate/TransEmptyStatementsAndDealloc.cpp b/clang/lib/ARCMigrate/TransEmptyStatementsAndDealloc.cpp index e9c21b8106d7d..ecbee51437cb6 100644 --- a/clang/lib/ARCMigrate/TransEmptyStatementsAndDealloc.cpp +++ b/clang/lib/ARCMigrate/TransEmptyStatementsAndDealloc.cpp @@ -18,9 +18,10 @@ // //===----------------------------------------------------------------------===// -#include "Transforms.h" #include "Internals.h" +#include "Transforms.h" #include "clang/AST/ASTContext.h" +#include "clang/AST/DynamicRecursiveASTVisitor.h" #include "clang/AST/StmtVisitor.h" #include "clang/Basic/SourceManager.h" @@ -143,14 +144,13 @@ class EmptyChecker : public StmtVisitor { } }; -class EmptyStatementsRemover : - public RecursiveASTVisitor { +class EmptyStatementsRemover : public DynamicRecursiveASTVisitor { MigrationPass &Pass; public: EmptyStatementsRemover(MigrationPass &pass) : Pass(pass) { } - bool TraverseStmtExpr(StmtExpr *E) { + bool TraverseStmtExpr(StmtExpr *E) override { CompoundStmt *S = E->getSubStmt(); for (CompoundStmt::body_iterator I = S->body_begin(), E = S->body_end(); I != E; ++I) { @@ -161,7 +161,7 @@ class EmptyStatementsRemover : return true; } - bool VisitCompoundStmt(CompoundStmt *S) { + bool VisitCompoundStmt(CompoundStmt *S) override { for (auto *I : S->body()) check(I); return true; diff --git a/clang/lib/ARCMigrate/TransGCAttrs.cpp b/clang/lib/ARCMigrate/TransGCAttrs.cpp index 85e3fe77660b5..1fbb5b896a0c2 100644 --- a/clang/lib/ARCMigrate/TransGCAttrs.cpp +++ b/clang/lib/ARCMigrate/TransGCAttrs.cpp @@ -6,9 +6,10 @@ // //===----------------------------------------------------------------------===// -#include "Transforms.h" #include "Internals.h" +#include "Transforms.h" #include "clang/AST/ASTContext.h" +#include "clang/AST/DynamicRecursiveASTVisitor.h" #include "clang/Basic/SourceManager.h" #include "clang/Lex/Lexer.h" #include "clang/Sema/SemaDiagnostic.h" @@ -23,26 +24,24 @@ using namespace trans; namespace { /// Collects all the places where GC attributes __strong/__weak occur. -class GCAttrsCollector : public RecursiveASTVisitor { +class GCAttrsCollector : public DynamicRecursiveASTVisitor { MigrationContext &MigrateCtx; bool FullyMigratable; std::vector &AllProps; - typedef RecursiveASTVisitor base; public: GCAttrsCollector(MigrationContext &ctx, std::vector &AllProps) - : MigrateCtx(ctx), FullyMigratable(false), - AllProps(AllProps) { } - - bool shouldWalkTypesOfTypeLocs() const { return false; } + : MigrateCtx(ctx), FullyMigratable(false), AllProps(AllProps) { + ShouldWalkTypesOfTypeLocs = false; + } - bool VisitAttributedTypeLoc(AttributedTypeLoc TL) { + bool VisitAttributedTypeLoc(AttributedTypeLoc TL) override { handleAttr(TL); return true; } - bool TraverseDecl(Decl *D) { + bool TraverseDecl(Decl *D) override { if (!D || D->isImplicit()) return true; @@ -54,7 +53,7 @@ class GCAttrsCollector : public RecursiveASTVisitor { } else if (DeclaratorDecl *DD = dyn_cast(D)) { lookForAttribute(DD, DD->getTypeSourceInfo()); } - return base::TraverseDecl(D); + return DynamicRecursiveASTVisitor::TraverseDecl(D); } void lookForAttribute(Decl *D, TypeSourceInfo *TInfo) { diff --git a/clang/lib/ARCMigrate/TransGCCalls.cpp b/clang/lib/ARCMigrate/TransGCCalls.cpp index 43233e2d0b456..c2717dd1a7251 100644 --- a/clang/lib/ARCMigrate/TransGCCalls.cpp +++ b/clang/lib/ARCMigrate/TransGCCalls.cpp @@ -6,9 +6,10 @@ // //===----------------------------------------------------------------------===// -#include "Transforms.h" #include "Internals.h" +#include "Transforms.h" #include "clang/AST/ASTContext.h" +#include "clang/AST/DynamicRecursiveASTVisitor.h" #include "clang/Sema/SemaDiagnostic.h" using namespace clang; @@ -17,8 +18,7 @@ using namespace trans; namespace { -class GCCollectableCallsChecker : - public RecursiveASTVisitor { +class GCCollectableCallsChecker : public DynamicRecursiveASTVisitor { MigrationContext &MigrateCtx; IdentifierInfo *NSMakeCollectableII; IdentifierInfo *CFMakeCollectableII; @@ -29,11 +29,10 @@ class GCCollectableCallsChecker : IdentifierTable &Ids = MigrateCtx.Pass.Ctx.Idents; NSMakeCollectableII = &Ids.get("NSMakeCollectable"); CFMakeCollectableII = &Ids.get("CFMakeCollectable"); + ShouldWalkTypesOfTypeLocs = false; } - bool shouldWalkTypesOfTypeLocs() const { return false; } - - bool VisitCallExpr(CallExpr *E) { + bool VisitCallExpr(CallExpr *E) override { TransformActions &TA = MigrateCtx.Pass.TA; if (MigrateCtx.isGCOwnedNonObjC(E->getType())) { diff --git a/clang/lib/ARCMigrate/TransProperties.cpp b/clang/lib/ARCMigrate/TransProperties.cpp index 6d1d950821a07..ee62ae41dd5f0 100644 --- a/clang/lib/ARCMigrate/TransProperties.cpp +++ b/clang/lib/ARCMigrate/TransProperties.cpp @@ -29,8 +29,9 @@ // //===----------------------------------------------------------------------===// -#include "Transforms.h" #include "Internals.h" +#include "Transforms.h" +#include "clang/AST/DynamicRecursiveASTVisitor.h" #include "clang/Basic/SourceManager.h" #include "clang/Lex/Lexer.h" #include "clang/Sema/SemaDiagnostic.h" @@ -281,12 +282,12 @@ class PropertiesRewriter { return MigrateCtx.addPropertyAttribute(attr, atLoc); } - class PlusOneAssign : public RecursiveASTVisitor { + class PlusOneAssign : public DynamicRecursiveASTVisitor { ObjCIvarDecl *Ivar; public: PlusOneAssign(ObjCIvarDecl *D) : Ivar(D) {} - bool VisitBinaryOperator(BinaryOperator *E) { + bool VisitBinaryOperator(BinaryOperator *E) override { if (E->getOpcode() != BO_Assign) return true; diff --git a/clang/lib/ARCMigrate/TransProtectedScope.cpp b/clang/lib/ARCMigrate/TransProtectedScope.cpp index 154e0b54800f9..a861ab29b1b9b 100644 --- a/clang/lib/ARCMigrate/TransProtectedScope.cpp +++ b/clang/lib/ARCMigrate/TransProtectedScope.cpp @@ -14,6 +14,7 @@ #include "Internals.h" #include "Transforms.h" #include "clang/AST/ASTContext.h" +#include "clang/AST/DynamicRecursiveASTVisitor.h" #include "clang/Basic/SourceManager.h" #include "clang/Sema/SemaDiagnostic.h" @@ -23,14 +24,14 @@ using namespace trans; namespace { -class LocalRefsCollector : public RecursiveASTVisitor { +class LocalRefsCollector : public DynamicRecursiveASTVisitor { SmallVectorImpl &Refs; public: LocalRefsCollector(SmallVectorImpl &refs) : Refs(refs) { } - bool VisitDeclRefExpr(DeclRefExpr *E) { + bool VisitDeclRefExpr(DeclRefExpr *E) override { if (ValueDecl *D = E->getDecl()) if (D->getDeclContext()->getRedeclContext()->isFunctionOrMethod()) Refs.push_back(E); @@ -52,7 +53,7 @@ struct CaseInfo { : SC(S), Range(Range), State(St_Unchecked) {} }; -class CaseCollector : public RecursiveASTVisitor { +class CaseCollector : public DynamicRecursiveASTVisitor { ParentMap &PMap; SmallVectorImpl &Cases; @@ -60,7 +61,7 @@ class CaseCollector : public RecursiveASTVisitor { CaseCollector(ParentMap &PMap, SmallVectorImpl &Cases) : PMap(PMap), Cases(Cases) { } - bool VisitSwitchStmt(SwitchStmt *S) { + bool VisitSwitchStmt(SwitchStmt *S) override { SwitchCase *Curr = S->getSwitchCaseList(); if (!Curr) return true; diff --git a/clang/lib/ARCMigrate/TransRetainReleaseDealloc.cpp b/clang/lib/ARCMigrate/TransRetainReleaseDealloc.cpp index baa503d8a39dc..6e10dcc856974 100644 --- a/clang/lib/ARCMigrate/TransRetainReleaseDealloc.cpp +++ b/clang/lib/ARCMigrate/TransRetainReleaseDealloc.cpp @@ -16,9 +16,10 @@ // //===----------------------------------------------------------------------===// -#include "Transforms.h" #include "Internals.h" +#include "Transforms.h" #include "clang/AST/ASTContext.h" +#include "clang/AST/DynamicRecursiveASTVisitor.h" #include "clang/AST/ParentMap.h" #include "clang/Basic/SourceManager.h" #include "clang/Lex/Lexer.h" @@ -31,33 +32,37 @@ using namespace trans; namespace { -class RetainReleaseDeallocRemover : - public RecursiveASTVisitor { +class RetainReleaseDeallocRemover : public BodyTransform { Stmt *Body; - MigrationPass &Pass; ExprSet Removables; std::unique_ptr StmtMap; + bool TraversingBody = false; Selector DelegateSel, FinalizeSel; public: RetainReleaseDeallocRemover(MigrationPass &pass) - : Body(nullptr), Pass(pass) { + : BodyTransform(pass), Body(nullptr) { DelegateSel = Pass.Ctx.Selectors.getNullarySelector(&Pass.Ctx.Idents.get("delegate")); FinalizeSel = Pass.Ctx.Selectors.getNullarySelector(&Pass.Ctx.Idents.get("finalize")); } - void transformBody(Stmt *body, Decl *ParentD) { + bool TraverseStmt(Stmt *body) override { + if (TraversingBody) + return BodyTransform::TraverseStmt(body); + + llvm::SaveAndRestore Restore{TraversingBody, true}; Body = body; collectRemovables(body, Removables); StmtMap.reset(new ParentMap(body)); - TraverseStmt(body); + BodyTransform::TraverseStmt(body); + return true; } - bool VisitObjCMessageExpr(ObjCMessageExpr *E) { + bool VisitObjCMessageExpr(ObjCMessageExpr *E) override { switch (E->getMethodFamily()) { default: if (E->isInstanceMessage() && E->getSelector() == FinalizeSel) @@ -448,12 +453,11 @@ class RetainReleaseDeallocRemover : return false; } - }; } // anonymous namespace void trans::removeRetainReleaseDeallocFinalize(MigrationPass &pass) { - BodyTransform trans(pass); + RetainReleaseDeallocRemover trans(pass); trans.TraverseDecl(pass.Ctx.getTranslationUnitDecl()); } diff --git a/clang/lib/ARCMigrate/TransUnbridgedCasts.cpp b/clang/lib/ARCMigrate/TransUnbridgedCasts.cpp index 7390ea17c8a4b..ef701c3d7358d 100644 --- a/clang/lib/ARCMigrate/TransUnbridgedCasts.cpp +++ b/clang/lib/ARCMigrate/TransUnbridgedCasts.cpp @@ -39,11 +39,13 @@ // //===----------------------------------------------------------------------===// -#include "Transforms.h" #include "Internals.h" +#include "Transforms.h" #include "clang/AST/ASTContext.h" #include "clang/AST/Attr.h" +#include "clang/AST/DynamicRecursiveASTVisitor.h" #include "clang/AST/ParentMap.h" +#include "clang/AST/RecursiveASTVisitor.h" #include "clang/Analysis/DomainSpecific/CocoaConventions.h" #include "clang/Basic/SourceManager.h" #include "clang/Lex/Lexer.h" @@ -55,8 +57,35 @@ using namespace arcmt; using namespace trans; namespace { +// FIXME: UnbridgedCastRewriter should probably just inherit from +// BodyTransform (and this class shouldn't exist in the first place), +// but I have so far been unable to untangle whatever is actually going +// on in TraverseBlockDecl() that makes that not work properly... +template +class UnbridgedCastRewriterWrapper + : public RecursiveASTVisitor> { + MigrationPass &Pass; + Decl *ParentD; + + typedef RecursiveASTVisitor> base; + +public: + UnbridgedCastRewriterWrapper(MigrationPass &pass) + : Pass(pass), ParentD(nullptr) {} + + bool TraverseStmt(Stmt *rootS) { + if (rootS) + BODY_TRANS(Pass).transformBody(rootS, ParentD); + return true; + } + + bool TraverseObjCMethodDecl(ObjCMethodDecl *D) { + SaveAndRestore SetParent(ParentD, D); + return base::TraverseObjCMethodDecl(D); + } +}; -class UnbridgedCastRewriter : public RecursiveASTVisitor{ +class UnbridgedCastRewriter : public DynamicRecursiveASTVisitor { MigrationPass &Pass; IdentifierInfo *SelfII; std::unique_ptr StmtMap; @@ -77,14 +106,14 @@ class UnbridgedCastRewriter : public RecursiveASTVisitor{ TraverseStmt(body); } - bool TraverseBlockDecl(BlockDecl *D) { + bool TraverseBlockDecl(BlockDecl *D) override { // ParentMap does not enter into a BlockDecl to record its stmts, so use a // new UnbridgedCastRewriter to handle the block. UnbridgedCastRewriter(Pass).transformBody(D->getBody(), D); return true; } - bool VisitCastExpr(CastExpr *E) { + bool VisitCastExpr(CastExpr *E) override { if (E->getCastKind() != CK_CPointerToObjCPointerCast && E->getCastKind() != CK_BitCast && E->getCastKind() != CK_AnyPointerToBlockPointerCast) @@ -461,6 +490,6 @@ class UnbridgedCastRewriter : public RecursiveASTVisitor{ } // end anonymous namespace void trans::rewriteUnbridgedCasts(MigrationPass &pass) { - BodyTransform trans(pass); + UnbridgedCastRewriterWrapper trans(pass); trans.TraverseDecl(pass.Ctx.getTranslationUnitDecl()); } diff --git a/clang/lib/ARCMigrate/TransUnusedInitDelegate.cpp b/clang/lib/ARCMigrate/TransUnusedInitDelegate.cpp index bac8dfac9b415..98e54227116c2 100644 --- a/clang/lib/ARCMigrate/TransUnusedInitDelegate.cpp +++ b/clang/lib/ARCMigrate/TransUnusedInitDelegate.cpp @@ -19,9 +19,10 @@ // //===----------------------------------------------------------------------===// -#include "Transforms.h" #include "Internals.h" +#include "Transforms.h" #include "clang/AST/ASTContext.h" +#include "clang/AST/DynamicRecursiveASTVisitor.h" #include "clang/Sema/SemaDiagnostic.h" using namespace clang; @@ -30,23 +31,27 @@ using namespace trans; namespace { -class UnusedInitRewriter : public RecursiveASTVisitor { +class UnusedInitRewriter : public BodyTransform { Stmt *Body; - MigrationPass &Pass; - ExprSet Removables; + bool TraversingBody = false; public: UnusedInitRewriter(MigrationPass &pass) - : Body(nullptr), Pass(pass) { } + : BodyTransform(pass), Body(nullptr) {} - void transformBody(Stmt *body, Decl *ParentD) { + bool TraverseStmt(Stmt *body) override { + if (TraversingBody) + return BodyTransform::TraverseStmt(body); + + llvm::SaveAndRestore Restore{TraversingBody, true}; Body = body; collectRemovables(body, Removables); - TraverseStmt(body); + BodyTransform::TraverseStmt(body); + return true; } - bool VisitObjCMessageExpr(ObjCMessageExpr *ME) { + bool VisitObjCMessageExpr(ObjCMessageExpr *ME) override { if (ME->isDelegateInitCall() && isRemovable(ME) && Pass.TA.hasDiagnostic(diag::err_arc_unused_init_message, @@ -72,6 +77,6 @@ class UnusedInitRewriter : public RecursiveASTVisitor { } // anonymous namespace void trans::rewriteUnusedInitDelegate(MigrationPass &pass) { - BodyTransform trans(pass); + UnusedInitRewriter trans(pass); trans.TraverseDecl(pass.Ctx.getTranslationUnitDecl()); } diff --git a/clang/lib/ARCMigrate/TransZeroOutPropsInDealloc.cpp b/clang/lib/ARCMigrate/TransZeroOutPropsInDealloc.cpp index 81e67628fb1f4..4aeb305a08eb2 100644 --- a/clang/lib/ARCMigrate/TransZeroOutPropsInDealloc.cpp +++ b/clang/lib/ARCMigrate/TransZeroOutPropsInDealloc.cpp @@ -12,9 +12,10 @@ // //===----------------------------------------------------------------------===// -#include "Transforms.h" #include "Internals.h" +#include "Transforms.h" #include "clang/AST/ASTContext.h" +#include "clang/AST/DynamicRecursiveASTVisitor.h" using namespace clang; using namespace arcmt; @@ -22,10 +23,7 @@ using namespace trans; namespace { -class ZeroOutInDeallocRemover : - public RecursiveASTVisitor { - typedef RecursiveASTVisitor base; - +class ZeroOutInDeallocRemover : public DynamicRecursiveASTVisitor { MigrationPass &Pass; llvm::DenseMap SynthesizedProperties; @@ -39,7 +37,7 @@ class ZeroOutInDeallocRemover : Pass.Ctx.Selectors.getNullarySelector(&Pass.Ctx.Idents.get("finalize")); } - bool VisitObjCMessageExpr(ObjCMessageExpr *ME) { + bool VisitObjCMessageExpr(ObjCMessageExpr *ME) override { ASTContext &Ctx = Pass.Ctx; TransformActions &TA = Pass.TA; @@ -78,7 +76,7 @@ class ZeroOutInDeallocRemover : return true; } - bool VisitPseudoObjectExpr(PseudoObjectExpr *POE) { + bool VisitPseudoObjectExpr(PseudoObjectExpr *POE) override { if (isZeroingPropIvar(POE) && isRemovable(POE)) { Transaction Trans(Pass.TA); Pass.TA.removeStmt(POE); @@ -87,7 +85,7 @@ class ZeroOutInDeallocRemover : return true; } - bool VisitBinaryOperator(BinaryOperator *BOE) { + bool VisitBinaryOperator(BinaryOperator *BOE) override { if (isZeroingPropIvar(BOE) && isRemovable(BOE)) { Transaction Trans(Pass.TA); Pass.TA.removeStmt(BOE); @@ -96,7 +94,7 @@ class ZeroOutInDeallocRemover : return true; } - bool TraverseObjCMethodDecl(ObjCMethodDecl *D) { + bool TraverseObjCMethodDecl(ObjCMethodDecl *D) override { if (D->getMethodFamily() != OMF_dealloc && !(D->isInstanceMethod() && D->getSelector() == FinalizeSel)) return true; @@ -128,7 +126,7 @@ class ZeroOutInDeallocRemover : } // Now, remove all zeroing of ivars etc. - base::TraverseObjCMethodDecl(D); + DynamicRecursiveASTVisitor::TraverseObjCMethodDecl(D); // clear out for next method. SynthesizedProperties.clear(); @@ -137,9 +135,9 @@ class ZeroOutInDeallocRemover : return true; } - bool TraverseFunctionDecl(FunctionDecl *D) { return true; } - bool TraverseBlockDecl(BlockDecl *block) { return true; } - bool TraverseBlockExpr(BlockExpr *block) { return true; } + bool TraverseFunctionDecl(FunctionDecl *D) override { return true; } + bool TraverseBlockDecl(BlockDecl *block) override { return true; } + bool TraverseBlockExpr(BlockExpr *block) override { return true; } private: bool isRemovable(Expr *E) const { diff --git a/clang/lib/ARCMigrate/Transforms.cpp b/clang/lib/ARCMigrate/Transforms.cpp index fda0e1c932fc0..ce08be82bcf03 100644 --- a/clang/lib/ARCMigrate/Transforms.cpp +++ b/clang/lib/ARCMigrate/Transforms.cpp @@ -10,6 +10,7 @@ #include "Internals.h" #include "clang/ARCMigrate/ARCMT.h" #include "clang/AST/ASTContext.h" +#include "clang/AST/DynamicRecursiveASTVisitor.h" #include "clang/AST/RecursiveASTVisitor.h" #include "clang/Analysis/DomainSpecific/CocoaConventions.h" #include "clang/Basic/SourceManager.h" @@ -211,14 +212,17 @@ StringRef trans::getNilString(MigrationPass &Pass) { namespace { -class ReferenceClear : public RecursiveASTVisitor { +class ReferenceClear : public DynamicRecursiveASTVisitor { ExprSet &Refs; public: ReferenceClear(ExprSet &refs) : Refs(refs) { } - bool VisitDeclRefExpr(DeclRefExpr *E) { Refs.erase(E); return true; } + bool VisitDeclRefExpr(DeclRefExpr *E) override { + Refs.erase(E); + return true; + } }; -class ReferenceCollector : public RecursiveASTVisitor { +class ReferenceCollector : public DynamicRecursiveASTVisitor { ValueDecl *Dcl; ExprSet &Refs; @@ -226,23 +230,22 @@ class ReferenceCollector : public RecursiveASTVisitor { ReferenceCollector(ValueDecl *D, ExprSet &refs) : Dcl(D), Refs(refs) { } - bool VisitDeclRefExpr(DeclRefExpr *E) { + bool VisitDeclRefExpr(DeclRefExpr *E) override { if (E->getDecl() == Dcl) Refs.insert(E); return true; } }; -class RemovablesCollector : public RecursiveASTVisitor { +class RemovablesCollector : public DynamicRecursiveASTVisitor { ExprSet &Removables; public: - RemovablesCollector(ExprSet &removables) - : Removables(removables) { } - - bool shouldWalkTypesOfTypeLocs() const { return false; } + RemovablesCollector(ExprSet &removables) : Removables(removables) { + ShouldWalkTypesOfTypeLocs = false; + } - bool TraverseStmtExpr(StmtExpr *E) { + bool TraverseStmtExpr(StmtExpr *E) override { CompoundStmt *S = E->getSubStmt(); for (CompoundStmt::body_iterator I = S->body_begin(), E = S->body_end(); I != E; ++I) { @@ -253,29 +256,29 @@ class RemovablesCollector : public RecursiveASTVisitor { return true; } - bool VisitCompoundStmt(CompoundStmt *S) { + bool VisitCompoundStmt(CompoundStmt *S) override { for (auto *I : S->body()) mark(I); return true; } - bool VisitIfStmt(IfStmt *S) { + bool VisitIfStmt(IfStmt *S) override { mark(S->getThen()); mark(S->getElse()); return true; } - bool VisitWhileStmt(WhileStmt *S) { + bool VisitWhileStmt(WhileStmt *S) override { mark(S->getBody()); return true; } - bool VisitDoStmt(DoStmt *S) { + bool VisitDoStmt(DoStmt *S) override { mark(S->getBody()); return true; } - bool VisitForStmt(ForStmt *S) { + bool VisitForStmt(ForStmt *S) override { mark(S->getInit()); mark(S->getInc()); mark(S->getBody()); @@ -315,26 +318,25 @@ void trans::collectRemovables(Stmt *S, ExprSet &exprs) { namespace { -class ASTTransform : public RecursiveASTVisitor { +class ASTTransform : public DynamicRecursiveASTVisitor { MigrationContext &MigrateCtx; - typedef RecursiveASTVisitor base; public: - ASTTransform(MigrationContext &MigrateCtx) : MigrateCtx(MigrateCtx) { } - - bool shouldWalkTypesOfTypeLocs() const { return false; } + ASTTransform(MigrationContext &MigrateCtx) : MigrateCtx(MigrateCtx) { + ShouldWalkTypesOfTypeLocs = false; + } - bool TraverseObjCImplementationDecl(ObjCImplementationDecl *D) { + bool TraverseObjCImplementationDecl(ObjCImplementationDecl *D) override { ObjCImplementationContext ImplCtx(MigrateCtx, D); for (MigrationContext::traverser_iterator I = MigrateCtx.traversers_begin(), E = MigrateCtx.traversers_end(); I != E; ++I) (*I)->traverseObjCImplementation(ImplCtx); - return base::TraverseObjCImplementationDecl(D); + return DynamicRecursiveASTVisitor::TraverseObjCImplementationDecl(D); } - bool TraverseStmt(Stmt *rootS) { + bool TraverseStmt(Stmt *rootS) override { if (!rootS) return true; @@ -347,7 +349,6 @@ class ASTTransform : public RecursiveASTVisitor { return true; } }; - } MigrationContext::~MigrationContext() { diff --git a/clang/lib/ARCMigrate/Transforms.h b/clang/lib/ARCMigrate/Transforms.h index 37e2d6b2a7e12..0bb3172e506d1 100644 --- a/clang/lib/ARCMigrate/Transforms.h +++ b/clang/lib/ARCMigrate/Transforms.h @@ -9,8 +9,11 @@ #ifndef LLVM_CLANG_LIB_ARCMIGRATE_TRANSFORMS_H #define LLVM_CLANG_LIB_ARCMIGRATE_TRANSFORMS_H +#include "clang/AST/DeclObjC.h" +#include "clang/AST/DynamicRecursiveASTVisitor.h" +#include "clang/AST/ExprObjC.h" #include "clang/AST/ParentMap.h" -#include "clang/AST/RecursiveASTVisitor.h" +#include "clang/AST/StmtObjC.h" #include "llvm/ADT/DenseSet.h" #include "llvm/Support/SaveAndRestore.h" @@ -181,24 +184,17 @@ bool isGlobalVar(Expr *E); /// Returns "nil" or "0" if 'nil' macro is not actually defined. StringRef getNilString(MigrationPass &Pass); -template -class BodyTransform : public RecursiveASTVisitor > { +class BodyTransform : public DynamicRecursiveASTVisitor { +protected: MigrationPass &Pass; Decl *ParentD; - typedef RecursiveASTVisitor > base; public: - BodyTransform(MigrationPass &pass) : Pass(pass), ParentD(nullptr) { } + BodyTransform(MigrationPass &pass) : Pass(pass), ParentD(nullptr) {} - bool TraverseStmt(Stmt *rootS) { - if (rootS) - BODY_TRANS(Pass).transformBody(rootS, ParentD); - return true; - } - - bool TraverseObjCMethodDecl(ObjCMethodDecl *D) { + bool TraverseObjCMethodDecl(ObjCMethodDecl *D) override { SaveAndRestore SetParent(ParentD, D); - return base::TraverseObjCMethodDecl(D); + return DynamicRecursiveASTVisitor::TraverseObjCMethodDecl(D); } };