[flang] Add one semantic check for masked array assignment

As Fortran 2018 states, in each where-assignment-stmt, the mask-expr and
the variable being defined shall be arrays of the same shape. The
previous check does not consider checking if it is an array.

Reviewed By: klausler

Differential Revision: https://reviews.llvm.org/D125022
This commit is contained in:
PeixinQiao 2022-05-06 22:19:20 +08:00
parent ffc7f9d542
commit 2472b6869a
3 changed files with 35 additions and 1 deletions

View File

@ -216,10 +216,13 @@ bool AssignmentContext::CheckForPureContext(const SomeExpr &lhs,
return true; return true;
} }
// 10.2.3.1(2) The masks and LHS of assignments must all have the same shape // 10.2.3.1(2) The masks and LHS of assignments must be arrays of the same shape
void AssignmentContext::CheckShape(parser::CharBlock at, const SomeExpr *expr) { void AssignmentContext::CheckShape(parser::CharBlock at, const SomeExpr *expr) {
if (auto shape{evaluate::GetShape(foldingContext(), expr)}) { if (auto shape{evaluate::GetShape(foldingContext(), expr)}) {
std::size_t size{shape->size()}; std::size_t size{shape->size()};
if (size == 0) {
Say(at, "The mask or variable must not be scalar"_err_en_US);
}
if (whereDepth_ == 0) { if (whereDepth_ == 0) {
whereExtents_.resize(size); whereExtents_.resize(size);
} else if (whereExtents_.size() != size) { } else if (whereExtents_.size() != size) {

View File

@ -52,3 +52,26 @@ subroutine s3
end where end where
end where end where
end end
subroutine s4
integer :: x1 = 0, x2(2) = 0
logical :: l1 = .false., l2(2) = (/.true., .false./), l3 = .false.
!ERROR: The mask or variable must not be scalar
where (l1)
!ERROR: The mask or variable must not be scalar
x1 = 1
end where
!ERROR: The mask or variable must not be scalar
where (l1)
!ERROR: The mask or variable must not be scalar
where (l3)
!ERROR: The mask or variable must not be scalar
x1 = 1
end where
end where
!ERROR: The mask or variable must not be scalar
where (l2(2))
!ERROR: The mask or variable must not be scalar
x2(2) = 1
end where
end

View File

@ -185,17 +185,25 @@ subroutine s13()
where ([1==1]) x='*' where ([1==1]) x='*'
where ([1==1]) n='*' ! fine where ([1==1]) n='*' ! fine
forall (j=1:1) forall (j=1:1)
!ERROR: The mask or variable must not be scalar
where (j==1) where (j==1)
!ERROR: Defined assignment in WHERE must be elemental, but 'ctor' is not !ERROR: Defined assignment in WHERE must be elemental, but 'ctor' is not
!ERROR: The mask or variable must not be scalar
x(j)='?' x(j)='?'
!ERROR: The mask or variable must not be scalar
n(j)='?' ! fine n(j)='?' ! fine
!ERROR: The mask or variable must not be scalar
elsewhere (.false.) elsewhere (.false.)
!ERROR: Defined assignment in WHERE must be elemental, but 'ctor' is not !ERROR: Defined assignment in WHERE must be elemental, but 'ctor' is not
!ERROR: The mask or variable must not be scalar
x(j)='1' x(j)='1'
!ERROR: The mask or variable must not be scalar
n(j)='1' ! fine n(j)='1' ! fine
elsewhere elsewhere
!ERROR: Defined assignment in WHERE must be elemental, but 'ctor' is not !ERROR: Defined assignment in WHERE must be elemental, but 'ctor' is not
!ERROR: The mask or variable must not be scalar
x(j)='9' x(j)='9'
!ERROR: The mask or variable must not be scalar
n(j)='9' ! fine n(j)='9' ! fine
end where end where
end forall end forall