Dear All, Please find attached a draft patch for the above PR, together with PRs 40737, 55763, 57019 and 57116. These PRs constitute problems associated with the last F95 feature that gfortran does not completely implement. I want to sound out if this is acceptable as the way to fix these problems before going to the trouble of doing the final clean up; especially of trans.c (gfc_build_array_ref) and trans-array.c(build_array_ref). The problem concerns pointers to derived type array components. eg: pointer_array(:) => derived_array (:)%component At present gfortran uses a rather crude fix, where a 'span' variable with value of sizeof(element of derived_array) is used for pointer arithmetic to access elements of the array; &pointer_array(i) = &derived_array(1)%component + span*(i-1) The difficulty of using a variable 'span' is that it is not passed to procedures and it is not available to array pointer components. This patch fixes this by the introduction of a span field in the array descriptor. Note that this is only used for intrinsic type, pointer arrays in this version of the patch. A considerable simplification would arise from using the span field in class arrays too. This might well be one result of the clean up mentioned above. Tobias Burnus and I have been putting off fixing these PRs for a long time because of the pending array descriptor reform. However, work on fortran-dev has once again stopped and neither I nor, I think, anybody else has the time to restart this work anytime soon. pointer[1,2].f90 in the libgomp testsuite fail if this modification to array referencing is exposed to them. For the time being, trans-array.c(is_pointer_array) has: + if (flag_openmp) + return false; to switch off the modification. I will come back to this during the clean up, with the hope of putting it right. Bootstraps and regtests on FC23/x86_64 - OK to proceed to completion and submission? Paul 2017-06-24 Paul Thomas PR fortran/34640 PR fortran/40737 PR fortran/55763 PR fortran/57019 PR fortran/57116 * trans-array.c: Add SPAN_FIELD and update indices for subsequent fields. (gfc_conv_descriptor_span, gfc_conv_descriptor_span_get, gfc_conv_descriptor_span_set, is_pointer_array, get_array_span): New functions. (gfc_conv_scalarized_array_ref): If the expression is a subref array, make sure that info->descriptor is a descriptor type. Otherwise, if info->descriptor is a pointer array, set 'decl' and fix it if it is a component reference. (gfc_conv_array_ref): Similarly set 'decl'. (gfc_array_allocate): Set the span field if this is a pointer array. (gfc_conv_expr_descriptor): Set the span field for pointer assignments. * trans-array.h: Prototypes for gfc_conv_descriptor_span_get and gfc_conv_descriptor_span_set added. * trans.c (gfc_build_array_ref): GFC_DECL_SUBREF_ARRAY_P change to GFC_DECL_PTR_ARRAY_P and defreference if a PARM_DECL. trans-decl.c (gfc_get_symbol_decl): If a non-class pointer array, mark the declaration as a GFC_DECL_PTR_ARRAY_P. Remove the setting of GFC_DECL_SPAN. (gfc_trans_deferred_vars): Set the span field to zero in the originating scope. * trans-expr.c (gfc_trans_pointer_assignment): Remove code for setting of GFC_DECL_SPAN. Set the 'span' field for non-class pointers to class function results. Likewise for rank remap. * trans.h : Rename DECL_LANG_FLAG_6, GFC_DECL_SUBREF_ARRAY_P, as GFC_DECL_PTR_ARRAY_P. * trans-intrinsic.c (conv_expr_ref_to_caf_ref): Pick up the 'token' offset from the field decl in the descriptor. (conv_isocbinding_subroutine): Set the 'span' field. * trans-io.c (gfc_trans_transfer): Always scalarize pointer array io. * trans-stmt.c (trans_associate_var): Set the 'span' field. * trans-types.c (gfc_get_array_descriptor_base): Add the 'span' field to the array descriptor. (gfc_get_derived_type): Pointer array components are marked as GFC_DECL_PTR_ARRAY_P. (gfc_get_array_descr_info): Jump one more in the DECL_CHAIN to access the offset field. 2017-06-24 Paul Thomas PR fortran/34640 * gfortran.dg/assumed_type_2.f90: Adjust some of the tree dump checks. * gfortran.dg/no_arg_check_2.f90: Likewise. * gfortran.dg/pointer_array_1.f90: New test. * gfortran.dg/pointer_array_2.f90: New test. * gfortran.dg/pointer_array_component_1.f90: New test. * gfortran.dg/pointer_array_component_2.f90: New test. * gfortran.dg/goacc/kernels-alias-4.f95: Bump up both tree scan counts by 1. PR fortran/40737 * gfortran.dg/pointer_array_3.f90: New test. PR fortran/57116 * gfortran.dg/pointer_array_4.f90: New test. PR fortran/55763 * gfortran.dg/pointer_array_5.f90: New test. PR fortran/57019 * gfortran.dg/pointer_array_6.f90: New test. 2017-06-24 Paul Thomas PR fortran/34640 * libgfortran/libgfortran.h: Add span field to descriptor. -- "If you can't explain it simply, you don't understand it well enough" - Albert Einstein