[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:
parent
28f13353b6
commit
bc83d1c655
|
@ -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) {
|
||||
|
|
|
@ -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
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue