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 @@ -1996,11 +1996,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/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 @@ -72,9 +72,8 @@ end subroutine subroutine s8 - !ERROR: Derived type 't2' was used but never defined - !ERROR: The derived type 't2' was forward-referenced but not defined 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