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 @@ -1159,8 +1159,12 @@ template Result Test() { if (type_ && type_->category() == T::category) { if constexpr (T::category == TypeCategory::Derived) { - return AsMaybeExpr(ArrayConstructor{ - type_->GetDerivedTypeSpec(), MakeSpecific(std::move(values_))}); + if (type_->IsUnlimitedPolymorphic()) { + return std::nullopt; + } else { + return AsMaybeExpr(ArrayConstructor{type_->GetDerivedTypeSpec(), + MakeSpecific(std::move(values_))}); + } } else if (type_->kind() == T::kind) { if constexpr (T::category == TypeCategory::Character) { if (auto len{type_->LEN()}) { @@ -1295,6 +1299,13 @@ auto restorer{exprAnalyzer_.GetContextualMessages().SetLocation( expr.value().source)}; if (MaybeExpr v{exprAnalyzer_.Analyze(expr.value())}) { + if (auto exprType{v->GetType()}) { + if (exprType->IsUnlimitedPolymorphic()) { + exprAnalyzer_.Say( + "Cannot have an unlimited polymorphic value in an " + "array constructor"_err_en_US); + } + } Push(std::move(*v)); } }, diff --git a/flang/test/Semantics/resolve70.f90 b/flang/test/Semantics/resolve70.f90 --- a/flang/test/Semantics/resolve70.f90 +++ b/flang/test/Semantics/resolve70.f90 @@ -57,3 +57,19 @@ !ERROR: Non-extensible derived type 'inextensible' may not be used with CLASS keyword class(inextensible), allocatable :: x end subroutine s1 + +subroutine s2() + type t + integer i + end type t + type, extends(t) :: t2 + real x + end type t2 +contains + function f1(dummy) + class(*) dummy + type(t) f1(1) + !ERROR: Cannot have an unlimited polymorphic value in an array constructor + f1 = [ (dummy) ] + end function f1 +end subroutine s2