Commit 6f6e26a8 by Janus Weil

re PR fortran/36426 (Endless loop in gfc_apply_interface_mapping_to_expr)

2008-11-01  Janus Weil  <janus@gcc.gnu.org>

	PR fortran/36426
	* expr.c (replace_symbol): Replace all symbols which lie in the
	formal namespace of the interface and copy their attributes.
	* resolve.c (resolve_symbol): Add charlen to namespace.


2008-11-01  Janus Weil  <janus@gcc.gnu.org>

	PR fortran/36426
	* gfortran.dg/proc_decl_19.f90: New.

From-SVN: r141522
parent f18e0ca6
2008-11-01 Janus Weil <janus@gcc.gnu.org>
PR fortran/36426
* expr.c (replace_symbol): Replace all symbols which lie in the
formal namespace of the interface and copy their attributes.
* resolve.c (resolve_symbol): Add charlen to namespace.
2008-11-01 Steven G. Kargl <kargls@comcast.net> 2008-11-01 Steven G. Kargl <kargls@comcast.net>
PR fortran/19925 PR fortran/19925
......
...@@ -3511,12 +3511,11 @@ static bool ...@@ -3511,12 +3511,11 @@ static bool
replace_symbol (gfc_expr *expr, gfc_symbol *sym, int *i ATTRIBUTE_UNUSED) replace_symbol (gfc_expr *expr, gfc_symbol *sym, int *i ATTRIBUTE_UNUSED)
{ {
if ((expr->expr_type == EXPR_VARIABLE || expr->expr_type == EXPR_FUNCTION) if ((expr->expr_type == EXPR_VARIABLE || expr->expr_type == EXPR_FUNCTION)
&& expr->symtree->n.sym->ns != sym->formal_ns && expr->symtree->n.sym->ns == sym->ts.interface->formal_ns)
&& expr->symtree->n.sym->attr.dummy)
{ {
gfc_symtree *stree; gfc_symtree *stree;
gfc_get_sym_tree (expr->symtree->name, sym->formal_ns, &stree); gfc_get_sym_tree (expr->symtree->name, sym->formal_ns, &stree);
stree->n.sym->attr.referenced = expr->symtree->n.sym->attr.referenced; stree->n.sym->attr = expr->symtree->n.sym->attr;
expr->symtree = stree; expr->symtree = stree;
} }
return false; return false;
......
...@@ -8939,6 +8939,12 @@ resolve_symbol (gfc_symbol *sym) ...@@ -8939,6 +8939,12 @@ resolve_symbol (gfc_symbol *sym)
sym->ts.cl->resolved = ifc->ts.cl->resolved; sym->ts.cl->resolved = ifc->ts.cl->resolved;
sym->ts.cl->length = gfc_copy_expr (ifc->ts.cl->length); sym->ts.cl->length = gfc_copy_expr (ifc->ts.cl->length);
gfc_expr_replace_symbols (sym->ts.cl->length, sym); gfc_expr_replace_symbols (sym->ts.cl->length, sym);
/* Add charlen to namespace. */
if (sym->formal_ns)
{
sym->ts.cl->next = sym->formal_ns->cl_list;
sym->formal_ns->cl_list = sym->ts.cl;
}
} }
} }
else if (sym->ts.interface->name[0] != '\0') else if (sym->ts.interface->name[0] != '\0')
......
2008-11-01 Janus Weil <janus@gcc.gnu.org>
PR fortran/36426
* gfortran.dg/proc_decl_19.f90: New.
2008-11-01 Steven G. Kargl <kargls@comcast.net> 2008-11-01 Steven G. Kargl <kargls@comcast.net>
PR fortran/19925 PR fortran/19925
......
! { dg-do compile }
!
! PR 36426
!
! Contributed by Tobias Burnus <burnus@gcc.gnu.org>
abstract interface
function foo(x)
character(len=*) :: x
character(len=len(x)) :: foo
end function foo
end interface
procedure(foo) :: bar
abstract interface
character function abs_fun()
end function
end interface
procedure(abs_fun):: x
character(len=20) :: str
str = bar("Hello")
end
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