[flang] Enforce restrictions on intrinsic assignment

When the left-hand side of an intrinsic assignment statement is
polymorphic, the LHS must be a whole allocatable variable or
component and may not be a coarray (10.2.2.1p1(1)).

Differential Revision: https://reviews.llvm.org/D139049
This commit is contained in:
Peter Klausler 2022-11-04 14:29:49 -07:00
parent 28f13353b6
commit bc83d1c655
3 changed files with 25 additions and 0 deletions

View File

@ -2633,6 +2633,18 @@ const Assignment *ExpressionAnalyzer::Analyze(const parser::AssignmentStmt &x) {
if (!procRef) {
analyzer.CheckForNullPointer(
"in a non-pointer intrinsic assignment statement");
const Expr<SomeType> &lhs{analyzer.GetExpr(0)};
if (auto dyType{lhs.GetType()};
dyType && dyType->IsPolymorphic()) { // 10.2.1.2p1(1)
const Symbol *lastWhole0{UnwrapWholeSymbolOrComponentDataRef(lhs)};
const Symbol *lastWhole{
lastWhole0 ? &lastWhole0->GetUltimate() : nullptr};
if (!lastWhole || !IsAllocatable(*lastWhole)) {
Say("Left-hand side of assignment may not be polymorphic unless assignment is to an entire allocatable"_err_en_US);
} else if (evaluate::IsCoarray(*lastWhole)) {
Say("Left-hand side of assignment may not be polymorphic if it is a coarray"_err_en_US);
}
}
}
assignment.emplace(analyzer.MoveExpr(0), analyzer.MoveExpr(1));
if (procRef) {

View File

@ -0,0 +1,12 @@
! RUN: %python %S/test_errors.py %s %flang_fc1
! 10.2.1.2p1(1)
program test
class(*), allocatable :: pa
class(*), pointer :: pp
class(*), allocatable :: pac[:]
pa = 1 ! ok
!ERROR: Left-hand side of assignment may not be polymorphic unless assignment is to an entire allocatable
pp = 1
!ERROR: Left-hand side of assignment may not be polymorphic if it is a coarray
pac = 1
end

View File

@ -11,6 +11,7 @@ module m1
end subroutine
pure subroutine s2(x)
class(t), intent(in out) :: x
!ERROR: Left-hand side of assignment may not be polymorphic unless assignment is to an entire allocatable
!ERROR: Left-hand side of assignment is not definable
!BECAUSE: 'x' is polymorphic in a pure subprogram
x = t()