forked from OSchip/llvm-project
268 lines
4.1 KiB
Fortran
268 lines
4.1 KiB
Fortran
! RUN: %S/test_errors.sh %s %t %flang_fc1
|
|
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 g
|
|
end interface
|
|
contains
|
|
subroutine g()
|
|
end
|
|
end module
|
|
module m9b
|
|
interface g
|
|
module procedure g
|
|
end interface
|
|
contains
|
|
subroutine g(x)
|
|
real :: x
|
|
end
|
|
end module
|
|
module m9c
|
|
interface g
|
|
module procedure g
|
|
end interface
|
|
contains
|
|
subroutine g()
|
|
end
|
|
end module
|
|
subroutine s9a
|
|
use m9a
|
|
use m9b
|
|
end
|
|
subroutine s9b
|
|
!ERROR: USE-associated generic 'g' may not have specific procedures 'g' and 'g' as their interfaces are not distinguishable
|
|
use m9a
|
|
use m9c
|
|
end
|
|
|
|
module m10a
|
|
interface g
|
|
module procedure s
|
|
end interface
|
|
private :: s
|
|
contains
|
|
subroutine s(x)
|
|
integer :: x
|
|
end
|
|
end
|
|
module m10b
|
|
use m10a
|
|
!ERROR: Generic 'g' may not have specific procedures 's' and 's' as their interfaces are not distinguishable
|
|
interface g
|
|
module procedure s
|
|
end interface
|
|
private :: s
|
|
contains
|
|
subroutine s(x)
|
|
integer :: x
|
|
end
|
|
end
|
|
|
|
module m11a
|
|
interface g
|
|
end interface
|
|
type g
|
|
end type
|
|
end module
|
|
module m11b
|
|
interface g
|
|
end interface
|
|
type g
|
|
end type
|
|
end module
|
|
module m11c
|
|
use m11a
|
|
!ERROR: Generic interface 'g' has ambiguous derived types from modules 'm11a' and 'm11b'
|
|
use m11b
|
|
end module
|
|
|
|
module m12a
|
|
interface ga
|
|
module procedure sa
|
|
end interface
|
|
contains
|
|
subroutine sa(i)
|
|
end
|
|
end
|
|
module m12b
|
|
use m12a
|
|
interface gb
|
|
module procedure sb
|
|
end interface
|
|
contains
|
|
subroutine sb(x)
|
|
end
|
|
end
|
|
module m12c
|
|
use m12b, only: gc => gb
|
|
end
|
|
module m12d
|
|
use m12a, only: g => ga
|
|
use m12c, only: g => gc
|
|
interface g
|
|
end interface
|
|
end module
|