diff options
author | Eric Liu <ioeric@google.com> | 2017-12-08 10:06:16 +0000 |
---|---|---|
committer | Eric Liu <ioeric@google.com> | 2017-12-08 10:06:16 +0000 |
commit | 89827634e1c90ed38380cbb2d1d53b69f7a4736d (patch) | |
tree | c12f401c98f4f95cd65957386259db9cd0b0a249 /unittests | |
parent | e95f20d0df5f2c34c9019bd89ef4a531ca8510be (diff) |
[change-namespace] Fix crash when injected base-class name is used in friend declarations.
Reviewers: hokein
Subscribers: klimek, cfe-commits
Differential Revision: https://reviews.llvm.org/D41001
git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@320139 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'unittests')
-rw-r--r-- | unittests/change-namespace/ChangeNamespaceTests.cpp | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/unittests/change-namespace/ChangeNamespaceTests.cpp b/unittests/change-namespace/ChangeNamespaceTests.cpp index c16d8647..2a6449b7 100644 --- a/unittests/change-namespace/ChangeNamespaceTests.cpp +++ b/unittests/change-namespace/ChangeNamespaceTests.cpp @@ -2154,6 +2154,60 @@ TEST_F(ChangeNamespaceTest, DefaultMoveConstructors) { EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code)); } +TEST_F(ChangeNamespaceTest, InjectedClassNameInFriendDecl) { + OldNamespace = "d"; + NewNamespace = "e"; + std::string Code = "namespace a{\n" + "template <typename T>\n" + "class Base {\n" + " public:\n" + " void f() {\n" + " T t;\n" + " t.priv();\n" + " }\n" + "};\n" + "} // namespace a\n" + "namespace d {\n" + "class D : public a::Base<D> {\n" + " private:\n" + " friend class Base<D>;\n" + " void priv() {}\n" + " Base b;\n" + "};\n" + "\n" + "void f() {\n" + " D d;\n" + " a:: Base<D> b;\n" + " b.f();\n" + "}\n" + "} // namespace d\n"; + std::string Expected = "namespace a{\n" + "template <typename T>\n" + "class Base {\n" + " public:\n" + " void f() {\n" + " T t;\n" + " t.priv();\n" + " }\n" + "};\n" + "} // namespace a\n" + "\n" + "namespace e {\n" + "class D : public a::Base<D> {\n" + " private:\n" + " friend class Base<D>;\n" + " void priv() {}\n" + " a::Base b;\n" + "};\n" + "\n" + "void f() {\n" + " D d;\n" + " a::Base<D> b;\n" + " b.f();\n" + "}\n" + "} // namespace e\n"; + EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code)); +} } // anonymous namespace } // namespace change_namespace |