diff options
author | Eric Liu <ioeric@google.com> | 2017-02-02 15:29:54 +0000 |
---|---|---|
committer | Eric Liu <ioeric@google.com> | 2017-02-02 15:29:54 +0000 |
commit | ae7de7117a088f6ca6bd176f995c405b87f8cf1e (patch) | |
tree | c294ba070e02a4fd2bca0285eae0a26955fd4b60 | |
parent | 180bc5a02170cf5cc943555c718b246380817a55 (diff) | |
download | bcm5719-llvm-ae7de7117a088f6ca6bd176f995c405b87f8cf1e.tar.gz bcm5719-llvm-ae7de7117a088f6ca6bd176f995c405b87f8cf1e.zip |
[change-namespace] check using shadow decl correctly when shortening namespace specifiers.
Summary:
This fixes mismatch between template decls and template specialization decls.
Also added a few more test cases.
Reviewers: bkramer
Subscribers: cfe-commits
Differential Revision: https://reviews.llvm.org/D29447
llvm-svn: 293897
-rw-r--r-- | clang-tools-extra/change-namespace/ChangeNamespace.cpp | 3 | ||||
-rw-r--r-- | clang-tools-extra/unittests/change-namespace/ChangeNamespaceTests.cpp | 70 |
2 files changed, 71 insertions, 2 deletions
diff --git a/clang-tools-extra/change-namespace/ChangeNamespace.cpp b/clang-tools-extra/change-namespace/ChangeNamespace.cpp index 2f234da0887..728aa2b8bc2 100644 --- a/clang-tools-extra/change-namespace/ChangeNamespace.cpp +++ b/clang-tools-extra/change-namespace/ChangeNamespace.cpp @@ -761,7 +761,8 @@ void ChangeNamespaceTool::replaceQualifiedSymbolInDeclContext( 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; diff --git a/clang-tools-extra/unittests/change-namespace/ChangeNamespaceTests.cpp b/clang-tools-extra/unittests/change-namespace/ChangeNamespaceTests.cpp index 428629aa3b1..e0b48a369b0 100644 --- a/clang-tools-extra/unittests/change-namespace/ChangeNamespaceTests.cpp +++ b/clang-tools-extra/unittests/change-namespace/ChangeNamespaceTests.cpp @@ -1255,7 +1255,7 @@ TEST_F(ChangeNamespaceTest, UsingDeclInMovedNamespaceMultiNested) { 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 @@ TEST_F(ChangeNamespaceTest, UsingDeclInTheParentOfOldNamespace) { 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 <typename T>\n" + "class A { T t; };\n" + "} // namespace na\n" + "namespace nb {\n" + "using na::A;\n" + "void d() { A<int> a; }\n" + "} // nb\n"; + + std::string Expected = "namespace na {\n" + "template <typename T>\n" + "class A { T t; };\n" + "} // namespace na\n" + "\n" + "namespace nc {\n" + "using ::na::A;\n" + "void d() { A<int> 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 <typename T>\n" + "void f() { T t; };\n" + "} // namespace na\n" + "namespace nb {\n" + "using na::f;\n" + "void d() { f<int>(); }\n" + "} // nb\n"; + + std::string Expected = "namespace na {\n" + "template <typename T>\n" + "void f() { T t; };\n" + "} // namespace na\n" + "\n" + "namespace nc {\n" + "using ::na::f;\n" + "void d() { f<int>(); }\n" + "} // namespace nc\n"; + EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code)); +} + TEST_F(ChangeNamespaceTest, UsingAliasDecl) { std::string Code = "namespace nx { namespace ny { class X {}; } }\n" |