1// RUN: mlir-tblgen -gen-typedef-defs -I %S/../../include -asmformat-error-is-fatal=false %s 2>&1 | FileCheck %s 2 3include "mlir/IR/AttrTypeBase.td" 4include "mlir/IR/OpBase.td" 5 6def Test_Dialect : Dialect { 7 let name = "TestDialect"; 8 let cppNamespace = "::test"; 9} 10 11class InvalidType<string name, string asm> : TypeDef<Test_Dialect, name> { 12 let mnemonic = asm; 13} 14 15// Test format is missing a parameter capture. 16def InvalidTypeA : InvalidType<"InvalidTypeA", "invalid_a"> { 17 let parameters = (ins "int":$v0, "int":$v1); 18 // CHECK: format is missing reference to parameter: v1 19 let assemblyFormat = "`<` $v0 `>`"; 20} 21 22// Test format has duplicate parameter captures. 23def InvalidTypeB : InvalidType<"InvalidTypeB", "invalid_b"> { 24 let parameters = (ins "int":$v0, "int":$v1); 25 // CHECK: duplicate parameter 'v0' 26 let assemblyFormat = "`<` $v0 `,` $v1 `,` $v0 `>`"; 27} 28 29// Test format has invalid syntax. 30def InvalidTypeC : InvalidType<"InvalidTypeC", "invalid_c"> { 31 let parameters = (ins "int":$v0, "int":$v1); 32 // CHECK: expected literal, variable, directive, or optional group 33 let assemblyFormat = "`<` $v0, $v1 `>`"; 34} 35 36// Test struct directive has invalid syntax. 37def InvalidTypeD : InvalidType<"InvalidTypeD", "invalid_d"> { 38 let parameters = (ins "int":$v0); 39 // CHECK: literals may only be used in the top-level section of the format 40 // CHECK: expected a variable in `struct` argument list 41 let assemblyFormat = "`<` struct($v0, `,`) `>`"; 42} 43 44// Test struct directive cannot capture zero parameters. 45def InvalidTypeE : InvalidType<"InvalidTypeE", "invalid_e"> { 46 let parameters = (ins "int":$v0); 47 // CHECK: `struct` argument list expected a variable or directive 48 let assemblyFormat = "`<` struct() $v0 `>`"; 49} 50 51// Test capture parameter that does not exist. 52def InvalidTypeF : InvalidType<"InvalidTypeF", "invalid_f"> { 53 let parameters = (ins "int":$v0); 54 // CHECK: InvalidTypeF has no parameter named 'v1' 55 let assemblyFormat = "`<` $v0 $v1 `>`"; 56} 57 58// Test duplicate capture of parameter in capture-all struct. 59def InvalidTypeG : InvalidType<"InvalidTypeG", "invalid_g"> { 60 let parameters = (ins "int":$v0, "int":$v1, "int":$v2); 61 // CHECK: duplicate parameter 'v0' 62 let assemblyFormat = "`<` struct(params) $v0 `>`"; 63} 64 65// Test capture-all struct duplicate capture. 66def InvalidTypeH : InvalidType<"InvalidTypeH", "invalid_h"> { 67 let parameters = (ins "int":$v0, "int":$v1, "int":$v2); 68 // CHECK: `params` captures duplicate parameter: v0 69 let assemblyFormat = "`<` $v0 struct(params) `>`"; 70} 71 72// Test capture of parameter after `params` directive. 73def InvalidTypeI : InvalidType<"InvalidTypeI", "invalid_i"> { 74 let parameters = (ins "int":$v0); 75 // CHECK: duplicate parameter 'v0' 76 let assemblyFormat = "`<` params $v0 `>`"; 77} 78 79// Test `struct` with optional parameter followed by comma. 80def InvalidTypeJ : InvalidType<"InvalidTypeJ", "invalid_j"> { 81 let parameters = (ins OptionalParameter<"int">:$a, "int":$b); 82 // CHECK: directive with optional parameters cannot be followed by a comma literal 83 let assemblyFormat = "struct($a) `,` $b"; 84} 85 86// Test `struct` in optional group must have all optional parameters. 87def InvalidTypeK : InvalidType<"InvalidTypeK", "invalid_k"> { 88 let parameters = (ins OptionalParameter<"int">:$a, "int":$b); 89 // CHECK: is only allowed in an optional group if all captured parameters are optional 90 let assemblyFormat = "(`(` struct(params)^ `)`)?"; 91} 92 93// Test `struct` in optional group must have all optional parameters. 94def InvalidTypeL : InvalidType<"InvalidTypeL", "invalid_l"> { 95 let parameters = (ins OptionalParameter<"int">:$a, "int":$b); 96 // CHECK: directive allowed in optional group only if all parameters are optional 97 let assemblyFormat = "(`(` params^ `)`)?"; 98} 99 100def InvalidTypeM : InvalidType<"InvalidTypeM", "invalid_m"> { 101 let parameters = (ins OptionalParameter<"int">:$a, "int":$b); 102 // CHECK: parameters in an optional group must be optional 103 let assemblyFormat = "(`(` $a^ `,` $b `)`)?"; 104} 105 106def InvalidTypeN : InvalidType<"InvalidTypeN", "invalid_n"> { 107 let parameters = (ins OptionalParameter<"int">:$a); 108 // CHECK: optional group anchor must be a parameter or directive 109 let assemblyFormat = "(`(` $a `)`^)?"; 110} 111 112def InvalidTypeO : InvalidType<"InvalidTypeO", "invalid_o"> { 113 let parameters = (ins "int":$a); 114 // CHECK: 'ref' is only valid within a `custom` directive 115 let assemblyFormat = "$a ref($a)"; 116} 117 118def InvalidTypeP : InvalidType<"InvalidTypeP", "invalid_p"> { 119 let parameters = (ins "int":$a); 120 // CHECK: parameter 'a' must be bound before it is referenced 121 let assemblyFormat = "custom<Foo>(ref($a)) $a"; 122} 123 124def InvalidTypeQ : InvalidType<"InvalidTypeQ", "invalid_q"> { 125 let parameters = (ins "int":$a); 126 // CHECK: `params` can only be used at the top-level context or within a `struct` directive 127 let assemblyFormat = "custom<Foo>(params)"; 128} 129 130def InvalidTypeR : InvalidType<"InvalidTypeR", "invalid_r"> { 131 let parameters = (ins "int":$a); 132 // CHECK: `struct` can only be used at the top-level context 133 let assemblyFormat = "custom<Foo>(struct(params))"; 134} 135 136def InvalidTypeS : InvalidType<"InvalidTypeS", "invalid_s"> { 137 let parameters = (ins OptionalParameter<"int">:$a, "int":$b); 138 // CHECK: `custom` is only allowed in an optional group if all captured parameters are optional 139 let assemblyFormat = "(`(` custom<Foo>($a, $b)^ `)`)?"; 140} 141 142def InvalidTypeT : InvalidType<"InvalidTypeT", "invalid_t"> { 143 let parameters = (ins OptionalParameter<"int">:$a); 144 // CHECK: `custom` directive with no bound parameters cannot be used as optional group anchor 145 let assemblyFormat = "$a (`(` custom<Foo>(ref($a))^ `)`)?"; 146} 147