mirror of
https://github.com/intel/llvm.git
synced 2026-01-26 12:26:52 +08:00
[flang][hlfir] Allow passing null() to dummy class argument.
This commit is contained in:
@@ -1135,7 +1135,8 @@ genUserCall(PreparedActualArguments &loweredActuals,
|
||||
// callee side, and it is illegal to use NULL without a MOLD if any
|
||||
// dummy length parameters are assumed.
|
||||
mlir::Type boxTy = fir::dyn_cast_ptrEleTy(argTy);
|
||||
assert(boxTy && boxTy.isa<fir::BoxType>() && "must be a fir.box type");
|
||||
assert(boxTy && boxTy.isa<fir::BaseBoxType>() &&
|
||||
"must be a fir.box type");
|
||||
mlir::Value boxStorage = builder.createTemporary(loc, boxTy);
|
||||
mlir::Value nullBox = fir::factory::createUnallocatedBox(
|
||||
builder, loc, boxTy, /*nonDeferredParams=*/{});
|
||||
|
||||
31
flang/test/Lower/pass-null-for-class-arg.f90
Normal file
31
flang/test/Lower/pass-null-for-class-arg.f90
Normal file
@@ -0,0 +1,31 @@
|
||||
! RUN: bbc -emit-fir -polymorphic-type %s -o - | FileCheck %s --check-prefix=FIR
|
||||
! RUN: bbc -emit-fir -polymorphic-type -hlfir %s -o - | FileCheck %s --check-prefix=HLFIR
|
||||
|
||||
subroutine test
|
||||
interface
|
||||
subroutine s1p(n)
|
||||
type t
|
||||
integer :: n
|
||||
end type t
|
||||
class(t), pointer :: n
|
||||
end subroutine s1p
|
||||
end interface
|
||||
call s1p(null())
|
||||
end subroutine test
|
||||
! FIR-LABEL: func.func @_QPtest() {
|
||||
! FIR: %[[VAL_0:.*]] = fir.alloca !fir.class<!fir.ptr<!fir.type<_QFtestFs1pTt{n:i32}>>>
|
||||
! FIR: %[[VAL_1:.*]] = fir.zero_bits !fir.ptr<!fir.type<_QFtestFs1pTt{n:i32}>>
|
||||
! FIR: %[[VAL_2:.*]] = fir.embox %[[VAL_1]] : (!fir.ptr<!fir.type<_QFtestFs1pTt{n:i32}>>) -> !fir.class<!fir.ptr<!fir.type<_QFtestFs1pTt{n:i32}>>>
|
||||
! FIR: fir.store %[[VAL_2]] to %[[VAL_0]] : !fir.ref<!fir.class<!fir.ptr<!fir.type<_QFtestFs1pTt{n:i32}>>>>
|
||||
! FIR: fir.call @_QPs1p(%[[VAL_0]]) fastmath<contract> : (!fir.ref<!fir.class<!fir.ptr<!fir.type<_QFtestFs1pTt{n:i32}>>>>) -> ()
|
||||
! FIR: return
|
||||
! FIR: }
|
||||
|
||||
! HLFIR-LABEL: func.func @_QPtest() {
|
||||
! HLFIR: %[[VAL_0:.*]] = fir.alloca !fir.class<!fir.ptr<!fir.type<_QFtestFs1pTt{n:i32}>>>
|
||||
! HLFIR: %[[VAL_1:.*]] = fir.zero_bits !fir.ptr<!fir.type<_QFtestFs1pTt{n:i32}>>
|
||||
! HLFIR: %[[VAL_2:.*]] = fir.embox %[[VAL_1]] : (!fir.ptr<!fir.type<_QFtestFs1pTt{n:i32}>>) -> !fir.class<!fir.ptr<!fir.type<_QFtestFs1pTt{n:i32}>>>
|
||||
! HLFIR: fir.store %[[VAL_2]] to %[[VAL_0]] : !fir.ref<!fir.class<!fir.ptr<!fir.type<_QFtestFs1pTt{n:i32}>>>>
|
||||
! HLFIR: fir.call @_QPs1p(%[[VAL_0]]) fastmath<contract> : (!fir.ref<!fir.class<!fir.ptr<!fir.type<_QFtestFs1pTt{n:i32}>>>>) -> ()
|
||||
! HLFIR: return
|
||||
! HLFIR: }
|
||||
Reference in New Issue
Block a user