From: mikael Date: Sat, 5 Jan 2013 13:20:08 +0000 (+0000) Subject: 2013-01-05 Steven G. Kargl X-Git-Tag: upstream/4.9.2~8276 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=698334060ab0b5a5ce8f018bc987e1ed11d84d79;p=platform%2Fupstream%2Flinaro-gcc.git 2013-01-05 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. 2013-01-05 Steven G. Kargl Mikael Morin PR fortran/55827 * gfortran.dg/use_22.f90: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@194928 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index bab3db4..78ecf9a 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2013-01-05 Steven G. Kargl + Mikael Morin + + * 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. + 2013-01-05 Tobias Burnus * class.c (finalize_component): Used passed offset expr. diff --git a/gcc/fortran/class.c b/gcc/fortran/class.c index 1b1e85d..0d34e78 100644 --- a/gcc/fortran/class.c +++ b/gcc/fortran/class.c @@ -165,7 +165,23 @@ gfc_fix_class_refs (gfc_expr *e) && e->value.function.isym != NULL)) return; - ts = &e->symtree->n.sym->ts; + if (e->expr_type == EXPR_VARIABLE) + ts = &e->symtree->n.sym->ts; + else + { + gfc_symbol *func; + + gcc_assert (e->expr_type == EXPR_FUNCTION); + if (e->value.function.esym != NULL) + func = e->value.function.esym; + else + func = e->symtree->n.sym; + + if (func->result != NULL) + ts = &func->result->ts; + else + ts = &func->ts; + } for (ref = &e->ref; *ref != NULL; ref = &(*ref)->next) { diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 0abb52d..01d3595 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -5525,20 +5525,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 388d1ce..e730140 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-01-05 Steven G. Kargl + Mikael Morin + + * gfortran.dg/use_22.f90: New test. + 2013-01-04 Andrew Pinski * gcc.target/aarch64/cmp-1.c: New testcase. diff --git a/gcc/testsuite/gfortran.dg/use_22.f90 b/gcc/testsuite/gfortran.dg/use_22.f90 new file mode 100644 index 0000000..d61df67 --- /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 + +