diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2008-11-03 06:44:47 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2008-11-03 06:44:47 +0000 |
commit | 67cec813c625940ddf829c57f4bfd1c14fd7e563 (patch) | |
tree | 38c4f22cc0df72560dabf9a32280ae9e19eced9d /gcc/fortran/resolve.c | |
parent | 15426fdc53ed6924184279368b106798677ca407 (diff) | |
download | gcc-67cec813c625940ddf829c57f4bfd1c14fd7e563.zip gcc-67cec813c625940ddf829c57f4bfd1c14fd7e563.tar.gz gcc-67cec813c625940ddf829c57f4bfd1c14fd7e563.tar.bz2 |
re PR fortran/37445 (Host-associated proc not found if same-name generic is use-associated)
2008-11-03 Paul Thomas <pault@gcc.gnu.org>
PR fortran/37445
* resolve.c (resolve_actual_arglist ): Correct comparison of
FL_VARIABLE with e->expr_type.
(resolve_call): Check that host association is correct.
(resolve_actual_arglist ): Remove return is old_sym is use
associated. Only reparse expression if old and new symbols
have different types.
PR fortran/PR35769
* resolve.c (gfc_resolve_assign_in_forall): Change error to a
warning.
2008-11-03 Paul Thomas <pault@gcc.gnu.org>
PR fortran/37445
* gfortran.dg/host_assoc_call_3.f90: New test.
* gfortran.dg/host_assoc_call_4.f90: New test.
* gfortran.dg/host_assoc_function_4.f90: New test.
From-SVN: r141543
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r-- | gcc/fortran/resolve.c | 34 |
1 files changed, 24 insertions, 10 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index bf21416..4774b0b 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -1105,7 +1105,7 @@ resolve_actual_arglist (gfc_actual_arglist *arg, procedure_type ptype, continue; } - if (e->expr_type == FL_VARIABLE + if (e->expr_type == EXPR_VARIABLE && e->symtree->n.sym->attr.generic && no_formal_args && count_specific_procs (e) != 1) @@ -2857,7 +2857,7 @@ resolve_call (gfc_code *c) { gfc_try t; procedure_type ptype = PROC_INTRINSIC; - gfc_symbol *csym; + gfc_symbol *csym, *sym; bool no_formal_args; csym = c->symtree ? c->symtree->n.sym : NULL; @@ -2869,6 +2869,20 @@ resolve_call (gfc_code *c) return FAILURE; } + if (csym && gfc_current_ns->parent && csym->ns != gfc_current_ns) + { + gfc_find_symbol (csym->name, gfc_current_ns, 1, &sym); + if (sym && csym != sym + && sym->ns == gfc_current_ns + && sym->attr.flavor == FL_PROCEDURE + && sym->attr.contained) + { + sym->refs++; + csym = sym; + c->symtree->n.sym = sym; + } + } + /* If external, check for usage. */ if (csym && is_external_proc (csym)) resolve_global_procedure (csym, &c->loc, 1); @@ -4248,14 +4262,12 @@ check_host_association (gfc_expr *e) old_sym = e->symtree->n.sym; - if (old_sym->attr.use_assoc) - return retval; - if (gfc_current_ns->parent && old_sym->ns != gfc_current_ns) { gfc_find_symbol (old_sym->name, gfc_current_ns, 1, &sym); if (sym && old_sym != sym + && sym->ts.type == old_sym->ts.type && sym->attr.flavor == FL_PROCEDURE && sym->attr.contained) { @@ -6117,12 +6129,14 @@ gfc_resolve_assign_in_forall (gfc_code *code, int nvar, gfc_expr **var_expr) else { /* If one of the FORALL index variables doesn't appear in the - assignment target, then there will be a many-to-one - assignment. */ + assignment variable, then there could be a many-to-one + assignment. Emit a warning rather than an error because the + mask could be resolving this problem. */ if (find_forall_index (code->expr, forall_index, 0) == FAILURE) - gfc_error ("The FORALL with index '%s' cause more than one " - "assignment to this object at %L", - var_expr[n]->symtree->name, &code->expr->where); + gfc_warning ("The FORALL with index '%s' is not used on the " + "left side of the assignment at %L and so might " + "cause multiple assignment to this object", + var_expr[n]->symtree->name, &code->expr->where); } } } |