diff options
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r-- | gcc/fortran/resolve.c | 21 |
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) { |