diff options
author | Mikael Morin <mikael@gcc.gnu.org> | 2012-02-12 15:12:21 +0000 |
---|---|---|
committer | Mikael Morin <mikael@gcc.gnu.org> | 2012-02-12 15:12:21 +0000 |
commit | 58b29fa3426e8b7ad37e5849b14c4152f0c2abb1 (patch) | |
tree | 8ce2fd42260e0bf235e613ee4366567df490bd65 /gcc/fortran/trans-array.c | |
parent | 12e3c3961436e0bc19f7fcbf7dd5ba6d556b0803 (diff) | |
download | gcc-58b29fa3426e8b7ad37e5849b14c4152f0c2abb1.zip gcc-58b29fa3426e8b7ad37e5849b14c4152f0c2abb1.tar.gz gcc-58b29fa3426e8b7ad37e5849b14c4152f0c2abb1.tar.bz2 |
trans-array.c (gfc_get_proc_ifc_for_expr): New function.
* trans-array.c (gfc_get_proc_ifc_for_expr): New function.
(gfc_walk_elemental_function_args): Move code to
gfc_get_proc_ifc_for_expr and call it.
From-SVN: r184139
Diffstat (limited to 'gcc/fortran/trans-array.c')
-rw-r--r-- | gcc/fortran/trans-array.c | 52 |
1 files changed, 34 insertions, 18 deletions
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index edcde5c..ac39fdf 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -8426,6 +8426,36 @@ gfc_reverse_ss (gfc_ss * ss) } +/* Given an expression refering to a procedure, return the symbol of its + interface. We can't get the procedure symbol directly as we have to handle + the case of (deferred) type-bound procedures. */ + +gfc_symbol * +gfc_get_proc_ifc_for_expr (gfc_expr *procedure_ref) +{ + gfc_symbol *sym; + gfc_ref *ref; + + if (procedure_ref == NULL) + return NULL; + + /* Normal procedure case. */ + sym = procedure_ref->symtree->n.sym; + + /* Typebound procedure case. */ + for (ref = procedure_ref->ref; ref; ref = ref->next) + { + if (ref->type == REF_COMPONENT + && ref->u.c.component->attr.proc_pointer) + sym = ref->u.c.component->ts.interface; + else + sym = NULL; + } + + return sym; +} + + /* Walk the arguments of an elemental function. PROC_EXPR is used to check whether an argument is permitted to be absent. If it is NULL, we don't do the check and the argument is assumed to be present. @@ -8435,6 +8465,7 @@ gfc_ss * gfc_walk_elemental_function_args (gfc_ss * ss, gfc_actual_arglist *arg, gfc_expr *proc_expr, gfc_ss_type type) { + gfc_symbol *proc_ifc; gfc_formal_arglist *dummy_arg; int scalar; gfc_ss *head; @@ -8444,24 +8475,9 @@ gfc_walk_elemental_function_args (gfc_ss * ss, gfc_actual_arglist *arg, head = gfc_ss_terminator; tail = NULL; - if (proc_expr) - { - gfc_ref *ref; - - /* Normal procedure case. */ - dummy_arg = proc_expr->symtree->n.sym->formal; - - /* Typebound procedure case. */ - for (ref = proc_expr->ref; ref; ref = ref->next) - { - if (ref->type == REF_COMPONENT - && ref->u.c.component->attr.proc_pointer - && ref->u.c.component->ts.interface) - dummy_arg = ref->u.c.component->ts.interface->formal; - else - dummy_arg = NULL; - } - } + proc_ifc = gfc_get_proc_ifc_for_expr (proc_expr); + if (proc_ifc) + dummy_arg = proc_ifc->formal; else dummy_arg = NULL; |