summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHaojian Wu <hokein@google.com>2019-09-16 10:16:56 +0000
committerHaojian Wu <hokein@google.com>2019-09-16 10:16:56 +0000
commitaf28bb65023ef989e9079717626a9e3080bb50d3 (patch)
treeca3a833fd85191a05257fefa08bcf1951a66b49a
parent1d74940b319c7b6aea49f94730e408586fd76a82 (diff)
downloadbcm5719-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.cpp4
-rw-r--r--clang-tools-extra/clangd/unittests/RenameTests.cpp7
-rw-r--r--clang/include/clang/Tooling/Refactoring/RecursiveSymbolVisitor.h3
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));
}
};
OpenPOWER on IntegriCloud