diff --git a/mlir/lib/Transforms/Utils/DialectConversion.cpp b/mlir/lib/Transforms/Utils/DialectConversion.cpp --- a/mlir/lib/Transforms/Utils/DialectConversion.cpp +++ b/mlir/lib/Transforms/Utils/DialectConversion.cpp @@ -1147,6 +1147,8 @@ block, converter, *conversion, mapping, argReplacements) : argConverter.convertSignature(block, converter, mapping, argReplacements); + if (failed(result)) + return failure(); if (Block *newBlock = result.getValue()) { if (newBlock != block) blockActions.push_back(BlockAction::getTypeConversion(newBlock)); diff --git a/mlir/test/Transforms/test-legalize-type-conversion.mlir b/mlir/test/Transforms/test-legalize-type-conversion.mlir --- a/mlir/test/Transforms/test-legalize-type-conversion.mlir +++ b/mlir/test/Transforms/test-legalize-type-conversion.mlir @@ -99,3 +99,17 @@ }) : () -> () return } + +// ----- + +// Should not segfault here but gracefully fail. +// CHECK-LABEL: func @test_block_argument_not_converted +func @test_block_argument_not_converted() { + "test.unsupported_block_arg_type"() ({ + // NOTE: The test pass does not convert `index` types. + // CHECK: ^bb0({{.*}}: index): + ^bb0(%0 : index): + "test.return"(%0) : (index) -> () + }) : () -> () + return +}