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 "