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 <anl...@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

Reply via email to