[mlir] Fix two AttributeParser aborts

Reproducers that resulted in triggering the following asserts

mlir::NamedAttribute::NamedAttribute(mlir::StringAttr, mlir::Attribute)
mlir/lib/IR/Attributes.cpp:29:3
consumeToken
mlir/lib/Parser/Parser.h:126

Differential Revision: https://reviews.llvm.org/D122240
This commit is contained in:
Jacques Pienaar
2022-04-18 09:30:35 -07:00
parent a6efcf1c31
commit f4085c57dd
2 changed files with 19 additions and 2 deletions

View File

@@ -169,8 +169,10 @@ Attribute Parser::parseAttribute(Type type) {
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 @@ ParseResult Parser::parseAttributeDict(NamedAttrList &attributes) {
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";

View File

@@ -1643,3 +1643,14 @@ func @invalid_region_dominance_with_dominance_free_regions() {
// -----
func @foo() {} // expected-error {{expected non-empty function body}}
// -----
// expected-error@+1 {{expected valid attribute name}}
"t"(){""}
// -----
// expected-error@+2 {{expected ']'}}
"f"() { b = [@m: