…arrays When comparing dummy array extents, cope with references to symbols better (including references to other dummy arguments), and emit warnings in dubious cases that are not equivalent but not provably incompatible.
164 lines
7.1 KiB
Fortran
164 lines
7.1 KiB
Fortran
! RUN: %python %S/test_errors.py %s %flang_fc1 -pedantic
|
|
! Detect incompatible argument shapes
|
|
module m
|
|
integer :: ha = 1
|
|
contains
|
|
subroutine s1(a)
|
|
real, intent(in) :: a(2,3)
|
|
end
|
|
subroutine s2(a)
|
|
real, intent(in) :: a(3,2)
|
|
end
|
|
subroutine s3(a)
|
|
real, intent(in) :: a(3,*)
|
|
end
|
|
subroutine s4(a)
|
|
real, intent(in) :: a(:,:)
|
|
end
|
|
subroutine s5(a)
|
|
real, intent(in) :: a(..)
|
|
end
|
|
subroutine s6(a,n,m)
|
|
integer, intent(in) :: n, m
|
|
real, intent(in) :: a(n, m)
|
|
end
|
|
subroutine s6b(a,nn,mm)
|
|
integer, intent(in) :: nn, mm
|
|
real, intent(in) :: a(nn, mm)
|
|
end
|
|
subroutine s7(a,n,m)
|
|
integer, intent(in) :: n, m
|
|
real, intent(in) :: a(m, n)
|
|
end
|
|
subroutine s8(a,n,m)
|
|
integer, intent(in) :: n, m
|
|
real, intent(in) :: a(n+1,m+1)
|
|
end
|
|
subroutine s8b(a,n,m)
|
|
integer, intent(in) :: n, m
|
|
real, intent(in) :: a(n-1,m+2)
|
|
end
|
|
subroutine s9(a)
|
|
real, intent(in) :: a(ha,ha)
|
|
end
|
|
subroutine s9b(a)
|
|
real, intent(in) :: a(ha,ha)
|
|
end
|
|
subroutine s1c(s)
|
|
procedure(s1) :: s
|
|
end
|
|
subroutine s2c(s)
|
|
procedure(s2) :: s
|
|
end
|
|
subroutine s3c(s)
|
|
procedure(s3) :: s
|
|
end
|
|
subroutine s4c(s)
|
|
procedure(s4) :: s
|
|
end
|
|
subroutine s5c(s)
|
|
procedure(s5) :: s
|
|
end
|
|
subroutine s6c(s)
|
|
procedure(s6) :: s
|
|
end
|
|
subroutine s7c(s)
|
|
procedure(s7) :: s
|
|
end
|
|
subroutine s8c(s)
|
|
procedure(s8) :: s
|
|
end
|
|
subroutine s9c(s)
|
|
procedure(s9) :: s
|
|
end
|
|
end
|
|
|
|
program main
|
|
use m
|
|
procedure(s1), pointer :: ps1
|
|
procedure(s2), pointer :: ps2
|
|
procedure(s3), pointer :: ps3
|
|
procedure(s4), pointer :: ps4
|
|
procedure(s5), pointer :: ps5
|
|
procedure(s6), pointer :: ps6
|
|
procedure(s7), pointer :: ps7
|
|
procedure(s8), pointer :: ps8
|
|
procedure(s9), pointer :: ps9
|
|
call s1c(s1)
|
|
!ERROR: Actual procedure argument has interface incompatible with dummy argument 's=': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
call s1c(s2)
|
|
!ERROR: Actual procedure argument has interface incompatible with dummy argument 's=': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
call s1c(s3)
|
|
!ERROR: Actual procedure argument has interface incompatible with dummy argument 's=': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
call s1c(s4)
|
|
!ERROR: Actual procedure argument has interface incompatible with dummy argument 's=': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
call s1c(s5)
|
|
!ERROR: Actual procedure argument has interface incompatible with dummy argument 's=': distinct numbers of dummy arguments
|
|
call s1c(s6)
|
|
!ERROR: Actual procedure argument has interface incompatible with dummy argument 's=': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
call s2c(s1)
|
|
call s2c(s2)
|
|
call s6c(s6)
|
|
call s6c(s6b)
|
|
!ERROR: Actual procedure argument has interface incompatible with dummy argument 's=': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
call s6c(s7)
|
|
!WARNING: Actual procedure argument has interface incompatible with dummy argument 's=': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
call s6c(s8)
|
|
!ERROR: Actual procedure argument has interface incompatible with dummy argument 's=': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
call s7c(s6)
|
|
!ERROR: Actual procedure argument has interface incompatible with dummy argument 's=': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
call s7c(s8)
|
|
!ERROR: Actual procedure argument has interface incompatible with dummy argument 's=': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
call s8c(s6)
|
|
!ERROR: Actual procedure argument has interface incompatible with dummy argument 's=': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
call s8c(s7)
|
|
call s8c(s8)
|
|
!WARNING: Actual procedure argument has possible interface incompatibility with dummy argument 's=': possibly incompatible dummy argument #1: distinct dummy data object shapes
|
|
call s8c(s8b)
|
|
call s9c(s9)
|
|
call s9c(s9b)
|
|
ps1 => s1
|
|
!ERROR: Procedure pointer 'ps1' associated with incompatible procedure designator 's2': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
ps1 => s2
|
|
!ERROR: Procedure pointer 'ps1' associated with incompatible procedure designator 's3': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
ps1 => s3
|
|
!ERROR: Procedure pointer 'ps1' associated with incompatible procedure designator 's4': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
ps1 => s4
|
|
!ERROR: Procedure pointer 'ps1' associated with incompatible procedure designator 's5': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
ps1 => s5
|
|
!ERROR: Procedure pointer 'ps1' associated with incompatible procedure designator 's6': distinct numbers of dummy arguments
|
|
ps1 => s6
|
|
!ERROR: Procedure pointer 'ps2' associated with incompatible procedure designator 's1': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
ps2 => s1
|
|
ps2 => s2
|
|
call s1c(ps1)
|
|
!ERROR: Actual procedure argument has interface incompatible with dummy argument 's=': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
call s1c(ps2)
|
|
!ERROR: Actual procedure argument has interface incompatible with dummy argument 's=': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
call s1c(ps3)
|
|
!ERROR: Actual procedure argument has interface incompatible with dummy argument 's=': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
call s1c(ps4)
|
|
!ERROR: Actual procedure argument has interface incompatible with dummy argument 's=': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
call s1c(ps5)
|
|
!ERROR: Actual procedure argument has interface incompatible with dummy argument 's=': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
call s2c(ps1)
|
|
call s2c(ps2)
|
|
ps6 => s6
|
|
ps6 => s6b
|
|
!ERROR: Procedure pointer 'ps6' associated with incompatible procedure designator 's7': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
ps6 => s7
|
|
!ERROR: Procedure pointer 'ps6' associated with incompatible procedure designator 's8': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
ps6 => s8
|
|
!ERROR: Procedure pointer 'ps7' associated with incompatible procedure designator 's6': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
ps7 => s6
|
|
!ERROR: Procedure pointer 'ps7' associated with incompatible procedure designator 's8': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
ps7 => s8
|
|
ps8 => s8
|
|
!WARNING: pointer 'ps8' and s8b may not be completely compatible procedures: possibly incompatible dummy argument #1: distinct dummy data object shapes
|
|
ps8 => s8b
|
|
!ERROR: Procedure pointer 'ps8' associated with incompatible procedure designator 's6': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
ps8 => s6
|
|
!WARNING: Procedure pointer 'ps8' associated with incompatible procedure designator 's7': incompatible dummy argument #1: incompatible dummy data object shapes
|
|
ps8 => s7
|
|
end
|