http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47377

Tobias Burnus <burnus at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |ice-on-invalid-code
                 CC|                            |burnus at gcc dot gnu.org

--- Comment #1 from Tobias Burnus <burnus at gcc dot gnu.org> 2011-01-20 
14:32:29 UTC ---
(Full test case of attachment 23045 below for quicker reference as it is really
short.)

NAG prints:
  Error: Right-hand side of pointer assignment is not a pointer expression

ifort:
  error: When the target is an expression it must deliver a pointer result.


The RHS has to be per F2008, R733 a data-target, which is:

R737  data-target  is  variable
R602  variable  is  designator
                or  expr
C602 (R602) expr shall be a reference to a function that has a data
            pointer result.

Using TARGET in f() is a bit odd, but valid and can be sometimes useful, e.g.
if one want to use  -- in f() -- "ptr => f%some%component".


program testgferr
    real, pointer :: y
    y => f()
contains
    function f()
      real, target :: f
      f = 5
    end function f
end program testgferr


Draft patch (untested):

--- a/gcc/fortran/expr.c
+++ b/gcc/fortran/expr.c
@@ -3507,6 +3507,15 @@ gfc_check_pointer_assign (gfc_expr *lvalue, gfc_expr
*rvalue)
     lvalue->symtree->n.sym->attr.subref_array_pointer = 1;

   attr = gfc_expr_attr (rvalue);
+
+  if (rvalue->expr_type == EXPR_FUNCTION && !attr.pointer)
+    {
+      gfc_error ("Pointer assignment target expression "
+                "at %L must deliver a pointer result",
+                &rvalue->where);
+      return FAILURE;
+    }
+
   if (!attr.target && !attr.pointer)
     {
       gfc_error ("Pointer assignment target is neither TARGET "

Reply via email to