forked from OSchip/llvm-project
208 lines
3.2 KiB
Fortran
208 lines
3.2 KiB
Fortran
! RUN: %S/test_errors.sh %s %t %f18
|
|
module m
|
|
integer :: foo
|
|
!Note: PGI, Intel, and GNU allow this; NAG and Sun do not
|
|
!ERROR: 'foo' is already declared in this scoping unit
|
|
interface foo
|
|
end interface
|
|
end module
|
|
|
|
module m2
|
|
interface s
|
|
end interface
|
|
contains
|
|
!ERROR: 's' may not be the name of both a generic interface and a procedure unless it is a specific procedure of the generic
|
|
subroutine s
|
|
end subroutine
|
|
end module
|
|
|
|
module m3
|
|
! This is okay: s is generic and specific
|
|
interface s
|
|
procedure s2
|
|
end interface
|
|
interface s
|
|
procedure s
|
|
end interface
|
|
contains
|
|
subroutine s()
|
|
end subroutine
|
|
subroutine s2(x)
|
|
end subroutine
|
|
end module
|
|
|
|
module m4a
|
|
interface g
|
|
procedure s_real
|
|
end interface
|
|
contains
|
|
subroutine s_real(x)
|
|
end
|
|
end
|
|
module m4b
|
|
interface g
|
|
procedure s_int
|
|
end interface
|
|
contains
|
|
subroutine s_int(i)
|
|
end
|
|
end
|
|
! Generic g should merge the two use-associated ones
|
|
subroutine s4
|
|
use m4a
|
|
use m4b
|
|
call g(123)
|
|
call g(1.2)
|
|
end
|
|
|
|
module m5a
|
|
interface g
|
|
procedure s_real
|
|
end interface
|
|
contains
|
|
subroutine s_real(x)
|
|
end
|
|
end
|
|
module m5b
|
|
interface gg
|
|
procedure s_int
|
|
end interface
|
|
contains
|
|
subroutine s_int(i)
|
|
end
|
|
end
|
|
! Generic g should merge the two use-associated ones
|
|
subroutine s5
|
|
use m5a
|
|
use m5b, g => gg
|
|
call g(123)
|
|
call g(1.2)
|
|
end
|
|
|
|
module m6a
|
|
interface gg
|
|
procedure sa
|
|
end interface
|
|
contains
|
|
subroutine sa(x)
|
|
end
|
|
end
|
|
module m6b
|
|
interface gg
|
|
procedure sb
|
|
end interface
|
|
contains
|
|
subroutine sb(y)
|
|
end
|
|
end
|
|
subroutine s6
|
|
!ERROR: Generic 'g' may not have specific procedures 'sa' and 'sb' as their interfaces are not distinguishable
|
|
use m6a, g => gg
|
|
use m6b, g => gg
|
|
end
|
|
|
|
module m7a
|
|
interface g
|
|
procedure s1
|
|
end interface
|
|
contains
|
|
subroutine s1(x)
|
|
end
|
|
end
|
|
module m7b
|
|
interface g
|
|
procedure s2
|
|
end interface
|
|
contains
|
|
subroutine s2(x, y)
|
|
end
|
|
end
|
|
module m7c
|
|
interface g
|
|
procedure s3
|
|
end interface
|
|
contains
|
|
subroutine s3(x, y, z)
|
|
end
|
|
end
|
|
! Merge the three use-associated generics
|
|
subroutine s7
|
|
use m7a
|
|
use m7b
|
|
use m7c
|
|
call g(1.0)
|
|
call g(1.0, 2.0)
|
|
call g(1.0, 2.0, 3.0)
|
|
end
|
|
|
|
module m8a
|
|
interface g
|
|
procedure s1
|
|
end interface
|
|
contains
|
|
subroutine s1(x)
|
|
end
|
|
end
|
|
module m8b
|
|
interface g
|
|
procedure s2
|
|
end interface
|
|
contains
|
|
subroutine s2(x, y)
|
|
end
|
|
end
|
|
module m8c
|
|
integer :: g
|
|
end
|
|
! If merged generic conflicts with another USE, it is an error (if it is referenced)
|
|
subroutine s8
|
|
use m8a
|
|
use m8b
|
|
use m8c
|
|
!ERROR: Reference to 'g' is ambiguous
|
|
g = 1
|
|
end
|
|
|
|
module m9a
|
|
interface g
|
|
module procedure s1
|
|
module procedure g
|
|
end interface
|
|
contains
|
|
subroutine g()
|
|
end
|
|
subroutine s1(x)
|
|
integer :: x
|
|
end
|
|
end module
|
|
module m9b
|
|
use m9a
|
|
interface g
|
|
module procedure s2
|
|
end interface
|
|
contains
|
|
subroutine s2(x)
|
|
real :: x
|
|
end
|
|
end module
|
|
module m9c
|
|
interface g
|
|
module procedure g
|
|
end interface
|
|
contains
|
|
subroutine g(x)
|
|
real :: x
|
|
end
|
|
end module
|
|
! Merge use-associated generics that have the same symbol (s1)
|
|
subroutine s9
|
|
use m9a
|
|
use m9b
|
|
end
|
|
! Merge use-associate generics each with specific of same name
|
|
subroutine s9c
|
|
use m9a
|
|
!ERROR: Generic interface 'g' has ambiguous specific procedures from modules 'm9a' and 'm9c'
|
|
use m9c
|
|
end
|