[PATCH] Fortran: potential aliasing of complex pointer inquiry references [PR118120]
Steve Kargl
sgk@troutmask.apl.washington.edu
Thu Dec 19 23:31:02 GMT 2024
I'm ok withi your patch. It seems to also catch PR113928.
You may want to give others a chance to chime in.
--
steve
On Thu, Dec 19, 2024 at 09:34:38PM +0000, Harald Anlauf wrote:
>
> the check for potential aliasing of lhs and rhs currently shortcuts
> if the types differ. This is a problem if one is of type complex
> and the other is of type real (and of the same kind parameter value),
> as this ignores that F2008 inquiry references (%RE, %IM) could be
> involved. The attached patch just addresses this shortcut.
>
> This may not be a complete solution, see discussion in the PR,
> but is a lightweight solution (for the time being).
>
> Regtested on x86_64-pc-linux-gnu. OK for mainline?
>
> Thanks,
> Harald
>
> From c5029d09151292ec2ed1e878d49afc3480476588 Mon Sep 17 00:00:00 2001
> From: Harald Anlauf <anlauf@gmx.de>
> Date: Thu, 19 Dec 2024 22:22:52 +0100
> Subject: [PATCH] Fortran: potential aliasing of complex pointer inquiry
> references [PR118120]
>
> PR fortran/118120
>
> gcc/fortran/ChangeLog:
>
> * trans-array.cc (symbols_could_alias): If one symbol refers to a
> complex type and the other to a real type of the same kind, do not
> a priori exclude the possibility of aliasing.
>
> gcc/testsuite/ChangeLog:
>
> * gfortran.dg/aliasing_complex_pointer.f90: New test.
> ---
> gcc/fortran/trans-array.cc | 17 +++++++-----
> .../gfortran.dg/aliasing_complex_pointer.f90 | 27 +++++++++++++++++++
> 2 files changed, 38 insertions(+), 6 deletions(-)
> create mode 100644 gcc/testsuite/gfortran.dg/aliasing_complex_pointer.f90
>
> diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
> index 82a2ae1f747..52813857353 100644
> --- a/gcc/fortran/trans-array.cc
> +++ b/gcc/fortran/trans-array.cc
> @@ -5344,15 +5344,20 @@ static bool
> symbols_could_alias (gfc_symbol *lsym, gfc_symbol *rsym, bool lsym_pointer,
> bool lsym_target, bool rsym_pointer, bool rsym_target)
> {
> - /* Aliasing isn't possible if the symbols have different base types. */
> - if (gfc_compare_types (&lsym->ts, &rsym->ts) == 0)
> - return 0;
> + /* Aliasing isn't possible if the symbols have different base types,
> + except for complex types where an inquiry reference (%RE, %IM) could
> + alias with a real type with the same kind parameter. */
> + if (!gfc_compare_types (&lsym->ts, &rsym->ts)
> + && !(((lsym->ts.type == BT_COMPLEX && rsym->ts.type == BT_REAL)
> + || (lsym->ts.type == BT_REAL && rsym->ts.type == BT_COMPLEX))
> + && lsym->ts.kind == rsym->ts.kind))
> + return false;
>
> /* Pointers can point to other pointers and target objects. */
>
> if ((lsym_pointer && (rsym_pointer || rsym_target))
> || (rsym_pointer && (lsym_pointer || lsym_target)))
> - return 1;
> + return true;
>
> /* Special case: Argument association, cf. F90 12.4.1.6, F2003 12.4.1.7
> and F2008 12.5.2.13 items 3b and 4b. The pointer case (a) is already
> @@ -5363,9 +5368,9 @@ symbols_could_alias (gfc_symbol *lsym, gfc_symbol *rsym, bool lsym_pointer,
> || (rsym->attr.dummy && !rsym->attr.contiguous
> && (!rsym->attr.dimension
> || rsym->as->type == AS_ASSUMED_SHAPE))))
> - return 1;
> + return true;
>
> - return 0;
> + return false;
> }
>
>
> diff --git a/gcc/testsuite/gfortran.dg/aliasing_complex_pointer.f90 b/gcc/testsuite/gfortran.dg/aliasing_complex_pointer.f90
> new file mode 100644
> index 00000000000..0ce4e6a8578
> --- /dev/null
> +++ b/gcc/testsuite/gfortran.dg/aliasing_complex_pointer.f90
> @@ -0,0 +1,27 @@
> +! { dg-do run }
> +! PR fortran/118120 - potential aliasing of complex pointer inquiry references
> +!
> +! Contributed by Slava Zakharin < szakharin at nvidia dot com >
> +
> +program main
> + implicit none
> + integer :: k
> + complex, target :: data(21)
> + do k=1,21
> + data(k) = cmplx(-k,0.0)
> + end do
> + call test(1, 1, data)
> +! print *, data
> + if ( data(1) /= -1.) stop 1
> + if (any (data(2:)% re /= [(k,k=1,20)])) stop 2
> +contains
> + subroutine test(i, j, data)
> + integer :: i, j
> + complex, target :: data(21)
> + real, pointer :: result(:,:,:,:)
> + complex, pointer :: temp(:,:)
> + result(i:i,j:j,1:4,1:5) => data(2:)%re
> + temp(1:4,1:5) => data(1:20)
> + result(i,j,:,:) = abs(temp)
> + end subroutine test
> +end program main
> --
> 2.35.3
>
--
Steve
More information about the Fortran
mailing list