This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [Patch, fortran] PR52846 - [F2008] Support submodules


Dear Reinhold,

That looks like a very strange bug. I am out of the loop until Sunday
evening and so cannot look at it until then.

Thanks, this really helps

Paul

On 25 June 2015 at 23:21, Bader, Reinhold <Reinhold.Bader@lrz.de> wrote:
> 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



-- 
Outside of a dog, a book is a man's best friend. Inside of a dog it's
too dark to read.

Groucho Marx


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]