diff options
author | Peter Klausler <pklausler@nvidia.com> | 2023-07-17 09:42:47 -0700 |
---|---|---|
committer | Peter Klausler <pklausler@nvidia.com> | 2023-07-21 09:47:14 -0700 |
commit | 8eb2206197a31290e33a0e4a4a5d0010c176e31e (patch) | |
tree | 64c0110018bd82e353069bcd08c804ae3182c086 /flang/lib/Evaluate/intrinsics.cpp | |
parent | 0517a9cae90fafbc36267a81df40ce4eef73eb30 (diff) | |
download | llvm-8eb2206197a31290e33a0e4a4a5d0010c176e31e.zip llvm-8eb2206197a31290e33a0e4a4a5d0010c176e31e.tar.gz llvm-8eb2206197a31290e33a0e4a4a5d0010c176e31e.tar.bz2 |
[flang] Accept an assumed-rank array as operand of ASSOCIATED()
The ASSOCIATED() intrinsic was mistakenly defined in the intrinsic
function table as requiring operands of known rank, which unintentionally
prevented assumed-rank dummy arguments from being tested.
Fixes llvm-test-suite/Fortran/gfortran/regression/pr88932.f90.
Differential Revision: https://reviews.llvm.org/D155498
Diffstat (limited to 'flang/lib/Evaluate/intrinsics.cpp')
-rw-r--r-- | flang/lib/Evaluate/intrinsics.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/flang/lib/Evaluate/intrinsics.cpp b/flang/lib/Evaluate/intrinsics.cpp index c6f32c0..aa0d349 100644 --- a/flang/lib/Evaluate/intrinsics.cpp +++ b/flang/lib/Evaluate/intrinsics.cpp @@ -326,7 +326,7 @@ static const IntrinsicInterface genericIntrinsicFunction[]{ {"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 @@ std::optional<SpecificCall> IntrinsicInterface::Match( 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)) { |