aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/resolve.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r--gcc/fortran/resolve.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 1b46a10..ba547f2 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -140,6 +140,21 @@ resolve_formal_arglist (gfc_symbol * proc)
continue;
}
+ if (sym->attr.function
+ && sym->ts.type == BT_UNKNOWN
+ && sym->attr.intrinsic)
+ {
+ gfc_intrinsic_sym *isym;
+ isym = gfc_find_function (sym->name);
+ if (isym == NULL || !isym->specific)
+ {
+ gfc_error ("Unable to find a specific INTRINSIC procedure "
+ "for the reference '%s' at %L", sym->name,
+ &sym->declared_at);
+ }
+ sym->ts = isym->ts;
+ }
+
continue;
}
@@ -937,6 +952,21 @@ resolve_actual_arglist (gfc_actual_arglist * arg, procedure_type ptype)
&& sym->ns->parent->proc_name == sym)))
goto got_variable;
+ /* If all else fails, see if we have a specific intrinsic. */
+ if (sym->attr.function
+ && sym->ts.type == BT_UNKNOWN
+ && sym->attr.intrinsic)
+ {
+ gfc_intrinsic_sym *isym;
+ isym = gfc_find_function (sym->name);
+ if (isym == NULL || !isym->specific)
+ {
+ gfc_error ("Unable to find a specific INTRINSIC procedure "
+ "for the reference '%s' at %L", sym->name,
+ &e->where);
+ }
+ sym->ts = isym->ts;
+ }
goto argument_list;
}
@@ -1512,6 +1542,13 @@ resolve_function (gfc_expr * expr)
if (expr->symtree)
sym = expr->symtree->n.sym;
+ if (sym && sym->attr.flavor == FL_VARIABLE)
+ {
+ gfc_error ("'%s' at %L is not a function",
+ sym->name, &expr->where);
+ return FAILURE;
+ }
+
/* If the procedure is not internal, a statement function or a module
procedure,it must be external and should be checked for usage. */
if (sym && !sym->attr.dummy && !sym->attr.contained