Skip to content

Commit 858a79e

Browse files
authored
[flang] relax ASSOCIATED checks for assumed-ranks (#94277)
Nothing in the standard actually prevents TARGET from being an assumed-rank if the POINTER is. The only rank related constraints says: "POINTER is not assumed-rank, TARGET shall have the same rank as POINTER.".
1 parent fadd1ec commit 858a79e

File tree

3 files changed

+23
-8
lines changed

3 files changed

+23
-8
lines changed

flang/lib/Evaluate/intrinsics.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,8 +332,9 @@ static const IntrinsicInterface genericIntrinsicFunction[]{
332332
{"associated",
333333
{{"pointer", AnyPointer, Rank::anyOrAssumedRank, Optionality::required,
334334
common::Intent::In, {ArgFlag::canBeNull}},
335-
{"target", Addressable, Rank::known, Optionality::optional,
336-
common::Intent::In, {ArgFlag::canBeNull}}},
335+
{"target", Addressable, Rank::anyOrAssumedRank,
336+
Optionality::optional, common::Intent::In,
337+
{ArgFlag::canBeNull}}},
337338
DefaultLogical, Rank::elemental, IntrinsicClass::inquiryFunction},
338339
{"atan", {{"x", SameFloating}}, SameFloating},
339340
{"atan", {{"y", OperandReal}, {"x", OperandReal}}, OperandReal},

flang/lib/Semantics/check-call.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1499,6 +1499,17 @@ static void CheckAssociated(evaluate::ActualArguments &arguments,
14991499
"POINTER= argument '%s' is an object pointer but the TARGET= argument '%s' is not a variable"_err_en_US,
15001500
pointerExpr->AsFortran(), targetExpr->AsFortran());
15011501
}
1502+
if (!IsAssumedRank(*pointerExpr)) {
1503+
if (IsAssumedRank(*targetExpr)) {
1504+
messages.Say(
1505+
"TARGET= argument '%s' may not be assumed-rank when POINTER= argument is not"_err_en_US,
1506+
pointerExpr->AsFortran());
1507+
} else if (pointerExpr->Rank() != targetExpr->Rank()) {
1508+
messages.Say(
1509+
"POINTER= argument and TARGET= argument have incompatible ranks %d and %d"_err_en_US,
1510+
pointerExpr->Rank(), targetExpr->Rank());
1511+
}
1512+
}
15021513
}
15031514
}
15041515
}

flang/test/Semantics/associated.f90

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -94,18 +94,21 @@ subroutine test(assumedRank)
9494
integer, pointer :: intPointerArr(:)
9595
procedure(objPtrFunc), pointer :: objPtrFuncPointer
9696

97-
!ERROR: Assumed-rank array cannot be forwarded to 'target=' argument
98-
lvar = associated(assumedRank, assumedRank)
97+
lvar = associated(assumedRank, assumedRank) ! ok
98+
!ERROR: TARGET= argument 'realscalarptr' may not be assumed-rank when POINTER= argument is not
99+
lvar = associated(realScalarPtr, assumedRank)
100+
!ERROR: TARGET= argument 'realvecptr' may not be assumed-rank when POINTER= argument is not
101+
lvar = associated(realVecPtr, assumedRank)
99102
lvar = associated(assumedRank, targetRealVar) ! ok
100103
lvar = associated(assumedRank, targetRealMat) ! ok
101104
lvar = associated(realScalarPtr, targetRealVar) ! ok
102-
!ERROR: 'target=' argument has unacceptable rank 0
105+
!ERROR: POINTER= argument and TARGET= argument have incompatible ranks 1 and 0
103106
lvar = associated(realVecPtr, targetRealVar)
104-
!ERROR: 'target=' argument has unacceptable rank 0
107+
!ERROR: POINTER= argument and TARGET= argument have incompatible ranks 2 and 0
105108
lvar = associated(realMatPtr, targetRealVar)
106-
!ERROR: 'target=' argument has unacceptable rank 2
109+
!ERROR: POINTER= argument and TARGET= argument have incompatible ranks 0 and 2
107110
lvar = associated(realScalarPtr, targetRealMat)
108-
!ERROR: 'target=' argument has unacceptable rank 2
111+
!ERROR: POINTER= argument and TARGET= argument have incompatible ranks 1 and 2
109112
lvar = associated(realVecPtr, targetRealMat)
110113
lvar = associated(realMatPtr, targetRealMat) ! ok
111114
!ERROR: missing mandatory 'pointer=' argument

0 commit comments

Comments
 (0)