47 lines
966 B
Fortran
47 lines
966 B
Fortran
! { dg-do "compile" }
|
|
|
|
! Abstract Types.
|
|
! Check for correct handling of abstract-typed base object references.
|
|
|
|
MODULE m
|
|
IMPLICIT NONE
|
|
|
|
TYPE, ABSTRACT :: abstract_t
|
|
INTEGER :: i
|
|
CONTAINS
|
|
PROCEDURE, NOPASS :: proc
|
|
PROCEDURE, NOPASS :: func
|
|
END TYPE abstract_t
|
|
|
|
TYPE, EXTENDS(abstract_t) :: concrete_t
|
|
END TYPE concrete_t
|
|
|
|
CONTAINS
|
|
|
|
SUBROUTINE proc ()
|
|
IMPLICIT NONE
|
|
! Do nothing
|
|
END SUBROUTINE proc
|
|
|
|
INTEGER FUNCTION func ()
|
|
IMPLICIT NONE
|
|
func = 1234
|
|
END FUNCTION func
|
|
|
|
SUBROUTINE test ()
|
|
IMPLICIT NONE
|
|
TYPE(concrete_t) :: obj
|
|
|
|
! These are ok.
|
|
obj%abstract_t%i = 42
|
|
CALL obj%proc ()
|
|
PRINT *, obj%func ()
|
|
|
|
! These are errors (even though the procedures are not DEFERRED!).
|
|
CALL obj%abstract_t%proc () ! { dg-error "is of ABSTRACT type" }
|
|
PRINT *, obj%abstract_t%func () ! { dg-error "is of ABSTRACT type" }
|
|
END SUBROUTINE test
|
|
|
|
END MODULE m
|
|
! { dg-final { cleanup-modules "m" } }
|