Index: clang-tools-extra/trunk/change-namespace/ChangeNamespace.cpp =================================================================== --- clang-tools-extra/trunk/change-namespace/ChangeNamespace.cpp +++ clang-tools-extra/trunk/change-namespace/ChangeNamespace.cpp @@ -761,7 +761,8 @@ if (isDeclVisibleAtLocation(*Result.SourceManager, Using, DeclCtx, Start)) { for (const auto *UsingShadow : Using->shadows()) { const auto *TargetDecl = UsingShadow->getTargetDecl(); - if (TargetDecl == FromDecl) { + if (TargetDecl->getQualifiedNameAsString() == + FromDecl->getQualifiedNameAsString()) { ReplaceName = FromDecl->getNameAsString(); Matched = true; break; Index: clang-tools-extra/trunk/unittests/change-namespace/ChangeNamespaceTests.cpp =================================================================== --- clang-tools-extra/trunk/unittests/change-namespace/ChangeNamespaceTests.cpp +++ clang-tools-extra/trunk/unittests/change-namespace/ChangeNamespaceTests.cpp @@ -1255,7 +1255,7 @@ EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code)); } -TEST_F(ChangeNamespaceTest, UsingDeclInTheParentOfOldNamespace) { +TEST_F(ChangeNamespaceTest, UsingShadowDeclInTheParentOfOldNamespace) { OldNamespace = "nb::nc"; NewNamespace = "nb::nd"; std::string Code = "namespace na { class A {}; }\n" @@ -1277,6 +1277,74 @@ EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code)); } +TEST_F(ChangeNamespaceTest, UsingShadowDeclInOldNamespace) { + OldNamespace = "nb"; + NewNamespace = "nc"; + std::string Code = "namespace na { class A {}; }\n" + "namespace nb {\n" + "using na::A;\n" + "void d() { A a; }\n" + "struct X { A a; };\n" + "} // nb\n"; + + std::string Expected = "namespace na { class A {}; }\n" + "\n" + "namespace nc {\n" + "using ::na::A;\n" + "void d() { A a; }\n" + "struct X { A a; };\n" + "} // namespace nc\n"; + EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code)); +} + +TEST_F(ChangeNamespaceTest, UsingShadowDeclOfTemplateClass) { + OldNamespace = "nb"; + NewNamespace = "nc"; + std::string Code = "namespace na {\n" + "template \n" + "class A { T t; };\n" + "} // namespace na\n" + "namespace nb {\n" + "using na::A;\n" + "void d() { A a; }\n" + "} // nb\n"; + + std::string Expected = "namespace na {\n" + "template \n" + "class A { T t; };\n" + "} // namespace na\n" + "\n" + "namespace nc {\n" + "using ::na::A;\n" + "void d() { A a; }\n" + "} // namespace nc\n"; + EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code)); +} + +TEST_F(ChangeNamespaceTest, UsingShadowDeclOfTemplateFunction) { + OldNamespace = "nb"; + NewNamespace = "nc"; + std::string Code = "namespace na {\n" + "template \n" + "void f() { T t; };\n" + "} // namespace na\n" + "namespace nb {\n" + "using na::f;\n" + "void d() { f(); }\n" + "} // nb\n"; + + std::string Expected = "namespace na {\n" + "template \n" + "void f() { T t; };\n" + "} // namespace na\n" + "\n" + "namespace nc {\n" + "using ::na::f;\n" + "void d() { f(); }\n" + "} // namespace nc\n"; + EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code)); +} + TEST_F(ChangeNamespaceTest, UsingAliasDecl) { std::string Code = "namespace nx { namespace ny { class X {}; } }\n"