blob: ebef02ed82a854c1bb0a965d358f395ee28d6bb2 [file] [log] [blame]
! { dg-do compile }
! Test the fix for PR43266, in which an ICE followed correct error messages.
!
! Contributed by Tobias Burnus <burnus@gcc.gnu.org>
! Reported in http://groups.google.ca/group/comp.lang.fortran/browse_thread/thread/f5ec99089ea72b79
!
!----------------
! library code
module m
TYPE, ABSTRACT :: top
CONTAINS
PROCEDURE(xxx), DEFERRED :: proc_a ! { dg-error "must be explicit" }
! some useful default behavior
PROCEDURE :: proc_c => top_c ! { dg-error "must be a module procedure" }
END TYPE top
! Concrete middle class with useful behavior
TYPE, EXTENDS(top) :: middle
CONTAINS
! do nothing, empty proc just to make middle concrete
PROCEDURE :: proc_a => dummy_middle_a ! { dg-error "must be a module procedure" }
! some useful default behavior
PROCEDURE :: proc_b => middle_b ! { dg-error "must be a module procedure" }
END TYPE middle
!----------------
! client code
TYPE, EXTENDS(middle) :: bottom
CONTAINS
! useful proc to satisfy deferred procedure in top. Because we've
! extended middle we wouldn't get told off if we forgot this.
PROCEDURE :: proc_a => bottom_a ! { dg-error "must be a module procedure" }
! calls middle%proc_b and then provides extra behavior
PROCEDURE :: proc_b => bottom_b
! calls top_c and then provides extra behavior
PROCEDURE :: proc_c => bottom_c
END TYPE bottom
contains
SUBROUTINE bottom_b(obj)
CLASS(Bottom) :: obj
CALL obj%middle%proc_b ! { dg-error "should be a SUBROUTINE" }
! other stuff
END SUBROUTINE bottom_b
SUBROUTINE bottom_c(obj)
CLASS(Bottom) :: obj
CALL top_c(obj) ! { dg-error "Explicit interface required" }
! other stuff
END SUBROUTINE bottom_c
end module