From 5aee8c2a33ae0d3f375ed0ca6e03718b284d2574 Mon Sep 17 00:00:00 2001 From: Harald Anlauf Date: Sat, 24 Apr 2021 20:38:06 +0200 Subject: [PATCH] Fortran - allow target of pointer from evaluation of function-reference Fortran allows the target of a pointer from the evaluation of a function-reference in a variable definition context (e.g. F2018:R902). gcc/fortran/ChangeLog: PR fortran/100218 * expr.c (gfc_check_vardef_context): Extend check to allow pointer from a function reference. gcc/testsuite/ChangeLog: PR fortran/100218 * gfortran.dg/ptr-func-4.f90: New test. (cherry picked from commit 32c4d970ea3a9fc330d6aa8fd83f9dae0b9afc64) --- gcc/fortran/expr.c | 4 +++- gcc/testsuite/gfortran.dg/ptr-func-4.f90 | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/ptr-func-4.f90 diff --git a/gcc/fortran/expr.c b/gcc/fortran/expr.c index 92a6700568d6..956003ec605e 100644 --- a/gcc/fortran/expr.c +++ b/gcc/fortran/expr.c @@ -6121,7 +6121,9 @@ gfc_check_vardef_context (gfc_expr* e, bool pointer, bool alloc_obj, } if (!pointer && sym->attr.flavor != FL_VARIABLE && !(sym->attr.flavor == FL_PROCEDURE && sym == sym->result) - && !(sym->attr.flavor == FL_PROCEDURE && sym->attr.proc_pointer)) + && !(sym->attr.flavor == FL_PROCEDURE && sym->attr.proc_pointer) + && !(sym->attr.flavor == FL_PROCEDURE + && sym->attr.function && sym->attr.pointer)) { if (context) gfc_error ("%qs in variable definition context (%s) at %L is not" diff --git a/gcc/testsuite/gfortran.dg/ptr-func-4.f90 b/gcc/testsuite/gfortran.dg/ptr-func-4.f90 new file mode 100644 index 000000000000..62b18f6a9350 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/ptr-func-4.f90 @@ -0,0 +1,19 @@ +! { dg-do run } +! { dg-options "-O2 -std=f2008" } +! PR fortran/100218 - target of pointer from evaluation of function-reference + +program p + implicit none + integer, target :: z = 0 + call g (f ()) + if (z /= 1) stop 1 +contains + function f () result (r) + integer, pointer :: r + r => z + end function f + subroutine g (x) + integer, intent(out) :: x + x = 1 + end subroutine g +end program p -- 2.43.5