public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: "Bader, Reinhold" <Reinhold.Bader@lrz.de>
To: Paul Richard Thomas <paul.richard.thomas@gmail.com>,
	"fortran@gcc.gnu.org"	<fortran@gcc.gnu.org>,
	gcc-patches <gcc-patches@gcc.gnu.org>
Cc: Damian Rouson <damian@sourceryinstitute.org>,
	Tobias Burnus	<burnus@net-b.de>,
	"salvatore.filippone@uniroma2.it"
	<salvatore.filippone@uniroma2.it>
Subject: AW: [Patch, fortran] PR52846 - [F2008] Support submodules
Date: Thu, 25 Jun 2015 21:23:00 -0000	[thread overview]
Message-ID: <d0e5c8c06ffc4822b0e70978f8996120@BADWLRZ-SW13MB6.ads.mwn.de> (raw)
In-Reply-To: <CAGkQGiJ0tLwoXHBntOuq_W1X=87TSBUHcPWYZgFUSuvHKSR5aQ@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 12904 bytes --]

Looks much better.

Attached another test case that fails compilation. The function result as declared
in the module procedure interface is not propagated to the submodule that uses the
argument/resultless form in the implementation. 

Cheers
Reinhold

> -----Ursprüngliche Nachricht-----
> Von: Paul Richard Thomas [mailto:paul.richard.thomas@gmail.com]
> Gesendet: Donnerstag, 25. Juni 2015 17:16
> An: fortran@gcc.gnu.org; gcc-patches
> Cc: Damian Rouson; Tobias Burnus; salvatore.filippone@uniroma2.it; Bader,
> Reinhold
> Betreff: Re: [Patch, fortran] PR52846 - [F2008] Support submodules
> 
> Dear All,
> 
> Please find attached an updated version of the submodule patch.
> Reinhold Bader uncovered a couple of bugs, which have now been fixed:
> (i) IMPORT is no longer permitted in module_procedure interface
> bodies, as required by F2008(C1210). Instead, import occurs
> automatically; and
> (ii) The end statement for the abreviated module procedure declaration
> was wrong; should have been END PROCEDURE. I started introducing
> COMP_MODPROC_FUNC/SUBR in the parser to fix this. However, many of the
> if statement became impossibly torturous considering that there was
> only one place where it matters. Therefore, I decided to add a bit
> field to gfc_symbol as the least invasive way of dealing with the
> problem.
> 
> The testcases were modified accordingly.
> 
> Bootstraps and regtests on FC21/x86_64 - OK for trunk?
> 
> Thanks Reinhold!
> 
> Paul
> 
> 2015-06-25  Paul Thomas  <pault@gcc.gnu.org>
> 
>     PR fortran/52846
>     * decl.c (get_proc_name): Make a partially populated interface
>     symbol to carry the characteristics of a module procedure and
>     its result.
>     (gfc_match_import): IMPORT is not permitted in the interface
>     declaration of module procedures.
>     (match_attr_spec): Submodule variables have implicit save
>     attribute for F2008 onwards.
>     (gfc_match_prefix): Add 'module' as the a prefix and set the
>     module_procedure attribute.
>     (gfc_match_formal_arglist): For a module procedure keep the
>     interface formal_arglist from the interface, match new the
>     formal arguments and then compare the number and names of each.
>     (gfc_match_procedure): Add case COMP_SUBMODULE.
>     (gfc_match_function_decl, gfc_match_subroutine_decl): Set the
>     module_procedure attribute.
>     (gfc_match_entry, gfc_match_end):  Add case COMP_SUBMODULE. If
>     attr abr_modproc_decl is set, switch the message accordingly
>     for subroutines and functions.
>     (gfc_match_submod_proc): New function to match the abbreviated
>     style of submodule declaration.
>     * gfortran.h : Add ST_SUBMODULE and ST_END_SUBMODULE. Add the
>     attribute bits 'used_in_submodule' and 'module_procedure'. Add
>     prototypes for the functions 'gfc_check_dummy_characteristics'
>     and 'gfc_check_result_characteristics'.
>     * interface.c : Add the prefix 'gfc_' to the names of functions
>     'check_dummy(result)_characteristics' and all their references.
>     * match.h : Add prototype for 'gfc_match_submod_proc' and
>     'gfc_match_submodule'.
>     * module.c (gfc_match_submodule): New function. Add handling
>     for the 'module_procedure' attribute bit.
>     * parse.c (decode_statement): Set attr has_'import_set' for
>     the interface declaration of module procedures. Handle a match
>     occurring in 'gfc_match_submod_proc' and a match for
>     'submodule'.
>     (gfc_enclosing_unit): Include the state COMP_SUBMODULE.
>     (gfc_ascii_statement): Add END SUBMODULE.
>     (accept_statement): Add ST_SUBMODULE.
>     (parse_spec): Disallow statement functions in a submodule
>     specification part.
>     (parse_contained): Add ST_END_SUBMODULE and COMP_SUBMODULE
>     twice each.
>     (set_syms_host_assoc): Make symbols from the ancestor module
>     and submodules use associated, as required by the standard and
>     set all private components public. Module procedures 'external'
>     attribute bit is reset and the 'used_in_submodule' bit is set.
>     (parse_module): If this is a submodule, use the ancestor module
>     and submodules. Traverse the namespace, calling
>     'set_syms_host_assoc'. Add ST_END_SUBMODULE and COMP_SUBMODULE.
>     * parse.h : Add COMP_SUBMODULE.
>     * primary.c (match_variable): Add COMP_SUBMODULE.
>     * resolve.c (compare_fsyms): New function to compare the dummy
>     characteristics of a module procedure with its interface.
>     (resolve_fl_procedure): Compare the procedure, result and dummy
>     characteristics of a module_procedure with its interface, using
>     'compare_fsyms' for the dummy arguments.
>     * symbol.c (gfc_add_procedure): Suppress the check for existing
>     procedures in the case of a module procedure.
>     (gfc_add_explicit_interface): Skip checks that must fail for
>     module procedures.
>     (gfc_add_type): Allow a new type to be added to module
>     procedures, their results or their dummy arguments.
>     * trans-decl.c (gfc_sym_mangled_function_id): Module procedures
>     must always have their names mangled as if they are symbols
>     coming from a declaration in a module.
>     (gfc_finish_var_decl): Symbols with the 'used_in_submodule' bit
>     set are set DECL_EXTERNAL as if they were use associated.
> 
> 2015-06-25  Paul Thomas  <pault@gcc.gnu.org>
> 
>     PR fortran/52846
>     * gfortran.dg/submodule_1.f90: New test
>     * gfortran.dg/submodule_2.f90: New test
>     * gfortran.dg/submodule_3.f90: New test
>     * gfortran.dg/submodule_4.f90: New test
>     * gfortran.dg/submodule_5.f90: New test
> 
> On 22 June 2015 at 14:39, Paul Richard Thomas
> <paul.richard.thomas@gmail.com> wrote:
> > Dear All,
> >
> > This patch enables submodule support in gfortran. Submodules are a
> > feature of F2008 but are fully described in ISO/IEC TR 19767:2004(E).
> >
> > The patch has one significant non-conformance (that I know about,
> > anyway!); whilst private derived type components are correctly dealt
> > with, symbols whose access is private within the parent module are
> > not. They should effectively be host associated in descendant
> > submodules. At present gfortran handles private access at the module
> > write stage. This means that when a submodule reads the module file,
> > there is no information present about symbols whose access was
> > private. Since this modification might cause significant fall-out to
> > existing code, I propose to submit a separate patch later on to sort
> > out the non-conformance. However, as required private and public
> > statements are not allowed in submodules.
> >
> > The patch makes maximum possible leverage of existing code to handle
> > modules. Once the submodule is matched, the ancestor module and
> > submodules are first "used" and then all the symbols are set host
> > associated and private derived type components set public.
> >
> > Most of the work involved matching module procedures, with both the
> > traditional form of declaration and the abbreviated one. I have chosen
> > to treat MODULE as a prefix like PURE or ELEMENTAL. This is logical
> > both because of the form of the declaration and because the
> > identification of module procedures is most easily done with an
> > attribute bit. With traditional procedure declarations, the procedure,
> > result and dummy characteristics are compared with those of the
> > interface declaration. The comparison of the dummy characteristics is
> > a bit cobbled together and might be better done by copying the
> > formal_namespace and it's contents to the new symbol and retaining the
> > old for the interface symbol. This patch leaves the old dummy symbols
> > in the formal namespace in the new ones in the formal arglist. I have
> > checked that cleanup occurs for all objects.
> >
> > Note the comment in submodule_1.f90 about the possibility of
> > undetected recursion between procedures in different submodules. I am
> > not at all sure that I know how to deal with this and am open to
> > suggestions.
> >
> > In addition, it should be noted that collisions between the names of
> > entities and procedures, other than module procedures are detected by
> > the linker at present.
> >
> > Apart from this, all is very straightforward and follows the the ChangeLogs.
> >
> > Thanks for testing of an early version of the patch by Damian Rouson,
> > Salvatore Filippone and Tobias Burnus.
> >
> > Bootstrapped and regtested on FC21/x86_64 - OK for trunk?
> >
> > Cheers
> >
> > Paul
> >
> > 2015-06-22  Paul Thomas  <pault@gcc.gnu.org>
> >
> >     PR fortran/52846
> >     * decl.c (get_proc_name): Make a partially populated interface
> >     symbol to carry the characteristics of a module procedure and
> >     its result.
> >     (match_attr_spec): Submodule variables have implicit save
> >     attribute for F2008 onwards.
> >     (gfc_match_prefix): Add 'module' as the a prefix and set the
> >     module_procedure attribute.
> >     (gfc_match_formal_arglist): For a module procedure keep the
> >     interface formal_arglist from the interface, match new the
> >     formal arguments and then compare the number and names of each.
> >     (gfc_match_procedure): Add case COMP_SUBMODULE.
> >     (gfc_match_function_decl, gfc_match_subroutine_decl): Set the
> >     module_procedure attribute.
> >     (gfc_match_entry, gfc_match_end):  Add case COMP_SUBMODULE.
> >     (gfc_match_submod_proc): New function to match the abbreviated
> >     style of submodule declaration.
> >     * gfortran.h : Add ST_SUBMODULE and ST_END_SUBMODULE. Add the
> >     attribute bits 'used_in_submodule' and 'module_procedure'. Add
> >     prototypes for the functions 'gfc_check_dummy_characteristics'
> >     and 'gfc_check_result_characteristics'.
> >     * interface.c : Add the prefix 'gfc_' to the names of functions
> >     'check_dummy(result)_characteristics' and all their references.
> >     * match.h : Add prototype for 'gfc_match_submod_proc' and
> >     'gfc_match_submodule'.
> >     * module.c (gfc_match_submodule): New function. Add handling
> >     for the 'module_procedure' attribute bit.
> >     * parse.c (decode_statement): Handle a match occurring in
> >     'gfc_match_submod_proc' and a match for 'submodule'.
> >     (gfc_enclosing_unit): Include the state COMP_SUBMODULE.
> >     (gfc_ascii_statement): Add END SUBMODULE.
> >     (accept_statement): Add ST_SUBMODULE.
> >     (parse_spec): Disallow statement functions in a submodule
> >     specification part.
> >     (parse_contained): Add ST_END_SUBMODULE and COMP_SUBMODULE
> >     twice each.
> >     (set_syms_host_assoc): Make symbols from the ancestor module
> >     and submodules use associated, as required by the standard and
> >     set all private components public. Module procedures 'external'
> >     attribute bit is reset and the 'used_in_submodule' bit is set.
> >     (parse_module): If this is a submodule, use the ancestor module
> >     and submodules. Traverse the namespace, calling
> >     'set_syms_host_assoc'. Add ST_END_SUBMODULE and
> COMP_SUBMODULE.
> >     * parse.h : Add COMP_SUBMODULE.
> >     * primary.c (match_variable): Add COMP_SUBMODULE.
> >     * resolve.c (compare_fsyms): New function to compare the dummy
> >     characteristics of a module procedure with its interface.
> >     (resolve_fl_procedure): Compare the procedure, result and dummy
> >     characteristics of a module_procedure with its interface, using
> >     'compare_fsyms' for the dummy arguments.
> >     * symbol.c (gfc_add_procedure): Suppress the check for existing
> >     procedures in the case of a module procedure.
> >     (gfc_add_explicit_interface): Skip checks that must fail for
> >     module procedures.
> >     (gfc_add_type): Allow a new type to be added to module
> >     procedures, their results or their dummy arguments.
> >     * trans-decl.c (gfc_sym_mangled_function_id): Module procedures
> >     must always have their names mangled as if they are symbols
> >     coming from a declaration in a module.
> >     (gfc_finish_var_decl): Symbols with the 'used_in_submodule' bit
> >     set are set DECL_EXTERNAL as if they were use associated.
> >
> > 2015-06-22  Paul Thomas  <pault@gcc.gnu.org>
> >
> >     PR fortran/52846
> >     * gfortran.dg/submodule_1.f90: New test
> >     * gfortran.dg/submodule_2.f90: New test
> >     * gfortran.dg/submodule_3.f90: New test
> >     * gfortran.dg/submodule_4.f90: New test
> >     * gfortran.dg/submodule_5.f90: New test
> 
> 
> 
> --
> Outside of a dog, a book is a man's best friend. Inside of a dog it's
> too dark to read.
> 
> Groucho Marx

[-- Attachment #2: subm_04_pos.f90 --]
[-- Type: application/octet-stream, Size: 2004 bytes --]

module mod_a
  implicit none
  type, abstract :: t_a
  end type t_a
  interface
     module subroutine p_a(this, q)
       ! t_a is accessible - no IMPORT needed
       class(t_a), intent(inout) :: this
       class(*), intent(in) :: q
     end subroutine
     module function create_a() result(r)
       class(t_a), allocatable :: r
     end function
     module subroutine print(this)
       class(t_a), intent(in) :: this
     end subroutine
  end interface
  
end module mod_a

module mod_b
  implicit none
  type t_b
     integer, allocatable :: I(:)
  end type t_b
  interface 
     module function create_b(i) result(r)
       type(t_b) :: r
       integer :: i(:)
      end function
  end interface
end module mod_b

submodule(mod_b) imp_create
contains
  module procedure create_b
    if (allocated(r%i)) deallocate(r%i)  
    allocate(r%i, source=i)
  end procedure
end submodule imp_create

submodule(mod_a) imp_p_a
  use mod_b
  type, extends(t_a) :: t_imp
     type(t_b) :: b
  end type t_imp
  integer, parameter :: ii(2) = [1,2]
contains
  module procedure create_a
    type(t_b) :: b
    b = create_b(ii)
    allocate(r, source=t_imp(b))
  end procedure
  
  module procedure  p_a
    select type (this)
    type is (t_imp)
       select type (q)
       type is (t_b)
          this%b = q
       class default
          write(*,*) 'FAIL (RTTI1)'
          error stop
       end select
    class default
       write(*,*) 'FAIL (RTTI2)'
       error stop
    end select
  end procedure p_a
  module procedure print
    select type (this)
    type is (t_imp)
       if (sum (abs(this%b%i - [3,4,5])) == 0) then
          write(*,*) 'OK'
       else
          write(*,*) 'FAIL:', this%b%i
       end if
    class default
       write(*,*) 'FAIL (RTTI3)'
    end select
  end procedure
end submodule imp_p_a

program p
  use mod_a
  use mod_b
  implicit none
  class(t_a), allocatable :: a

  allocate(a, source=create_a())
  call p_a(a, create_b([3,4,5]))
  call print(a)
  
end program p



  reply	other threads:[~2015-06-25 21:21 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-06-22 12:41 Paul Richard Thomas
2015-06-25 15:29 ` Paul Richard Thomas
2015-06-25 21:23   ` Bader, Reinhold [this message]
2015-06-25 22:57     ` Paul Richard Thomas
2015-06-30 12:36   ` Paul Richard Thomas
2015-06-30 13:59     ` FX
2015-07-02 20:45       ` Paul Richard Thomas

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=d0e5c8c06ffc4822b0e70978f8996120@BADWLRZ-SW13MB6.ads.mwn.de \
    --to=reinhold.bader@lrz.de \
    --cc=burnus@net-b.de \
    --cc=damian@sourceryinstitute.org \
    --cc=fortran@gcc.gnu.org \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=paul.richard.thomas@gmail.com \
    --cc=salvatore.filippone@uniroma2.it \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).