diff --git a/mlir/lib/Parser/AttributeParser.cpp b/mlir/lib/Parser/AttributeParser.cpp --- a/mlir/lib/Parser/AttributeParser.cpp +++ b/mlir/lib/Parser/AttributeParser.cpp @@ -169,8 +169,10 @@ const char *curPointer = getToken().getLoc().getPointer(); consumeToken(Token::colon); if (!consumeIf(Token::colon)) { - state.lex.resetPointer(curPointer); - consumeToken(); + if (getToken().isNot(Token::eof, Token::error)) { + state.lex.resetPointer(curPointer); + consumeToken(); + } break; } // Parse the reference itself. @@ -271,6 +273,10 @@ nameId = builder.getStringAttr(getTokenSpelling()); else return emitError("expected attribute name"); + + if (nameId->size() == 0) + return emitError("expected valid attribute name"); + if (!seenKeys.insert(*nameId).second) return emitError("duplicate key '") << nameId->getValue() << "' in dictionary attribute"; 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 @@ -1643,3 +1643,14 @@ // ----- func @foo() {} // expected-error {{expected non-empty function body}} + +// ----- + +// expected-error@+1 {{expected valid attribute name}} +"t"(){""} + +// ----- + +// expected-error@+2 {{expected ']'}} +"f"() { b = [@m: +