<div dir="ltr">r293927 should appease bots.<br><br><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">On Thu, Feb 2, 2017 at 7:59 PM Eric Liu <<a href="mailto:ioeric@google.com" class="gmail_msg" target="_blank">ioeric@google.com</a>> wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="gmail_msg">This is breaking build bots, and I am trying to fix it. Feel free to revert the change if this blocks you.</div><br class="gmail_msg"><div class="gmail_quote gmail_msg"><div dir="ltr" class="gmail_msg">On Thu, Feb 2, 2017 at 6:51 PM Eric Liu via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" class="gmail_msg" target="_blank">cfe-commits@lists.llvm.org</a>> wrote:<br class="gmail_msg"></div><blockquote class="gmail_quote gmail_msg" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: ioeric<br class="gmail_msg">
Date: Thu Feb 2 11:40:38 2017<br class="gmail_msg">
New Revision: 293909<br class="gmail_msg">
<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=293909&view=rev" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project?rev=293909&view=rev</a><br class="gmail_msg">
Log:<br class="gmail_msg">
[change-namespace] fix unscoped enum constant references.<br class="gmail_msg">
<br class="gmail_msg">
Reviewers: bkramer<br class="gmail_msg">
<br class="gmail_msg">
Subscribers: cfe-commits<br class="gmail_msg">
<br class="gmail_msg">
Differential Revision: <a href="https://reviews.llvm.org/D29460" rel="noreferrer" class="gmail_msg" target="_blank">https://reviews.llvm.org/D29460</a><br class="gmail_msg">
<br class="gmail_msg">
Modified:<br class="gmail_msg">
clang-tools-extra/trunk/change-namespace/ChangeNamespace.cpp<br class="gmail_msg">
clang-tools-extra/trunk/unittests/change-namespace/ChangeNamespaceTests.cpp<br class="gmail_msg">
<br class="gmail_msg">
Modified: clang-tools-extra/trunk/change-namespace/ChangeNamespace.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/change-namespace/ChangeNamespace.cpp?rev=293909&r1=293908&r2=293909&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/change-namespace/ChangeNamespace.cpp?rev=293909&r1=293908&r2=293909&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- clang-tools-extra/trunk/change-namespace/ChangeNamespace.cpp (original)<br class="gmail_msg">
+++ clang-tools-extra/trunk/change-namespace/ChangeNamespace.cpp Thu Feb 2 11:40:38 2017<br class="gmail_msg">
@@ -282,6 +282,10 @@ bool isDeclVisibleAtLocation(const Sourc<br class="gmail_msg">
isNestedDeclContext(DeclCtx, D->getDeclContext()));<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
+AST_MATCHER(EnumDecl, isScoped) {<br class="gmail_msg">
+ return Node.isScoped();<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
} // anonymous namespace<br class="gmail_msg">
<br class="gmail_msg">
ChangeNamespaceTool::ChangeNamespaceTool(<br class="gmail_msg">
@@ -454,6 +458,17 @@ void ChangeNamespaceTool::registerMatche<br class="gmail_msg">
to(GlobalVarMatcher.bind("var_decl")))<br class="gmail_msg">
.bind("var_ref"),<br class="gmail_msg">
this);<br class="gmail_msg">
+<br class="gmail_msg">
+ // Handle unscoped enum constant.<br class="gmail_msg">
+ auto UnscopedEnumMatcher = enumConstantDecl(hasParent(enumDecl(<br class="gmail_msg">
+ hasParent(namespaceDecl()),<br class="gmail_msg">
+ unless(anyOf(isScoped(), IsInMovedNs, hasAncestor(cxxRecordDecl()),<br class="gmail_msg">
+ hasAncestor(namespaceDecl(isAnonymous())))))));<br class="gmail_msg">
+ Finder->addMatcher(<br class="gmail_msg">
+ declRefExpr(IsInMovedNs, hasAncestor(decl().bind("dc")),<br class="gmail_msg">
+ to(UnscopedEnumMatcher.bind("enum_const_decl")))<br class="gmail_msg">
+ .bind("enum_const_ref"),<br class="gmail_msg">
+ this);<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
void ChangeNamespaceTool::run(<br class="gmail_msg">
@@ -518,6 +533,21 @@ void ChangeNamespaceTool::run(<br class="gmail_msg">
assert(Context && "Empty decl context.");<br class="gmail_msg">
fixDeclRefExpr(Result, Context->getDeclContext(),<br class="gmail_msg">
llvm::cast<NamedDecl>(Var), VarRef);<br class="gmail_msg">
+ } else if (const auto *EnumConstRef =<br class="gmail_msg">
+ Result.Nodes.getNodeAs<DeclRefExpr>("enum_const_ref")) {<br class="gmail_msg">
+ // Do not rename the reference if it is already scoped by the EnumDecl name.<br class="gmail_msg">
+ if (EnumConstRef->hasQualifier() &&<br class="gmail_msg">
+ EnumConstRef->getQualifier()->getAsType()->isEnumeralType())<br class="gmail_msg">
+ return;<br class="gmail_msg">
+ const auto *EnumConstDecl =<br class="gmail_msg">
+ Result.Nodes.getNodeAs<EnumConstantDecl>("enum_const_decl");<br class="gmail_msg">
+ assert(EnumConstDecl);<br class="gmail_msg">
+ const auto *Context = Result.Nodes.getNodeAs<Decl>("dc");<br class="gmail_msg">
+ assert(Context && "Empty decl context.");<br class="gmail_msg">
+ // FIXME: this would qualify "ns::VALUE" as "ns::EnumValue::VALUE". Fix it<br class="gmail_msg">
+ // if it turns out to be an issue.<br class="gmail_msg">
+ fixDeclRefExpr(Result, Context->getDeclContext(),<br class="gmail_msg">
+ llvm::cast<NamedDecl>(EnumConstDecl), EnumConstRef);<br class="gmail_msg">
} else if (const auto *FuncRef =<br class="gmail_msg">
Result.Nodes.getNodeAs<DeclRefExpr>("func_ref")) {<br class="gmail_msg">
// If this reference has been processed as a function call, we do not<br class="gmail_msg">
<br class="gmail_msg">
Modified: clang-tools-extra/trunk/unittests/change-namespace/ChangeNamespaceTests.cpp<br class="gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/change-namespace/ChangeNamespaceTests.cpp?rev=293909&r1=293908&r2=293909&view=diff" rel="noreferrer" class="gmail_msg" target="_blank">http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/change-namespace/ChangeNamespaceTests.cpp?rev=293909&r1=293908&r2=293909&view=diff</a><br class="gmail_msg">
==============================================================================<br class="gmail_msg">
--- clang-tools-extra/trunk/unittests/change-namespace/ChangeNamespaceTests.cpp (original)<br class="gmail_msg">
+++ clang-tools-extra/trunk/unittests/change-namespace/ChangeNamespaceTests.cpp Thu Feb 2 11:40:38 2017<br class="gmail_msg">
@@ -1774,6 +1774,207 @@ TEST_F(ChangeNamespaceTest, ShortenNames<br class="gmail_msg">
EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));<br class="gmail_msg">
}<br class="gmail_msg">
<br class="gmail_msg">
+TEST_F(ChangeNamespaceTest, SimpleMoveEnum) {<br class="gmail_msg">
+ std::string Code = "namespace na {\n"<br class="gmail_msg">
+ "namespace nb {\n"<br class="gmail_msg">
+ "enum class X { X1, X2 };\n"<br class="gmail_msg">
+ "enum Y { Y1, Y2 };\n"<br class="gmail_msg">
+ "} // namespace nb\n"<br class="gmail_msg">
+ "} // namespace na\n";<br class="gmail_msg">
+ std::string Expected = "\n\nnamespace x {\n"<br class="gmail_msg">
+ "namespace y {\n"<br class="gmail_msg">
+ "enum class X { X1, X2 };\n"<br class="gmail_msg">
+ "enum Y { Y1, Y2 };\n"<br class="gmail_msg">
+ "} // namespace y\n"<br class="gmail_msg">
+ "} // namespace x\n";<br class="gmail_msg">
+<br class="gmail_msg">
+ EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+TEST_F(ChangeNamespaceTest, ReferencesToEnums) {<br class="gmail_msg">
+ std::string Code = "enum Glob { G1, G2 };\n"<br class="gmail_msg">
+ "namespace na {\n"<br class="gmail_msg">
+ "enum class X { X1 };\n"<br class="gmail_msg">
+ "enum Y { Y1, Y2 };\n"<br class="gmail_msg">
+ "namespace nb {\n"<br class="gmail_msg">
+ "void f() {\n"<br class="gmail_msg">
+ " Glob g1 = Glob::G1;\n"<br class="gmail_msg">
+ " Glob g2 = G2;\n"<br class="gmail_msg">
+ " X x1 = X::X1;\n"<br class="gmail_msg">
+ " Y y1 = Y::Y1;\n"<br class="gmail_msg">
+ " Y y2 = Y2;\n"<br class="gmail_msg">
+ "}\n"<br class="gmail_msg">
+ "} // namespace nb\n"<br class="gmail_msg">
+ "} // namespace na\n";<br class="gmail_msg">
+ std::string Expected = "enum Glob { G1, G2 };\n"<br class="gmail_msg">
+ "namespace na {\n"<br class="gmail_msg">
+ "enum class X { X1 };\n"<br class="gmail_msg">
+ "enum Y { Y1, Y2 };\n"<br class="gmail_msg">
+ "\n"<br class="gmail_msg">
+ "} // namespace na\n"<br class="gmail_msg">
+ "namespace x {\n"<br class="gmail_msg">
+ "namespace y {\n"<br class="gmail_msg">
+ "void f() {\n"<br class="gmail_msg">
+ " Glob g1 = Glob::G1;\n"<br class="gmail_msg">
+ " Glob g2 = G2;\n"<br class="gmail_msg">
+ " ::na::X x1 = ::na::X::X1;\n"<br class="gmail_msg">
+ " ::na::Y y1 = ::na::Y::Y1;\n"<br class="gmail_msg">
+ " ::na::Y y2 = ::na::Y::Y2;\n"<br class="gmail_msg">
+ "}\n"<br class="gmail_msg">
+ "} // namespace y\n"<br class="gmail_msg">
+ "} // namespace x\n";<br class="gmail_msg">
+<br class="gmail_msg">
+ EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+TEST_F(ChangeNamespaceTest, NoRedundantEnumUpdate) {<br class="gmail_msg">
+ std::string Code = "namespace ns {\n"<br class="gmail_msg">
+ "enum class X { X1 };\n"<br class="gmail_msg">
+ "enum Y { Y1, Y2 };\n"<br class="gmail_msg">
+ "} // namespace ns\n"<br class="gmail_msg">
+ "namespace na {\n"<br class="gmail_msg">
+ "namespace nb {\n"<br class="gmail_msg">
+ "void f() {\n"<br class="gmail_msg">
+ " ns::X x1 = ns::X::X1;\n"<br class="gmail_msg">
+ " ns::Y y1 = ns::Y::Y1;\n"<br class="gmail_msg">
+ " ns::Y y2 = ns::Y2;\n"<br class="gmail_msg">
+ "}\n"<br class="gmail_msg">
+ "} // namespace nb\n"<br class="gmail_msg">
+ "} // namespace na\n";<br class="gmail_msg">
+ std::string Expected = "namespace ns {\n"<br class="gmail_msg">
+ "enum class X { X1 };\n"<br class="gmail_msg">
+ "enum Y { Y1, Y2 };\n"<br class="gmail_msg">
+ "} // namespace ns\n"<br class="gmail_msg">
+ "\n"<br class="gmail_msg">
+ "namespace x {\n"<br class="gmail_msg">
+ "namespace y {\n"<br class="gmail_msg">
+ "void f() {\n"<br class="gmail_msg">
+ " ns::X x1 = ns::X::X1;\n"<br class="gmail_msg">
+ " ns::Y y1 = ns::Y::Y1;\n"<br class="gmail_msg">
+ // FIXME: this is redundant<br class="gmail_msg">
+ " ns::Y y2 = ::ns::Y::Y2;\n"<br class="gmail_msg">
+ "}\n"<br class="gmail_msg">
+ "} // namespace y\n"<br class="gmail_msg">
+ "} // namespace x\n";<br class="gmail_msg">
+ ;<br class="gmail_msg">
+<br class="gmail_msg">
+ EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+TEST_F(ChangeNamespaceTest, EnumsAndUsingShadows) {<br class="gmail_msg">
+ std::string Code = "namespace ns {\n"<br class="gmail_msg">
+ "enum class X { X1 };\n"<br class="gmail_msg">
+ "enum Y { Y1, Y2, Y3 };\n"<br class="gmail_msg">
+ "} // namespace ns\n"<br class="gmail_msg">
+ "using ns::X;\n"<br class="gmail_msg">
+ "using ns::Y;\n"<br class="gmail_msg">
+ "using ns::Y::Y2;\n"<br class="gmail_msg">
+ "using ns::Y::Y3;\n"<br class="gmail_msg">
+ "namespace na {\n"<br class="gmail_msg">
+ "namespace nb {\n"<br class="gmail_msg">
+ "void f() {\n"<br class="gmail_msg">
+ " X x1 = X::X1;\n"<br class="gmail_msg">
+ " Y y1 = Y::Y1;\n"<br class="gmail_msg">
+ " Y y2 = Y2;\n"<br class="gmail_msg">
+ " Y y3 = Y3;\n"<br class="gmail_msg">
+ "}\n"<br class="gmail_msg">
+ "} // namespace nb\n"<br class="gmail_msg">
+ "} // namespace na\n";<br class="gmail_msg">
+ std::string Expected = "namespace ns {\n"<br class="gmail_msg">
+ "enum class X { X1 };\n"<br class="gmail_msg">
+ "enum Y { Y1, Y2, Y3 };\n"<br class="gmail_msg">
+ "} // namespace ns\n"<br class="gmail_msg">
+ "using ns::X;\n"<br class="gmail_msg">
+ "using ns::Y;\n"<br class="gmail_msg">
+ "using ns::Y::Y2;\n"<br class="gmail_msg">
+ "using ns::Y::Y3;\n"<br class="gmail_msg">
+ "\n"<br class="gmail_msg">
+ "namespace x {\n"<br class="gmail_msg">
+ "namespace y {\n"<br class="gmail_msg">
+ "void f() {\n"<br class="gmail_msg">
+ " X x1 = X::X1;\n"<br class="gmail_msg">
+ " Y y1 = Y::Y1;\n"<br class="gmail_msg">
+ " Y y2 = Y2;\n"<br class="gmail_msg">
+ " Y y3 = Y3;\n"<br class="gmail_msg">
+ "}\n"<br class="gmail_msg">
+ "} // namespace y\n"<br class="gmail_msg">
+ "} // namespace x\n";<br class="gmail_msg">
+<br class="gmail_msg">
+ EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+TEST_F(ChangeNamespaceTest, EnumsAndAliases) {<br class="gmail_msg">
+ std::string Code = "namespace ns {\n"<br class="gmail_msg">
+ "enum class X { X1 };\n"<br class="gmail_msg">
+ "enum Y { Y1, Y2, Y3 };\n"<br class="gmail_msg">
+ "} // namespace ns\n"<br class="gmail_msg">
+ "typedef ns::X TX;\n"<br class="gmail_msg">
+ "typedef ns::Y TY;\n"<br class="gmail_msg">
+ "using UX = ns::X;\n"<br class="gmail_msg">
+ "using UY = ns::Y;\n"<br class="gmail_msg">
+ "namespace na {\n"<br class="gmail_msg">
+ "namespace nb {\n"<br class="gmail_msg">
+ "void f() {\n"<br class="gmail_msg">
+ " ns::X x1 = ns::X::X1;\n"<br class="gmail_msg">
+ " TX tx1 = TX::X1;\n"<br class="gmail_msg">
+ " UX ux1 = UX::X1;\n"<br class="gmail_msg">
+ " ns::Y y1 = ns::Y::Y1;\n"<br class="gmail_msg">
+ " TY ty1 = TY::Y1;\n"<br class="gmail_msg">
+ " UY uy1 = UY::Y1;\n"<br class="gmail_msg">
+ "}\n"<br class="gmail_msg">
+ "} // namespace nb\n"<br class="gmail_msg">
+ "} // namespace na\n";<br class="gmail_msg">
+ std::string Expected = "namespace ns {\n"<br class="gmail_msg">
+ "enum class X { X1 };\n"<br class="gmail_msg">
+ "enum Y { Y1, Y2, Y3 };\n"<br class="gmail_msg">
+ "} // namespace ns\n"<br class="gmail_msg">
+ "typedef ns::X TX;\n"<br class="gmail_msg">
+ "typedef ns::Y TY;\n"<br class="gmail_msg">
+ "using UX = ns::X;\n"<br class="gmail_msg">
+ "using UY = ns::Y;\n"<br class="gmail_msg">
+ "\n"<br class="gmail_msg">
+ "namespace x {\n"<br class="gmail_msg">
+ "namespace y {\n"<br class="gmail_msg">
+ "void f() {\n"<br class="gmail_msg">
+ " ns::X x1 = ns::X::X1;\n"<br class="gmail_msg">
+ " TX tx1 = TX::X1;\n"<br class="gmail_msg">
+ " UX ux1 = UX::X1;\n"<br class="gmail_msg">
+ " ns::Y y1 = ns::Y::Y1;\n"<br class="gmail_msg">
+ " TY ty1 = TY::Y1;\n"<br class="gmail_msg">
+ " UY uy1 = UY::Y1;\n"<br class="gmail_msg">
+ "}\n"<br class="gmail_msg">
+ "} // namespace y\n"<br class="gmail_msg">
+ "} // namespace x\n";<br class="gmail_msg">
+<br class="gmail_msg">
+ EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
+TEST_F(ChangeNamespaceTest, EnumInClass) {<br class="gmail_msg">
+ std::string Code = "namespace na {\n"<br class="gmail_msg">
+ "struct X { enum E { E1 }; };\n"<br class="gmail_msg">
+ "namespace nb {\n"<br class="gmail_msg">
+ "void f() {\n"<br class="gmail_msg">
+ " X::E e = X::E1;\n"<br class="gmail_msg">
+ " X::E ee = X::E::E1;\n"<br class="gmail_msg">
+ "}\n"<br class="gmail_msg">
+ "} // namespace nb\n"<br class="gmail_msg">
+ "} // namespace na\n";<br class="gmail_msg">
+ std::string Expected = "namespace na {\n"<br class="gmail_msg">
+ "struct X { enum E { E1 }; };\n"<br class="gmail_msg">
+ "\n"<br class="gmail_msg">
+ "} // namespace na\n"<br class="gmail_msg">
+ "namespace x {\n"<br class="gmail_msg">
+ "namespace y {\n"<br class="gmail_msg">
+ "void f() {\n"<br class="gmail_msg">
+ " ::na::X::E e = ::na::X::E1;\n"<br class="gmail_msg">
+ " ::na::X::E ee = ::na::X::E::E1;\n"<br class="gmail_msg">
+ "}\n"<br class="gmail_msg">
+ "} // namespace y\n"<br class="gmail_msg">
+ "} // namespace x\n";<br class="gmail_msg">
+<br class="gmail_msg">
+ EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));<br class="gmail_msg">
+}<br class="gmail_msg">
+<br class="gmail_msg">
} // anonymous namespace<br class="gmail_msg">
} // namespace change_namespace<br class="gmail_msg">
} // namespace clang<br class="gmail_msg">
<br class="gmail_msg">
<br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
cfe-commits mailing list<br class="gmail_msg">
<a href="mailto:cfe-commits@lists.llvm.org" class="gmail_msg" target="_blank">cfe-commits@lists.llvm.org</a><br class="gmail_msg">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br class="gmail_msg">
</blockquote></div></blockquote></div></div>