diff options
author | Janus Weil <janus@gcc.gnu.org> | 2013-01-29 22:40:51 +0100 |
---|---|---|
committer | Janus Weil <janus@gcc.gnu.org> | 2013-01-29 22:40:51 +0100 |
commit | 4cbc9039962dd819f07ee1e3324696aea5114b00 (patch) | |
tree | 8a5b65f0f6e388374cf3665d4df237dbe7704a75 /gcc/fortran/expr.c | |
parent | d6f2922e91928b5191a5c5f1b3a6b320712b5ce3 (diff) | |
download | gcc-4cbc9039962dd819f07ee1e3324696aea5114b00.zip gcc-4cbc9039962dd819f07ee1e3324696aea5114b00.tar.gz gcc-4cbc9039962dd819f07ee1e3324696aea5114b00.tar.bz2 |
re PR fortran/54107 ([F03] Memory hog with abstract interface)
2013-01-29 Janus Weil <janus@gcc.gnu.org>
Mikael Morin <mikael@gcc.gnu.org>
PR fortran/54107
* gfortran.h (gfc_component): Delete members 'formal' and 'formal_ns'.
(gfc_copy_formal_args,gfc_copy_formal_args_ppc,gfc_expr_replace_symbols,
gfc_expr_replace_comp): Delete.
(gfc_sym_get_dummy_args): New prototype.
* dependency.c (gfc_check_fncall_dependency): Use
'gfc_sym_get_dummy_args'.
* expr.c (gfc_is_constant_expr): Ditto.
(replace_symbol,gfc_expr_replace_symbols,replace_comp,
gfc_expr_replace_comp): Deleted.
* frontend-passes.c (doloop_code,do_function): Use
'gfc_sym_get_dummy_args'.
* interface.c (gfc_check_operator_interface,gfc_compare_interfaces,
gfc_procedure_use,gfc_ppc_use,gfc_arglist_matches_symbol,
gfc_check_typebound_override): Ditto.
* module.c (MOD_VERSION): Bump module version.
(mio_component): Do not read/write 'formal' and 'formal_ns'.
* resolve.c (resolve_procedure_interface,resolve_fl_derived0): Do not
copy formal args, but just keep a pointer to the interface.
(resolve_function,resolve_call,resolve_typebound_generic_call,
resolve_ppc_call,resolve_expr_ppc,generate_component_assignments,
resolve_fl_procedure,gfc_resolve_finalizers,check_generic_tbp_ambiguity,
resolve_typebound_procedure,check_uop_procedure): Use
'gfc_sym_get_dummy_args'.
* symbol.c (free_components): Do not free 'formal' and 'formal_ns'.
(gfc_copy_formal_args,gfc_copy_formal_args_ppc): Deleted.
(gfc_sym_get_dummy_args): New function.
* trans-array.c (get_array_charlen,gfc_walk_elemental_function_args):
Use 'gfc_sym_get_dummy_args'.
* trans-decl.c (build_function_decl,create_function_arglist,
build_entry_thunks,init_intent_out_dt,gfc_trans_deferred_vars,
add_argument_checking): Ditto.
* trans-expr.c (gfc_map_fcn_formal_to_actual,gfc_conv_procedure_call,
gfc_conv_statement_function): Ditto.
* trans-stmt.c (gfc_conv_elemental_dependencies): Ditto.
* trans-types.c (create_fn_spec,gfc_get_function_type): Ditto.
2013-01-29 Janus Weil <janus@gcc.gnu.org>
Mikael Morin <mikael@gcc.gnu.org>
PR fortran/54107
* gfortran.dg/proc_ptr_comp_36.f90: New.
Co-Authored-By: Mikael Morin <mikael@gcc.gnu.org>
From-SVN: r195562
Diffstat (limited to 'gcc/fortran/expr.c')
-rw-r--r-- | gcc/fortran/expr.c | 68 |
1 files changed, 1 insertions, 67 deletions
diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index f358ac7..3843c2e 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -934,7 +934,7 @@ gfc_is_constant_expr (gfc_expr *e) && sym->attr.proc != PROC_INTERNAL && sym->attr.proc != PROC_ST_FUNCTION && sym->attr.proc != PROC_UNKNOWN - && sym->formal == NULL) + && gfc_sym_get_dummy_args (sym) == NULL) return 1; if (e->value.function.isym @@ -4301,72 +4301,6 @@ gfc_expr_check_typed (gfc_expr* e, gfc_namespace* ns, bool strict) } -/* Walk an expression tree and replace all dummy symbols by the corresponding - symbol in the formal_ns of "sym". Needed for copying interfaces in PROCEDURE - statements. The boolean return value is required by gfc_traverse_expr. */ - -static bool -replace_symbol (gfc_expr *expr, gfc_symbol *sym, int *i ATTRIBUTE_UNUSED) -{ - if ((expr->expr_type == EXPR_VARIABLE - || (expr->expr_type == EXPR_FUNCTION - && !gfc_is_intrinsic (expr->symtree->n.sym, 0, expr->where))) - && expr->symtree->n.sym->ns == sym->ts.interface->formal_ns - && expr->symtree->n.sym->attr.dummy) - { - gfc_symtree *root = sym->formal_ns ? sym->formal_ns->sym_root - : gfc_current_ns->sym_root; - gfc_symtree *stree = gfc_find_symtree (root, expr->symtree->n.sym->name); - gcc_assert (stree); - stree->n.sym->attr = expr->symtree->n.sym->attr; - expr->symtree = stree; - } - return false; -} - -void -gfc_expr_replace_symbols (gfc_expr *expr, gfc_symbol *dest) -{ - gfc_traverse_expr (expr, dest, &replace_symbol, 0); -} - - -/* The following is analogous to 'replace_symbol', and needed for copying - interfaces for procedure pointer components. The argument 'sym' must formally - be a gfc_symbol, so that the function can be passed to gfc_traverse_expr. - However, it gets actually passed a gfc_component (i.e. the procedure pointer - component in whose formal_ns the arguments have to be). */ - -static bool -replace_comp (gfc_expr *expr, gfc_symbol *sym, int *i ATTRIBUTE_UNUSED) -{ - gfc_component *comp; - comp = (gfc_component *)sym; - if ((expr->expr_type == EXPR_VARIABLE - || (expr->expr_type == EXPR_FUNCTION - && !gfc_is_intrinsic (expr->symtree->n.sym, 0, expr->where))) - && expr->symtree->n.sym->ns == comp->ts.interface->formal_ns) - { - gfc_symtree *stree; - gfc_namespace *ns = comp->formal_ns; - /* Don't use gfc_get_symtree as we prefer to fail badly if we don't find - the symtree rather than create a new one (and probably fail later). */ - stree = gfc_find_symtree (ns ? ns->sym_root : gfc_current_ns->sym_root, - expr->symtree->n.sym->name); - gcc_assert (stree); - stree->n.sym->attr = expr->symtree->n.sym->attr; - expr->symtree = stree; - } - return false; -} - -void -gfc_expr_replace_comp (gfc_expr *expr, gfc_component *dest) -{ - gfc_traverse_expr (expr, (gfc_symbol *)dest, &replace_comp, 0); -} - - bool gfc_ref_this_image (gfc_ref *ref) { |