I opened PR93486 for this problem: The following causes an ICE with revision ad690d79cfbb905c5546c9333c5fd089d906505b:
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 $ gfortran -v Using built-in specs. COLLECT_GCC=gfortran COLLECT_LTO_WRAPPER=/data001/abenson/Galacticus/Tools_Devel_Install/bin/../ libexec/gcc/x86_64-pc-linux-gnu/10.0.1/lto-wrapper Target: x86_64-pc-linux-gnu Configured with: ../gcc-git/configure --prefix=/home/abenson/Galacticus/ Tools_Devel --enable-languages=c,c++,fortran --disable-multilib Thread model: posix Supported LTO compression algorithms: zlib gcc version 10.0.1 20200128 (experimental) (GCC) $ gfortran -c test.F90 -o test.o f951: internal compiler error: Segmentation fault 0xe1bc9f crash_signal ../../gcc-git/gcc/toplev.c:328 0x7f98119c71ef ??? /data001/abenson/Galacticus/Tools/glibc-2.12.1/signal/../sysdeps/unix/ sysv/linux/x86_64/sigaction.c:0 0x84b3f0 gfc_use_modules() ../../gcc-git/gcc/fortran/module.c:7315 0x85acc8 use_modules ../../gcc-git/gcc/fortran/parse.c:114 0x866daa parse_module ../../gcc-git/gcc/fortran/parse.c:6111 0x86733c gfc_parse_file() ../../gcc-git/gcc/fortran/parse.c:6428 0x8b780f gfc_be_parse_file ../../gcc-git/gcc/fortran/f95-lang.c:210 Please submit a full bug report, with preprocessed source if appropriate. Please include the complete backtrace with any bug report. See <https://gcc.gnu.org/bugs/> for instructions. The ICE goes away if the module and/or submodule names are made shorter. The problem is caused when loading (generic or operator) interfaces from a module file. The module name can include the submodule name, so a size of 2*GFC_MAX_SYMBOL_LEN+2 is required to read this in. The attached patch fixes this problem and regression tests cleanly *if* the patch for PR87103 is applied (otherwise that problem gets triggered by the new test case). PR87103 has been a long-standing issue - there's a patch that works (either my original ugly fix, or the better fix proposed by Bernhard at https:// gcc.gnu.org/ml/fortran/2018-09/msg00044.html ). It would be very nice to get one of these patches committed. -Andrew -- * Andrew Benson: http://users.obs.carnegiescience.edu/abenson/contact.html * Galacticus: https://github.com/galacticusorg/galacticus
diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c index 4487f65..b6a4e87 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 0000000..5037d40 --- /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
2020-01-28 Andrew Benson <abenso...@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.