[mlir] Don't include the attribute self type in a `params` directive
authorRiver Riddle <riddleriver@gmail.com>
Wed, 9 Nov 2022 20:39:04 +0000 (12:39 -0800)
committerRiver Riddle <riddleriver@gmail.com>
Sat, 12 Nov 2022 22:38:45 +0000 (14:38 -0800)
The self type is handled separately from normal parameters, and
the use of the params directive currently breaks attributes that
want to use it (e.g. in a struct directive).

Differential Revision: https://reviews.llvm.org/D137732

mlir/docs/AttributesAndTypes.md
mlir/test/lib/Dialect/Test/TestAttrDefs.td
mlir/test/mlir-tblgen/attr-or-type-format-roundtrip.mlir
mlir/tools/mlir-tblgen/AttrOrTypeFormatGen.cpp

index d19b1bf..52b0073 100644 (file)
@@ -762,8 +762,9 @@ Attribute and type assembly formats have the following directives:
 
 ###### `params` Directive
 
-This directive is used to refer to all parameters of an attribute or type. When
-used as a top-level directive, `params` generates a parser and printer for a
+This directive is used to refer to all parameters of an attribute or type, except
+for the attribute self type (which is handled separately from normal parameters).
+When used as a top-level directive, `params` generates a parser and printer for a
 comma-separated list of the parameters. For example:
 
 ```tablegen
index c4996ab..145d021 100644 (file)
@@ -229,6 +229,14 @@ def TestAttrSelfTypeParameterFormat
   let assemblyFormat = "`<` $a `>`";
 }
 
+def TestAttrSelfTypeParameterStructFormat
+    : Test_Attr<"TestAttrSelfTypeParameterStructFormat", [TypedAttrInterface]> {
+  let parameters = (ins "int":$a, AttributeSelfTypeParameter<"">:$type);
+
+  let mnemonic = "attr_self_type_struct_format";
+  let assemblyFormat = "`<` struct(params) `>`";
+}
+
 // Test overridding attribute builders with a custom builder.
 def TestOverrideBuilderAttr : Test_Attr<"TestOverrideBuilder"> {
   let mnemonic = "override_builder";
index 1abf362..22cf365 100644 (file)
@@ -17,10 +17,12 @@ attributes {
   attr4 = #test.attr_with_type<i32, vector<4xi32>>,
   // CHECK: #test.attr_self_type_format<5> : i32
   attr5 = #test.attr_self_type_format<5> : i32,
+  // CHECK: #test.attr_self_type_struct_format<a = 5> : i32
+  attr6 = #test.attr_self_type_struct_format<a = 5> : i32,
   // CHECK: #test.custom_anchor<5>
-  attr6 = #test.custom_anchor<5>,
+  attr7 = #test.custom_anchor<5>,
   // CHECK: #test.custom_anchor<5, true>
-  attr7 = #test.custom_anchor<5, true>
+  attr8 = #test.custom_anchor<5, true>
 }
 
 // CHECK-LABEL: @test_roundtrip_default_parsers_struct
index d094fcd..da2455b 100644 (file)
@@ -1126,6 +1126,10 @@ FailureOr<FormatElement *> DefFormatParser::parseParamsDirective(SMLoc loc,
       return emitError(loc, "`params` captures duplicate parameter: " +
                                 it.value().getName());
     }
+    // Self-type parameters are handled separately from the rest of the
+    // parameters.
+    if (isa<AttributeSelfTypeParameter>(it.value()))
+      continue;
     seenParams.set(it.index());
     vars.push_back(create<ParameterElement>(it.value()));
   }