diff options
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r-- | gcc/fortran/resolve.c | 57 |
1 files changed, 40 insertions, 17 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index c543a95..e363763 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -24,6 +24,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor,Boston, MA #include "system.h" #include "gfortran.h" #include "arith.h" /* For gfc_compare_expr(). */ +#include "dependency.h" /* Types used in equivalence statements. */ @@ -804,6 +805,24 @@ resolve_actual_arglist (gfc_actual_arglist * arg) } +/* Go through each actual argument in ACTUAL and see if it can be + implemented as an inlined, non-copying intrinsic. FNSYM is the + function being called, or NULL if not known. */ + +static void +find_noncopying_intrinsics (gfc_symbol * fnsym, gfc_actual_arglist * actual) +{ + gfc_actual_arglist *ap; + gfc_expr *expr; + + for (ap = actual; ap; ap = ap->next) + if (ap->expr + && (expr = gfc_get_noncopying_intrinsic_argument (ap->expr)) + && !gfc_check_fncall_dependency (expr, INTENT_IN, fnsym, actual)) + ap->expr->inline_noncopying_intrinsic = 1; +} + + /************* Function resolution *************/ /* Resolve a function call known to be generic. @@ -1150,6 +1169,9 @@ resolve_function (gfc_expr * expr) } } + if (t == SUCCESS) + find_noncopying_intrinsics (expr->value.function.esym, + expr->value.function.actual); return t; } @@ -1372,27 +1394,28 @@ resolve_call (gfc_code * c) if (resolve_actual_arglist (c->ext.actual) == FAILURE) return FAILURE; - if (c->resolved_sym != NULL) - return SUCCESS; - - switch (procedure_kind (c->symtree->n.sym)) - { - case PTYPE_GENERIC: - t = resolve_generic_s (c); - break; + t = SUCCESS; + if (c->resolved_sym == NULL) + switch (procedure_kind (c->symtree->n.sym)) + { + case PTYPE_GENERIC: + t = resolve_generic_s (c); + break; - case PTYPE_SPECIFIC: - t = resolve_specific_s (c); - break; + case PTYPE_SPECIFIC: + t = resolve_specific_s (c); + break; - case PTYPE_UNKNOWN: - t = resolve_unknown_s (c); - break; + case PTYPE_UNKNOWN: + t = resolve_unknown_s (c); + break; - default: - gfc_internal_error ("resolve_subroutine(): bad function type"); - } + default: + gfc_internal_error ("resolve_subroutine(): bad function type"); + } + if (t == SUCCESS) + find_noncopying_intrinsics (c->resolved_sym, c->ext.actual); return t; } |