Dear All, Reinhold Bader has pointed out the naming the submodule files after the submodule name and using .mod as the extension can potentially lead to clashes. Therefore, I have written a patch to change gfortran to follow the naming convention of another leading brand:
submodule filename = module@ancestor@....@submodule.smod The implementation is straightforward and the ChangeLog and the patch provide an adequate description. Bootstraps and regtests on x86_64 - OK for trunk? Paul 2015-07-14 Paul Thomas <pa...@gcc.gnu.org> PR fortran/52846 * gfortran.h : Add 'submodule_name' to gfc_use_list structure. * module.c (gfc_match_submodule): Define submodule_name and add static 'submodule_name'. (gfc_match_submodule): Build up submodule filenames, using '@' as a delimiter. Store the output filename in 'submodule_name'. (gfc_dump_module): If current state is COMP_SUBMODULE, write to file 'submodule_name', using SUBMODULE_EXTENSION. (gfc_use_module): Similarly, use the 'submodule_name' field in the gfc_use_list structure and SUBMODULE_EXTENSION to read the implicitly used submodule files.
Index: gcc/fortran/gfortran.h =================================================================== *** gcc/fortran/gfortran.h (revision 225410) --- gcc/fortran/gfortran.h (working copy) *************** gfc_use_rename; *** 1556,1561 **** --- 1556,1562 ---- typedef struct gfc_use_list { const char *module_name; + const char *submodule_name; bool intrinsic; bool non_intrinsic; bool only_flag; Index: gcc/fortran/module.c =================================================================== *** gcc/fortran/module.c (revision 225410) --- gcc/fortran/module.c (working copy) *************** along with GCC; see the file COPYING3. *** 82,87 **** --- 82,88 ---- #include <zlib.h> #define MODULE_EXTENSION ".mod" + #define SUBMODULE_EXTENSION ".smod" /* Don't put any single quote (') in MOD_VERSION, if you want it to be recognized. */ *************** static gzFile module_fp; *** 191,196 **** --- 192,199 ---- /* The name of the module we're reading (USE'ing) or writing. */ static const char *module_name; + /* The name of the .smod file that the submodule will write to. */ + static const char *submodule_name; static gfc_use_list *module_list; /* If we're reading an intrinsic module, this is its ID. */ *************** cleanup: *** 718,723 **** --- 721,727 ---- /* Match a SUBMODULE statement. */ + match gfc_match_submodule (void) { *************** gfc_match_submodule (void) *** 750,758 **** --- 754,767 ---- while (last->next) last = last->next; last->next = use_list; + use_list->submodule_name + = gfc_get_string ("%s@%s", last->module_name, name); } else + { module_list = use_list; + use_list->submodule_name = gfc_get_string (name); + } if (gfc_match_char (')') == MATCH_YES) break; *************** gfc_match_submodule (void) *** 765,770 **** --- 774,782 ---- if (m != MATCH_YES) goto syntax; + submodule_name = gfc_get_string ("%s@%s", use_list->submodule_name, + gfc_new_block->name); + if (!gfc_add_flavor (&gfc_new_block->attr, FL_MODULE, gfc_new_block->name, NULL)) return MATCH_ERROR; *************** gfc_dump_module (const char *name, int d *** 5933,5939 **** --- 5945,5960 ---- char *filename, *filename_tmp; uLong crc, crc_old; + module_name = gfc_get_string (name); + + if (gfc_state_stack->state == COMP_SUBMODULE) + { + name = submodule_name; + n = strlen (name) + strlen (SUBMODULE_EXTENSION) + 1; + } + else n = strlen (name) + strlen (MODULE_EXTENSION) + 1; + if (gfc_option.module_dir != NULL) { n += strlen (gfc_option.module_dir); *************** gfc_dump_module (const char *name, int d *** 5946,5951 **** --- 5967,5976 ---- filename = (char *) alloca (n); strcpy (filename, name); } + + if (gfc_state_stack->state == COMP_SUBMODULE) + strcat (filename, SUBMODULE_EXTENSION); + else strcat (filename, MODULE_EXTENSION); /* Name of the temporary file used to write the module. */ *************** gfc_dump_module (const char *name, int d *** 5975,5981 **** /* Write the module itself. */ iomode = IO_OUTPUT; - module_name = gfc_get_string (name); init_pi_tree (); --- 6000,6005 ---- *************** gfc_use_module (gfc_use_list *module) *** 6706,6715 **** gfc_warning_now (OPT_Wuse_without_only, "USE statement at %C has no ONLY qualifier"); ! filename = XALLOCAVEC (char, strlen (module_name) + strlen (MODULE_EXTENSION) ! + 1); strcpy (filename, module_name); strcat (filename, MODULE_EXTENSION); /* First, try to find an non-intrinsic module, unless the USE statement specified that the module is intrinsic. */ --- 6730,6751 ---- gfc_warning_now (OPT_Wuse_without_only, "USE statement at %C has no ONLY qualifier"); ! if (gfc_state_stack->state == COMP_MODULE ! || module->submodule_name == NULL ! || strcmp (module_name, module->submodule_name) == 0) ! { ! filename = XALLOCAVEC (char, strlen (module_name) ! + strlen (MODULE_EXTENSION) + 1); strcpy (filename, module_name); strcat (filename, MODULE_EXTENSION); + } + else + { + filename = XALLOCAVEC (char, strlen (module->submodule_name) + + strlen (SUBMODULE_EXTENSION) + 1); + strcpy (filename, module->submodule_name); + strcat (filename, SUBMODULE_EXTENSION); + } /* First, try to find an non-intrinsic module, unless the USE statement specified that the module is intrinsic. */