@@ -548,7 +548,8 @@ template <typename Ty>
548548mlir::Value OpenACCMappableModel<Ty>::generatePrivateInit(
549549 mlir::Type type, mlir::OpBuilder &builder, mlir::Location loc,
550550 mlir::TypedValue<mlir::acc::MappableType> var, llvm::StringRef varName,
551- mlir::ValueRange extents, mlir::Value initVal) const {
551+ mlir::ValueRange extents, mlir::Value initVal, bool &needsDestroy) const {
552+ needsDestroy = false ;
552553 mlir::Value retVal;
553554 mlir::Type unwrappedTy = fir::unwrapRefType (type);
554555 mlir::ModuleOp mod = builder.getInsertionBlock ()
@@ -615,9 +616,11 @@ mlir::Value OpenACCMappableModel<Ty>::generatePrivateInit(
615616 mlir::Value firClass =
616617 fir::EmboxOp::create (builder, loc, boxTy, allocatedScalar);
617618 fir::StoreOp::create (builder, loc, firClass, retVal);
619+ needsDestroy = true ;
618620 } else if (mlir::isa<fir::SequenceType>(innerTy)) {
619621 hlfir::Entity source = hlfir::Entity{var};
620- auto [temp, cleanup] = hlfir::createTempFromMold (loc, firBuilder, source);
622+ auto [temp, cleanupFlag] =
623+ hlfir::createTempFromMold (loc, firBuilder, source);
621624 if (fir::isa_ref_type (type)) {
622625 // When the temp is created - it is not a reference - thus we can
623626 // end up with a type inconsistency. Therefore ensure storage is created
@@ -636,6 +639,9 @@ mlir::Value OpenACCMappableModel<Ty>::generatePrivateInit(
636639 } else {
637640 retVal = temp;
638641 }
642+ // If heap was allocated, a destroy is required later.
643+ if (cleanupFlag)
644+ needsDestroy = true ;
639645 } else {
640646 TODO (loc, " Unsupported boxed type for OpenACC private-like recipe" );
641647 }
@@ -667,23 +673,23 @@ template mlir::Value
667673OpenACCMappableModel<fir::BaseBoxType>::generatePrivateInit(
668674 mlir::Type type, mlir::OpBuilder &builder, mlir::Location loc,
669675 mlir::TypedValue<mlir::acc::MappableType> var, llvm::StringRef varName,
670- mlir::ValueRange extents, mlir::Value initVal) const ;
676+ mlir::ValueRange extents, mlir::Value initVal, bool &needsDestroy ) const ;
671677
672678template mlir::Value
673679OpenACCMappableModel<fir::ReferenceType>::generatePrivateInit(
674680 mlir::Type type, mlir::OpBuilder &builder, mlir::Location loc,
675681 mlir::TypedValue<mlir::acc::MappableType> var, llvm::StringRef varName,
676- mlir::ValueRange extents, mlir::Value initVal) const ;
682+ mlir::ValueRange extents, mlir::Value initVal, bool &needsDestroy ) const ;
677683
678684template mlir::Value OpenACCMappableModel<fir::HeapType>::generatePrivateInit(
679685 mlir::Type type, mlir::OpBuilder &builder, mlir::Location loc,
680686 mlir::TypedValue<mlir::acc::MappableType> var, llvm::StringRef varName,
681- mlir::ValueRange extents, mlir::Value initVal) const ;
687+ mlir::ValueRange extents, mlir::Value initVal, bool &needsDestroy ) const ;
682688
683689template mlir::Value
684690OpenACCMappableModel<fir::PointerType>::generatePrivateInit(
685691 mlir::Type type, mlir::OpBuilder &builder, mlir::Location loc,
686692 mlir::TypedValue<mlir::acc::MappableType> var, llvm::StringRef varName,
687- mlir::ValueRange extents, mlir::Value initVal) const ;
693+ mlir::ValueRange extents, mlir::Value initVal, bool &needsDestroy ) const ;
688694
689695} // namespace fir::acc
0 commit comments