From: Paul Thomas Date: Thu, 18 Mar 2010 21:23:35 +0000 (+0000) Subject: re PR fortran/43039 ([lto/-fwhole-file] fortran-dev - ICE in gfc_conv_component_ref... X-Git-Tag: releases/gcc-4.5.0~314 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1821bcfc49276dee748251bdefbb2040dd718954;p=thirdparty%2Fgcc.git re PR fortran/43039 ([lto/-fwhole-file] fortran-dev - ICE in gfc_conv_component_ref dynamic_dispatch_5.f03) 2010-03-18 Paul Thomas PR fortran/43039 * trans-expr.c (conv_parent_component_references): Ensure that 'dt' has a backend_decl. PR fortran/43043 * trans-expr.c (gfc_conv_structure): Ensure that the derived type has a backend_decl. PR fortran/43044 * resolve.c (resolve_global_procedure): Check that the 'cl' structure is not NULL. From-SVN: r157552 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 231deaa75823..dc155fa1574d 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,17 @@ +2010-03-18 Paul Thomas + + PR fortran/43039 + * trans-expr.c (conv_parent_component_references): Ensure that + 'dt' has a backend_decl. + + PR fortran/43043 + * trans-expr.c (gfc_conv_structure): Ensure that the derived + type has a backend_decl. + + PR fortran/43044 + * resolve.c (resolve_global_procedure): Check that the 'cl' + structure is not NULL. + 2010-03-18 Shujing Zhao * lang.opt (-ffixed-line-length-, ffree-line-length-): Remove diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index de316da840dd..24ec7a8a1de8 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -1851,12 +1851,13 @@ resolve_global_procedure (gfc_symbol *sym, locus *where, /* Non-assumed length character functions. */ if (sym->attr.function && sym->ts.type == BT_CHARACTER - && gsym->ns->proc_name->ts.u.cl->length != NULL) + && gsym->ns->proc_name->ts.u.cl != NULL + && gsym->ns->proc_name->ts.u.cl->length != NULL) { gfc_charlen *cl = sym->ts.u.cl; if (!sym->attr.entry_master && sym->attr.if_source == IFSRC_UNKNOWN - && cl && cl->length && cl->length->expr_type != EXPR_CONSTANT) + && cl && cl->length && cl->length->expr_type != EXPR_CONSTANT) { gfc_error ("Nonconstant character-length function '%s' at %L " "must have an explicit interface", sym->name, diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index abc2a24318a9..b9ea5579ac8e 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -507,6 +507,9 @@ conv_parent_component_references (gfc_se * se, gfc_ref * ref) parent.u.c.sym = dt; parent.u.c.component = dt->components; + if (dt->backend_decl == NULL) + gfc_get_derived_type (dt); + if (dt->attr.extension && dt->components) { if (dt->attr.is_class) @@ -4454,6 +4457,8 @@ gfc_conv_structure (gfc_se * se, gfc_expr * expr, int init) { gfc_component *data; data = gfc_find_component (cm->ts.u.derived, "$data", true, true); + if (!data->backend_decl) + gfc_get_derived_type (cm->ts.u.derived); val = gfc_conv_initializer (c->expr, &cm->ts, TREE_TYPE (data->backend_decl), data->attr.dimension,