This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Hi all, here is a patch which fixes most of the problems in PR36322 and PR36463. I think it's enough for PR3622 to be closed and for PR36463 not to be called a regression any more (I will keep this one open and fix the remaining trouble in a follow-up patch). I had several test cases before, but compressed them all into one. The patch is regression-tested on i686-pc-linux-gnu. Ok for trunk? Cheers, Janus 2008-10-24 Janus Weil <janus@gcc.gnu.org> PR fortran/36322 PR fortran/36463 * gfortran.h: New function gfc_expr_replace_symbols. * decl.c (match_procedure_decl): Increase reference count for interface. * expr.c: New functions replace_symbol and gfc_expr_replace_symbols. * resolve.c (resolve_symbol): Correctly copy array spec and char len of PROCEDURE declarations from their interface. * symbol.c (gfc_get_default_type): Enhanced error message. * trans-expr.c (gfc_conv_function_call): Bugfix. 2008-10-24 Janus Weil <janus@gcc.gnu.org> PR fortran/36322 PR fortran/36463 * gfortran.dg/proc_decl_17.f90: New.
Index: gcc/fortran/trans-expr.c =================================================================== --- gcc/fortran/trans-expr.c (revision 141323) +++ gcc/fortran/trans-expr.c (working copy) @@ -2716,7 +2716,8 @@ gfc_conv_function_call (gfc_se * se, gfc && parmse.string_length == NULL_TREE && e->ts.type == BT_PROCEDURE && e->symtree->n.sym->ts.type == BT_CHARACTER - && e->symtree->n.sym->ts.cl->length != NULL) + && e->symtree->n.sym->ts.cl->length != NULL + && e->symtree->n.sym->ts.cl->length->expr_type == EXPR_CONSTANT) { gfc_conv_const_charlen (e->symtree->n.sym->ts.cl); parmse.string_length = e->symtree->n.sym->ts.cl->backend_decl; Index: gcc/fortran/symbol.c =================================================================== --- gcc/fortran/symbol.c (revision 141323) +++ gcc/fortran/symbol.c (working copy) @@ -219,7 +219,7 @@ gfc_get_default_type (gfc_symbol *sym, g "implicitly typed variables"); if (letter < 'a' || letter > 'z') - gfc_internal_error ("gfc_get_default_type(): Bad symbol"); + gfc_internal_error ("gfc_get_default_type(): Bad symbol '%s'",sym->name); if (ns == NULL) ns = gfc_current_ns; Index: gcc/fortran/decl.c =================================================================== --- gcc/fortran/decl.c (revision 141323) +++ gcc/fortran/decl.c (working copy) @@ -4125,6 +4125,7 @@ match_procedure_decl (void) /* Various interface checks. */ if (proc_if) { + proc_if->refs++; /* Resolve interface if possible. That way, attr.procedure is only set if it is declared by a later procedure-declaration-stmt, which is invalid per C1212. */ Index: gcc/fortran/gfortran.h =================================================================== --- gcc/fortran/gfortran.h (revision 141323) +++ gcc/fortran/gfortran.h (working copy) @@ -2448,8 +2448,8 @@ bool gfc_traverse_expr (gfc_expr *, gfc_ bool (*)(gfc_expr *, gfc_symbol *, int*), int); void gfc_expr_set_symbols_referenced (gfc_expr *); - gfc_try gfc_expr_check_typed (gfc_expr*, gfc_namespace*, bool); +void gfc_expr_replace_symbols (gfc_expr *, gfc_symbol *); /* st.c */ extern gfc_code new_st; Index: gcc/fortran/expr.c =================================================================== --- gcc/fortran/expr.c (revision 141323) +++ gcc/fortran/expr.c (working copy) @@ -3487,3 +3487,28 @@ gfc_expr_check_typed (gfc_expr* e, gfc_n return error_found ? FAILURE : SUCCESS; } + +/* Walk an expression tree and replace all symbols with a corresponding symbol + in the formal_ns of "sym". Needed for copying interfaces in PROCEDURE + statements. */ + +static bool +replace_symbol (gfc_expr *expr, gfc_symbol *sym, int *i ATTRIBUTE_UNUSED) +{ + if (!expr->symtree) return false; + if (expr->symtree->n.sym->ns != sym->formal_ns + && expr->symtree->n.sym->attr.dummy) + { + gfc_symtree *stree; + gfc_get_sym_tree (expr->symtree->name, sym->formal_ns, &stree); + stree->n.sym->attr.referenced = expr->symtree->n.sym->attr.referenced; + expr->symtree = stree; + } + return false; +} + +void +gfc_expr_replace_symbols (gfc_expr *expr, gfc_symbol *dest) +{ + gfc_traverse_expr (expr, dest, &replace_symbol, 0); +} Index: gcc/fortran/resolve.c =================================================================== --- gcc/fortran/resolve.c (revision 141323) +++ gcc/fortran/resolve.c (working copy) @@ -8876,8 +8876,26 @@ resolve_symbol (gfc_symbol *sym) sym->attr.dimension = ifc->attr.dimension; sym->attr.recursive = ifc->attr.recursive; sym->attr.always_explicit = ifc->attr.always_explicit; - sym->as = gfc_copy_array_spec (ifc->as); copy_formal_args (sym, ifc); + /* Copy array spec. */ + sym->as = gfc_copy_array_spec (ifc->as); + if (sym->as) + { + int i; + for (i = 0; i < sym->as->rank; i++) + { + gfc_expr_replace_symbols (sym->as->lower[i], sym); + gfc_expr_replace_symbols (sym->as->upper[i], sym); + } + } + /* Copy char length. */ + if (ifc->ts.cl) + { + sym->ts.cl = gfc_get_charlen(); + sym->ts.cl->resolved = ifc->ts.cl->resolved; + sym->ts.cl->length = gfc_copy_expr (ifc->ts.cl->length); + gfc_expr_replace_symbols (sym->ts.cl->length, sym); + } } else if (sym->ts.interface->name[0] != '\0') {
Attachment:
proc_decl_17.f90
Description: Binary data
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |