Skip to content

Commit 245eb0a

Browse files
authored
[flang] Catch structure constructor in its own type definition (#102241)
The check for a structure constructor to a forward-referenced derived type wasn't tripping for constructors in the type definition itself. Set the forward reference flag unconditionally at the beginning of name resolution for the type definition.
1 parent 25822dc commit 245eb0a

File tree

3 files changed

+5
-8
lines changed

3 files changed

+5
-8
lines changed

flang/lib/Semantics/expression.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3026,8 +3026,7 @@ const Symbol *AssumedTypeDummy<parser::PointerObject>(
30263026
bool ExpressionAnalyzer::CheckIsValidForwardReference(
30273027
const semantics::DerivedTypeSpec &dtSpec) {
30283028
if (dtSpec.IsForwardReferenced()) {
3029-
Say("Cannot construct value for derived type '%s' "
3030-
"before it is defined"_err_en_US,
3029+
Say("Cannot construct value for derived type '%s' before it is defined"_err_en_US,
30313030
dtSpec.name());
30323031
return false;
30333032
}

flang/lib/Semantics/resolve-names.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5507,11 +5507,8 @@ void DeclarationVisitor::Post(const parser::DerivedTypeStmt &x) {
55075507
std::optional<DerivedTypeSpec> extendsType{
55085508
ResolveExtendsType(name, extendsName)};
55095509
DerivedTypeDetails derivedTypeDetails;
5510-
if (Symbol * typeSymbol{FindInScope(currScope(), name)}; typeSymbol &&
5511-
typeSymbol->has<DerivedTypeDetails>() &&
5512-
typeSymbol->get<DerivedTypeDetails>().isForwardReferenced()) {
5513-
derivedTypeDetails.set_isForwardReferenced(true);
5514-
}
5510+
// Catch any premature structure constructors within the definition
5511+
derivedTypeDetails.set_isForwardReferenced(true);
55155512
auto &symbol{MakeSymbol(name, GetAttrs(), std::move(derivedTypeDetails))};
55165513
symbol.ReplaceName(name.source);
55175514
derivedTypeInfo_.type = &symbol;

flang/test/Semantics/bad-forward-type.f90

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,8 @@ subroutine s8
7676
!ERROR: Cannot construct value for derived type 't2' before it is defined
7777
parameter(y=t2(12.3))
7878
type t2
79-
real :: c
79+
!ERROR: Cannot construct value for derived type 't2' before it is defined
80+
real :: c = transfer(t2(),0.)
8081
end type
8182
end subroutine
8283

0 commit comments

Comments
 (0)