diff --git a/flang/lib/Evaluate/intrinsics.cpp b/flang/lib/Evaluate/intrinsics.cpp --- a/flang/lib/Evaluate/intrinsics.cpp +++ b/flang/lib/Evaluate/intrinsics.cpp @@ -326,7 +326,7 @@ {"asind", {{"x", SameFloating}}, SameFloating}, {"asinh", {{"x", SameFloating}}, SameFloating}, {"associated", - {{"pointer", AnyPointer, Rank::known, Optionality::required, + {{"pointer", AnyPointer, Rank::anyOrAssumedRank, Optionality::required, common::Intent::In, {ArgFlag::canBeNull}}, {"target", Addressable, Rank::known, Optionality::optional, common::Intent::In, {ArgFlag::canBeNull}}}, @@ -1966,15 +1966,22 @@ if (!knownArg) { knownArg = arg; } - argOk = rank == knownArg->Rank(); + argOk = !isAssumedRank && rank == knownArg->Rank(); break; case Rank::anyOrAssumedRank: case Rank::arrayOrAssumedRank: + if (isAssumedRank) { + argOk = true; + break; + } if (d.rank == Rank::arrayOrAssumedRank && rank == 0) { argOk = false; break; } - if (!dimArg && rank > 0 && !isAssumedRank && + if (!knownArg) { + knownArg = arg; + } + if (!dimArg && rank > 0 && (std::strcmp(name, "shape") == 0 || std::strcmp(name, "size") == 0 || std::strcmp(name, "ubound") == 0)) { diff --git a/flang/test/Semantics/associated.f90 b/flang/test/Semantics/associated.f90 --- a/flang/test/Semantics/associated.f90 +++ b/flang/test/Semantics/associated.f90 @@ -48,11 +48,13 @@ integer :: i(:) end subroutine subrCannotBeCalledfromImplicit - subroutine test() + subroutine test(assumedRank) + real, pointer, intent(in out) :: assumedRank(..) integer :: intVar integer, target :: targetIntVar1 integer(kind=2), target :: targetIntVar2 - real, target :: targetRealVar + real, target :: targetRealVar, targetRealMat(2,2) + real, pointer :: realScalarPtr, realVecPtr(:), realMatPtr(:,:) integer, pointer :: intPointerVar1 integer, pointer :: intPointerVar2 integer, allocatable :: intAllocVar @@ -77,6 +79,20 @@ integer, target :: targetIntCoarray[*] integer, pointer :: intPointerArr(:) + !ERROR: Assumed-rank array cannot be forwarded to 'target=' argument + lvar = associated(assumedRank, assumedRank) + lvar = associated(assumedRank, targetRealVar) ! ok + lvar = associated(assumedRank, targetRealMat) ! ok + lvar = associated(realScalarPtr, targetRealVar) ! ok + !ERROR: 'target=' argument has unacceptable rank 0 + lvar = associated(realVecPtr, targetRealVar) + !ERROR: 'target=' argument has unacceptable rank 0 + lvar = associated(realMatPtr, targetRealVar) + !ERROR: 'target=' argument has unacceptable rank 2 + lvar = associated(realScalarPtr, targetRealMat) + !ERROR: 'target=' argument has unacceptable rank 2 + lvar = associated(realVecPtr, targetRealMat) + lvar = associated(realMatPtr, targetRealMat) ! ok !ERROR: missing mandatory 'pointer=' argument lVar = associated() !ERROR: MOLD= argument to NULL() must be a pointer or allocatable