alexshap created this revision. alexshap added reviewers: klimek, omtcyfz. alexshap added subscribers: compnerd, cfe-commits. alexshap changed the visibility of this Differential Revision from "Public (No Login Required)" to "All Users".
Properly initialize the field Context in NamedDeclFindingASTVisitor constructor: it is dereferenced in VisitTypeLoc Context->getLangOpts(). Fix passing nullptr to setResult in VisitTypeLoc: it is dereferenced in setResult Decl->getQualifiedNameAsString(). Add a test case: clang-rename crashes on it without this patch, works correctly with this patch. All the other tests are green. https://reviews.llvm.org/D22881 Files: clang-rename/USRFinder.cpp test/clang-rename/FunctionWithClassFindByName.cpp Index: test/clang-rename/FunctionWithClassFindByName.cpp =================================================================== --- test/clang-rename/FunctionWithClassFindByName.cpp +++ test/clang-rename/FunctionWithClassFindByName.cpp @@ -0,0 +1,12 @@ +// RUN: clang-rename -old-name=Foo -new-name=Bar %s -- | FileCheck %s + +void foo() { +} + +class Foo { // CHECK: class Bar +}; + +int main() { + Foo *Pointer = 0; // CHECK: Bar *Pointer = 0; + return 0; +} Index: clang-rename/USRFinder.cpp =================================================================== --- clang-rename/USRFinder.cpp +++ clang-rename/USRFinder.cpp @@ -42,8 +42,9 @@ // \brief Finds the NamedDecl for a name in the source. // \param Name the fully qualified name. explicit NamedDeclFindingASTVisitor(const SourceManager &SourceMgr, - const std::string &Name) - : Result(nullptr), SourceMgr(SourceMgr), Name(Name) {} + const std::string &Name, + const ASTContext *Context) + : Result(nullptr), SourceMgr(SourceMgr), Name(Name), Context(Context) {} // Declaration visitors: @@ -76,8 +77,9 @@ const auto TypeBeginLoc = Loc.getBeginLoc(); const auto TypeEndLoc = Lexer::getLocForEndOfToken( TypeBeginLoc, 0, SourceMgr, Context->getLangOpts()); - return setResult(Loc.getType()->getAsCXXRecordDecl(), TypeBeginLoc, - TypeEndLoc); + if (auto *RD = Loc.getType()->getAsCXXRecordDecl()) + return setResult(RD, TypeBeginLoc, TypeEndLoc); + return true; } // Other: @@ -170,7 +172,7 @@ const NamedDecl *getNamedDeclFor(const ASTContext &Context, const std::string &Name) { const auto &SourceMgr = Context.getSourceManager(); - NamedDeclFindingASTVisitor Visitor(SourceMgr, Name); + NamedDeclFindingASTVisitor Visitor(SourceMgr, Name, &Context); Visitor.TraverseDecl(Context.getTranslationUnitDecl()); return Visitor.getNamedDecl();
Index: test/clang-rename/FunctionWithClassFindByName.cpp =================================================================== --- test/clang-rename/FunctionWithClassFindByName.cpp +++ test/clang-rename/FunctionWithClassFindByName.cpp @@ -0,0 +1,12 @@ +// RUN: clang-rename -old-name=Foo -new-name=Bar %s -- | FileCheck %s + +void foo() { +} + +class Foo { // CHECK: class Bar +}; + +int main() { + Foo *Pointer = 0; // CHECK: Bar *Pointer = 0; + return 0; +} Index: clang-rename/USRFinder.cpp =================================================================== --- clang-rename/USRFinder.cpp +++ clang-rename/USRFinder.cpp @@ -42,8 +42,9 @@ // \brief Finds the NamedDecl for a name in the source. // \param Name the fully qualified name. explicit NamedDeclFindingASTVisitor(const SourceManager &SourceMgr, - const std::string &Name) - : Result(nullptr), SourceMgr(SourceMgr), Name(Name) {} + const std::string &Name, + const ASTContext *Context) + : Result(nullptr), SourceMgr(SourceMgr), Name(Name), Context(Context) {} // Declaration visitors: @@ -76,8 +77,9 @@ const auto TypeBeginLoc = Loc.getBeginLoc(); const auto TypeEndLoc = Lexer::getLocForEndOfToken( TypeBeginLoc, 0, SourceMgr, Context->getLangOpts()); - return setResult(Loc.getType()->getAsCXXRecordDecl(), TypeBeginLoc, - TypeEndLoc); + if (auto *RD = Loc.getType()->getAsCXXRecordDecl()) + return setResult(RD, TypeBeginLoc, TypeEndLoc); + return true; } // Other: @@ -170,7 +172,7 @@ const NamedDecl *getNamedDeclFor(const ASTContext &Context, const std::string &Name) { const auto &SourceMgr = Context.getSourceManager(); - NamedDeclFindingASTVisitor Visitor(SourceMgr, Name); + NamedDeclFindingASTVisitor Visitor(SourceMgr, Name, &Context); Visitor.TraverseDecl(Context.getTranslationUnitDecl()); return Visitor.getNamedDecl();
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits