[flang] Downgrade inappropriate error message to a warning

It may not be great practice to pass a procedure (or procedure pointer)
with an implicit interface as an actual argument to correspond with
a dummy procedure (pointer), but it's not an error.  Change to a
warning, and modify tests accordingly.

Differential Revision: https://reviews.llvm.org/D108932
This commit is contained in:
peter klausler 2021-08-27 13:38:06 -07:00
parent e9b3f25730
commit b4c86525fd
3 changed files with 32 additions and 11 deletions

View File

@ -553,9 +553,8 @@ static void CheckProcedureArg(evaluate::ActualArgument &arg,
messages.Say(
"Actual procedure argument has an implicit interface "
"which is not known to be compatible with %s which has an "
"explicit interface"_err_en_US,
"explicit interface"_en_US,
dummyName);
return;
}
}
} else { // 15.5.2.9(2,3)

View File

@ -58,9 +58,6 @@ module m
procedure(realfunc), pointer :: p
procedure(intfunc), pointer :: ip
integer, pointer :: intPtr
external :: extfunc
external :: extfuncPtr
pointer :: extfuncPtr
p => realfunc
ip => intfunc
call s01(realfunc) ! ok
@ -79,8 +76,6 @@ module m
call s01(null(intPtr))
!ERROR: Actual argument associated with procedure dummy argument 'p=' is typeless
call s01(B"0101")
!ERROR: Actual procedure argument has an implicit interface which is not known to be compatible with dummy argument 'p=' which has an explicit interface
call s01(extfunc)
!ERROR: Actual argument associated with procedure pointer dummy argument 'p=' must be a POINTER unless INTENT(IN)
call s02(realfunc)
call s02(p) ! ok
@ -94,10 +89,6 @@ module m
call s02(null(p))
!ERROR: Actual argument associated with procedure pointer dummy argument 'p=' must be a POINTER unless INTENT(IN)
call s02(sin)
!ERROR: Actual procedure argument has an implicit interface which is not known to be compatible with dummy argument 'p=' which has an explicit interface
call s02(extfunc)
!ERROR: Actual procedure argument has an implicit interface which is not known to be compatible with dummy argument 'p=' which has an explicit interface
call s03(extfuncPtr)
end subroutine
subroutine callsub(s)

View File

@ -0,0 +1,31 @@
! RUN: %flang -fsyntax-only 2>&1 %s | FileCheck %s
! Verifies that warnings issue when actual arguments with implicit
! interfaces are associated with dummy procedures and dummy procedure
! pointers whose interfaces are explicit.
module m
contains
real function realfunc(x)
real, intent(in) :: x
realfunc = x
end function
subroutine s00(p0)
procedure(realfunc) :: p0
end subroutine
subroutine s01(p1)
procedure(realfunc), pointer, intent(in) :: p1
end subroutine
subroutine s02(p2)
procedure(realfunc), pointer :: p2
end subroutine
subroutine test
external :: extfunc
external :: extfuncPtr
pointer :: extfuncPtr
!CHECK: Actual procedure argument has an implicit interface which is not known to be compatible with dummy argument 'p0=' which has an explicit interface
call s00(extfunc)
!CHECK: Actual procedure argument has an implicit interface which is not known to be compatible with dummy argument 'p1=' which has an explicit interface
call s01(extfunc)
!CHECK: Actual procedure argument has an implicit interface which is not known to be compatible with dummy argument 'p2=' which has an explicit interface
call s02(extfuncPtr)
end subroutine
end module