I just opened PR 119812 for what appears to be a regression in the latest 
gfortran.

The following code causes bogus errors when compiled with the latest trunk 
using the -Wall option:

module bugMod

  type :: c
     integer :: a
  end type c

  type, extends(c) :: c1
  end type c1

  type, extends(c) :: c2
  end type c2
  
  type :: s
     type(c1) :: c1_
     type(c2) :: c2_
   contains
     procedure :: map => map_
  end type s

contains

  subroutine mf(self)
    implicit none
    class(c), intent(inout) :: self

    self%a=1
    return
  end subroutine mf
  
  subroutine map_(self,mapFunction)
    implicit none
    class(s), intent(inout) :: self
    procedure(mf), pointer :: mapFunction 

    call mapFunction(self%c1_)
    call mapFunction(self%c2_)
    return
  end subroutine map_
  
end module bugMod


> gfortran -v
Using built-in specs.
COLLECT_GCC=gfortran
COLLECT_LTO_WRAPPER=/carnegie/nobackup/users/abenson/upstream/libexec/gcc/
x86_64-pc-linux-gnu/15.0.1/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../configure 
--prefix=/carnegie/nobackup/users/abenson/upstream 
--disable-multilib --enable-checking=release --enable-host-shared --with-pic 
--enable-languages=c,c++,fortran,jit,lto
Thread model: posix
Supported LTO compression algorithms: zlib zstd
gcc version 15.0.1 20250410 (experimental) (GCC) 



> gfortran -c bugFP.F90  -Wall
bugFP.F90:36:30:

   35 |     call mapFunction(self%c1_)
      |                              2
   36 |     call mapFunction(self%c2_)
      |                              1
Warning: Different argument lists in external dummy subroutine mapfunction at 
(1) and (2) [-Wexternal-argument-mismatch]
bugFP.F90:36:21:

   35 |     call mapFunction(self%c1_)
      |                     2
   36 |     call mapFunction(self%c2_)
      |                     1
Error: Type mismatch between actual argument at (1) and actual argument at (2) 
(TYPE(c2)/TYPE(c1)).



The `mapFunction` procedure pointer uses subroutine `mf` as its interface, 
which accepts a `class(c)` argument, such that either of the child types (`c1` 
and `c2`) should be acceptable.

The error goes away if compiled without -Wall, or if the calls to 
`mapFunction` are replaced with calls to `mf` directly.

This doesn't occur with gfortran 13.3.0 so appears to be a regression.

-Andrew

-- 

* Andrew Benson: https://abensonca.github.io

* Galacticus: https://github.com/galacticusorg/galacticus



Reply via email to