Bug 54387

Summary: [F03] Wrongly accepts non-proc result variable on the RHS of a proc-pointer assignment
Product: gcc Reporter: Tobias Burnus <burnus>
Component: fortranAssignee: janus
Severity: normal CC: burnus, janus
Priority: P3 Keywords: accepts-invalid
Version: 4.8.0   
Target Milestone: ---   
Host: Target:
Build: Known to work:
Known to fail: Last reconfirmed: 2012-09-12 00:00:00

Description Tobias Burnus 2012-08-27 22:10:46 UTC
Found by James Van Buskirk in c.l.f's "Function questions?" thread:  https://groups.google.com/forum/?fromgroups=#!topic/comp.lang.fortran/r4PVbtaBnFM

The following program is invalid as "foo" inside the function is the result variable - hence "i => foo" doesn't make sense.

function foo()
  integer :: foo
  procedure(), pointer :: i
  i => foo  ! Invalid RHS - in this context "foo" the RESULT variable
            ! To use the procedure name, a RESULT(...) has to be specified
Comment 1 Tobias Burnus 2012-08-27 22:23:31 UTC
As postscript: (Intel, g95 and (with target attribute) PGI also accept the program of comment 0.)

Crayftn correctly rejects the program of comment 0:
  i => foo  ! Invalid RHS - in this context "foo" the RESULT variable
  Invalid proc-target for this procedure pointer assignment statement.

For the following, the diagnostic works and one gets the message:
  Error: Expected a procedure for argument 'x' at (1)

function foo()
  integer :: foo
  call bar(foo)
subroutine bar(x)
  integer, external :: x
end subroutine bar
Comment 2 janus 2012-09-12 09:17:36 UTC
Here is a draft patch which rejects the test case and is free of testsuite regressions:

Index: gcc/fortran/expr.c
--- gcc/fortran/expr.c	(revision 190908)
+++ gcc/fortran/expr.c	(working copy)
@@ -3430,6 +3430,14 @@ gfc_check_pointer_assign (gfc_expr *lvalue, gfc_ex
 	      gfc_resolve_intrinsic (sym, &rvalue->where);
 	      attr = gfc_expr_attr (rvalue);
+	  /* Check for result of embracing function.  */
+	  if (sym == gfc_current_ns->proc_name
+	      && sym->attr.function && sym->result == sym)
+	    {
+	      gfc_error ("Invalid proc-target in procedure pointer assignment "
+			 "at %L", &rvalue->where);
+	      return FAILURE;
+	    }
       if (attr.abstract)
Comment 3 janus 2012-09-16 20:12:30 UTC
Author: janus
Date: Sun Sep 16 20:12:21 2012
New Revision: 191364

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=191364
2012-09-16  Janus Weil  <janus@gcc.gnu.org>

	PR fortran/54387
	* expr.c (gfc_check_pointer_assign): Check for result of embracing

2012-09-16  Janus Weil  <janus@gcc.gnu.org>

	PR fortran/54387
	* gfortran.dg/proc_ptr_38.f90: New.

Comment 4 janus 2012-09-16 20:19:09 UTC
Fixed with r191364. Closing.