Ensure sufficient size of variables used for module+submodule names.
authorAndrew Benson <abenson@carnegiescience.edu>
Mon, 2 Mar 2020 17:28:35 +0000 (17:28 +0000)
committerAndrew Benson <abenson@carnegiescience.edu>
Mon, 2 Mar 2020 17:28:35 +0000 (17:28 +0000)
        PR fortran/93486
        * module.c: Increase size of variables used to read module names
        when loading interfaces from module files to permit cases where
        the name is the concatenation of a module and submodule name.
        * gfortran.dg/pr93486.f90: New test.

gcc/fortran/ChangeLog
gcc/fortran/module.c
gcc/testsuite/gfortran.dg/pr93486.f90 [new file with mode: 0644]

index 1256b95ae75c0055874cd3085c79fdb569f93920..e3957fbac4dcccf96cdb88112cc1bc3e04d5c0cc 100644 (file)
@@ -1,3 +1,11 @@
+2020-03-02  Andrew Benson  <abensonca@gmail.com>
+
+       PR fortran/93486
+       * module.c: Increase size of variables used to read module names
+       when loading interfaces from module files to permit cases where
+       the name is the concatenation of a module and submodule name.
+       * gfortran.dg/pr93486.f90: New test.
+
 2020-03-01  Paul Thomas  <pault@gcc.gnu.org>
 
        PR fortran/92976
index 4487f65eafd252a7111a864ba59ea615a500bcd4..b6a4e87cb1abe40bd3988ed8c6e99b0e6e7235e6 100644 (file)
@@ -4568,7 +4568,9 @@ static void
 load_operator_interfaces (void)
 {
   const char *p;
-  char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
+  /* "module" must be large enough for the case of submodules in which the name
+     has the form module.submodule */
+  char name[GFC_MAX_SYMBOL_LEN + 1], module[2 * GFC_MAX_SYMBOL_LEN + 2];
   gfc_user_op *uop;
   pointer_info *pi = NULL;
   int n, i;
@@ -4624,7 +4626,9 @@ static void
 load_generic_interfaces (void)
 {
   const char *p;
-  char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
+  /* "module" must be large enough for the case of submodules in which the name
+     has the form module.submodule */
+  char name[GFC_MAX_SYMBOL_LEN + 1], module[2 * GFC_MAX_SYMBOL_LEN + 2];
   gfc_symbol *sym;
   gfc_interface *generic = NULL, *gen = NULL;
   int n, i, renamed;
diff --git a/gcc/testsuite/gfortran.dg/pr93486.f90 b/gcc/testsuite/gfortran.dg/pr93486.f90
new file mode 100644 (file)
index 0000000..5037d40
--- /dev/null
@@ -0,0 +1,30 @@
+! { dg-do compile }
+! PR fortran/93486
+module ivs
+  interface l
+     module procedure l_
+  end interface l
+contains
+  function l_()
+  end function l_
+end module ivs
+
+module aModeratleyLongModuleName
+  use ivs
+  interface
+     module subroutine cmo()
+     end subroutine cmo
+  end interface
+end module aModeratleyLongModuleName
+
+submodule (aModeratleyLongModuleName) aNameForASubmoduleThatIsVeryLongButWhichIsLegalStill
+contains
+  module procedure cmo
+  end procedure cmo
+end submodule aNameForASubmoduleThatIsVeryLongButWhichIsLegalStill
+
+submodule (aModeratleyLongModuleName:aNameForASubmoduleThatIsVeryLongButWhichIsLegalStill) sb
+end submodule sb
+
+submodule (aModeratleyLongModuleName:sb) sc
+end submodule sc