From f3c276aec26d9e406cc4bbf0e18b1105df63f0ee Mon Sep 17 00:00:00 2001 From: Andrew Benson Date: Mon, 2 Mar 2020 17:28:35 +0000 Subject: [PATCH] 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. --- gcc/fortran/ChangeLog | 8 +++++++ gcc/fortran/module.c | 8 +++++-- gcc/testsuite/gfortran.dg/pr93486.f90 | 30 +++++++++++++++++++++++++++ 3 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/pr93486.f90 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 + + 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 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 -- 2.30.2