aboutsummaryrefslogtreecommitdiff
path: root/flang/lib/Evaluate/intrinsics.cpp
diff options
context:
space:
mode:
authorPeter Klausler <pklausler@nvidia.com>2023-07-17 09:42:47 -0700
committerPeter Klausler <pklausler@nvidia.com>2023-07-21 09:47:14 -0700
commit8eb2206197a31290e33a0e4a4a5d0010c176e31e (patch)
tree64c0110018bd82e353069bcd08c804ae3182c086 /flang/lib/Evaluate/intrinsics.cpp
parent0517a9cae90fafbc36267a81df40ce4eef73eb30 (diff)
downloadllvm-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.cpp13
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)) {