diff --git a/mlir/lib/Parser/Parser.cpp b/mlir/lib/Parser/Parser.cpp --- a/mlir/lib/Parser/Parser.cpp +++ b/mlir/lib/Parser/Parser.cpp @@ -1958,11 +1958,9 @@ return emitError(nameLoc, "redefinition of block '") << name << "'"; // If an argument list is present, parse it. - if (consumeIf(Token::l_paren)) { - if (parseOptionalBlockArgList(block) || - parseToken(Token::r_paren, "expected ')' to end argument list")) + if (getToken().is(Token::l_paren)) + if (parseOptionalBlockArgList(block)) return failure(); - } if (parseToken(Token::colon, "expected ':' after block name")) return failure(); @@ -2025,9 +2023,11 @@ return blockAndLoc.block; } -/// Parse a (possibly empty) list of SSA operands with types as block arguments. +/// Parse a (possibly empty) list of SSA operands with types as block arguments +/// enclosed in parentheses. /// -/// ssa-id-and-type-list ::= ssa-id-and-type (`,` ssa-id-and-type)* +/// value-id-and-type-list ::= value-id-and-type (`,` ssa-id-and-type)* +/// block-arg-list ::= `(` value-id-and-type-list? `)` /// ParseResult OperationParser::parseOptionalBlockArgList(Block *owner) { if (getToken().is(Token::r_brace)) @@ -2038,7 +2038,7 @@ bool definingExistingArgs = owner->getNumArguments() != 0; unsigned nextArgument = 0; - return parseCommaSeparatedList([&]() -> ParseResult { + return parseCommaSeparatedList(Delimiter::Paren, [&]() -> ParseResult { return parseSSADefOrUseAndType( [&](SSAUseInfo useInfo, Type type) -> ParseResult { BlockArgument arg; diff --git a/mlir/test/IR/invalid.mlir b/mlir/test/IR/invalid.mlir --- a/mlir/test/IR/invalid.mlir +++ b/mlir/test/IR/invalid.mlir @@ -136,7 +136,7 @@ // ----- func @block_no_rparen() { -^bb42 (%bb42 : i32: // expected-error {{expected ')' to end argument list}} +^bb42 (%bb42 : i32: // expected-error {{expected ')'}} return } @@ -188,6 +188,12 @@ %y = arith.constant 1 : i32 // expected-error {{block with no terminator}} } +// ----- + +func @no_block_arg_enclosing_parens() { +^bb %x: i32 : // expected-error {{expected ':' after block name}} + return +} // ----- diff --git a/mlir/test/IR/parser.mlir b/mlir/test/IR/parser.mlir --- a/mlir/test/IR/parser.mlir +++ b/mlir/test/IR/parser.mlir @@ -181,6 +181,12 @@ // CHECK: } } +// CHECK-LABEL: func @block_label_empty_list +func @block_label_empty_list() { +^bb0(): + return +} + // CHECK-LABEL: func @multiblock() { func @multiblock() { return // CHECK: return