diff options
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r-- | gcc/fortran/resolve.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 198fec7..3f3ef03 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -1074,6 +1074,7 @@ resolve_actual_arglist (gfc_actual_arglist *arg, procedure_type ptype) if (sym->ts.type == BT_UNKNOWN && sym->attr.intrinsic) { gfc_intrinsic_sym *isym; + isym = gfc_find_function (sym->name); if (isym == NULL || !isym->specific) { @@ -1083,6 +1084,7 @@ resolve_actual_arglist (gfc_actual_arglist *arg, procedure_type ptype) return FAILURE; } sym->ts = isym->ts; + sym->attr.intrinsic = 1; sym->attr.function = 1; } goto argument_list; @@ -1487,6 +1489,22 @@ resolve_specific_f0 (gfc_symbol *sym, gfc_expr *expr) { match m; + /* See if we have an intrinsic interface. */ + + if (sym->interface != NULL && sym->interface->attr.intrinsic) + { + gfc_intrinsic_sym *isym; + isym = gfc_find_function (sym->interface->name); + + /* Existance of isym should be checked already. */ + gcc_assert (isym); + + sym->ts = isym->ts; + sym->attr.function = 1; + sym->attr.proc = PROC_EXTERNAL; + goto found; + } + if (sym->attr.external || sym->attr.if_source == IFSRC_IFBODY) { if (sym->attr.dummy) @@ -2513,6 +2531,22 @@ resolve_specific_s0 (gfc_code *c, gfc_symbol *sym) { match m; + /* See if we have an intrinsic interface. */ + if (sym->interface != NULL && !sym->interface->attr.abstract + && !sym->interface->attr.subroutine) + { + gfc_intrinsic_sym *isym; + + isym = gfc_find_function (sym->interface->name); + + /* Existance of isym should be checked already. */ + gcc_assert (isym); + + sym->ts = isym->ts; + sym->attr.function = 1; + goto found; + } + if(sym->attr.is_iso_c) { m = gfc_iso_c_sub_interface (c,sym); |