https://gcc.gnu.org/bugzilla/show_bug.cgi?id=120371
Bug ID: 120371 Summary: [15.1 regression] erroneously triggered error message on non-matching interfaces with flag -Wall Product: gcc Version: 15.1.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: fortran Assignee: unassigned at gcc dot gnu.org Reporter: juergen.reuter at desy dot de Target Milestone: --- Created attachment 61483 --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=61483&action=edit Reproducer The following code when compiled with -Wall is rejected with erroneous error messages: Error: Interface mismatch in dummy procedure ‘evaluate_special’ at (1): 'evaluate_special' has the wrong number of arguments The -Wall doesn't produce this error message for versions 11.5, 13.3 or 14.2, but with 15.1. The reproducer is listed below and attached: module lorentz implicit none private type :: vector4_t real, dimension(0:3) :: p = [0, 0, 0, 0] end type vector4_t abstract interface subroutine func_spec (p_origin, & p1_in, p1_out, msq_in, jac) import type(vector4_t), intent(in) :: p_origin type(vector4_t), intent(in) :: p1_in type(vector4_t), intent(inout) :: p1_out real, intent(in), optional :: msq_in real, intent(inout), optional :: jac end subroutine func_spec end interface contains recursive subroutine rec_func (p_dec, & p_in, p_out, i_real, msq_in, jac, evaluate_special) type(vector4_t), intent(in) :: p_dec type(vector4_t), intent(in), dimension(:) :: p_in type(vector4_t), intent(inout), dimension(:) :: p_out integer, intent(in) :: i_real real, intent(in), optional :: msq_in real, intent(inout), optional :: jac procedure(func_spec), intent(in), & pointer, optional :: evaluate_special type(vector4_t) :: p_dec_new if (present (evaluate_special)) then call evaluate_special (p_in(1), p_in(2), & p_out(i_real)) call rec_func (p_in(1), p_in (2 : ), p_out, & i_real + 1, msq_in, jac, evaluate_special) else call func (p_in(1), p_in(2), & p_out(i_real), msq_in, jac) end if end subroutine rec_func subroutine func (p_origin, & p1_in, p1_out, msq_in, jac) type(vector4_t), intent(in) :: p_origin type(vector4_t), intent(in) :: p1_in type(vector4_t), intent(inout) :: p1_out real, intent(in), optional :: msq_in real, intent(inout), optional :: jac type(vector4_t) :: p1_rest, p2_rest real :: msq_in_update p1_rest = p1_in p1_out = p1_rest msq_in_update = 42. if (present (jac) .and. present (msq_in)) then jac = jac * msq_in_update end if end subroutine func end module lorentz