Bug 54387 - [F03] Wrongly accepts non-proc result variable on the RHS of a proc-pointer assignment
Summary: [F03] Wrongly accepts non-proc result variable on the RHS of a proc-pointer a...
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: fortran (show other bugs)
Version: 4.8.0
: P3 normal
Target Milestone: ---
Assignee: janus
URL:
Keywords: accepts-invalid
Depends on:
Blocks:
 
Reported: 2012-08-27 22:10 UTC by Tobias Burnus
Modified: 2012-09-16 20:19 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2012-09-12 00:00:00


Attachments

Note You need to log in before you can comment on or make changes to this bug.
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
end
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)
contains
subroutine bar(x)
  integer, external :: x
end subroutine bar
end
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
Log:
2012-09-16  Janus Weil  <janus@gcc.gnu.org>

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

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

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

Added:
    trunk/gcc/testsuite/gfortran.dg/proc_ptr_38.f90
Modified:
    trunk/gcc/fortran/ChangeLog
    trunk/gcc/fortran/expr.c
    trunk/gcc/testsuite/ChangeLog
Comment 4 janus 2012-09-16 20:19:09 UTC
Fixed with r191364. Closing.