module Base_Header

    implicit none

    type, abstract :: base(param1)
        integer, len :: &
            param1

        contains
        generic,   public  :: method => method_ ! switch "generic" to "procedure" and this compiles
        procedure, private :: method_
    end type

    type, extends(base) :: extension
        class(base(:)), allocatable :: something
        contains
        procedure, public :: doSomething
    end type

    contains

    function method_(this,x) result(y)
        class(base(*)), intent(in) :: this
        real(8),          intent(in) :: x
        real(8)                      :: y

        y = 2*x
    end function

    function doSomething(this,x) result(y)
        class(extension(*)), intent(in) :: this
        real(8),               intent(in) :: x
        real(8)                           :: y

        y = this%something%method(x)
    end function

end module
