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.  */

Reply via email to