mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-17 15:16:36 +00:00

…cific When checking generic procedures for indistinguishable specific procedures, don't neglect to include specific procedures from any accessible instance of the generic procedure inherited from its parent type.. Fixes https://github.com/llvm/llvm-project/issues/128760.
95 lines
1.7 KiB
Fortran
95 lines
1.7 KiB
Fortran
! RUN: %python %S/test_errors.py %s %flang_fc1
|
|
module m1
|
|
type :: t1
|
|
sequence
|
|
real :: x
|
|
end type
|
|
type :: t2
|
|
sequence
|
|
real :: x
|
|
end type
|
|
type :: t3
|
|
real :: x
|
|
end type
|
|
type :: t4
|
|
real, private :: x
|
|
end type
|
|
contains
|
|
subroutine s1a(x)
|
|
type(t1), intent(in) :: x
|
|
end
|
|
subroutine s2a(x)
|
|
type(t2), intent(in) :: x
|
|
end
|
|
subroutine s3a(x)
|
|
type(t3), intent(in) :: x
|
|
end
|
|
subroutine s4a(x)
|
|
type(t4), intent(in) :: x
|
|
end
|
|
end
|
|
|
|
module m2
|
|
type t10
|
|
integer n
|
|
contains
|
|
procedure :: f
|
|
generic:: operator(+) => f
|
|
end type
|
|
contains
|
|
elemental type(t10) function f(x,y)
|
|
class(t10), intent(in) :: x, y
|
|
f%n = x%n + y%n
|
|
end
|
|
end
|
|
|
|
module m3
|
|
use m2, only: rt10 => t10
|
|
end
|
|
|
|
program test
|
|
use m1, only: s1a, s2a, s3a, s4a
|
|
use m2, only: t10
|
|
use m3, only: rt10 ! alias for t10, ensure no distinguishability error
|
|
type :: t1
|
|
sequence
|
|
integer :: x ! distinct type
|
|
end type
|
|
type :: t2
|
|
sequence
|
|
real :: x
|
|
end type
|
|
type :: t3 ! no SEQUENCE
|
|
real :: x
|
|
end type
|
|
type :: t4
|
|
real :: x ! not PRIVATE
|
|
end type
|
|
interface distinguishable1
|
|
procedure :: s1a, s1b
|
|
end interface
|
|
interface distinguishable2
|
|
procedure :: s1a, s1b
|
|
end interface
|
|
interface distinguishable3
|
|
procedure :: s1a, s1b
|
|
end interface
|
|
!ERROR: Generic 'indistinguishable' may not have specific procedures 's2a' and 's2b' as their interfaces are not distinguishable
|
|
interface indistinguishable
|
|
procedure :: s2a, s2b
|
|
end interface
|
|
contains
|
|
subroutine s1b(x)
|
|
type(t1), intent(in) :: x
|
|
end
|
|
subroutine s2b(x)
|
|
type(t2), intent(in) :: x
|
|
end
|
|
subroutine s3b(x)
|
|
type(t3), intent(in) :: x
|
|
end
|
|
subroutine s4b(x)
|
|
type(t4), intent(in) :: x
|
|
end
|
|
end
|