Commit d00be3a3 by Steven G. Kargl Committed by Mikael Morin

re PR fortran/55827 (ICE with multiple fortran modules and character lenght…

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

2013-01-05  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-05  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: r194928
parent 9e04287b
2013-01-05 Steven G. Kargl <kargl@gcc.gnu.org>
Mikael Morin <mikael@gcc.gnu.org>
* 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 <burnus@net-b.de>
* class.c (finalize_component): Used passed offset expr.
......
......@@ -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)
{
......
......@@ -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);
}
......
2013-01-05 Steven G. Kargl <kargl@gcc.gnu.org>
Mikael Morin <mikael@gcc.gnu.org>
* gfortran.dg/use_22.f90: New test.
2013-01-04 Andrew Pinski <apinski@cavium.com>
* gcc.target/aarch64/cmp-1.c: New testcase.
......
! { 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment