Implements compatibility checking for initializers in procedure pointer declarations. This work exposed some inconsistency in how ELEMENTAL interfaces were handled and checked, from both unrestricted intrinsic functions and others, and some refinements needed for function result compatbility checking; these have also been ironed out. Some new warnings are now emitted, and this affected a dozen or so tests. Differential Revision: https://reviews.llvm.org/D159026
25 lines
954 B
Fortran
25 lines
954 B
Fortran
! RUN: %python %S/test_errors.py %s %flang_fc1
|
|
subroutine test(dp1, dp2)
|
|
intrinsic sin
|
|
interface
|
|
elemental real function elemental(x)
|
|
real, intent(in) :: x
|
|
end
|
|
pure real function nonelemental(x)
|
|
real, intent(in) :: x
|
|
end
|
|
end interface
|
|
!PORTABILITY: A dummy procedure should not have an ELEMENTAL intrinsic as its interface
|
|
procedure(sin) :: dp1
|
|
!ERROR: A dummy procedure may not be ELEMENTAL
|
|
procedure(elemental) :: dp2
|
|
!PORTABILITY: Procedure pointer 'pp1' should not have an ELEMENTAL intrinsic as its interface
|
|
procedure(sin), pointer :: pp1
|
|
!ERROR: Procedure pointer 'pp2' may not be ELEMENTAL
|
|
procedure(elemental), pointer :: pp2
|
|
procedure(elemental) :: pp3 ! ok, external
|
|
procedure(nonelemental), pointer :: pp4 => sin ! ok, special case
|
|
!ERROR: Procedure pointer 'pp5' cannot be initialized with the elemental procedure 'elemental'
|
|
procedure(nonelemental), pointer :: pp5 => elemental
|
|
end
|