ArrayOfAttr can be used to easily create an attribute that just
contains an array of something. The elements can be other attributes,
in which case the custom parsers and printers are invoked directly for
nice syntax, or any C++ type that supports parsing and printing, either
though custom printer and parser methods or FieldParser.
An array of integers:
def ArrayOfInts : ArrayOfAttr<Test_Dialect, "ArrayOfInts", "array_of_ints", "int32_t">;
When embedded in an op's assembly format, it will look like
foo.ints value = [1, 2, 3]
An array of enums, when embedded in an op's assembly format, will look
like:
foo.enums value = [first, second, last]