[HW] Fix crash when error encountered parsing hw.array. (#7578)

Fix checking of OptionalParseResult, having value does not mean
that the parsing succeeded.

Add test.

Found via fuzzing.
This commit is contained in:
Will Dietz 2024-09-04 00:29:42 -05:00 committed by GitHub
parent f074d91fea
commit 38f45e1be1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 14 additions and 3 deletions

View File

@ -558,10 +558,16 @@ static ParseResult parseHWArray(AsmParser &p, Attribute &dim, Type &inner) {
uint64_t dimLiteral; uint64_t dimLiteral;
auto int64Type = p.getBuilder().getIntegerType(64); auto int64Type = p.getBuilder().getIntegerType(64);
if (auto res = p.parseOptionalInteger(dimLiteral); res.has_value()) if (auto res = p.parseOptionalInteger(dimLiteral); res.has_value()) {
if (failed(*res))
return failure();
dim = p.getBuilder().getI64IntegerAttr(dimLiteral); dim = p.getBuilder().getI64IntegerAttr(dimLiteral);
else if (!p.parseOptionalAttribute(dim, int64Type).has_value()) } else if (auto res64 = p.parseOptionalAttribute(dim, int64Type);
return failure(); res64.has_value()) {
if (failed(*res64))
return failure();
} else
return p.emitError(p.getNameLoc(), "expected integer");
if (!isa<IntegerAttr, ParamExprAttr, ParamDeclRefAttr>(dim)) { if (!isa<IntegerAttr, ParamExprAttr, ParamDeclRefAttr>(dim)) {
p.emitError(p.getNameLoc(), "unsupported dimension kind in hw.array"); p.emitError(p.getNameLoc(), "unsupported dimension kind in hw.array");

View File

@ -501,3 +501,8 @@ hw.module @Foo () {
hw.instance_choice "inst" option "foo" @DoesNotExist () -> () hw.instance_choice "inst" option "foo" @DoesNotExist () -> ()
} }
// -----
// Don't crash if hw.array attribute fails to parse as integer
// expected-error @below {{floating point value not valid for specified type}}
hw.module @arrayTypeError(in %in: !hw.array<44.44axi0>) { }