From: Peter Klausler Date: Tue, 3 May 2022 17:10:11 +0000 (-0700) Subject: [flang] Allow NULL() actual argument for optional dummy procedure X-Git-Tag: upstream/15.0.7~8188 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=78a166b47beb919b50594f13c1d0c23bda3e4fd7;p=platform%2Fupstream%2Fllvm.git [flang] Allow NULL() actual argument for optional dummy procedure A disassociated procedure pointer is allowed to be passed as an absent actual argument that corresponds to an optional dummy procedure, but not NULL(); accept that case as well. Differential Revision: https://reviews.llvm.org/D125127 --- diff --git a/flang/lib/Semantics/check-call.cpp b/flang/lib/Semantics/check-call.cpp index 8f49953..fee7162 100644 --- a/flang/lib/Semantics/check-call.cpp +++ b/flang/lib/Semantics/check-call.cpp @@ -635,7 +635,9 @@ static void CheckProcedureArg(evaluate::ActualArgument &arg, dummyName); } } else if (IsNullPointer(*expr)) { - if (!dummyIsPointer) { + if (!dummyIsPointer && + !dummy.attrs.test( + characteristics::DummyProcedure::Attr::Optional)) { messages.Say( "Actual argument associated with procedure %s is a null pointer"_err_en_US, dummyName); diff --git a/flang/test/Semantics/call02.f90 b/flang/test/Semantics/call02.f90 index dfd1ba5..a4ceaf6 100644 --- a/flang/test/Semantics/call02.f90 +++ b/flang/test/Semantics/call02.f90 @@ -15,6 +15,12 @@ subroutine s01(elem, subr) !ERROR: A dummy procedure may not be ELEMENTAL procedure(elem) :: dummy end subroutine + subroutine optionalsubr(dummy) + procedure(sin), optional :: dummy + end subroutine + subroutine ptrsubr(dummy) + procedure(sin), pointer, intent(in) :: dummy + end subroutine end interface intrinsic :: cos call subr(cos) ! not an error @@ -22,6 +28,8 @@ subroutine s01(elem, subr) call subr(elem) ! C1533 !ERROR: Actual argument associated with procedure dummy argument 'dummy=' is a null pointer call subr(null()) + call optionalsubr(null()) ! ok + call ptrsubr(null()) ! ok !ERROR: Actual argument associated with procedure dummy argument 'dummy=' is typeless call subr(B"1010") end subroutine