[gcc(refs/vendors/ibm/heads/perf)] Ensure sufficient size of variables used for module+submodule names.

Jiu Fu Guo guojiufu@gcc.gnu.org
Thu Mar 19 06:02:54 GMT 2020


https://gcc.gnu.org/g:f3c276aec26d9e406cc4bbf0e18b1105df63f0ee

commit f3c276aec26d9e406cc4bbf0e18b1105df63f0ee
Author: Andrew Benson <abenson@carnegiescience.edu>
Date:   Mon Mar 2 17:28:35 2020 +0000

    Ensure sufficient size of variables used for module+submodule names.
    
            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.

Diff:
---
 gcc/fortran/ChangeLog                 |  8 ++++++++
 gcc/fortran/module.c                  |  8 ++++++--
 gcc/testsuite/gfortran.dg/pr93486.f90 | 30 ++++++++++++++++++++++++++++++
 3 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 1256b95ae75..e3957fbac4d 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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
diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c
index 4487f65eafd..b6a4e87cb1a 100644
--- a/gcc/fortran/module.c
+++ b/gcc/fortran/module.c
@@ -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
index 00000000000..5037d4087a1
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr93486.f90
@@ -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


More information about the Gcc-cvs mailing list