blob: bfc118cd74308f8189853af2d31de86c19b16a79 [file] [edit]
! RUN: %python %S/test_errors.py %s %flang_fc1
module m
type, abstract :: parent
contains
procedure(ip), deferred :: set
end type
abstract interface
subroutine ip(x)
import parent
class(parent) :: x
end subroutine
end interface
type, public, extends(parent), abstract :: child
end type
type, extends(child) :: grandchild
contains
!ERROR: Dummy argument 'y' of type-bound procedure 'set' must correspond by name to 'x' in the overridden procedure
procedure :: set
end type
contains
subroutine set(y)
class(grandchild) :: y
end subroutine
end module
! Valid override with matching dummy names
module m_ok
type, abstract :: t
contains
procedure(ip), deferred :: set
end type
abstract interface
subroutine ip(x)
import t
class(t) :: x
end subroutine
end interface
type, extends(t) :: e
contains
procedure :: set
end type
contains
subroutine set(x)
class(e) :: x
end subroutine
end module
! Extra dummy argument: interface mismatch, not a name error
module m_extra
type, abstract :: t
contains
procedure(ip), deferred :: set
end type
abstract interface
subroutine ip(x)
import t
class(t) :: x
end subroutine
end interface
type, extends(t) :: e
contains
!ERROR: A type-bound procedure and its override must have compatible interfaces
procedure :: set
end type
contains
subroutine set(x, n)
class(e) :: x
integer :: n
end subroutine
end module
! Non-pass dummy renamed
module m_rename
type, abstract :: t
contains
procedure(ip), deferred :: set
end type
abstract interface
subroutine ip(x, n)
import t
class(t) :: x
integer :: n
end subroutine
end interface
type, extends(t) :: e
contains
!ERROR: Dummy argument 'm2' of type-bound procedure 'set' must correspond by name to 'n' in the overridden procedure
procedure :: set
end type
contains
subroutine set(x, m2)
class(e) :: x
integer :: m2
end subroutine
end module
! NOPASS deferred override with mismatched dummy name
module m_nopass
type, abstract :: t
contains
procedure(ip), deferred, nopass :: act
end type
abstract interface
subroutine ip(a)
integer :: a
end subroutine
end interface
type, extends(t) :: e
contains
!ERROR: Dummy argument 'b' of type-bound procedure 'act' must correspond by name to 'a' in the overridden procedure
procedure, nopass :: act => impl
end type
contains
subroutine impl(b)
integer :: b
end subroutine
end module