Commit 4d124378 by Tobias Burnus Committed by Tobias Burnus

Fortran] PR 92994 – add more ASSOCIATE checks

        PR fortran/92994
        * primary.c (gfc_match_rvalue): Add some flavor checks
        gfc_matching_procptr_assignment.
        * resolve.c (resolve_assoc_var): Add more checks for invalid targets.

        PR fortran/92994
        * gfortran.dg/associate_50.f90: Update dg-error.
        * gfortran.dg/associate_51.f90: New.

From-SVN: r279853
parent 208cb81f
2020-01-03 Tobias Burnus <tobias@codesourcery.com>
PR fortran/92994
* primary.c (gfc_match_rvalue): Add some flavor checks
gfc_matching_procptr_assignment.
* resolve.c (resolve_assoc_var): Add more checks for invalid targets.
2020-01-02 Tobias Burnus <tobias@codesourcery.com> 2020-01-02 Tobias Burnus <tobias@codesourcery.com>
PR fortran/68020 PR fortran/68020
......
...@@ -3447,7 +3447,19 @@ gfc_match_rvalue (gfc_expr **result) ...@@ -3447,7 +3447,19 @@ gfc_match_rvalue (gfc_expr **result)
} }
if (gfc_matching_procptr_assignment) if (gfc_matching_procptr_assignment)
goto procptr0; {
/* It can be a procedure or a derived-type procedure or a not-yet-known
type. */
if (sym->attr.flavor != FL_UNKNOWN
&& sym->attr.flavor != FL_PROCEDURE
&& sym->attr.flavor != FL_PARAMETER
&& sym->attr.flavor != FL_VARIABLE)
{
gfc_error ("Symbol at %C is not appropriate for an expression");
return MATCH_ERROR;
}
goto procptr0;
}
if (sym->attr.function || sym->attr.external || sym->attr.intrinsic) if (sym->attr.function || sym->attr.external || sym->attr.intrinsic)
goto function0; goto function0;
......
...@@ -8836,9 +8836,20 @@ resolve_assoc_var (gfc_symbol* sym, bool resolve_target) ...@@ -8836,9 +8836,20 @@ resolve_assoc_var (gfc_symbol* sym, bool resolve_target)
gcc_assert (target->symtree); gcc_assert (target->symtree);
tsym = target->symtree->n.sym; 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); tsym->name, &target->where);
return; return;
} }
...@@ -8851,6 +8862,12 @@ resolve_assoc_var (gfc_symbol* sym, bool resolve_target) ...@@ -8851,6 +8862,12 @@ resolve_assoc_var (gfc_symbol* sym, bool resolve_target)
if (is_subref_array (target)) if (is_subref_array (target))
sym->attr.subref_array_pointer = 1; 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) if (target->expr_type == EXPR_NULL)
{ {
......
2020-01-03 Tobias Burnus <tobias@codesourcery.com>
PR fortran/92994
* gfortran.dg/associate_50.f90: Update dg-error.
* gfortran.dg/associate_51.f90: New.
2020-01-03 Jakub Jelinek <jakub@redhat.com> 2020-01-03 Jakub Jelinek <jakub@redhat.com>
PR fortran/68020 PR fortran/68020
......
...@@ -3,6 +3,6 @@ ...@@ -3,6 +3,6 @@
! Test case by Gerhard Steinmetz. ! Test case by Gerhard Steinmetz.
program p program p
associate (y => p) ! { dg-error "is a PROGRAM" } associate (y => p) ! { dg-error "Invalid association target" }
end associate end associate ! { dg-error "Expecting END PROGRAM statement" }
end program p end program p
! { dg-do compile }
!
! PR fortran/92994
!
! Contributed by G. Steinmetz
!
recursive function f() result(z)
associate (y1 => f())
end associate
associate (y2 => f) ! { dg-error "is a procedure name" }
end associate
end
recursive function f2()
associate (y1 => f2()) ! { dg-error "Invalid association target" }
end associate ! { dg-error "Expecting END FUNCTION statement" }
associate (y2 => f2) ! { dg-error "is a procedure name" }
end associate
end
subroutine p2
type t
end type
type(t) :: z = t()
associate (y => t)
end associate
end
subroutine p3
procedure() :: g
associate (y => g) ! { dg-error "is a procedure name" }
end associate
end
subroutine p4
external :: g
associate (y => g) ! { dg-error "is a procedure name" }
end associate
end
recursive subroutine s
associate (y => s) ! { dg-error "is a procedure name" }
end associate
end
recursive subroutine s2
associate (y => (s2)) ! { dg-error "Associating selector-expression at .1. yields a procedure" }
end associate
end
program p
associate (y => (p)) ! { dg-error "Invalid association target" }
end associate ! { dg-error "Expecting END PROGRAM statement" }
end
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment