From e7cb6778000bdc915508cbe06ff23d976a1e6a51 Mon Sep 17 00:00:00 2001 From: Peter Klausler Date: Wed, 19 Jul 2023 13:23:53 -0700 Subject: [flang] Enforce F'2023 C7125 An item whose declared type is ABSTRACT may not appear in an array constructor. Differential Revision: https://reviews.llvm.org/D155969 --- flang/lib/Semantics/expression.cpp | 8 ++++++++ flang/test/Semantics/array-constr-values.f90 | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) (limited to 'flang') diff --git a/flang/lib/Semantics/expression.cpp b/flang/lib/Semantics/expression.cpp index 777ef3b..0f07fe0 100644 --- a/flang/lib/Semantics/expression.cpp +++ b/flang/lib/Semantics/expression.cpp @@ -1600,6 +1600,14 @@ void ArrayConstructorContext::Push(MaybeExpr &&x) { messageDisplayedSet_ |= 8; } return; + } else if (dyType->category() == TypeCategory::Derived && + dyType->GetDerivedTypeSpec().typeSymbol().attrs().test( + semantics::Attr::ABSTRACT)) { // F'2023 C7125 + if (!(messageDisplayedSet_ & 0x200)) { + exprAnalyzer_.Say( + "An item whose declared type is ABSTRACT may not appear in an array constructor"_err_en_US); + messageDisplayedSet_ |= 0x200; + } } DynamicTypeWithLength xType{dyType.value()}; if (Expr * charExpr{UnwrapExpr>(*x)}) { diff --git a/flang/test/Semantics/array-constr-values.f90 b/flang/test/Semantics/array-constr-values.f90 index 860a3a3..b93f774 100644 --- a/flang/test/Semantics/array-constr-values.f90 +++ b/flang/test/Semantics/array-constr-values.f90 @@ -44,9 +44,10 @@ subroutine arrayconstructorvalues() !ERROR: Cannot have an unlimited polymorphic value in an array constructor intarray = (/ unlim_polymorphic, 2, 3, 4, 5/) - ! C7114 + ! C7114, F'2023 C7125 !ERROR: No intrinsic or user-defined ASSIGNMENT(=) matches operand types INTEGER(4) and TYPE(base_type) !ERROR: ABSTRACT derived type 'base_type' may not be used in a structure constructor + !ERROR: An item whose declared type is ABSTRACT may not appear in an array constructor !ERROR: Values in array constructor must have the same declared type when no explicit type appears intarray = (/ base_type(10), 2, 3, 4, 5 /) -- cgit v1.1