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.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 4aa5f1b..6f2a4c4 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -8836,9 +8836,20 @@ resolve_assoc_var (gfc_symbol* sym, bool resolve_target)
gcc_assert (target->symtree);
tsym = target->symtree->n.sym;
- if (tsym->attr.flavor == FL_PROGRAM)
+
+ if (tsym->attr.subroutine
+ || tsym->attr.external
+ || (tsym->attr.function
+ && (tsym->result != tsym || tsym->attr.recursive)))
{
- gfc_error ("Associating entity %qs at %L is a PROGRAM",
+ gfc_error ("Associating entity %qs at %L is a procedure name",
+ tsym->name, &target->where);
+ return;
+ }
+
+ if (gfc_expr_attr (target).proc_pointer)
+ {
+ gfc_error ("Associating entity %qs at %L is a procedure pointer",
tsym->name, &target->where);
return;
}
@@ -8851,6 +8862,12 @@ resolve_assoc_var (gfc_symbol* sym, bool resolve_target)
if (is_subref_array (target))
sym->attr.subref_array_pointer = 1;
}
+ else if (target->ts.type == BT_PROCEDURE)
+ {
+ gfc_error ("Associating selector-expression at %L yields a procedure",
+ &target->where);
+ return;
+ }
if (target->expr_type == EXPR_NULL)
{