Skip to content

Commit 0002960

Browse files
authored
[flang] fix passing characters to polymorphic array pointers (#157813)
The existing code failed to detect character array as being character because of the extra fir.array type indirection. Use `fir::getFortranElementType` for a more generic type handling. Fixes #150749.
1 parent 788a25a commit 0002960

File tree

3 files changed

+31
-2
lines changed

3 files changed

+31
-2
lines changed

flang/lib/Optimizer/Builder/MutableBox.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ createNewFirBox(fir::FirOpBuilder &builder, mlir::Location loc,
6767
cleanedLengths.append(lengths.begin(), lengths.end());
6868
} else if (fir::isUnlimitedPolymorphicType(box.getBoxTy())) {
6969
if (auto charTy = mlir::dyn_cast<fir::CharacterType>(
70-
fir::dyn_cast_ptrEleTy(addr.getType()))) {
70+
fir::getFortranElementType(addr.getType()))) {
7171
if (charTy.getLen() == fir::CharacterType::unknownLen())
7272
cleanedLengths.append(lengths.begin(), lengths.end());
7373
}

flang/test/Lower/HLFIR/actual_target_for_dummy_pointer.f90

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ end subroutine char_explicit_shape_array
246246
! CHECK: fir.store %[[VAL_30]] to %[[VAL_2]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?x!fir.char<1,?>>>>>
247247
! CHECK: fir.call @_QPchar_explicit_shape_array_assumed_len_callee(%[[VAL_2]]) fastmath<contract> : (!fir.ref<!fir.box<!fir.ptr<!fir.array<?x!fir.char<1,?>>>>>) -> ()
248248
! CHECK: %[[VAL_31:.*]] = fir.shape %[[VAL_14]] : (index) -> !fir.shape<1>
249-
! CHECK: %[[VAL_32:.*]] = fir.embox %[[VAL_16]]#1(%[[VAL_31]]) : (!fir.ref<!fir.array<100x!fir.char<1,?>>>, !fir.shape<1>) -> !fir.class<!fir.ptr<!fir.array<?xnone>>>
249+
! CHECK: %[[VAL_32:.*]] = fir.embox %[[VAL_16]]#1(%[[VAL_31]]) typeparams %[[VAL_12]]#1 : (!fir.ref<!fir.array<100x!fir.char<1,?>>>, !fir.shape<1>, index) -> !fir.class<!fir.ptr<!fir.array<?xnone>>>
250250
! CHECK: fir.store %[[VAL_32]] to %[[VAL_1]] : !fir.ref<!fir.class<!fir.ptr<!fir.array<?xnone>>>>
251251
! CHECK: fir.call @_QPchar_explicit_shape_array_uclass_callee(%[[VAL_1]]) fastmath<contract> : (!fir.ref<!fir.class<!fir.ptr<!fir.array<?xnone>>>>) -> ()
252252
! CHECK: return
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
! Test passing character array to unlimited polymorphic array pointer.
2+
! Regression test from https://github.com/llvm/llvm-project/issues/150749
3+
4+
! RUN: bbc -emit-hlfir -o - %s | FileCheck %s
5+
6+
subroutine char_explicit_shape_array(a2)
7+
interface
8+
subroutine char_explicit_shape_array_uclass_callee(p)
9+
class(*), pointer, intent(in) :: p(:)
10+
end subroutine char_explicit_shape_array_uclass_callee
11+
end interface
12+
character(*), target :: a2(100)
13+
call char_explicit_shape_array_uclass_callee(a2)
14+
end subroutine char_explicit_shape_array
15+
! CHECK-LABEL: func.func @_QPchar_explicit_shape_array(
16+
! CHECK-SAME: %[[ARG0:.*]]: !fir.boxchar<1> {fir.bindc_name = "a2", fir.target}) {
17+
! CHECK: %[[VAL_0:.*]] = fir.alloca !fir.class<!fir.ptr<!fir.array<?xnone>>>
18+
! CHECK: %[[VAL_1:.*]] = fir.dummy_scope : !fir.dscope
19+
! CHECK: %[[VAL_2:.*]]:2 = fir.unboxchar %[[ARG0]] : (!fir.boxchar<1>) -> (!fir.ref<!fir.char<1,?>>, index)
20+
! CHECK: %[[VAL_3:.*]] = fir.convert %[[VAL_2]]#0 : (!fir.ref<!fir.char<1,?>>) -> !fir.ref<!fir.array<100x!fir.char<1,?>>>
21+
! CHECK: %[[VAL_4:.*]] = arith.constant 100 : index
22+
! CHECK: %[[VAL_5:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1>
23+
! CHECK: %[[VAL_6:.*]]:2 = hlfir.declare %[[VAL_3]](%[[VAL_5]]) typeparams %[[VAL_2]]#1 dummy_scope %[[VAL_1]] {fortran_attrs = #fir.var_attrs<target>, uniq_name = "_QFchar_explicit_shape_arrayEa2"} : (!fir.ref<!fir.array<100x!fir.char<1,?>>>, !fir.shape<1>, index, !fir.dscope) -> (!fir.box<!fir.array<100x!fir.char<1,?>>>, !fir.ref<!fir.array<100x!fir.char<1,?>>>)
24+
! CHECK: %[[VAL_7:.*]] = fir.shape %[[VAL_4]] : (index) -> !fir.shape<1>
25+
! CHECK: %[[VAL_8:.*]] = fir.embox %[[VAL_6]]#1(%[[VAL_7]]) typeparams %[[VAL_2]]#1 : (!fir.ref<!fir.array<100x!fir.char<1,?>>>, !fir.shape<1>, index) -> !fir.class<!fir.ptr<!fir.array<?xnone>>>
26+
! CHECK: fir.store %[[VAL_8]] to %[[VAL_0]] : !fir.ref<!fir.class<!fir.ptr<!fir.array<?xnone>>>>
27+
! CHECK: fir.call @_QPchar_explicit_shape_array_uclass_callee(%[[VAL_0]]) fastmath<contract> : (!fir.ref<!fir.class<!fir.ptr<!fir.array<?xnone>>>>) -> ()
28+
! CHECK: return
29+
! CHECK: }

0 commit comments

Comments
 (0)