int i, compval;
gfc_expr *shape1, *shape2;
+ if (s1->as->rank != s2->as->rank)
+ {
+ snprintf (errmsg, err_len, "Rank mismatch in argument '%s' (%i/%i)",
+ s1->name, s1->as->rank, s2->as->rank);
+ return false;
+ }
+
/* Sometimes the ambiguity between deferred shape and assumed shape
does not get resolved in module procedures, where the only explicit
declaration of the dummy is in the interface. */
s2->as->lower[i] = gfc_copy_expr (s1->as->lower[i]);
}
- if (s1->as->type != s2->as->type)
+ if (s1->as->type != s2->as->type
+ && !(s1->as->type == AS_DEFERRED
+ && s2->as->type == AS_ASSUMED_SHAPE))
{
snprintf (errmsg, err_len, "Shape mismatch in argument '%s'",
s1->name);
--- /dev/null
+! { dg-do compile }
+!
+! PR fortran/124567 - overriding method not resolved correctly
+!
+! Contributed by Salvatore Filippone
+
+module psb_base_spm_mod
+ type :: psb_base_spm
+ end type psb_base_spm
+end module psb_base_spm_mod
+
+module psb_r_base_spm_mod
+ use psb_base_spm_mod
+ type, extends(psb_base_spm) :: psb_r_base_spm
+ contains
+ procedure, pass(a) :: csgrw => psb_r_base_csgrw
+ end type psb_r_base_spm
+
+ interface
+ subroutine psb_r_base_csgrw(a,iren)
+ import
+ class(psb_r_base_spm), intent(in) :: a
+ integer, intent(in), optional :: iren(:)
+ end subroutine psb_r_base_csgrw
+ end interface
+end module psb_r_base_spm_mod
+
+module psb_d_mf_mat_mod
+ use psb_r_base_spm_mod
+ type, extends(psb_r_base_spm) :: psb_d_mf_spm
+ procedure(d_mf_mv), pass(a), pointer :: var_csmv => null()
+ contains
+ procedure, pass(a) :: csgrw => psb_d_mf_csgrw
+ procedure, pass(a) :: set_csmv => d_mf_set_csmv
+ end type psb_d_mf_spm
+
+ interface
+ subroutine d_mf_mv(a,x,info)
+ import :: psb_d_mf_spm
+ class(psb_d_mf_spm), intent(in) :: a
+ real, intent(in) :: x(:)
+ integer, intent(out) :: info
+ end subroutine d_mf_mv
+ end interface
+
+ interface
+ subroutine psb_d_mf_csgrw(a,iren)
+ import
+ class(psb_d_mf_spm), intent(in) :: a
+ integer, intent(in), optional :: iren(:)
+ end subroutine psb_d_mf_csgrw
+ end interface
+
+contains
+ subroutine d_mf_set_csmv(func,a)
+ implicit none
+ class(psb_d_mf_spm), intent(inout) :: a
+ procedure(d_mf_mv) :: func
+ a%var_csmv => func
+ return
+ end subroutine d_mf_set_csmv
+end module psb_d_mf_mat_mod
--- /dev/null
+! { dg-do compile }
+!
+! PR fortran/124567 - rank/shape check in interface checking
+!
+! Variation of gfortran.dg/proc_decl_26.f90
+
+program test
+ implicit none
+
+ interface
+ subroutine one(a)
+ integer a(:)
+ end subroutine
+ subroutine two(a)
+ integer a(..)
+ end subroutine
+ end interface
+
+ ! Assumed-shape vs. deferred
+ call foo(two) ! { dg-error "Rank mismatch in argument 'a' \\(1/-1\\)" }
+ call bar(two) ! { dg-error "Rank mismatch in argument 'a' \\(1/-1\\)" }
+
+ ! Reversed
+ call bas(one) ! { dg-error "Rank mismatch in argument 'a' \\(-1/1\\)" }
+ call bla(one) ! { dg-error "Rank mismatch in argument 'a' \\(-1/1\\)" }
+
+contains
+
+ subroutine foo(f1)
+ procedure(one) :: f1
+ end subroutine foo
+
+ subroutine bar(f2)
+ interface
+ subroutine f2(a)
+ integer a(:)
+ end subroutine
+ end interface
+ end subroutine bar
+
+ subroutine bas(f1)
+ procedure(two) :: f1
+ end subroutine bas
+
+ subroutine bla(f2)
+ interface
+ subroutine f2(a)
+ integer a(..)
+ end subroutine
+ end interface
+ end subroutine bla
+
+end program