This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug fortran/47377] internal compiler error: in fold_convert_loc, at fold-const.c:1906
- From: "burnus at gcc dot gnu.org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Thu, 20 Jan 2011 14:32:42 +0000
- Subject: [Bug fortran/47377] internal compiler error: in fold_convert_loc, at fold-const.c:1906
- Auto-submitted: auto-generated
- References: <bug-47377-4@http.gcc.gnu.org/bugzilla/>
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 "