diff options
author | Janus Weil <janus@gcc.gnu.org> | 2009-08-27 21:48:46 +0200 |
---|---|---|
committer | Janus Weil <janus@gcc.gnu.org> | 2009-08-27 21:48:46 +0200 |
commit | 889dc035812dfc72033fb61b7b3433dba072e279 (patch) | |
tree | 0b4f4a7e22430637b541964f0f58ea591ed634ea /gcc/fortran/expr.c | |
parent | 0930984ef0f7920353aa5465322e42a17706aa3d (diff) | |
download | gcc-889dc035812dfc72033fb61b7b3433dba072e279.zip gcc-889dc035812dfc72033fb61b7b3433dba072e279.tar.gz gcc-889dc035812dfc72033fb61b7b3433dba072e279.tar.bz2 |
re PR fortran/40869 ([F03] PPC assignment checking)
2009-08-27 Janus Weil <janus@gcc.gnu.org>
PR fortran/40869
* expr.c (gfc_check_pointer_assign): Enable interface check for
pointer assignments involving procedure pointer components.
* gfortran.h (gfc_compare_interfaces): Modified prototype.
* interface.c (gfc_compare_interfaces): Add argument 'name2', to be
used instead of s2->name. Don't rely on the proc_pointer attribute,
but instead on the flags handed to this function.
(check_interface1,compare_parameter): Add argument for
gfc_compare_interfaces.
* resolve.c (check_generic_tbp_ambiguity): Ditto.
2009-08-27 Janus Weil <janus@gcc.gnu.org>
PR fortran/40869
* gfortran.dg/proc_ptr_comp_20.f90: New.
From-SVN: r151147
Diffstat (limited to 'gcc/fortran/expr.c')
-rw-r--r-- | gcc/fortran/expr.c | 39 |
1 files changed, 28 insertions, 11 deletions
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index 57582a9..970c259 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -3149,6 +3149,10 @@ gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue) if (proc_pointer) { char err[200]; + gfc_symbol *s1,*s2; + gfc_component *comp; + const char *name; + attr = gfc_expr_attr (rvalue); if (!((rvalue->expr_type == EXPR_NULL) || (rvalue->expr_type == EXPR_FUNCTION && attr.proc_pointer) @@ -3208,22 +3212,35 @@ gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr *rvalue) } } - /* TODO: Enable interface check for PPCs. */ - if (gfc_is_proc_ptr_comp (rvalue, NULL)) - return SUCCESS; - if ((rvalue->expr_type == EXPR_VARIABLE - && !gfc_compare_interfaces (lvalue->symtree->n.sym, - rvalue->symtree->n.sym, 0, 1, err, - sizeof(err))) - || (rvalue->expr_type == EXPR_FUNCTION - && !gfc_compare_interfaces (lvalue->symtree->n.sym, - rvalue->symtree->n.sym->result, 0, 1, - err, sizeof(err)))) + if (gfc_is_proc_ptr_comp (lvalue, &comp)) + s1 = comp->ts.interface; + else + s1 = lvalue->symtree->n.sym; + + if (gfc_is_proc_ptr_comp (rvalue, &comp)) + { + s2 = comp->ts.interface; + name = comp->name; + } + else if (rvalue->expr_type == EXPR_FUNCTION) + { + s2 = rvalue->symtree->n.sym->result; + name = rvalue->symtree->n.sym->result->name; + } + else + { + s2 = rvalue->symtree->n.sym; + name = rvalue->symtree->n.sym->name; + } + + if (s1 && s2 && !gfc_compare_interfaces (s1, s2, name, 0, 1, + err, sizeof(err))) { gfc_error ("Interface mismatch in procedure pointer assignment " "at %L: %s", &rvalue->where, err); return FAILURE; } + return SUCCESS; } |