diff --git a/flang/lib/Semantics/expression.cpp b/flang/lib/Semantics/expression.cpp index 0ec96d447c0b9d..4f1c53f1bb53fc 100644 --- a/flang/lib/Semantics/expression.cpp +++ b/flang/lib/Semantics/expression.cpp @@ -3026,8 +3026,7 @@ const Symbol *AssumedTypeDummy( bool ExpressionAnalyzer::CheckIsValidForwardReference( const semantics::DerivedTypeSpec &dtSpec) { if (dtSpec.IsForwardReferenced()) { - Say("Cannot construct value for derived type '%s' " - "before it is defined"_err_en_US, + Say("Cannot construct value for derived type '%s' before it is defined"_err_en_US, dtSpec.name()); return false; } diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp index 2fe45f9c941d71..b4875d87d172c2 100644 --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -5507,11 +5507,8 @@ void DeclarationVisitor::Post(const parser::DerivedTypeStmt &x) { std::optional extendsType{ ResolveExtendsType(name, extendsName)}; DerivedTypeDetails derivedTypeDetails; - if (Symbol * typeSymbol{FindInScope(currScope(), name)}; typeSymbol && - typeSymbol->has() && - typeSymbol->get().isForwardReferenced()) { - derivedTypeDetails.set_isForwardReferenced(true); - } + // Catch any premature structure constructors within the definition + derivedTypeDetails.set_isForwardReferenced(true); auto &symbol{MakeSymbol(name, GetAttrs(), std::move(derivedTypeDetails))}; symbol.ReplaceName(name.source); derivedTypeInfo_.type = &symbol; diff --git a/flang/test/Semantics/bad-forward-type.f90 b/flang/test/Semantics/bad-forward-type.f90 index 432d450a15f3fc..27c6045b0059fa 100644 --- a/flang/test/Semantics/bad-forward-type.f90 +++ b/flang/test/Semantics/bad-forward-type.f90 @@ -76,7 +76,8 @@ subroutine s8 !ERROR: Cannot construct value for derived type 't2' before it is defined parameter(y=t2(12.3)) type t2 - real :: c + !ERROR: Cannot construct value for derived type 't2' before it is defined + real :: c = transfer(t2(),0.) end type end subroutine