https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91556

--- Comment #7 from kargl at gcc dot gnu.org ---
(In reply to Jürgen Reuter from comment #6)
> (In reply to kargl from comment #5)
> > (In reply to kargl from comment #3)
> > > (In reply to Jürgen Reuter from comment #2)
> > > > (In reply to kargl from comment #1)
> > > > > W(In reply to Jürgen Reuter from comment #0)
> > > > > > Created attachment 46763 [details]
> > > > > > Reproducer
> > > > > > 
> > > > > > This is a rather recent regression, failing with r274920, and it 
> > > > > > had been
> > > > > > still working with r274120. The compile error is:
> > > > > > gfortran  -c muli_remnant.f90
> > > > > > muli_remnant.f90:2186:34:
> > > > > > 
> > > > > >  2186 |        call evolvePDF (x(0), q, f)
> > > > > >       |                                  1
> > > > > > Error: Type mismatch in argument '_formal_0' at (1); passed REAL(8) 
> > > > > > to
> > > > > > REAL(16)
> > > > > 
> > > > > What are the declared types of x, q, and f?
> > > > > What are the types of the dummy arguments of
> > > > > evolvepdf()?
> > > > 
> > > > The code is attached.
> > > 
> > > The code is broken, and gfortran has told you.
> > 
> > module kinds
> >   integer, parameter :: double    =  8   !  7..15 ! real64  ! c_double     
> >   integer, parameter :: quadruple = 16   ! 19..33 ! real128 ! c_float128   
> >   integer, parameter :: default  = quadruple
> > end module kinds
> >  
> > module pdf_builtin
> > 
> >   subroutine pdfnorm_scan (this)
> >     real(double) :: q, q2min, q2max
> >     real(double), dimension(-6:6) :: f
> >     real(double), dimension(0:2) :: x
> >     call evolvePDF (x(1), q, f)
> >   end subroutine pdfnorm_scan
> > 
> > evolvepdf is called with REAL(8), REAL(8), REAL(8)
> > 
> >   subroutine proton_remnant_momentum_kind_pdf (this, GeV_scale, &
> >        momentum_fraction, lha_flavor, valence_pdf, sea_pdf, twin_pdf)
> >     real(default), intent(in) :: GeV_scale, momentum_fraction
> >     integer, intent(in) :: lha_flavor
> >     real(double), dimension(-6:6) :: pdf_array
> >     call evolvePDF (momentum_fraction, GeV_scale, pdf_array)
> >   end subroutine proton_remnant_momentum_kind_pdf
> > 
> > evolvepdf is called with REAL(16), REAl(16), REAL(8)
> > 
> > 
> > evolvepdf is not generic.
> 
> Steve, you are absolutely right. The cast of evolvePDF is always on double
> precision arguments, this line here:
> call evolvePDF (momentum_fraction, GeV_scale, pdf_array)
> should be
> call evolvePDF (dble (momentum_fraction), dble(GeV_scale), pdf_array)
> Sorry for the hiccup. Please close.

I'll give Thomas a chance to look at the bug.  This is a new feature 
for gfortran that tries to track (external) subprogram interfaces.  The
error message seems odd to me

 2186 |        call evolvePDF (x(0), q, f)
      |                                  1
  Error: Type mismatch in argument '_formal_0' at (1); passed REAL(8)
  to REAL(16)

I would hope that the error could use an argument name, e.g., 
example.

 2186 |        call evolvePDF (x(0), q, f)
      |                                  1
   Error: Type mismatch in argument 'f' at (1); passed REAL(8) to REAL(16)

If gfortran told a user the problem was with the type of 'f', then one
could check the the types of 'f' and the dummy argument.

If you look through the last week or so of fortran mailing list, you'll
see that Thomas has discovered a large number of argument mismatch problems.

Reply via email to