[flang-commits] [flang] b76e08d - [flang] Accept NULL() actual for optional allocatable dummy argument (#66251)
via flang-commits
flang-commits at lists.llvm.org
Mon Sep 18 11:54:31 PDT 2023
Author: Peter Klausler
Date: 2023-09-18T11:54:27-07:00
New Revision: b76e08db9c14741850a366da7bbe3c80ad50e456
URL: https://github.com/llvm/llvm-project/commit/b76e08db9c14741850a366da7bbe3c80ad50e456
DIFF: https://github.com/llvm/llvm-project/commit/b76e08db9c14741850a366da7bbe3c80ad50e456.diff
LOG: [flang] Accept NULL() actual for optional allocatable dummy argument (#66251)
A NULL() pointer is an acceptable actual argument for association with
an (absent) optional allocatable dummy argument. Semantics was
unconditionally emitting an error that the actual argument is not
allocatable.
Added:
Modified:
flang/lib/Semantics/check-call.cpp
flang/test/Semantics/null01.f90
Removed:
################################################################################
diff --git a/flang/lib/Semantics/check-call.cpp b/flang/lib/Semantics/check-call.cpp
index ef05b2ab61e8bcd..428c29b9a6bced7 100644
--- a/flang/lib/Semantics/check-call.cpp
+++ b/flang/lib/Semantics/check-call.cpp
@@ -657,8 +657,11 @@ static void CheckExplicitDataArg(const characteristics::DummyDataObject &dummy,
// 15.5.2.6 -- dummy is ALLOCATABLE
bool actualIsAllocatable{evaluate::IsAllocatableDesignator(actual)};
+ bool dummyIsOptional{
+ dummy.attrs.test(characteristics::DummyDataObject::Attr::Optional)};
+ bool actualIsNull{evaluate::IsNullPointer(actual)};
if (dummyIsAllocatable) {
- if (!actualIsAllocatable) {
+ if (!actualIsAllocatable && !(actualIsNull && dummyIsOptional)) {
messages.Say(
"ALLOCATABLE %s must be associated with an ALLOCATABLE actual argument"_err_en_US,
dummyName);
@@ -788,9 +791,6 @@ static void CheckExplicitDataArg(const characteristics::DummyDataObject &dummy,
}
// NULL(MOLD=) checking for non-intrinsic procedures
- bool dummyIsOptional{
- dummy.attrs.test(characteristics::DummyDataObject::Attr::Optional)};
- bool actualIsNull{evaluate::IsNullPointer(actual)};
if (!intrinsic && !dummyIsPointer && !dummyIsOptional && actualIsNull) {
messages.Say(
"Actual argument associated with %s may not be null pointer %s"_err_en_US,
diff --git a/flang/test/Semantics/null01.f90 b/flang/test/Semantics/null01.f90
index 02a68147a7527ad..71567fb0a673465 100644
--- a/flang/test/Semantics/null01.f90
+++ b/flang/test/Semantics/null01.f90
@@ -12,6 +12,9 @@ subroutine canbenull(x, y)
integer, intent(in), optional :: x
real, intent(in), pointer :: y
end
+ subroutine optionalAllocatable(x)
+ integer, intent(in), allocatable, optional :: x
+ end
function f0()
real :: f0
end function
@@ -95,6 +98,7 @@ function f3()
dt4x = dt4(null(dt2x%pps0))
call canbenull(null(), null()) ! fine
call canbenull(null(mold=ip0), null(mold=rp0)) ! fine
+ call optionalAllocatable(null(mold=ip0)) ! fine
!ERROR: Null pointer argument requires an explicit interface
call implicit(null())
!ERROR: Null pointer argument requires an explicit interface
More information about the flang-commits
mailing list