aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorJanus Weil <janus@gcc.gnu.org>2009-11-24 09:16:32 +0100
committerJanus Weil <janus@gcc.gnu.org>2009-11-24 09:16:32 +0100
commit6c03662614375d5b608d27a46861229f372f29bf (patch)
tree1822559a7e676edd10dfddc440d395b5f5a3cb49 /gcc/fortran
parentaa62c188762c0d0065fe265d91ec3666c6608428 (diff)
downloadgcc-6c03662614375d5b608d27a46861229f372f29bf.zip
gcc-6c03662614375d5b608d27a46861229f372f29bf.tar.gz
gcc-6c03662614375d5b608d27a46861229f372f29bf.tar.bz2
re PR fortran/42045 ([F03] passing a procedure pointer component to a procedure pointer dummy)
2009-11-24 Janus Weil <janus@gcc.gnu.org> PR fortran/42045 * resolve.c (resolve_actual_arglist): Make sure procedure pointer actual arguments are resolved correctly. (resolve_function): An EXPR_FUNCTION which is a procedure pointer component, has already been resolved. (resolve_fl_derived): Procedure pointer components should not be implicitly typed. 2009-11-24 Janus Weil <janus@gcc.gnu.org> PR fortran/42045 * gfortran.dg/proc_ptr_comp_2.f90: Correct invalid test case. * gfortran.dg/proc_ptr_comp_3.f90: Extended test case. * gfortran.dg/proc_ptr_comp_24.f90: New. From-SVN: r154492
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/ChangeLog10
-rw-r--r--gcc/fortran/resolve.c11
2 files changed, 19 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 64061e7..862fffa 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,13 @@
+2009-11-24 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/42045
+ * resolve.c (resolve_actual_arglist): Make sure procedure pointer
+ actual arguments are resolved correctly.
+ (resolve_function): An EXPR_FUNCTION which is a procedure pointer
+ component, has already been resolved.
+ (resolve_fl_derived): Procedure pointer components should not be
+ implicitly typed.
+
2009-11-21 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/41807
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index bd690a7..740679e 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -1321,6 +1321,8 @@ resolve_actual_arglist (gfc_actual_arglist *arg, procedure_type ptype,
e->rank = comp->as->rank;
e->expr_type = EXPR_FUNCTION;
}
+ if (gfc_resolve_expr (e) == FAILURE)
+ return FAILURE;
goto argument_list;
}
@@ -2519,6 +2521,10 @@ resolve_function (gfc_expr *expr)
if (expr->symtree)
sym = expr->symtree->n.sym;
+ /* If this is a procedure pointer component, it has already been resolved. */
+ if (gfc_is_proc_ptr_comp (expr, NULL))
+ return SUCCESS;
+
if (sym && sym->attr.intrinsic
&& resolve_intrinsic (sym, &expr->where) == FAILURE)
return FAILURE;
@@ -10219,8 +10225,9 @@ resolve_fl_derived (gfc_symbol *sym)
}
else if (c->attr.proc_pointer && c->ts.type == BT_UNKNOWN)
{
- c->ts = *gfc_get_default_type (c->name, NULL);
- c->attr.implicit_type = 1;
+ /* Since PPCs are not implicitly typed, a PPC without an explicit
+ interface must be a subroutine. */
+ gfc_add_subroutine (&c->attr, c->name, &c->loc);
}
/* Procedure pointer components: Check PASS arg. */