[Mlir-commits] [mlir] [MLIR][TableGen] Fix ArrayRefParameter in struct format roundtrip (PR #189065)
Fabian Mora
llvmlistbot at llvm.org
Fri Mar 27 10:54:36 PDT 2026
================
@@ -899,10 +933,29 @@ void DefFormat::genParamsPrinter(ParamsDirective *el, FmtContext &ctx,
void DefFormat::genStructPrinter(StructDirective *el, FmtContext &ctx,
MethodBody &os) {
- genCommaSeparatedPrinter(el->getElements(), ctx, os, [&](FormatElement *arg) {
- ParameterElement *param = getEncapsulatedParameterElement(arg);
- os << tgfmt("$_printer << \"$0 = \";\n", &ctx, param->getName());
- });
+ ArrayRef<FormatElement *> elems = el->getElements();
+ // An `ArrayRefParameter` without a custom printer in a non-last struct
+ // position must be wrapped in `[...]` to avoid ambiguity with the
+ // struct-level comma separator. Track the element index via elemIdx, which is
+ // incremented once per element in the extraPost callback.
+ size_t elemIdx = 0;
+ genCommaSeparatedPrinter(
+ elems, ctx, os,
+ [&](FormatElement *arg) {
+ ParameterElement *param = getEncapsulatedParameterElement(arg);
+ os << tgfmt("$_printer << \"$0 = \";\n", &ctx, param->getName());
+ auto *paramEl = dyn_cast<ParameterElement>(arg);
+ if (paramEl && isUndelimitedArrayRefParam(paramEl) &&
+ elemIdx != elems.size() - 1)
+ os << tgfmt("$_printer << \"[\";\n", &ctx);
+ },
+ [&](FormatElement *arg) {
+ auto *paramEl = dyn_cast<ParameterElement>(arg);
+ if (paramEl && isUndelimitedArrayRefParam(paramEl) &&
+ elemIdx != elems.size() - 1)
+ os << tgfmt("$_printer << \"]\";\n", &ctx);
+ ++elemIdx;
+ });
----------------
fabianmcg wrote:
Should be impossible for these to be invoked with `elems.size() == 0`, however, a comment saying `elems.size() - 1` is always safe, an assert or changing the condition so that we avoid `elems.size() - 1` would be great.
https://github.com/llvm/llvm-project/pull/189065
More information about the Mlir-commits
mailing list