http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50684
Bug #: 50684
Summary: Incorrect error for move_alloc on intent(in) pointer
Classification: Unclassified
Product: gcc
Version: 4.6.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: fortran
AssignedTo: [email protected]
ReportedBy: [email protected]
Created attachment 25452
--> http://gcc.gnu.org/bugzilla/attachment.cgi?id=25452
Code to reproduce the behaviour
Bug that was originally posted as additional comment to bug 50570, but turned
out to be a different issue:
The code in the attachment is calling the function move_alloc with something
inside an intent(in) pointer as actual argument and gives the following error
message:
bug.f90:22.20:
CALL MOVE_ALLOC(POINTER_INTENT_IN_VARIABLE%VALUE, LOCAL_VALUE)
1
Error: 'from' argument of 'move_alloc' intrinsic at (1) cannot be INTENT(IN)
I'm not sure about what the Fortran standard says, but I don't think that
giving this error is a desired behaviour because:
* According to documentation of other compilers the code should compile:
http://publib.boulder.ibm.com/infocenter/comphelp/v111v131/topic/com.ibm.xlf131.aix.doc/language_ref/intent.html
(section "Rules", subsection about pointer dummy arguments)
* If INTENT(IN) really tries to protect the *members* (not the pointer itself)
of the derived type from being changed (that's the only scenario in which this
behaviour would make sense), then it's not doing its job: Copying the pointer
to a local variable I'm able to change them, as the example
"POINTER_INTENT_IN_BUG_WORKING" in the attached code shows.
Notes about the attachment:
Subroutine POINTER_INTENT_IN_BUG_FAILING contains the failing code.
Subroutien POINTER_INTENT_IN_BUG_WORKING contains an alternative code that does
the same thing, but compiles (to show that the behaviour of gfortran doesn't
make sense as protection, either).