From: Haojian Wu Date: Mon, 23 Oct 2017 08:58:50 +0000 (+0000) Subject: [rename] Don't overwrite the template argument when renaming a template function. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4e7c0628623316fe522d2b2688d8c7d4a8047105;p=clang [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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@316314 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Tooling/Refactoring/Rename/USRLocFinder.cpp b/lib/Tooling/Refactoring/Rename/USRLocFinder.cpp index 265e3c2072..38b2a624ea 100644 --- a/lib/Tooling/Refactoring/Rename/USRLocFinder.cpp +++ b/lib/Tooling/Refactoring/Rename/USRLocFinder.cpp @@ -221,7 +221,12 @@ public: } auto StartLoc = Expr->getLocStart(); - auto EndLoc = Expr->getLocEnd(); + // For template function call expressions like `foo()`, 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 diff --git a/unittests/Rename/RenameFunctionTest.cpp b/unittests/Rename/RenameFunctionTest.cpp index ef84b4bdb7..b27bbe273a 100644 --- a/unittests/Rename/RenameFunctionTest.cpp +++ b/unittests/Rename/RenameFunctionTest.cpp @@ -220,6 +220,25 @@ TEST_F(RenameFunctionTest, RenameFunctionDecls) { CompareSnippets(Expected, After); } +TEST_F(RenameFunctionTest, RenameTemplateFunctions) { + std::string Before = R"( + namespace na { + template T X(); + } + namespace na { void f() { X(); } } + namespace nb { void g() { na::X (); } } + )"; + std::string Expected = R"( + namespace na { + template T Y(); + } + namespace na { void f() { nb::Y(); } } + namespace nb { void g() { Y(); } } + )"; + std::string After = runClangRenameOnCode(Before, "na::X", "nb::Y"); + CompareSnippets(Expected, After); +} + TEST_F(RenameFunctionTest, RenameOutOfLineFunctionDecls) { std::string Before = R"( namespace na {