diff options
| author | Haojian Wu <hokein@google.com> | 2019-09-16 10:16:56 +0000 | 
|---|---|---|
| committer | Haojian Wu <hokein@google.com> | 2019-09-16 10:16:56 +0000 | 
| commit | af28bb65023ef989e9079717626a9e3080bb50d3 (patch) | |
| tree | ca3a833fd85191a05257fefa08bcf1951a66b49a | |
| parent | 1d74940b319c7b6aea49f94730e408586fd76a82 (diff) | |
| download | bcm5719-llvm-af28bb65023ef989e9079717626a9e3080bb50d3.tar.gz bcm5719-llvm-af28bb65023ef989e9079717626a9e3080bb50d3.zip  | |
[clangd] Fix a crash when renaming operator.
Summary:
The renamelib uses a tricky way to calculate the end location by relying
on decl name, this is incorrect for the overloaded operator (the name is
"operator++" instead of "++"), which will cause out-of-file offset.
We also disable renaming operator symbol, this case is tricky, and
renamelib doesnt handle it properly.
Reviewers: ilya-biryukov
Subscribers: MaskRay, jkorous, arphaman, kadircet, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D67607
llvm-svn: 371971
| -rw-r--r-- | clang-tools-extra/clangd/refactor/Rename.cpp | 4 | ||||
| -rw-r--r-- | clang-tools-extra/clangd/unittests/RenameTests.cpp | 7 | ||||
| -rw-r--r-- | clang/include/clang/Tooling/Refactoring/RecursiveSymbolVisitor.h | 3 | 
3 files changed, 12 insertions, 2 deletions
diff --git a/clang-tools-extra/clangd/refactor/Rename.cpp b/clang-tools-extra/clangd/refactor/Rename.cpp index 770064fc613..3c6119aeba8 100644 --- a/clang-tools-extra/clangd/refactor/Rename.cpp +++ b/clang-tools-extra/clangd/refactor/Rename.cpp @@ -74,6 +74,10 @@ llvm::Optional<ReasonToReject> renamableWithinFile(const Decl &RenameDecl,                                                     const SymbolIndex *Index) {    if (llvm::isa<NamespaceDecl>(&RenameDecl))      return ReasonToReject::UnsupportedSymbol; +  if (const auto *FD = llvm::dyn_cast<FunctionDecl>(&RenameDecl)) { +    if (FD->isOverloadedOperator()) +      return ReasonToReject::UnsupportedSymbol; +  }    auto &ASTCtx = RenameDecl.getASTContext();    const auto &SM = ASTCtx.getSourceManager();    bool MainFileIsHeader = ASTCtx.getLangOpts().IsHeaderFile; diff --git a/clang-tools-extra/clangd/unittests/RenameTests.cpp b/clang-tools-extra/clangd/unittests/RenameTests.cpp index 99e07e240e2..91d9c0fe73a 100644 --- a/clang-tools-extra/clangd/unittests/RenameTests.cpp +++ b/clang-tools-extra/clangd/unittests/RenameTests.cpp @@ -136,6 +136,13 @@ TEST(RenameTest, Renameable) {         )cpp",            "not a supported kind", HeaderFile}, +      { + +          R"cpp( +        struct X { X operator++(int) {} }; +        void f(X x) {x+^+;})cpp", +          "not a supported kind", HeaderFile}, +        {R"cpp(// foo is declared outside the file.          void fo^o() {}        )cpp", "used outside main file", !HeaderFile/*cc file*/}, diff --git a/clang/include/clang/Tooling/Refactoring/RecursiveSymbolVisitor.h b/clang/include/clang/Tooling/Refactoring/RecursiveSymbolVisitor.h index 41a448f035a..cd230ea18b5 100644 --- a/clang/include/clang/Tooling/Refactoring/RecursiveSymbolVisitor.h +++ b/clang/include/clang/Tooling/Refactoring/RecursiveSymbolVisitor.h @@ -122,8 +122,7 @@ private:          ND, SourceRange(BeginLoc, EndLoc));    }    bool visit(const NamedDecl *ND, SourceLocation Loc) { -    return visit(ND, Loc, -                 Loc.getLocWithOffset(ND->getNameAsString().length() - 1)); +    return visit(ND, Loc, Lexer::getLocForEndOfToken(Loc, 0, SM, LangOpts));    }  };  | 

