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] |
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:
subm_04_pos.f90
Description: subm_04_pos.f90
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |