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
next prev parent 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).