diff --git a/flang/lib/Semantics/expression.cpp b/flang/lib/Semantics/expression.cpp --- a/flang/lib/Semantics/expression.cpp +++ b/flang/lib/Semantics/expression.cpp @@ -1997,11 +1997,18 @@ const auto &designator{std::get(call.t)}; if (const auto *name{std::get_if(&designator.u)}) { semantics::Scope &scope{context_.FindScope(name->source)}; + semantics::DerivedTypeSpec dtSpec{ + name->source, derivedType.GetUltimate()}; + if (dtSpec.IsForwardReferenced()) { + Say(call.source, + "Cannot construct value for derived type '%s' " + "before it is defined"_err_en_US, + name->source); + return std::nullopt; + } const semantics::DeclTypeSpec &type{ - semantics::FindOrInstantiateDerivedType(scope, - semantics::DerivedTypeSpec{ - name->source, derivedType.GetUltimate()}, - context_)}; + semantics::FindOrInstantiateDerivedType( + scope, std::move(dtSpec), context_)}; auto &mutableRef{const_cast(funcRef)}; *structureConstructor = mutableRef.ConvertToStructureConstructor(type.derivedTypeSpec()); diff --git a/flang/lib/Semantics/symbol.cpp b/flang/lib/Semantics/symbol.cpp --- a/flang/lib/Semantics/symbol.cpp +++ b/flang/lib/Semantics/symbol.cpp @@ -541,13 +541,11 @@ const Symbol *Symbol::GetParentComponent(const Scope *scope) const { if (const auto *dtDetails{detailsIf()}) { - if (!scope) { - scope = scope_; + if (const Scope * localScope{scope ? scope : scope_}) { + return dtDetails->GetParentComponent(DEREF(localScope)); } - return dtDetails->GetParentComponent(DEREF(scope)); - } else { - return nullptr; } + return nullptr; } void DerivedTypeDetails::add_component(const Symbol &symbol) { diff --git a/flang/test/Semantics/bad-forward-type.f90 b/flang/test/Semantics/bad-forward-type.f90 --- a/flang/test/Semantics/bad-forward-type.f90 +++ b/flang/test/Semantics/bad-forward-type.f90 @@ -70,3 +70,12 @@ type, extends(undef) :: t end type end subroutine + +subroutine s8 + implicit type(t2)(x) + !ERROR: Cannot construct value for derived type 't2' before it is defined + parameter(y=t2(12.3)) + type t2 + real :: c + end type +end subroutine