Hi Thomas, Hi All, Please find attached what I believe is the final version of the patch. The problem concerning temporaries being generated in lieu of the descriptor being passed directly - see pointer_array_7.f90 and the change to subref_array_4.f90. This latter necessitated a thread on clf to get right. Thanks are due to Thomas for initiating it. I took the opportunity of the delay, while the bounds issue was being discussed on clf, to fix class pointer arrays. They now function correctly, as evidenced by pointer_array_8.f90. A possible final tweak - as asked before, should I bump up the module version number? My inclination is to say that we should. Bootstrapped and regtested on FC23/x86_64 - OK for trunk? Paul 2017-07-09 Paul Thomas PR fortran/34640 PR fortran/40737 PR fortran/55763 PR fortran/57019 PR fortran/57116 * expr.c (is_subref_array): Add class pointer array dummies to the list of expressions that return true. * 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_get_descriptor_offsets_for_info): New function to preserve API for access to descriptor fields for trans-types.c. (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. (build_array_ref): Simplify handling of class array refs by passing the vptr to gfc_build_array_ref rather than generating the pointer arithmetic in this function. (gfc_conv_array_ref): As in gfc_conv_scalarized_array_ref, set 'decl'. (gfc_array_allocate): Set the span field if this is a pointer array. Use the expr3 element size if it is available, so that the dynamic type element size is used. (gfc_conv_expr_descriptor): Set the span field for pointer assignments. * trans-array.h: Prototypes for gfc_conv_descriptor_span_get gfc_conv_descriptor_span_set and gfc_get_descriptor_offsets_for_info added. 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 thge originating scope. * trans-expr.c (gfc_conv_procedure_call): Do not use copy-in/ copy-out to pass subref expressions to a pointer dummy. (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-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): Replaced API breaking code for descriptor offset calling gfc_get_descriptor_offsets_for_info. * trans.c (get_array_span): New function. (gfc_build_array_ref): Simplify by calling get_array_span and obtain 'span' if 'decl' or 'vptr' present. * trans.h : Rename DECL_LANG_FLAG_6, GFC_DECL_SUBREF_ARRAY_P, as GFC_DECL_PTR_ARRAY_P. 2017-07-09 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_7.f90: New test. * gfortran.dg/pointer_array_8.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. * gfortran.dg/subref_array_pointer_4.f90: Use the passed lower bound for 'Q' to provide an offset for array element access. 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-07-09 Paul Thomas PR fortran/34640 * libgfortran/libgfortran.h: Add span field to descriptor. On 4 July 2017 at 22:03, Thomas Koenig wrote: > Hi Paul, > > first, this patch looks really good - it certainly fixes a lot of the > ICEs. > > I have a few points (a part already mentioned in private mail). > > Consider the test case: > > module x > use iso_c_binding > implicit none > type foo > complex :: c > integer :: i > end type foo > contains > subroutine printit(c) > complex, pointer, dimension(:) :: c > integer :: i > integer(kind=8) :: a > a = transfer(c_loc(c(1)),a) > print '(A,Z16)',"Adrress of first element is ", a > end subroutine printit > > subroutine p2(c) > complex, dimension(:), target :: c > integer :: i > integer(kind=8) :: a > a = transfer(c_loc(c(1)),a) > print '(A,Z16)',"Adrress of first element is ", a > end subroutine p2 > > end module x > > program main > use x > use iso_c_binding > implicit none > type(foo), dimension(5), target :: a > integer :: i > complex, dimension(:), pointer :: pc > complex, dimension(4), target :: v > integer(kind=8) :: s1, s2 > a%i = 0 > do i=1,5 > a(i)%c = cmplx(i**2,i) > end do > pc => a%c > print *,"Pointer to complex passed to pointer argument:" > call printit(pc) > print *,"Pointer to complex passed to array argument" > call p2(pc) > s1 = transfer(c_loc(a(1)),s1) > print '(A,Z16,/)',"Main program: Address of first element: ", s1 > > pc => v > print *,"Pointer to complex passed to pointer argument:" > call printit(pc) > print *,"Complex array passed to array argument" > call p2(v) > s1 = transfer(c_loc(v(1)),s1) > print '(A,Z16)',"Address of first element: ", s1 > end program main > > This yields: > > Pointer to complex passed to pointer argument: > Adrress of first element is 10021C90FF0 > Pointer to complex passed to array argument > Adrress of first element is 10021C90FF0 > Main program: Address of first element: 3FFFCEC599A4 > > Pointer to complex passed to pointer argument: > Adrress of first element is 10021C90FF0 > Complex array passed to array argument > Adrress of first element is 3FFFCEC59A20 > Address of first element: 3FFFCEC59A20 > > It appears that a temporary is created when passing > a pointer array to a pointer array dummy argument. > I think this would be wrong code, because the > subroutine could stash away the pointer and later > access data through it. > > The same seems to happen when passing a pointer to > a normal argument - a temporary copy appears to be made. > > While this code is correct, I am wodering if it > is intentional. Is the span field in the array > descriptor used in the called subroutine? > > Regards > > Thomas -- "If you can't explain it simply, you don't understand it well enough" - Albert Einstein