[Bug fortran/64138] gfortran interface issue

2014-12-06 Thread dominiq at lps dot ens.fr
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64138

Dominique d'Humieres dominiq at lps dot ens.fr changed:

   What|Removed |Added

 Status|WAITING |RESOLVED
 Resolution|--- |INVALID

--- Comment #10 from Dominique d'Humieres dominiq at lps dot ens.fr ---
The argument in comment 9 not being challenged, closing as INVALID.


[Bug fortran/64138] gfortran interface issue

2014-12-02 Thread wong.david-c at epa dot gov
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64138

--- Comment #5 from david wong.david-c at epa dot gov ---
Hi,

   What is your fix?

   In the original code, c_sub_cr and c_sub_rc are distinct because the
sequence of argument type are different. Other compilers have no problem to
distinguish them. Please advise.

Cheers,
David


[Bug fortran/64138] gfortran interface issue

2014-12-02 Thread sgk at troutmask dot apl.washington.edu
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64138

--- Comment #6 from Steve Kargl sgk at troutmask dot apl.washington.edu ---
On Tue, Dec 02, 2014 at 03:37:19PM +, wong.david-c at epa dot gov wrote:
 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64138
 
What is your fix?
 

I meant I fixed the code you posted.  It was missing a CONTAINS
statement before c_sub_cc, and there is an extra 'j' on the
end of one of the 'end function c_sub_??' lines.

In the original code, c_sub_cr and c_sub_rc are distinct because the
 sequence of argument type are different. Other compilers have no problem to
 distinguish them. Please advise.

You can get the code to compile if you change the dummy
argument names in c_sub_cr and c_sub_rc to unique entities.
For example, (and yes I changed the function and variable
names while debugging)

  type(complex_number) function f2(z1, num)
 type (complex_number), intent(in) :: z1
 real(kind=dp), intent(in) :: num
 f2%re = z1%re - num
 f2%im = z1%im
   end function f2

  type(complex_number) function f3(num, z2)
 type (complex_number), intent(in) :: z2
 real(kind=dp), intent(in) :: num
 f3%re = num - z2%re
 f3%im = - z2%im
  end function f3

The only problem with this workaround is that you cannot
use keyword argument association.  For example,

   type(complex_number) :: z=complex_number(1.,2.)
   real x = 3. 
   z = c_sub(num=x, z)

The above is ambiguous because the reduced argument list for
f2 and f3 are identical, so the generic c_sub can be mapped
to either.  Fortunately, gfortran tries to help in this 
situation

% gfortran -o z -fmax-errors=1 a.f90
a.f90:53.18:

  b = c_sub(num=x, a);print '(A,2F5.1)', '(x-a)? = ', b%re, b%im
  1
Error: Missing keyword name in actual argument list at (1)
Fatal Error: Error count reached limit of 1.

Note, however, AFAIK, a keyword is not necessary and is not required.
IHMO, issuing this error message could in fact be considered a bug.
In fact, if you change the order of arguments to

  b = c_sub(a, num=x);print '(A,2F5.1)', '(x-a)? = ', b%re, b%im

This will compile without error.  If the former line producing an
error about a missing keyword shouldn't the latter?


[Bug fortran/64138] gfortran interface issue

2014-12-02 Thread dominiq at lps dot ens.fr
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64138

--- Comment #7 from Dominique d'Humieres dominiq at lps dot ens.fr ---
I was sure to have seen discussions about such issues: pr33997 and 

https://groups.google.com/forum/#!msg/comp.lang.fortran/GIcxE7GM1ek/aP7eJpQ-T7QJ

AFAIU the discussions, the relevant point for this PR is

 (b) A nonoptional non-passed-object dummy argument whose name
 is such that either the other procedure has no dummy argument
 with that name or the dummy argument with that name is distinguishable
 with it.

Along this line I have renamed num to num1 and z1 to z2 in c_sub_rc

   module complex_number_module
implicit none

integer, parameter :: loc_real_precision = 8

type complex_number
  real(kind=loc_real_precision) :: real_part, imag_part
end type complex_number

interface c_sub
  module procedure c_sub_cc,  ! z1 - z2
   c_sub_cr,  ! z1 - num, where num is a real
number
   c_sub_rc! num - z1, where num is a real
number
end interface

 contains
! --
type (complex_number) function c_sub_cc (z1, z2)

type (complex_number), intent(in) :: z1, z2

c_sub_cc%real_part = z1%real_part - z2%real_part
c_sub_cc%imag_part = z1%imag_part - z2%imag_part

end function c_sub_cc

! --
type (complex_number) function c_sub_cr (z1, num)

type (complex_number), intent(in) :: z1
real(kind=loc_real_precision), intent(in) :: num

c_sub_cr%real_part = z1%real_part - num
c_sub_cr%imag_part = z1%imag_part

end function c_sub_cr

! --
type (complex_number) function c_sub_rc (num1, z2)

type (complex_number), intent(in) :: z2
real(kind=loc_real_precision), intent(in) :: num1

c_sub_rc%real_part = num1 - z2%real_part
c_sub_rc%imag_part = - z2%imag_part

end function c_sub_rc

  end module complex_number_module

program foo
  use complex_number_module
  type(complex_number) a, b
  real(loc_real_precision) x
  a%real_part = 1
  a%imag_part = 2
  x = 3
  b = c_sub(a, x); print '(A,2F5.1)', 'a-x = ', b%real_part, b%imag_part
  b = c_sub(x, a); print '(A,2F5.1)', 'x-a = ', b%real_part, b%imag_part
  b = c_sub(z1=a, num=x); print '(A,2F5.1)', 'a-x = ', b%real_part, b%imag_part
  b = c_sub(num=x,z1=a); print '(A,2F5.1)', 'a-x = ', b%real_part, b%imag_part
  b = c_sub(num1=x,z2=a); print '(A,2F5.1)', 'x-a = ', b%real_part, b%imag_part
end program foo

This made the code to compile and if I am not mistaken to produce the correct
result

a-x =  -2.0  2.0
x-a =   2.0 -2.0
a-x =  -2.0  2.0
a-x =  -2.0  2.0
x-a =   2.0 -2.0


Out of curiosity why do want to handle complex numbers through types while they
are perfectly handled in Fortran by kinds?

To conclude I think this PR should be closed as INVALID.


[Bug fortran/64138] gfortran interface issue

2014-12-02 Thread sgk at troutmask dot apl.washington.edu
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64138

--- Comment #8 from Steve Kargl sgk at troutmask dot apl.washington.edu ---
On Tue, Dec 02, 2014 at 05:13:09PM +, dominiq at lps dot ens.fr wrote:
 
 To conclude I think this PR should be closed as INVALID.
 

That's the conclusion that I'm leaning towards.  Reading
section 16 of the standard always makes my head hurt, so
I'm being caution while looking for some subtle point 
that I may have missed.


[Bug fortran/64138] gfortran interface issue

2014-12-02 Thread dominiq at lps dot ens.fr
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64138

--- Comment #9 from Dominique d'Humieres dominiq at lps dot ens.fr ---
 That's the conclusion that I'm leaning towards.  Reading
 section 16 of the standard always makes my head hurt, so
 I'm being caution while looking for some subtle point 
 that I may have missed.

And the threads I have pointed to are also convoluted. Now I find quite clear
that using the same names for the dummy arguments in c_sub_cr and c_sub_rc does
not permit to distinguish between c_sub_cr(num=x,z1=a) and
c_sub_rc(num=x,z1=a), while using different names does.


[Bug fortran/64138] gfortran interface issue

2014-12-01 Thread kargl at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64138

kargl at gcc dot gnu.org changed:

   What|Removed |Added

 CC||kargl at gcc dot gnu.org

--- Comment #1 from kargl at gcc dot gnu.org ---
(In reply to david from comment #0)
 Hi,
 
I have created a complex number module:
 
module complex_number_module
 implicit none
 
 integer, parameter :: loc_real_precision = 8
 
 type complex_number
   real(kind=loc_real_precision) :: real_part, imag_part
 end type complex_number
 
 interface c_sub
   module procedure c_sub_cc,  ! z1 - z2
c_sub_cr,  ! z1 - num, where num is a
 real number
c_sub_rc! num - z1, where num is a
 real number
 end interface
 
 ! --
 type (complex_number) function c_sub_cc (z1, z2)
 
 type (complex_number), intent(in) :: z1, z2
 
 c_sub_cc%real_part = z1%real_part - z2%real_part
 c_sub_cc%imag_part = z1%imag_part - z2%imag_part
 
 end function c_sub_ccj
 
 ! --
 type (complex_number) function c_sub_cr (z1, num)
 
 type (complex_number), intent(in) :: z1
 real(kind=loc_real_precision), intent(in) :: num
 
 c_sub_cr%real_part = z1%real_part - num
 c_sub_cr%imag_part = z1%imag_part
 
 end function c_sub_cr
 
 ! --
 type (complex_number) function c_sub_rc (num, z1)
 
 type (complex_number), intent(in) :: z1
 real(kind=loc_real_precision), intent(in) :: num
 
 c_sub_rc%real_part = num - z1%real_part
 c_sub_rc%imag_part = - z1%imag_part
 
 end function c_sub_rc
 
   end module complex_number_module
 
 When I compile with gfortran (version 4.6.4), I got the following error:
 
 module_twoway_rrtmg_aero_optical_util.F:14.85:
 
  c_sub_rc! num - z1, where num is a real number
1
 
 Error: Ambiguous interfaces 'c_sub_rc' and 'c_sub_cr' in generic interface
 'c_sub' at (1)
 
 I don't see any ambiguity and I don't encounter any problem with other
 compilers such pgi and ifort. Please advise.
 
 Cheers,
 David

Please attach the exact code you tried to compile.  The above is nonsense.


[Bug fortran/64138] gfortran interface issue

2014-12-01 Thread wong.david-c at epa dot gov
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64138

--- Comment #2 from david wong.david-c at epa dot gov ---
Created attachment 34158
  -- https://gcc.gnu.org/bugzilla/attachment.cgi?id=34158action=edit
a small code


[Bug fortran/64138] gfortran interface issue

2014-12-01 Thread wong.david-c at epa dot gov
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64138

--- Comment #3 from david wong.david-c at epa dot gov ---
(In reply to david from comment #0)
 Hi,
 
I have created a complex number module:
 
module complex_number_module
 implicit none
 
 integer, parameter :: loc_real_precision = 8
 
 type complex_number
   real(kind=loc_real_precision) :: real_part, imag_part
 end type complex_number
 
 interface c_sub
   module procedure c_sub_cc,  ! z1 - z2
c_sub_cr,  ! z1 - num, where num is a
 real number
c_sub_rc! num - z1, where num is a
 real number
 end interface
 
 ! --
 type (complex_number) function c_sub_cc (z1, z2)
 
 type (complex_number), intent(in) :: z1, z2
 
 c_sub_cc%real_part = z1%real_part - z2%real_part
 c_sub_cc%imag_part = z1%imag_part - z2%imag_part
 
 end function c_sub_ccj
 
 ! --
 type (complex_number) function c_sub_cr (z1, num)
 
 type (complex_number), intent(in) :: z1
 real(kind=loc_real_precision), intent(in) :: num
 
 c_sub_cr%real_part = z1%real_part - num
 c_sub_cr%imag_part = z1%imag_part
 
 end function c_sub_cr
 
 ! --
 type (complex_number) function c_sub_rc (num, z1)
 
 type (complex_number), intent(in) :: z1
 real(kind=loc_real_precision), intent(in) :: num
 
 c_sub_rc%real_part = num - z1%real_part
 c_sub_rc%imag_part = - z1%imag_part
 
 end function c_sub_rc
 
   end module complex_number_module
 
 When I compile with gfortran (version 4.6.4), I got the following error:
 
 module_twoway_rrtmg_aero_optical_util.F:14.85:
 
  c_sub_rc! num - z1, where num is a real number
1
 
 Error: Ambiguous interfaces 'c_sub_rc' and 'c_sub_cr' in generic interface
 'c_sub' at (1)
 
 I don't see any ambiguity and I don't encounter any problem with other
 compilers such pgi and ifort. Please advise.
 
 Cheers,
 David

Hi,

   I have attached a smaller version of the code and the way I compiled the
code is:

   gfortran -c -ffree-form d.F

Thanks,
David


[Bug fortran/64138] gfortran interface issue

2014-12-01 Thread kargl at gcc dot gnu.org
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64138

kargl at gcc dot gnu.org changed:

   What|Removed |Added

 Status|UNCONFIRMED |WAITING
   Last reconfirmed||2014-12-01
 Ever confirmed|0   |1

--- Comment #4 from kargl at gcc dot gnu.org ---
(In reply to kargl from comment #1)
 (In reply to david from comment #0)
  Hi,
  
 I have created a complex number module:
  
 module complex_number_module
  implicit none
  
  integer, parameter :: loc_real_precision = 8
  
  type complex_number
real(kind=loc_real_precision) :: real_part, imag_part
  end type complex_number
  
  interface c_sub
module procedure c_sub_cc,  ! z1 - z2
 c_sub_cr,  ! z1 - num, where num is a
  real number
 c_sub_rc! num - z1, where num is a
  real number
  end interface
  
  ! --
  type (complex_number) function c_sub_cc (z1, z2)
  
  type (complex_number), intent(in) :: z1, z2
  
  c_sub_cc%real_part = z1%real_part - z2%real_part
  c_sub_cc%imag_part = z1%imag_part - z2%imag_part
  
  end function c_sub_ccj
  
  ! --
  type (complex_number) function c_sub_cr (z1, num)
  
  type (complex_number), intent(in) :: z1
  real(kind=loc_real_precision), intent(in) :: num
  
  c_sub_cr%real_part = z1%real_part - num
  c_sub_cr%imag_part = z1%imag_part
  
  end function c_sub_cr
  
  ! --
  type (complex_number) function c_sub_rc (num, z1)
  
  type (complex_number), intent(in) :: z1
  real(kind=loc_real_precision), intent(in) :: num
  
  c_sub_rc%real_part = num - z1%real_part
  c_sub_rc%imag_part = - z1%imag_part
  
  end function c_sub_rc
  
end module complex_number_module
  
  When I compile with gfortran (version 4.6.4), I got the following error:
  
  module_twoway_rrtmg_aero_optical_util.F:14.85:
  
   c_sub_rc! num - z1, where num is a real number
 1
  
  Error: Ambiguous interfaces 'c_sub_rc' and 'c_sub_cr' in generic interface
  'c_sub' at (1)
  
  I don't see any ambiguity and I don't encounter any problem with other
  compilers such pgi and ifort. Please advise.
  
  Cheers,
  David
 
 Please attach the exact code you tried to compile.  The above is nonsense.

I fixed the above code.  I believe gfortran is correct to complain
about an ambiguous interface.  In the last two line below, which
of c_sub_rc and c_sub_cr should be called.

program foo
  use complex_number_module
  type(complex_number) a, b
  real(dp) x
  a%re = 1
  a%im = 2
  x = 1
  b = c_sub(a, x); print '(A,2F5.1)', 'a-x = ', b%re, b%im
  b = c_sub(x, a); print '(A,2F5.1)', 'x-a = ', b%re, b%im
  b = c_sub(z1=a, num=x); print '(A,2F5.1)', 'a-x = ', b%re, b%im
  b = c_sub(num=x,a); print '(A,2F5.1)', 'a-x = ', b%re, b%im
end program foo