! { dg-do compile } ! Parsing of finalizer procedure definitions. ! Check for appropriate errors on invalid final procedures. MODULE final_type IMPLICIT NONE TYPE :: mytype INTEGER, ALLOCATABLE :: fooarr(:) REAL :: foobar FINAL :: finalize_matrix ! { dg-error "must be inside a derived type" } CONTAINS FINAL :: ! { dg-error "Empty FINAL" } FINAL ! { dg-error "Empty FINAL" } FINAL :: + ! { dg-error "Expected module procedure name" } FINAL :: iamnot ! { dg-error "is not a SUBROUTINE" } FINAL :: finalize_single finalize_vector ! { dg-error "Expected ','" } FINAL :: finalize_single, finalize_vector FINAL :: finalize_single ! { dg-error "is already defined" } FINAL :: finalize_vector_2 ! { dg-error "has the same rank" } FINAL :: finalize_single_2 ! { dg-error "has the same rank" } FINAL :: bad_function ! { dg-error "is not a SUBROUTINE" } FINAL bad_num_args_1 ! { dg-error "must have exactly one argument" } FINAL bad_num_args_2 ! { dg-error "must have exactly one argument" } FINAL bad_arg_type FINAL :: bad_pointer FINAL :: bad_alloc FINAL :: bad_optional FINAL :: bad_intent_out ! TODO: Test for polymorphism, kind parameters once those are implemented. END TYPE mytype CONTAINS SUBROUTINE finalize_single (el) IMPLICIT NONE TYPE(mytype) :: el END SUBROUTINE finalize_single ELEMENTAL SUBROUTINE finalize_single_2 (el) IMPLICIT NONE TYPE(mytype), INTENT(IN) :: el END SUBROUTINE finalize_single_2 SUBROUTINE finalize_vector (el) IMPLICIT NONE TYPE(mytype), INTENT(INOUT) :: el(:) END SUBROUTINE finalize_vector SUBROUTINE finalize_vector_2 (el) IMPLICIT NONE TYPE(mytype), INTENT(IN) :: el(:) END SUBROUTINE finalize_vector_2 SUBROUTINE finalize_matrix (el) IMPLICIT NONE TYPE(mytype) :: el(:, :) END SUBROUTINE finalize_matrix INTEGER FUNCTION bad_function (el) IMPLICIT NONE TYPE(mytype) :: el bad_function = 42 END FUNCTION bad_function SUBROUTINE bad_num_args_1 () IMPLICIT NONE END SUBROUTINE bad_num_args_1 SUBROUTINE bad_num_args_2 (el, x) IMPLICIT NONE TYPE(mytype) :: el COMPLEX :: x END SUBROUTINE bad_num_args_2 SUBROUTINE bad_arg_type (el) ! { dg-error "must be of type 'mytype'" } IMPLICIT NONE REAL :: el END SUBROUTINE bad_arg_type SUBROUTINE bad_pointer (el) ! { dg-error "must not be a POINTER" } IMPLICIT NONE TYPE(mytype), POINTER :: el END SUBROUTINE bad_pointer SUBROUTINE bad_alloc (el) ! { dg-error "must not be ALLOCATABLE" } IMPLICIT NONE TYPE(mytype), ALLOCATABLE :: el(:) END SUBROUTINE bad_alloc SUBROUTINE bad_optional (el) ! { dg-error "must not be OPTIONAL" } IMPLICIT NONE TYPE(mytype), OPTIONAL :: el END SUBROUTINE bad_optional SUBROUTINE bad_intent_out (el) ! { dg-error "must not be INTENT\\(OUT\\)" } IMPLICIT NONE TYPE(mytype), INTENT(OUT) :: el END SUBROUTINE bad_intent_out END MODULE final_type PROGRAM finalizer IMPLICIT NONE ! Nothing here, errors above END PROGRAM finalizer