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 @@ -1739,7 +1739,10 @@ } else if (IsAllocatable(*symbol) && IsBareNullPointer(&*value)) { // NULL() with no arguments allowed by 7.5.10 para 6 for ALLOCATABLE } else if (auto symType{DynamicType::From(symbol)}) { - if (valueType) { + if (IsAllocatable(*symbol) && symType->IsUnlimitedPolymorphic() && + valueType) { + // ok + } else if (valueType) { AttachDeclaration( Say(expr.source, "Value in structure constructor of type %s is " diff --git a/flang/test/Semantics/structconst01.f90 b/flang/test/Semantics/structconst01.f90 --- a/flang/test/Semantics/structconst01.f90 +++ b/flang/test/Semantics/structconst01.f90 @@ -66,5 +66,18 @@ k=2,m=3)) !ERROR: ABSTRACT derived type 'abstract' may not be used in a structure constructor call abstractarg(abstract(0)(n=1)) + !This case is ok end subroutine errors + subroutine polycomponent + type :: poly + class(*), allocatable :: p + end type poly + type(poly) :: x + ! These cases are not errors + x = poly(1) + x = poly('hello') + x = poly(type1(1)(123)) + !ERROR: Value in structure constructor is incompatible with component 'p' of type CLASS(*) + x = poly(z'feedface') + end subroutine end module module1