From db8b0634cd4752a6360300decf0d40b4e31d23a2 Mon Sep 17 00:00:00 2001 From: "Steven G. Kargl" Date: Mon, 7 Jan 2013 18:10:46 +0000 Subject: [PATCH] re PR fortran/55827 (ICE with multiple fortran modules and character lenght determined by an interfaced pure function) 2013-01-07 Steven G. Kargl Mikael Morin PR fortran/55827 * trans-expr.c (gfc_conv_function_expr): Init sym earlier. Use it. 2013-01-07 Steven G. Kargl Mikael Morin PR fortran/55827 * gfortran.dg/use_22.f90: New test. Co-Authored-By: Mikael Morin From-SVN: r194987 --- gcc/fortran/ChangeLog | 8 +++++++ gcc/fortran/trans-expr.c | 14 +++++------ gcc/testsuite/ChangeLog | 6 +++++ gcc/testsuite/gfortran.dg/use_22.f90 | 35 ++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/use_22.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 13bec3d30266..458ae97ca1f3 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2013-01-07 Steven G. Kargl + Mikael Morin + + 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 PR fortran/55314 diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index d86de0058bb7..3b7ea79b9d49 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -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); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 849d43206092..9354a6de3da8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2013-01-07 Steven G. Kargl + Mikael Morin + + PR fortran/55827 + * gfortran.dg/use_22.f90: New test. + 2012-12-21 Martin Jambor 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 index 000000000000..d61df6713228 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/use_22.f90 @@ -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 + +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 + + -- 2.47.2