<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/107872>107872</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
clang-format incorrectly formats TableGen
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang-format
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
tim-hoffman
</td>
</tr>
</table>
<pre>
#### Input file
```
#ifndef DEMO_OPS
#define DEMO_OPS
include "mlir/Interfaces/InferTypeOpInterface.td"
include "mlir/Interfaces/SideEffectInterfaces.td"
include "mlir/IR/OpAsmInterface.td"
include "mlir/IR/OpBase.td"
include "mlir/IR/RegionKindInterface.td"
include "mlir/IR/SymbolInterfaces.td"
include "Dialect/DEMO/IR/Dialect.td"
include "Dialect/DEMO/IR/Attrs.td"
include "Dialect/DEMO/IR/Types.td"
class DEMO_Op<string mnemonic, list<Trait> traits = []>
: Op<DEMODialect, mnemonic, traits>;
//===----------------------------------------------------------------------===//
// Basic constructs
//===----------------------------------------------------------------------===//
def DEMO_StructDefOp : DEMO_Op<"struct", [
HasParent<"mlir::ModuleOp">,
Symbol,
SymbolTable,
IsolatedFromAbove,
GraphRegionNoTerminator,
]> {
let summary = "";
let description = [{}];
let arguments = (ins
SymbolNameAttr:$sym_name,
OptionalAttr<FlatSymbolRefArrayAttr>:$const_params
);
let regions = (region SizedRegion<1> : $body);
let assemblyFormat = [{
$sym_name (`<` $const_params^ `>`)? $body attr-dict
}];
let hasRegionVerifier = 1;
}
def DEMO_FieldOp : DEMO_Op<"field", [HasParent<"StructDefOp">, Symbol]> {
let summary = "";
let description = [{}];
let arguments = (ins
SymbolNameAttr:$sym_name,
OptionalAttr<TypedArrayAttrBase<DEMO_TypeModiferAttr, "type modifiers">>:$modifiers,
TypeAttrOf<AnyDEMOType>:$type
);
let assemblyFormat = [{
$sym_name `:` ($modifiers^)? $type attr-dict
}];
}
//===----------------------------------------------------------------------===//
// Field element operators
//===----------------------------------------------------------------------===//
class DEMO_BinaryFeltOp<string mnemonic, list<Trait> traits = []>
: DEMO_Op<mnemonic,
!listconcat(traits, [SameOperandsAndResultType, Pure, NoMemoryEffect])> {
let arguments = (ins DEMO_FeltType:$lhs, DEMO_FeltType:$rhs);
let results = (outs DEMO_FeltType:$result);
let assemblyFormat = "$lhs `,` $rhs attr-dict";
}
#endif // DEMO_OPS
```
#### `.clang-format` file:
```
---
# Formatter for .td files
Language: TableGen
BasedOnStyle: LLVM
IndentWidth: 2
---
# Formatter for .h, .cpp, etc.
Language: Cpp
BasedOnStyle: LLVM
IndentWidth: 2
```
#### Command:
`clang-format -i include/Dialect/DEMO/IR/Ops.td`
#### Result after formatting:
```
#ifndef DEMO_OPS
#define DEMO_OPS
include "mlir/Interfaces/InferTypeOpInterface.td"
include "mlir/Interfaces/SideEffectInterfaces.td"
include "mlir/IR/OpAsmInterface.td"
include "mlir/IR/OpBase.td"
include "mlir/IR/RegionKindInterface.td"
include "mlir/IR/SymbolInterfaces.td"
include "Dialect/DEMO/IR/Dialect.td"
include "Dialect/DEMO/IR/Attrs.td"
include "Dialect/DEMO/IR/Types.td"
class DEMO_Op<string mnemonic, list<Trait> traits = []>
: Op<DEMODialect, mnemonic, traits>;
//===----------------------------------------------------------------------===//
// Basic constructs
//===----------------------------------------------------------------------===//
def DEMO_StructDefOp : DEMO_Op<"struct", [
HasParent<"mlir::ModuleOp">,
Symbol,
SymbolTable,
IsolatedFromAbove,
GraphRegionNoTerminator,
]> {
let summary = "";
let description = [{}];
let arguments = (ins
SymbolNameAttr:$sym_name,
OptionalAttr<FlatSymbolRefArrayAttr>:$const_params
);
let regions = (region SizedRegion<1> : $body);
let assemblyFormat = [{
$sym_name (`<` $const_params^ `>`)? $body attr-dict
}];
let hasRegionVerifier = 1;
}
def DEMO_FieldOp : DEMO_Op<"field", [HasParent<"StructDefOp">, Symbol]> {
let summary = "";
let description = [{}];
let arguments = (ins
SymbolNameAttr:$sym_name,
OptionalAttr<TypedArrayAttrBase<DEMO_TypeModiferAttr, "type modifiers">>:$modifiers,
TypeAttrOf<AnyDEMOType>:$type
);
let assemblyFormat = [{
$sym_name `:` ($modifiers^)? $type attr-dict
}];
}
//===----------------------------------------------------------------------===//
// Field element operators
//===---------------------------------------------------------------- -- -- -- ==
= //
class DEMO_BinaryFeltOp<string mnemonic, list<Trait> traits = []>
: DEMO_Op<mnemonic, !listconcat(traits, [
SameOperandsAndResultType, Pure, NoMemoryEffect
])> {
let arguments = (ins DEMO_FeltType : $lhs, DEMO_FeltType : $rhs);
let results = (outs DEMO_FeltType : $result);
let assemblyFormat = "$lhs `,` $rhs attr-dict";
}
#endif // DEMO_OPS
```
#### Problem:
The comment block with "Field element operators" is reflowed improperly and the class declaration after it is formatted incorrectly.
#### Other attempts that did NOT resolve the issue:
1. Adding "ReflowComments: false" in the TableGen section of the `.clang-format` file
2. Adding "// clang-format off" and "// clang-format on" around the block comment. Resulted in:
```
// clang-format off
//===----------------------------------------------------------------------===//
// Field element operators
//===-------------------------------------------- -- -- -- -- -- -- -- -- -- -- -- -- -- ==
= //
// clang-format on
class DEMO_BinaryFeltOp<string mnemonic, list<Trait> traits = []>
: DEMO_Op<mnemonic, !listconcat(traits, [
SameOperandsAndResultType, Pure, NoMemoryEffect
])> {
let arguments = (ins DEMO_FeltType : $lhs, DEMO_FeltType : $rhs);
let results = (outs DEMO_FeltType : $result);
let assemblyFormat = "$lhs `,` $rhs attr-dict";
}
#endif // DEMO_OPS
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsWV1z4rwV_jXiRhMGZAhwwQXhY5vpJmSSzPYyI6xjUKsPjyRnh_76jiTbGGKSdCfdtu-LxwOLpPOhc55zpCdLreVbBTBFwxs0XHRo4XbaTB2XVzudZZKqzkaz_RSRpH7xrcoLhzMuAPUWqDdD173yjT9JwjPFIMOL5d36Zf3wVI8zyLiC0_HwyVUqCgYYESIFN4isbpUDk9EUbPiRgXne57DO6_GuY4iQT4k_cQbLLIPUHYY_EH9EZLXOZ1Z-1l4UuKH2MwsfYcu1-itX7N9R_7SXGy3at_BGcMGpgNQhsvLxrlSUo2eMtcvMnDPnwtUu4TPV4l0qqLVl-nOUzK0zXG2xVCC14ikicyy4dSiZPxvKHUqW2Pl_WIySBY4YRckyKsMYY5TMcNDkddauzI80Rg1eLLlpOoPIyr_JIr5XX_LU6krtDUv4hlqe4lQr60yROvvb3QifdWE-BS8WkK3zEMdDWhAh0UWfPjIPgY8h_wu1D9SAcnFVwGYyQ8nsTrNCwDr3EskSkXmVowjZNwPPdCPgMHprtaAO2MpoOdvo18YU_mZovov1cq-fwUiuqNOmXhExgdGochILcNgWUlKzj8Dx2yB1-uMCBjY1PHdcqxpdoxs0WgR9R0iJAtRsCwmqAiMZc1WmsNzTPZXgS8VHhAzsXr4oKhs7WQdjVMQ185WgLgo-QjYzhu7jxDLKB5y85NRQWZnBiExaXTMhOrVj8Sd-4v8EFgOHknk_BCmZYUQGvqef00WtBbkR-5U2krpmaA5Vd9idN-c7fzJH1z186vZwicPk0n96e6vKOqbOmSvGU1eqfSfwO2rjLn6A4RkHE5zqH9aOFq0AX3EQrA3cmZ84YPsE1I26qNFcwfj_FGq-HbMaYv6IKlvmi5-504xnYMJaHxFC3D4HLP0wB2PLKFTAbIzPD5jA2KvyOtYZSuYztff6_Vgt6LVW2f4i8HlwzSLyxkeuDZcHvIXdfIS3Ywz99rMhYBWDAJ92rHMwvsf9l46IxjF9wxU1-xUI93UH9qEWG3qaSKoeRPpee6pVSh0i4_Ikj1X7RCWsfZwUszPFHsEWwgW8kTl-KEz4vtd3ILXZx7ufd8ajolHBH1Vd2UmgVB1wLHbBh5YZ42cmJ9Vvgme1Ul24Vq1x2VvxtpLwTca7EQqAVK3X7GwD5o0u9AbcCSjGM1xi7-Q6fnKbr0QO93903eumgqrtVRZ88uYDG0hmrSo82CotOG7DgcGZNrjrWBAtgf6dqm1Bt14TDjeEb6DijO9ZbK2e3D7Ywd-__7iLM7eKgXJ_48zt_AT52ObOZ6-b5rn_Bpd23xqf5_mv2f04enMtJVWsGaxmMPEVx-X1-nBbP7ldr_Nwt37HSKwGTLNy0377XG3PZehC2S6U7ULZLpTtQtkulO1C2f4noHahbBfKdnhw_ZYqG0mMeDs9M-Lcf5DJvcPl3idubUzPP79C6FpVvUPzPkv0qq7bRvWquTdk75N0r5ZvIXxfRvkw_mLS92D0RoCsGcTzDnCqZcD-Ruj0H_gndzvv57m6IARziw1kQv8EhrnMjZ8Ue0wVw87rC2hlkApqaGi9kcBw5yVLGuNFVaqNgdSJffesw2u3A-ODAzJ3FrsddZhxhu_Xzz5HWrxCMMqtLQ7Utd_FM8Z8ZSBCHoOv87hL69OWUWEh7EQF4YqkYgtpcFhnYfwsRQ5GSNNImY8jDqizzBvxcTm3QoUFRhdl7GIOyox0SwIYYnWe9LUb_mN1U_zJ9-O-Wv1NqjUZf9LOe2m15b3k8532uBQ7bJqwSTKhHZj2R2Q4ngwGk35nNx2QzQTGgyS9HvTSIRuN-v0BzdJxmo4Iud6MO3xKemTQm_Qm_WFv3Bt3N-kkGSTJhl5njNB-Hw16ICkXXSFeZVebbSe0umm_NxqPSEfQDQgb_uOfkKNeRQgaLjpm6uWuNsXWokHPg8oeNDnuBEyPiqDRlMtWbev22CmMmO6cy224VvqwbLnbFZtuqiUiK6-3_LrKjf57_OtEcNcisio9fp2SfwUAAP__lZUQHQ">