]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/55827 (ICE with multiple fortran modules and character lenght determine...
authorSteven G. Kargl <kargl@gcc.gnu.org>
Mon, 7 Jan 2013 18:10:46 +0000 (18:10 +0000)
committerMikael Morin <mikael@gcc.gnu.org>
Mon, 7 Jan 2013 18:10:46 +0000 (18:10 +0000)
2013-01-07  Steven G. Kargl  <kargl@gcc.gnu.org>
    Mikael Morin  <mikael@gcc.gnu.org>

PR fortran/55827
* trans-expr.c (gfc_conv_function_expr): Init sym earlier. Use it.

2013-01-07  Steven G. Kargl  <kargl@gcc.gnu.org>
    Mikael Morin  <mikael@gcc.gnu.org>

PR fortran/55827
* gfortran.dg/use_22.f90: New test.

Co-Authored-By: Mikael Morin <mikael@gcc.gnu.org>
From-SVN: r194987

gcc/fortran/ChangeLog
gcc/fortran/trans-expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/use_22.f90 [new file with mode: 0644]

index 13bec3d30266204b6d1b9c1c9f501689c4529e04..458ae97ca1f37f3d6e352e8501e60c6bcba7a538 100644 (file)
@@ -1,3 +1,11 @@
+2013-01-07  Steven G. Kargl  <kargl@gcc.gnu.org>
+           Mikael Morin  <mikael@gcc.gnu.org>
+
+       PR fortran/55827
+       * class.c (gfc_fix_class_refs): Adapt ts initialization for the case
+       e->symtree == NULL.
+       * trans-expr.c (gfc_conv_function_expr): Init sym earlier. Use it.
+
 2012-11-24  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/55314
index d86de0058bb73813588683f0d9371f0f1a501d9d..3b7ea79b9d494e10a70813605d9cd4d85fe2be9e 100644 (file)
@@ -4066,20 +4066,20 @@ gfc_conv_function_expr (gfc_se * se, gfc_expr * expr)
       return;
     }
 
+  /* expr.value.function.esym is the resolved (specific) function symbol for
+     most functions.  However this isn't set for dummy procedures.  */
+  sym = expr->value.function.esym;
+  if (!sym)
+    sym = expr->symtree->n.sym;
+
   /* We distinguish statement functions from general functions to improve
      runtime performance.  */
-  if (expr->symtree->n.sym->attr.proc == PROC_ST_FUNCTION)
+  if (sym->attr.proc == PROC_ST_FUNCTION)
     {
       gfc_conv_statement_function (se, expr);
       return;
     }
 
-  /* expr.value.function.esym is the resolved (specific) function symbol for
-     most functions.  However this isn't set for dummy procedures.  */
-  sym = expr->value.function.esym;
-  if (!sym)
-    sym = expr->symtree->n.sym;
-
   gfc_conv_procedure_call (se, sym, expr->value.function.actual, expr, NULL);
 }
 
index 849d43206092812779d21bbc7541aa04621f0206..9354a6de3da809c594ba6f10594e46a88131dc14 100644 (file)
@@ -1,3 +1,9 @@
+2013-01-07  Steven G. Kargl  <kargl@gcc.gnu.org>
+           Mikael Morin  <mikael@gcc.gnu.org>
+
+       PR fortran/55827
+       * gfortran.dg/use_22.f90: New test.
+
 2012-12-21  Martin Jambor  <mjambor@suse.cz>
 
        PR tree-optimization/55355
diff --git a/gcc/testsuite/gfortran.dg/use_22.f90 b/gcc/testsuite/gfortran.dg/use_22.f90
new file mode 100644 (file)
index 0000000..d61df67
--- /dev/null
@@ -0,0 +1,35 @@
+! { dg-do compile }
+!
+! PR fortran/55827
+! gfortran used to ICE with the call to `tostring' depending on how the
+! `tostring' symbol was USE-associated.
+!
+! Contributed by Lorenz Hüdepohl <bugs@stellardeath.org>
+
+module stringutils
+  interface
+    pure function strlen(handle) result(len)
+      integer, intent(in) :: handle
+      integer :: len
+    end function
+  end interface
+end module
+module intermediate ! does not die if this module is merged with stringutils
+  contains
+  function tostring(handle) result(string)
+    use stringutils
+    integer, intent(in) :: handle
+    character(len=strlen(handle)) :: string
+  end function
+end module
+module usage
+  contains
+  subroutine dies_here(handle)
+    use stringutils ! does not die if this unnecessary line is omitted or placed after "use intermediate"
+    use intermediate
+    integer :: handle
+    write(*,*) tostring(handle) ! ICE
+  end subroutine
+end module
+
+