Skip to content

Commit

Permalink
[flang] Accept NULL() actual for optional allocatable dummy argument (l…
Browse files Browse the repository at this point in the history
…lvm#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.
  • Loading branch information
klausler authored and zahiraam committed Oct 24, 2023
1 parent 60725e4 commit 0a93ead
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 4 deletions.
8 changes: 4 additions & 4 deletions flang/lib/Semantics/check-call.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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,
Expand Down
4 changes: 4 additions & 0 deletions flang/test/Semantics/null01.f90
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 0a93ead

Please sign in to comment.