forked from OSchip/llvm-project
223 lines
5.6 KiB
Fortran
223 lines
5.6 KiB
Fortran
! RUN: %S/test_errors.sh %s %t %f18
|
|
! Confirm enforcement of constraints and restrictions in 7.5.7.3
|
|
! and C733, C734 and C779, C780, C782, C783, C784, and C785.
|
|
|
|
module m
|
|
!ERROR: An ABSTRACT derived type must be extensible
|
|
type, abstract, bind(c) :: badAbstract1
|
|
end type
|
|
!ERROR: An ABSTRACT derived type must be extensible
|
|
type, abstract :: badAbstract2
|
|
sequence
|
|
real :: badAbstract2Field
|
|
end type
|
|
type, abstract :: abstract
|
|
contains
|
|
!ERROR: DEFERRED is required when an interface-name is provided
|
|
procedure(s1), pass :: ab1
|
|
!ERROR: Type-bound procedure 'ab3' may not be both DEFERRED and NON_OVERRIDABLE
|
|
procedure(s1), deferred, non_overridable :: ab3
|
|
!ERROR: DEFERRED is only allowed when an interface-name is provided
|
|
procedure, deferred, non_overridable :: ab4 => s1
|
|
end type
|
|
type :: nonoverride
|
|
contains
|
|
procedure, non_overridable, nopass :: no1 => s1
|
|
end type
|
|
type, extends(nonoverride) :: nonoverride2
|
|
end type
|
|
type, extends(nonoverride2) :: nonoverride3
|
|
contains
|
|
!ERROR: Override of NON_OVERRIDABLE 'no1' is not permitted
|
|
procedure, nopass :: no1 => s1
|
|
end type
|
|
type, abstract :: missing
|
|
contains
|
|
procedure(s4), deferred :: am1
|
|
end type
|
|
!ERROR: Non-ABSTRACT extension of ABSTRACT derived type 'missing' lacks a binding for DEFERRED procedure 'am1'
|
|
type, extends(missing) :: concrete
|
|
end type
|
|
type, extends(missing) :: intermediate
|
|
contains
|
|
procedure :: am1 => s7
|
|
end type
|
|
type, extends(intermediate) :: concrete2 ! ensure no false missing binding error
|
|
end type
|
|
type, bind(c) :: inextensible1
|
|
end type
|
|
!ERROR: The parent type is not extensible
|
|
type, extends(inextensible1) :: badExtends1
|
|
end type
|
|
type :: inextensible2
|
|
sequence
|
|
real :: inextensible2Field
|
|
end type
|
|
!ERROR: The parent type is not extensible
|
|
type, extends(inextensible2) :: badExtends2
|
|
end type
|
|
!ERROR: Derived type 'real' not found
|
|
type, extends(real) :: badExtends3
|
|
end type
|
|
type :: base
|
|
real :: component
|
|
contains
|
|
!ERROR: Procedure bound to non-ABSTRACT derived type 'base' may not be DEFERRED
|
|
procedure(s2), deferred :: bb1
|
|
!ERROR: DEFERRED is only allowed when an interface-name is provided
|
|
procedure, deferred :: bb2 => s2
|
|
end type
|
|
type, extends(base) :: extension
|
|
contains
|
|
!ERROR: A type-bound procedure binding may not have the same name as a parent component
|
|
procedure :: component => s3
|
|
end type
|
|
type :: nopassBase
|
|
contains
|
|
procedure, nopass :: tbp => s1
|
|
end type
|
|
type, extends(nopassBase) :: passExtends
|
|
contains
|
|
!ERROR: A passed-argument type-bound procedure may not override a NOPASS procedure
|
|
procedure :: tbp => s5
|
|
end type
|
|
type :: passBase
|
|
contains
|
|
procedure :: tbp => s6
|
|
end type
|
|
type, extends(passBase) :: nopassExtends
|
|
contains
|
|
!ERROR: A NOPASS type-bound procedure may not override a passed-argument procedure
|
|
procedure, nopass :: tbp => s1
|
|
end type
|
|
contains
|
|
subroutine s1(x)
|
|
class(abstract), intent(in) :: x
|
|
end subroutine s1
|
|
subroutine s2(x)
|
|
class(base), intent(in) :: x
|
|
end subroutine s2
|
|
subroutine s3(x)
|
|
class(extension), intent(in) :: x
|
|
end subroutine s3
|
|
subroutine s4(x)
|
|
class(missing), intent(in) :: x
|
|
end subroutine s4
|
|
subroutine s5(x)
|
|
class(passExtends), intent(in) :: x
|
|
end subroutine s5
|
|
subroutine s6(x)
|
|
class(passBase), intent(in) :: x
|
|
end subroutine s6
|
|
subroutine s7(x)
|
|
class(intermediate), intent(in) :: x
|
|
end subroutine s7
|
|
end module
|
|
|
|
module m1
|
|
implicit none
|
|
interface g
|
|
module procedure mp
|
|
end interface g
|
|
|
|
type t
|
|
contains
|
|
!ERROR: The binding of 'tbp' ('g') must be either an accessible module procedure or an external procedure with an explicit interface
|
|
procedure,pass(x) :: tbp => g
|
|
end type t
|
|
|
|
contains
|
|
subroutine mp(x)
|
|
class(t),intent(in) :: x
|
|
end subroutine
|
|
end module m1
|
|
|
|
module m2
|
|
type parent
|
|
real realField
|
|
contains
|
|
!ERROR: Procedure binding 'proc' with no dummy arguments must have NOPASS attribute
|
|
procedure proc
|
|
end type parent
|
|
type,extends(parent) :: child
|
|
contains
|
|
!ERROR: Procedure binding 'proc' with no dummy arguments must have NOPASS attribute
|
|
procedure proc
|
|
end type child
|
|
contains
|
|
subroutine proc
|
|
end subroutine
|
|
end module m2
|
|
|
|
module m3
|
|
type t
|
|
contains
|
|
procedure b
|
|
end type
|
|
contains
|
|
!ERROR: Cannot use an alternate return as the passed-object dummy argument
|
|
subroutine b(*)
|
|
return 1
|
|
end subroutine
|
|
end module m3
|
|
|
|
module m4
|
|
type t
|
|
contains
|
|
procedure b
|
|
end type
|
|
contains
|
|
! Check to see that alternate returns work with default PASS arguments
|
|
subroutine b(this, *)
|
|
class(t) :: this
|
|
return 1
|
|
end subroutine
|
|
end module m4
|
|
|
|
module m5
|
|
type t
|
|
contains
|
|
!ERROR: Passed-object dummy argument 'passarg' of procedure 'b' must be of type 't' but is 'INTEGER(4)'
|
|
procedure, pass(passArg) :: b
|
|
end type
|
|
contains
|
|
subroutine b(*, passArg)
|
|
integer :: passArg
|
|
return 1
|
|
end subroutine
|
|
end module m5
|
|
|
|
module m6
|
|
type t
|
|
contains
|
|
!ERROR: Passed-object dummy argument 'passarg' of procedure 'b' must be polymorphic because 't' is extensible
|
|
procedure, pass(passArg) :: b
|
|
end type
|
|
contains
|
|
subroutine b(*, passArg)
|
|
type(t) :: passArg
|
|
return 1
|
|
end subroutine
|
|
end module m6
|
|
|
|
module m7
|
|
type t
|
|
contains
|
|
! Check to see that alternate returns work with PASS arguments
|
|
procedure, pass(passArg) :: b
|
|
end type
|
|
contains
|
|
subroutine b(*, passArg)
|
|
class(t) :: passArg
|
|
return 1
|
|
end subroutine
|
|
end module m7
|
|
|
|
program test
|
|
use m1
|
|
type,extends(t) :: t2
|
|
end type
|
|
type(t2) a
|
|
call a%tbp
|
|
end program
|