diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2010-04-20 19:07:14 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2010-04-20 19:07:14 +0000 |
commit | 9c4174d8533b2aa1386eb24a8a0debc642773e11 (patch) | |
tree | 16d8a2574a3d092a934b735111986d723b201239 /gcc/fortran | |
parent | e96ccb30f5787417582b6ba5fde14c60aea5e9a3 (diff) | |
download | gcc-9c4174d8533b2aa1386eb24a8a0debc642773e11.zip gcc-9c4174d8533b2aa1386eb24a8a0debc642773e11.tar.gz gcc-9c4174d8533b2aa1386eb24a8a0debc642773e11.tar.bz2 |
re PR fortran/43227 (ICE: segmentation fault in mio_expr)
2010-04-20 Paul Thomas <pault@gcc.gnu.org>
PR fortran/43227
* resolve.c (resolve_fl_derived): If a component character
length has not been resolved, do so now.
(resolve_symbol): The same as above for a symbol character
length.
* trans-decl.c (gfc_create_module_variable): A 'length' decl is
not needed for a character valued, procedure pointer.
PR fortran/43266
* resolve.c (ensure_not_abstract_walker): If 'overriding' is
not found, return FAILURE rather than ICEing.
2010-04-20 Paul Thomas <pault@gcc.gnu.org>
PR fortran/43227
* gfortran.dg/proc_decl_23.f90: New test.
PR fortran/43266
* gfortran.dg/abstract_type_6.f03: New test.
From-SVN: r158570
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 14 | ||||
-rw-r--r-- | gcc/fortran/resolve.c | 15 | ||||
-rw-r--r-- | gcc/fortran/trans-decl.c | 3 |
3 files changed, 28 insertions, 4 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index b9a4ebb..6663603 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,17 @@ +2010-04-20 Paul Thomas <pault@gcc.gnu.org> + + PR fortran/43227 + * resolve.c (resolve_fl_derived): If a component character + length has not been resolved, do so now. + (resolve_symbol): The same as above for a symbol character + length. + * trans-decl.c (gfc_create_module_variable): A 'length' decl is + not needed for a character valued, procedure pointer. + + PR fortran/43266 + * resolve.c (ensure_not_abstract_walker): If 'overriding' is + not found, return FAILURE rather than ICEing. + 2010-04-19 Jakub Jelinek <jakub@redhat.com> PR fortran/43339 diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 2831149..b13edf9 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -10617,7 +10617,9 @@ ensure_not_abstract_walker (gfc_symbol* sub, gfc_symtree* st) { gfc_symtree* overriding; overriding = gfc_find_typebound_proc (sub, NULL, st->name, true, NULL); - gcc_assert (overriding && overriding->n.tb); + if (!overriding) + return FAILURE; + gcc_assert (overriding->n.tb); if (overriding->n.tb->deferred) { gfc_error ("Derived-type '%s' declared at %L must be ABSTRACT because" @@ -10784,8 +10786,12 @@ resolve_fl_derived (gfc_symbol *sym) /* Copy char length. */ if (ifc->ts.type == BT_CHARACTER && ifc->ts.u.cl) { - c->ts.u.cl = gfc_new_charlen (sym->ns, ifc->ts.u.cl); - gfc_expr_replace_comp (c->ts.u.cl->length, c); + gfc_charlen *cl = gfc_new_charlen (sym->ns, ifc->ts.u.cl); + gfc_expr_replace_comp (cl->length, c); + if (cl->length && !cl->resolved + && gfc_resolve_expr (cl->length) == FAILURE) + return FAILURE; + c->ts.u.cl = cl; } } else if (c->ts.interface->name[0] != '\0') @@ -11298,6 +11304,9 @@ resolve_symbol (gfc_symbol *sym) { sym->ts.u.cl = gfc_new_charlen (sym->ns, ifc->ts.u.cl); gfc_expr_replace_symbols (sym->ts.u.cl->length, sym); + if (sym->ts.u.cl->length && !sym->ts.u.cl->resolved + && gfc_resolve_expr (sym->ts.u.cl->length) == FAILURE) + return; } } else if (sym->ts.interface->name[0] != '\0') diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 2545ad2..11a75b4 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -3477,7 +3477,8 @@ gfc_create_module_variable (gfc_symbol * sym) tree length; length = sym->ts.u.cl->backend_decl; - if (!INTEGER_CST_P (length)) + gcc_assert (length || sym->attr.proc_pointer); + if (length && !INTEGER_CST_P (length)) { pushdecl (length); rest_of_decl_compilation (length, 1, 0); |