diff --git a/flang/include/flang/Optimizer/Dialect/FIROps.td b/flang/include/flang/Optimizer/Dialect/FIROps.td --- a/flang/include/flang/Optimizer/Dialect/FIROps.td +++ b/flang/include/flang/Optimizer/Dialect/FIROps.td @@ -1978,7 +1978,8 @@ let summary = "insert sub-value into a range on an existing sequence"; let description = [{ - Insert copies of a value into an entity with an array type. + Insert copies of a value into an entity with an array type of constant shape + and size. Returns a new ssa value with the same type as the original entity. The values are inserted at a contiguous range of indices in Fortran row-to-column element order as specified by lower and upper bound diff --git a/flang/lib/Optimizer/Dialect/FIROps.cpp b/flang/lib/Optimizer/Dialect/FIROps.cpp --- a/flang/lib/Optimizer/Dialect/FIROps.cpp +++ b/flang/lib/Optimizer/Dialect/FIROps.cpp @@ -1387,6 +1387,8 @@ /// Range bounds must be nonnegative, and the range must not be empty. static mlir::LogicalResult verify(fir::InsertOnRangeOp op) { + if (fir::hasDynamicSize(op.seq().getType())) + return op.emitOpError("must have constant shape and size"); if (op.coor().size() < 2 || op.coor().size() % 2 != 0) return op.emitOpError("has uneven number of values in ranges"); bool rangeIsKnownToBeNonempty = false; diff --git a/flang/test/Fir/invalid.fir b/flang/test/Fir/invalid.fir --- a/flang/test/Fir/invalid.fir +++ b/flang/test/Fir/invalid.fir @@ -464,6 +464,26 @@ // ----- +fir.global internal @_QEmultiarray : !fir.array { + %c0_i32 = arith.constant 1 : i32 + %0 = fir.undefined !fir.array + // expected-error@+1 {{'fir.insert_on_range' op must have constant shape and size}} + %2 = fir.insert_on_range %0, %c0_i32, [0 : index, 10 : index] : (!fir.array, i32) -> !fir.array + fir.has_value %2 : !fir.array +} + +// ----- + +fir.global internal @_QEmultiarray : !fir.array<*:i32> { + %c0_i32 = arith.constant 1 : i32 + %0 = fir.undefined !fir.array<*:i32> + // expected-error@+1 {{'fir.insert_on_range' op must have constant shape and size}} + %2 = fir.insert_on_range %0, %c0_i32, [0 : index, 10 : index] : (!fir.array<*:i32>, i32) -> !fir.array<*:i32> + fir.has_value %2 : !fir.array<*:i32> +} + +// ----- + func @bad_save_result(%buffer : !fir.ref>, %n :index) { %res = fir.call @array_func() : () -> !fir.array %shape = fir.shape %n : (index) -> !fir.shape<1>