Author: hokein Date: Mon Sep 16 03:16:56 2019 New Revision: 371971 URL: http://llvm.org/viewvc/llvm-project?rev=371971&view=rev Log: [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 Modified: clang-tools-extra/trunk/clangd/refactor/Rename.cpp clang-tools-extra/trunk/clangd/unittests/RenameTests.cpp Modified: clang-tools-extra/trunk/clangd/refactor/Rename.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/refactor/Rename.cpp?rev=371971&r1=371970&r2=371971&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/refactor/Rename.cpp (original) +++ clang-tools-extra/trunk/clangd/refactor/Rename.cpp Mon Sep 16 03:16:56 2019 @@ -74,6 +74,10 @@ llvm::Optional<ReasonToReject> renamable 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; Modified: clang-tools-extra/trunk/clangd/unittests/RenameTests.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/unittests/RenameTests.cpp?rev=371971&r1=371970&r2=371971&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/unittests/RenameTests.cpp (original) +++ clang-tools-extra/trunk/clangd/unittests/RenameTests.cpp Mon Sep 16 03:16:56 2019 @@ -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*/}, _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits