diff --git a/flang/lib/Optimizer/Dialect/FIROps.cpp b/flang/lib/Optimizer/Dialect/FIROps.cpp index 90202f3cee588..052cc9c717bcb 100644 --- a/flang/lib/Optimizer/Dialect/FIROps.cpp +++ b/flang/lib/Optimizer/Dialect/FIROps.cpp @@ -388,6 +388,12 @@ static bool validTypeParams(mlir::Type dynTy, mlir::ValueRange typeParams, if (!allowParamsForBox) return typeParams.size() == 0; + // A boxed value may have no length parameters, when the lengths + // are assumed. If dynamic lengths are used, then proceed + // to the verification below. + if (typeParams.size() == 0) + return true; + dynTy = fir::getFortranElementType(dynTy); } // Derived type must have all type parameters satisfied. diff --git a/flang/test/Fir/fir-ops.fir b/flang/test/Fir/fir-ops.fir index 9cd02dce626ab..9c444d2f4e0bc 100644 --- a/flang/test/Fir/fir-ops.fir +++ b/flang/test/Fir/fir-ops.fir @@ -968,6 +968,17 @@ func.func @test_pack_unpack_array(%arg0: !fir.ref>, %arg1: !fir.b return } +// Test assumed-length character array packing. +// CHECK-LABEL: func.func @test_pack_array_character( +// CHECK-SAME: %[[VAL_0:[0-9]+|[a-zA-Z$._-][a-zA-Z0-9$._-]*]]: !fir.box>>) { +func.func @test_pack_array_character(%arg0: !fir.box>>) { +// CHECK: %[[VAL_1:.*]] = fir.pack_array %[[VAL_0]] heap whole : (!fir.box>>) -> !fir.box>> + %0 = fir.pack_array %arg0 heap whole : (!fir.box>>) -> !fir.box>> +// CHECK: fir.unpack_array %[[VAL_1]] to %[[VAL_0]] heap no_copy : !fir.box>> + fir.unpack_array %0 to %arg0 heap no_copy : !fir.box>> + return +} + // CHECK-LABEL: func.func @test_is_contiguous_box( func.func @test_is_contiguous_box(%arg0: !fir.class>, %arg1: !fir.box>, %arg2: !fir.box) -> i1 { // CHECK: fir.is_contiguous_box %{{.*}} innermost : (!fir.class>) -> i1