[Mlir-commits] [mlir] [mlir][python] Fix recursion error for __str__ (PR #174552)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Tue Jan 6 01:22:38 PST 2026


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-mlir

Author: Jiaxuan Bai (JiaxuanBai)

<details>
<summary>Changes</summary>

The implementation of "__str__" may cause recursion error: maximum recursion depth exceeded in __instancecheck__. Fix this issue by changing the sequence of judgment.

---
Full diff: https://github.com/llvm/llvm-project/pull/174552.diff


2 Files Affected:

- (modified) mlir/test/mlir-tblgen/enums-python-bindings.td (+2-2) 
- (modified) mlir/tools/mlir-tblgen/EnumPythonBindingGen.cpp (+4-4) 


``````````diff
diff --git a/mlir/test/mlir-tblgen/enums-python-bindings.td b/mlir/test/mlir-tblgen/enums-python-bindings.td
index cd23b6a2effb9..6d79f0999efed 100644
--- a/mlir/test/mlir-tblgen/enums-python-bindings.td
+++ b/mlir/test/mlir-tblgen/enums-python-bindings.td
@@ -90,8 +90,6 @@ def TestBitEnum_Attr : EnumAttr<Test_Dialect, TestBitEnum, "testbitenum">;
 // CHECK:         return bin(self).count("1")
 
 // CHECK:     def __str__(self):
-// CHECK:         if len(self) > 1:
-// CHECK:             return " | ".join(map(str, self))
 // CHECK:         if self is TestBitEnum.User:
 // CHECK:             return "user"
 // CHECK:         if self is TestBitEnum.Group:
@@ -100,6 +98,8 @@ def TestBitEnum_Attr : EnumAttr<Test_Dialect, TestBitEnum, "testbitenum">;
 // CHECK:             return "other"
 // CHECK:         if self is TestBitEnum.Any:
 // CHECK:             return "any"
+// CHECK:         if len(self) > 1:
+// CHECK:             return " | ".join(map(str, self))
 // CHECK:         raise ValueError("Unknown TestBitEnum enum entry.")
 
 // CHECK: @register_attribute_builder("TestBitEnum")
diff --git a/mlir/tools/mlir-tblgen/EnumPythonBindingGen.cpp b/mlir/tools/mlir-tblgen/EnumPythonBindingGen.cpp
index acc9b61d7121c..fcb81e7704321 100644
--- a/mlir/tools/mlir-tblgen/EnumPythonBindingGen.cpp
+++ b/mlir/tools/mlir-tblgen/EnumPythonBindingGen.cpp
@@ -71,15 +71,15 @@ static void emitEnumClass(EnumInfo enumInfo, raw_ostream &os) {
   }
 
   os << formatv("    def __str__(self):\n");
-  if (enumInfo.isBitEnum())
-    os << formatv("        if len(self) > 1:\n"
-                  "            return \"{0}\".join(map(str, self))\n",
-                  enumInfo.getDef().getValueAsString("separator"));
   for (const EnumCase &enumCase : enumInfo.getAllCases()) {
     os << formatv("        if self is {0}.{1}:\n", enumInfo.getEnumClassName(),
                   makePythonEnumCaseName(enumCase.getSymbol()));
     os << formatv("            return \"{0}\"\n", enumCase.getStr());
   }
+  if (enumInfo.isBitEnum())
+  os << formatv("        if len(self) > 1:\n"
+                "            return \"{0}\".join(map(str, self))\n",
+                enumInfo.getDef().getValueAsString("separator"));
   os << formatv("        raise ValueError(\"Unknown {0} enum entry.\")\n\n\n",
                 enumInfo.getEnumClassName());
   os << "\n";

``````````

</details>


https://github.com/llvm/llvm-project/pull/174552


More information about the Mlir-commits mailing list