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 "