r316314 - [rename] Don't overwrite the template argument when renaming a template function.
Haojian Wu via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 23 01:58:50 PDT 2017
Author: hokein
Date: Mon Oct 23 01:58:50 2017
New Revision: 316314
URL: http://llvm.org/viewvc/llvm-project?rev=316314&view=rev
Log:
[rename] Don't overwrite the template argument when renaming a template function.
Reviewers: ioeric
Reviewed By: ioeric
Subscribers: cierpuchaw, cfe-commits, klimek
Differential Revision: https://reviews.llvm.org/D39120
Modified:
cfe/trunk/lib/Tooling/Refactoring/Rename/USRLocFinder.cpp
cfe/trunk/unittests/Rename/RenameFunctionTest.cpp
Modified: cfe/trunk/lib/Tooling/Refactoring/Rename/USRLocFinder.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Tooling/Refactoring/Rename/USRLocFinder.cpp?rev=316314&r1=316313&r2=316314&view=diff
==============================================================================
--- cfe/trunk/lib/Tooling/Refactoring/Rename/USRLocFinder.cpp (original)
+++ cfe/trunk/lib/Tooling/Refactoring/Rename/USRLocFinder.cpp Mon Oct 23 01:58:50 2017
@@ -221,7 +221,12 @@ public:
}
auto StartLoc = Expr->getLocStart();
- auto EndLoc = Expr->getLocEnd();
+ // For template function call expressions like `foo<int>()`, we want to
+ // restrict the end of location to just before the `<` character.
+ SourceLocation EndLoc = Expr->hasExplicitTemplateArgs()
+ ? Expr->getLAngleLoc().getLocWithOffset(-1)
+ : Expr->getLocEnd();
+
// In case of renaming an enum declaration, we have to explicitly handle
// unscoped enum constants referenced in expressions (e.g.
// "auto r = ns1::ns2::Green" where Green is an enum constant of an unscoped
Modified: cfe/trunk/unittests/Rename/RenameFunctionTest.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Rename/RenameFunctionTest.cpp?rev=316314&r1=316313&r2=316314&view=diff
==============================================================================
--- cfe/trunk/unittests/Rename/RenameFunctionTest.cpp (original)
+++ cfe/trunk/unittests/Rename/RenameFunctionTest.cpp Mon Oct 23 01:58:50 2017
@@ -220,6 +220,25 @@ TEST_F(RenameFunctionTest, RenameFunctio
CompareSnippets(Expected, After);
}
+TEST_F(RenameFunctionTest, RenameTemplateFunctions) {
+ std::string Before = R"(
+ namespace na {
+ template<typename T> T X();
+ }
+ namespace na { void f() { X<int>(); } }
+ namespace nb { void g() { na::X <int>(); } }
+ )";
+ std::string Expected = R"(
+ namespace na {
+ template<typename T> T Y();
+ }
+ namespace na { void f() { nb::Y<int>(); } }
+ namespace nb { void g() { Y<int>(); } }
+ )";
+ std::string After = runClangRenameOnCode(Before, "na::X", "nb::Y");
+ CompareSnippets(Expected, After);
+}
+
TEST_F(RenameFunctionTest, RenameOutOfLineFunctionDecls) {
std::string Before = R"(
namespace na {
More information about the cfe-commits
mailing list