[flang-commits] [flang] [flang][lowering] Implement component-wise initialization for derived types (PR #187465)
via flang-commits
flang-commits at lists.llvm.org
Mon Mar 23 04:16:02 PDT 2026
================
@@ -812,6 +819,244 @@ mustBeDefaultInitializedAtRuntime(const Fortran::lower::pft::Variable &var) {
return Fortran::lower::hasDefaultInitialization(sym);
}
+namespace {
+/// Determines if \p sym represents a complex derived type.
+/// A derived type is considered complex if it contains allocatable, pointer,
+/// or procedure pointer components, or nested complex derived types.
+static bool isComplexDerivedType(const Fortran::semantics::Symbol &sym) {
+ const Fortran::semantics::DeclTypeSpec *declTy = sym.GetType();
+ if (!declTy || !declTy->AsDerived())
+ return false;
+ const Fortran::semantics::DerivedTypeSpec &derivedSpec = *declTy->AsDerived();
+ const Fortran::semantics::Scope *scope = derivedSpec.GetScope();
+ if (!scope)
+ return false;
+ const auto &typeDetails =
+ derivedSpec.typeSymbol().get<Fortran::semantics::DerivedTypeDetails>();
+ for (const auto &compName : typeDetails.componentNames()) {
+ auto iter = scope->find(compName);
+ if (iter == scope->cend())
+ continue;
+ const Fortran::semantics::Symbol &compSym = iter->second.get();
+ const auto *objDetails =
+ compSym.detailsIf<Fortran::semantics::ObjectEntityDetails>();
+ const auto *procDetails =
+ compSym.detailsIf<Fortran::semantics::ProcEntityDetails>();
+ if (Fortran::semantics::IsAllocatableOrPointer(compSym)) {
+ return true;
+ } else if (procDetails && procDetails->init().has_value()) {
+ return true;
+ } else if (objDetails && objDetails->init() && compSym.Rank() > 0) {
+ return true;
+ } else if (isComplexDerivedType(compSym)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+/// Performs precise, component-wise initialization for \p derivedSpec,
+/// selectively generating IR only for components that require it.
+static void genDerivedTypeComponentInit(
+ Fortran::lower::AbstractConverter &converter, mlir::Location loc,
+ const Fortran::semantics::DerivedTypeSpec &derivedSpec,
+ mlir::Value baseAddr, fir::RecordType recTy) {
+ fir::FirOpBuilder &builder = converter.getFirOpBuilder();
+ const Fortran::semantics::Scope *scope = derivedSpec.GetScope();
+ if (!scope)
+ return;
+ const auto &typeDetails =
+ derivedSpec.typeSymbol().get<Fortran::semantics::DerivedTypeDetails>();
+ for (const auto &compName : typeDetails.componentNames()) {
+ auto scopeIter = scope->find(compName);
+ if (scopeIter == scope->cend())
+ continue;
+ const Fortran::semantics::Symbol &compSym = scopeIter->second.get();
+ const auto *objDetails =
+ compSym.detailsIf<Fortran::semantics::ObjectEntityDetails>();
+ const auto *procDetails =
+ compSym.detailsIf<Fortran::semantics::ProcEntityDetails>();
+ // Determine if the component requires initialization.
+ // Dynamic descriptors (pointers/allocatables) and explicitly initialized
+ // entities must be processed.
+ bool needsInit = Fortran::semantics::IsAllocatableOrPointer(compSym) ||
+ (objDetails && objDetails->init()) ||
+ (procDetails && procDetails->init().has_value());
+ if (!needsInit && !Fortran::lower::hasDefaultInitialization(compSym))
+ continue;
+ std::string name = converter.getRecordTypeFieldName(compSym);
+ mlir::Type compFirTy = recTy.getType(name);
+ if (!compFirTy)
+ continue;
----------------
jeanPerier wrote:
This should be an assert.
https://github.com/llvm/llvm-project/pull/187465
More information about the flang-commits
mailing list