diff --git a/flang/lib/Lower/ConvertExpr.cpp b/flang/lib/Lower/ConvertExpr.cpp --- a/flang/lib/Lower/ConvertExpr.cpp +++ b/flang/lib/Lower/ConvertExpr.cpp @@ -34,6 +34,7 @@ #include "flang/Optimizer/Builder/Complex.h" #include "flang/Optimizer/Builder/Factory.h" #include "flang/Optimizer/Builder/Runtime/Character.h" +#include "flang/Optimizer/Builder/Runtime/Derived.h" #include "flang/Optimizer/Builder/Runtime/RTBuilder.h" #include "flang/Optimizer/Builder/Runtime/Ragged.h" #include "flang/Optimizer/Builder/Todo.h" @@ -1056,6 +1057,8 @@ auto recTy = ty.cast(); auto fieldTy = fir::FieldType::get(ty.getContext()); mlir::Value res = builder.createTemporary(loc, recTy); + mlir::Value box = builder.createBox(loc, fir::ExtendedValue{res}); + fir::runtime::genDerivedTypeInitialize(builder, loc, box); for (const auto &value : ctor.values()) { const Fortran::semantics::Symbol &sym = *value.first; diff --git a/flang/test/Lower/derived-type-temp.f90 b/flang/test/Lower/derived-type-temp.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Lower/derived-type-temp.f90 @@ -0,0 +1,19 @@ +! Test lowering of derived type temporary creation and init +! RUN: bbc -emit-fir %s -o - | FileCheck %s + +program derived_temp_init + type t1 + integer, allocatable :: i + end type + type t2 + type(t1) :: c + end type + type(t1) :: x + type(t2) :: y + y = t2(x) +end + +! CHECK: %[[temp:.*]] = fir.alloca !fir.type<_QFTt1{i:!fir.box>}> {bindc_name = "x", uniq_name = "_QFEx"} +! CHECK: %[[box:.*]] = fir.embox %[[temp]] : (!fir.ref>}>>) -> !fir.box>}>> +! CHECK: %[[box_none:.*]] = fir.convert %[[box]] : (!fir.box>}>>) -> !fir.box +! CHECK: %{{.*}} = fir.call @_FortranAInitialize(%[[box_none]], %{{.*}}, %{{.*}}) : (!fir.box, !fir.ref, i32) -> none