[Patch, fortran] PR29396 PR29606 PR30625 and PR30871 - subreference array pointers.
Paul Thomas
paulthomas2@wanadoo.fr
Sun Sep 9 17:58:00 GMT 2007
:ADDPATCH fortran:
This is a first stab at fixing these beasts. I would be the first to
admit that this might not be the most efficient way of going about the
job but it does leave the rest of gfortran's functionality untouched.
Also, the patch is incomplete. Pointer references to substrings of
components of arrays of derived types do not work and, without having
tried it, I am sure that WHERE and FORALL masks will do odd things if
they are such pointers. The former is something that I will work on
right away, after writing a PR, and the latter is a longer term TODO.
The patch functions by adding a 'span' field to the lang_decl structure,
which stores the size of the target array elements. The rhs of a
pointer assignment is converted to a descriptor, whose data pointer is
to the subreference of the first element of the array.
gfc_build_array_ref has then been modified to take a look at the
declaration for the array; if it is a pointer to a subreference array,
the offset is calculated in bytes and the element extracted by explicit
pointer arithmetic. The treatment of these pointers as actual arguments
is very conservative - they are always copy-in/copy-out. Doubtless
cleverer things can be done in teh fullness of time.
At present, very few references to gfc_build_array_ref have been updated
to supply the variable declaration. However, these are sufficient to
provide the basic functionality. I am rather sure that the problem with
substrings of components, mentioned above, lies in resolve.c. However,
I just do not have time to deal with it now.
The testcase is an amalgam of the PR testcases, together with some
testing that the target is modified as it should be and that various
forms of pointer reference work correctly.
It is my opinion that this patch is ready for 4.3 simply because it
provides an extra functionality that is ringfenced by specific tests.
Such pointer assignements, at present, either lead to ICEs or wrong
code. Hence, even if it is not in its final form, it will not break
anything, whilst filling in the missing f95 feature.
Regtested on Cygwin_NT/amd64 - OK for trunk..... before 09/10 :-) ?
Paul
2007-09-09 Paul Thomas <pault@gcc.gnu.org>
PR fortran/29396
PR fortran/29606
PR fortran/30625
PR fortran/30871
* trans.h : Add extra argument to gfc_build_array_ref. Rename
gfc_conv_aliased_arg to gfc_conv_subref_array_arg. Move
prototype of is_aliased_array to gfortran.h and rename it
is_subref_array. Add field span to lang_decl, add a new
decl lang specific flag accessed by GFC_DECL_SUBREF_ARRAY_P
and a new type flag GFC_DECL_SUBREF_ARRAY_P.
* trans.c (gfc_build_array_ref): Add the new argument, decl.
If this is a subreference array pointer, use the lang_decl
field 'span' to claculate the offset in bytes and use pointer
arithmetic to access the element.
* trans-array.c (gfc_conv_scalarized_array_ref,
gfc_conv_array_ref): Add the backend declaration as the third
field, if it is likely to be a subreference array pointer.
For all other references to gfc_build_array_ref, set the third
argument to NULL.
(gfc_conv_expr_descriptor): If the rhs of a pointer assignment
is a subreference array, then calculate the offset to the
subreference of the first element and set the descriptor data
pointer to this.
trans-expr.c (gfc_get_expr_charlen): Use the symbol charlen if
a character subreference gets through.
(gfc_conv_aliased_arg): Rename to gfc_conv_subref_array_arg.
(is_aliased_array): Remove.
(gfc_conv_function_call): Change reference to is_aliased_array
to is_subref_array.
(gfc_trans_pointer_assignment): Add the array element length to
the lang_decl 'span' field.
* gfortran.h : Add subref_array_pointer to symbol_attribute and
add the prototype for is_subref_array.
* trans-stmt.c : Add NULL for third argument in all references
to gfc_build_array_ref.
* expr.c (is_subref_array): Renamed copy of is_aliased_array.
If this is a subreference array pointer, return true.
(gfc_check_pointer_assign): If the rhs is a subreference array,
set the lhs subreference_array_pointer attribute.
* trans-decl.c (gfc_get_symbol_decl): Allocate the lang_decl
field if the symbol is a subreference array pointer and set an
initial value of zero for the 'span' field.
* trans-io.c (set_internal_unit): Refer to is_subref_array and
gfc_conv_subref_array_arg.
(nml_get_addr_expr): Add NULL third argument to
gfc_build_array_ref.
(gfc_trans_transfer): Use the scalarizer for a subreference
array.
2007-09-09 Paul Thomas <pault@gcc.gnu.org>
PR fortran/29396
PR fortran/29606
PR fortran/30625
PR fortran/30871
* gfortran.dg/subref_array_pointer_1.f90: New test.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: submit.diff
Type: text/x-patch
Size: 36046 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/fortran/attachments/20070909/6c42146a/attachment.bin>
More information about the Fortran
mailing list