diff options
author | Daniel Kraft <d@domob.eu> | 2008-10-05 08:39:37 +0200 |
---|---|---|
committer | Daniel Kraft <domob@gcc.gnu.org> | 2008-10-05 08:39:37 +0200 |
commit | b82657f4a84dd4abb65bbf4179a109f1d8a36e92 (patch) | |
tree | 78ecce3a29fd3893b90181a49404d11b877e45ac /gcc/fortran/resolve.c | |
parent | ee9ef10338020843b9df3c21297bd1c61bbd45b4 (diff) | |
download | gcc-b82657f4a84dd4abb65bbf4179a109f1d8a36e92.zip gcc-b82657f4a84dd4abb65bbf4179a109f1d8a36e92.tar.gz gcc-b82657f4a84dd4abb65bbf4179a109f1d8a36e92.tar.bz2 |
re PR fortran/37638 (ICE in update_arglist_pass)
2008-10-05 Daniel Kraft <d@domob.eu>
PR fortran/37638
* gfortran.h (struct gfc_typebound_proc): New flag `error'.
* resolve.c (update_arglist_pass): Added assertion.
(update_compcall_arglist): Fail early for erraneous procedures to avoid
confusion later.
(resolve_typebound_generic_call): Ignore erraneous specific targets
and added assertions.
(resolve_typebound_procedure): Set new `error' flag.
2008-10-05 Daniel Kraft <d@domob.eu>
PR fortran/37638
* gfortran.dg/typebound_call_9.f03: New test.
From-SVN: r140880
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r-- | gcc/fortran/resolve.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index d682e10..6976e64 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -4366,6 +4366,8 @@ fixup_charlen (gfc_expr *e) static gfc_actual_arglist* update_arglist_pass (gfc_actual_arglist* lst, gfc_expr* po, unsigned argpos) { + gcc_assert (argpos > 0); + if (argpos == 1) { gfc_actual_arglist* result; @@ -4417,6 +4419,9 @@ update_compcall_arglist (gfc_expr* e) tbp = e->value.compcall.tbp; + if (tbp->error) + return FAILURE; + po = extract_compcall_passed_object (e); if (!po) return FAILURE; @@ -4497,6 +4502,10 @@ resolve_typebound_generic_call (gfc_expr* e) bool matches; gcc_assert (g->specific); + + if (g->specific->error) + continue; + target = g->specific->u.specific->n.sym; /* Get the right arglist by handling PASS/NOPASS. */ @@ -4508,6 +4517,8 @@ resolve_typebound_generic_call (gfc_expr* e) if (!po) return FAILURE; + gcc_assert (g->specific->pass_arg_num > 0); + gcc_assert (!g->specific->error); args = update_arglist_pass (args, po, g->specific->pass_arg_num); } resolve_actual_arglist (args, target->attr.proc, @@ -8448,10 +8459,12 @@ resolve_typebound_procedure (gfc_symtree* stree) goto error; } + stree->typebound->error = 0; return; error: resolve_bindings_result = FAILURE; + stree->typebound->error = 1; } static gfc_try |