]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: fix ICE in gfc_create_module_variable [PR100273]
authorHarald Anlauf <anlauf@gmx.de>
Thu, 5 Sep 2024 19:30:25 +0000 (21:30 +0200)
committerHarald Anlauf <anlauf@gmx.de>
Fri, 20 Sep 2024 19:29:21 +0000 (21:29 +0200)
gcc/fortran/ChangeLog:

PR fortran/100273
* trans-decl.cc (gfc_create_module_variable): Handle module
variable also when it is needed for the result specification
of a contained function.

gcc/testsuite/ChangeLog:

PR fortran/100273
* gfortran.dg/pr100273.f90: New test.

(cherry picked from commit 1f462b5072a5e82c35921f7e3bdf3959c4a49dc9)

gcc/fortran/trans-decl.cc
gcc/testsuite/gfortran.dg/pr100273.f90 [new file with mode: 0644]

index 0e91553108f25b3276c86b1fb139a7e88e1ac639..884978ad981d9f26460207cead0b4a22548780a8 100644 (file)
@@ -5251,7 +5251,8 @@ gfc_create_module_variable (gfc_symbol * sym)
   /* Create the variable.  */
   pushdecl (decl);
   gcc_assert (sym->ns->proc_name->attr.flavor == FL_MODULE
-             || (sym->ns->parent->proc_name->attr.flavor == FL_MODULE
+             || ((sym->ns->parent->proc_name->attr.flavor == FL_MODULE
+                  || sym->ns->parent->proc_name->attr.flavor == FL_PROCEDURE)
                  && sym->fn_result_spec));
   DECL_CONTEXT (decl) = sym->ns->proc_name->backend_decl;
   rest_of_decl_compilation (decl, 1, 0);
diff --git a/gcc/testsuite/gfortran.dg/pr100273.f90 b/gcc/testsuite/gfortran.dg/pr100273.f90
new file mode 100644 (file)
index 0000000..f71947a
--- /dev/null
@@ -0,0 +1,26 @@
+! { dg-do compile }
+! PR fortran/100273 - ICE in gfc_create_module_variable
+!
+! Contributed by G.Steinmetz
+
+module m
+  implicit none
+contains
+  character(4) function g(k)
+    integer :: k
+    g = f(k)
+  contains
+    function f(n)
+      character(3), parameter :: a(2) = ['1  ', '123']
+      integer :: n
+      character(len_trim(a(n))) :: f
+      f = 'abc'
+    end
+  end
+end
+program p
+  use m 
+  implicit none
+  print *, '>>' // g(1) // '<<'
+  print *, '>>' // g(2) // '<<'
+end