diff options
author | Peter Klausler <pklausler@nvidia.com> | 2023-07-19 13:23:53 -0700 |
---|---|---|
committer | Peter Klausler <pklausler@nvidia.com> | 2023-07-21 13:39:28 -0700 |
commit | e7cb6778000bdc915508cbe06ff23d976a1e6a51 (patch) | |
tree | d7a7f225458603cd052a2a3a1c195df7d817bd83 /flang | |
parent | c381a947531ff31f510a7719fade9da73ec45078 (diff) | |
download | llvm-e7cb6778000bdc915508cbe06ff23d976a1e6a51.zip llvm-e7cb6778000bdc915508cbe06ff23d976a1e6a51.tar.gz llvm-e7cb6778000bdc915508cbe06ff23d976a1e6a51.tar.bz2 |
[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
Diffstat (limited to 'flang')
-rw-r--r-- | flang/lib/Semantics/expression.cpp | 8 | ||||
-rw-r--r-- | flang/test/Semantics/array-constr-values.f90 | 3 |
2 files changed, 10 insertions, 1 deletions
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<SomeCharacter> * charExpr{UnwrapExpr<Expr<SomeCharacter>>(*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 /) |