[flang-commits] [flang] [flang] Catch non-CONTIGUOUS assumed-rank with ASYNCHRONOUS/VOLATILE … (PR #71243)
Peter Klausler via flang-commits
flang-commits at lists.llvm.org
Fri Nov 3 15:30:10 PDT 2023
https://github.com/klausler created https://github.com/llvm/llvm-project/pull/71243
…forwarded to CONTIGUOUS dummy
No object with the ASYNCHRONOUS or VOLATILE attribute can go through the copy-in/copy-out protocol necessary for argument association with a contiguous dummy array argument. The check for this constraint missed the case of an assumed-rank array without an explicit CONTIGUOUS attribute being forwarded on to a CONTIGUOUS dummy argument.
>From 5e42b33db7941cf4cfa3fc775bce4c33709c8827 Mon Sep 17 00:00:00 2001
From: Peter Klausler <pklausler at nvidia.com>
Date: Fri, 3 Nov 2023 15:25:56 -0700
Subject: [PATCH] [flang] Catch non-CONTIGUOUS assumed-rank with
ASYNCHRONOUS/VOLATILE forwarded to CONTIGUOUS dummy
No object with the ASYNCHRONOUS or VOLATILE attribute can go
through the copy-in/copy-out protocol necessary for argument
association with a contiguous dummy array argument. The check
for this constraint missed the case of an assumed-rank array
without an explicit CONTIGUOUS attribute being forwarded on to
a CONTIGUOUS dummy argument.
---
flang/lib/Semantics/check-call.cpp | 10 ++++++----
flang/test/Semantics/call03.f90 | 5 ++++-
2 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/flang/lib/Semantics/check-call.cpp b/flang/lib/Semantics/check-call.cpp
index bf80dbecab009d9..e095518a60266a7 100644
--- a/flang/lib/Semantics/check-call.cpp
+++ b/flang/lib/Semantics/check-call.cpp
@@ -463,6 +463,7 @@ static void CheckExplicitDataArg(const characteristics::DummyDataObject &dummy,
: nullptr};
int actualRank{actualType.Rank()};
bool actualIsPointer{evaluate::IsObjectPointer(actual)};
+ bool actualIsAssumedRank{evaluate::IsAssumedRank(actual)};
if (dummy.type.attrs().test(
characteristics::TypeAndShape::Attr::AssumedShape)) {
// 15.5.2.4(16)
@@ -478,7 +479,8 @@ static void CheckExplicitDataArg(const characteristics::DummyDataObject &dummy,
}
} else if (dummyRank > 0) {
bool basicError{false};
- if (actualRank == 0 && !dummyIsAllocatableOrPointer) {
+ if (actualRank == 0 && !actualIsAssumedRank &&
+ !dummyIsAllocatableOrPointer) {
// Actual is scalar, dummy is an array. F'2023 15.5.2.5p14
if (actualIsCoindexed) {
basicError = true;
@@ -531,7 +533,7 @@ static void CheckExplicitDataArg(const characteristics::DummyDataObject &dummy,
characteristics::DummyDataObject::Attr::DeducedFromActual)) {
if (auto dummySize{evaluate::ToInt64(evaluate::Fold(foldingContext,
evaluate::GetSize(evaluate::Shape{dummy.type.shape()})))}) {
- if (actualRank == 0) {
+ if (actualRank == 0 && !actualIsAssumedRank) {
if (evaluate::IsArrayElement(actual)) {
// Actual argument is a scalar array element
evaluate::DesignatorFolder folder{
@@ -568,7 +570,7 @@ static void CheckExplicitDataArg(const characteristics::DummyDataObject &dummy,
}
}
}
- } else { // actualRank > 0
+ } else { // actualRank > 0 || actualIsAssumedRank
if (auto actualSize{evaluate::ToInt64(evaluate::Fold(foldingContext,
evaluate::GetSize(evaluate::Shape(actualType.shape()))))};
actualSize && *actualSize < *dummySize) {
@@ -644,7 +646,7 @@ static void CheckExplicitDataArg(const characteristics::DummyDataObject &dummy,
"Coindexed ASYNCHRONOUS or VOLATILE actual argument may not be associated with %s with ASYNCHRONOUS or VOLATILE attributes unless VALUE"_err_en_US,
dummyName);
}
- if (actualRank > 0 && !actualIsContiguous) {
+ if ((actualRank > 0 || actualIsAssumedRank) && !actualIsContiguous) {
if (dummyIsContiguous ||
!(dummyIsAssumedShape || dummyIsAssumedRank ||
(actualIsPointer && dummyIsPointer))) { // C1539 & C1540
diff --git a/flang/test/Semantics/call03.f90 b/flang/test/Semantics/call03.f90
index c31f2cc3eb8db79..2aca8de93acb05f 100644
--- a/flang/test/Semantics/call03.f90
+++ b/flang/test/Semantics/call03.f90
@@ -345,11 +345,12 @@ subroutine test14(a,b,c,d) ! C1538
call volatile(d[1])
end subroutine
- subroutine test15() ! C1539
+ subroutine test15(assumedrank) ! C1539
real, pointer :: a(:)
real, asynchronous :: b(10)
real, volatile :: c(10)
real, asynchronous, volatile :: d(10)
+ real, asynchronous, volatile :: assumedrank(..)
call assumedsize(a(::2)) ! ok
call contiguous(a(::2)) ! ok
call valueassumedsize(a(::2)) ! ok
@@ -368,6 +369,8 @@ subroutine test15() ! C1539
call volatileassumedsize(d(::2))
!ERROR: ASYNCHRONOUS or VOLATILE actual argument that is not simply contiguous may not be associated with a contiguous dummy argument 'x='
call volatilecontiguous(d(::2))
+ !ERROR: ASYNCHRONOUS or VOLATILE actual argument that is not simply contiguous may not be associated with a contiguous dummy argument 'x='
+ call volatilecontiguous(assumedrank)
end subroutine
subroutine test16() ! C1540
More information about the flang-commits
mailing list