re PR fortran/55827 (ICE with multiple fortran modules and character lenght determined by an interfaced pure function)

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.

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: r194985
This commit is contained in:
Steven G. Kargl 2013-01-07 17:56:53 +00:00 committed by Mikael Morin
parent 1e0ae1eaf5
commit 1e7aecb585
5 changed files with 74 additions and 9 deletions

View 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-12-20 Tobias Burnus <burnus@net-b.de>
PR fortran/54818

View File

@ -162,7 +162,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)
{

View File

@ -4799,20 +4799,20 @@ gfc_conv_function_expr (gfc_se * se, gfc_expr * expr)
return;
}
/* We distinguish statement functions from general functions to improve
runtime performance. */
if (expr->symtree->n.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;
/* We distinguish statement functions from general functions to improve
runtime performance. */
if (sym->attr.proc == PROC_ST_FUNCTION)
{
gfc_conv_statement_function (se, expr);
return;
}
gfc_conv_procedure_call (se, sym, expr->value.function.actual, expr, NULL);
}

View 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.
2013-01-07 Terry Guo <terry.guo@arm.com>
Backport from mainline

View File

@ -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