Bug 32634 - renamed, use associated generic interface rejected
Summary: renamed, use associated generic interface rejected
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: fortran (show other bugs)
Version: 4.3.0
: P3 normal
Target Milestone: ---
Assignee: Paul Thomas
URL:
Keywords: rejects-valid
Depends on:
Blocks:
 
Reported: 2007-07-05 15:21 UTC by Paul Thomas
Modified: 2007-07-12 20:27 UTC (History)
3 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Paul Thomas 2007-07-05 15:21:06 UTC
The code below incorrectly gives the error, as reported by Salvatore Filippone:

  Call foo_pwrk(pr,p,f,cd,info,work=aux)
                                       1
Error: There is no specific subroutine for the generic 'bar_pwrk' at (1)

Not only does it look correct but other compilers handle it OK.  module.c is not finding the "true name" symbol, even though it has been created with the "use name" symtree. A quick inspection of the .mod file reveals that the interface is given the true name, which simply is not findable by read_module.

Paul


module foo_base_mod


  type foo_dmt
    real(kind(1.d0)), allocatable  :: rv(:)
    integer, allocatable :: iv1(:), iv2(:)
  end type foo_dmt
  type foo_zmt
    complex(kind(1.d0)), allocatable  :: rv(:)
    integer, allocatable  :: iv1(:), iv2(:)
  end type foo_zmt


  type foo_cdt
     integer, allocatable :: md(:)
     integer, allocatable :: hi(:), ei(:)
  end type foo_cdt


end module foo_base_mod

module bar_prt

  use foo_base_mod, only : foo_dmt, foo_zmt, foo_cdt

  type bar_dbprt
    type(foo_dmt), allocatable :: av(:) 
    real(kind(1.d0)), allocatable      :: d(:)  
    type(foo_cdt)                :: cd 
  end type bar_dbprt


  type bar_dprt
    type(bar_dbprt), allocatable  :: bpv(:) 
  end type bar_dprt

  type bar_zbprt
    type(foo_zmt), allocatable :: av(:) 
    complex(kind(1.d0)), allocatable   :: d(:)  
    type(foo_cdt)                :: cd 
  end type bar_zbprt

  type bar_zprt
    type(bar_zbprt), allocatable  :: bpv(:) 
  end type bar_zprt


end module bar_prt

module bar_pr_mod
  use bar_prt

  interface bar_pwrk
    subroutine bar_dppwrk(pr,x,y,cd,info,trans,work)
      use foo_base_mod
      use bar_prt
      type(foo_cdt),intent(in)    :: cd
      type(bar_dprt), intent(in)  :: pr
      real(kind(0.d0)),intent(inout)    :: x(:), y(:)
      integer, intent(out)              :: info
      character(len=1), optional        :: trans
      real(kind(0.d0)),intent(inout), optional, target :: work(:)
    end subroutine bar_dppwrk
    subroutine bar_zppwrk(pr,x,y,cd,info,trans,work)
      use foo_base_mod
      use bar_prt
      type(foo_cdt),intent(in)    :: cd
      type(bar_zprt), intent(in)  :: pr
      complex(kind(0.d0)),intent(inout) :: x(:), y(:)
      integer, intent(out)              :: info
      character(len=1), optional        :: trans
      complex(kind(0.d0)),intent(inout), optional, target :: work(:)
    end subroutine bar_zppwrk
  end interface

end module bar_pr_mod


module foo_pr_mod

  use bar_prt, &
       & foo_dbprt  => bar_dbprt,&
       & foo_zbprt  => bar_zbprt,&
       & foo_dprt   => bar_dprt,&
       & foo_zprt   => bar_zprt 

  use bar_pr_mod, &
       & foo_pwrk  => bar_pwrk


end module foo_pr_mod


Subroutine foo_sub(a,pr,b,x,eps,cd,info)
  use foo_base_mod
  use foo_pr_mod
  Implicit None
!!$  parameters 
  Type(foo_dmt), Intent(in)  :: a
  Type(foo_dprt), Intent(in)   :: pr 
  Type(foo_cdt), Intent(in)    :: cd
  Real(Kind(1.d0)), Intent(in)       :: b(:)
  Real(Kind(1.d0)), Intent(inout)    :: x(:)
  Real(Kind(1.d0)), Intent(in)       :: eps
  integer, intent(out)               :: info

!!$   Local data
  Real(Kind(1.d0)), allocatable, target   :: aux(:),wwrk(:,:)
  Real(Kind(1.d0)), allocatable   :: p(:), f(:)

  info = 0

  Call foo_pwrk(pr,p,f,cd,info,work=aux)

  return

End Subroutine foo_sub
Comment 1 Paul Thomas 2007-07-05 15:24:10 UTC
This fixes it but is, as yet, unregtested:

Index: gcc/fortran/module.c
===================================================================
*** gcc/fortran/module.c        (revision 126317)
--- gcc/fortran/module.c        (working copy)
*************** write_operator (gfc_user_op *uop)
*** 3943,3948 ****
--- 3943,3951 ----
  static void
  write_generic (gfc_symbol *sym)
  {
+   const char *p;
+   int nuse, j;
+
    if (sym->generic == NULL
        || !gfc_check_access (sym->attr.access, sym->ns->default_access))
      return;
*************** write_generic (gfc_symbol *sym)
*** 3950,3956 ****
    if (sym->module == NULL)
      sym->module = gfc_get_string (module_name);

!   mio_symbol_interface (&sym->name, &sym->module, &sym->generic);
  }


--- 3953,3971 ----
    if (sym->module == NULL)
      sym->module = gfc_get_string (module_name);

!   /* See how many use names there are.  If none, go through the start
!        of the loop at least once.  */
!   nuse = number_use_names (sym->name);
!   if (nuse == 0)
!     nuse = 1;
!
!   for (j = 1; j <= nuse; j++)
!     {
!       /* Get the jth local name for this symbol.  */
!       p = find_use_name_n (sym->name, &j);
!
!       mio_symbol_interface (&p, &sym->module, &sym->generic);
!     }
  }


Comment 2 patchapp@dberlin.org 2007-07-06 11:20:20 UTC
Subject: Bug number PR32634

A patch for this bug has been added to the patch tracker.
The mailing list url for the patch is http://gcc.gnu.org/ml/gcc-patches/2007-07/msg00561.html
Comment 3 Paul Thomas 2007-07-10 05:11:14 UTC
Subject: Bug 32634

Author: pault
Date: Tue Jul 10 05:11:00 2007
New Revision: 126509

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=126509
Log:
2007-07-10  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/32157
	* resolve.c (is_external_proc): New function.  Adds test that
	the symbol is not an intrinsic procedure.
	* (resolve_function, resolve_call): Replace logical statements
	with call to is_external_proc.

	PR fortran/32689
	* simplify.c (gfc_simplify_transfer): If mold has rank, the
	result is an array.

	PR fortran/32634
	* module.c (write_generic): Write the local name of the
	interface. 


2007-07-10  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/32157
	* gfortran.dg/overload_2.f90: New test.

	PR fortran/32689
	* gfortran.dg/transfer_simplify_5.f90

	PR fortran/32634
	* gfortran.dg/interface_15.f90: New test.

Added:
    trunk/gcc/testsuite/gfortran.dg/interface_16.f90
    trunk/gcc/testsuite/gfortran.dg/overload_2.f90
    trunk/gcc/testsuite/gfortran.dg/transfer_simplify_5.f90
Modified:
    trunk/gcc/fortran/ChangeLog
    trunk/gcc/fortran/module.c
    trunk/gcc/fortran/resolve.c
    trunk/gcc/fortran/simplify.c
    trunk/gcc/testsuite/ChangeLog

Comment 4 Paul Thomas 2007-07-10 05:13:30 UTC
Fixed on trunk.

Paul
Comment 5 Daniel Franke 2007-07-12 06:31:31 UTC
Subject: Bug 32634

Author: dfranke
Date: Thu Jul 12 06:31:12 2007
New Revision: 126572

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=126572
Log:
2007-07-12  Daniel Franke  <franke.daniel@gmail.com>

        PR fortran/32634
        PR fortran/32727
        * module.c: Reverted Paul's patch from 2007-07-10.


Modified:
    trunk/gcc/fortran/ChangeLog
    trunk/gcc/fortran/module.c

Comment 6 Daniel Franke 2007-07-12 06:35:25 UTC
Reverted patch and re-opened as requested in PR32727.
Comment 7 Paul Thomas 2007-07-12 20:05:12 UTC
Subject: Bug 32634

Author: pault
Date: Thu Jul 12 20:04:59 2007
New Revision: 126600

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=126600
Log:
2007-07-12  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/32634
	PR fortran/32727
	* module.c (write_generic): Restore patch of 2007-07-10 and use
	symbol name if there are no use names. 

2007-07-12  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/32727
	* gfortran.dg/interface_17.f90: New test.

Added:
    trunk/gcc/testsuite/gfortran.dg/interface_17.f90
Modified:
    trunk/gcc/fortran/ChangeLog
    trunk/gcc/fortran/module.c
    trunk/gcc/testsuite/ChangeLog

Comment 8 Paul Thomas 2007-07-12 20:27:48 UTC
Fixed... again, I hope.

Paul