t = false;
/* F2018 C838 explicitly allows an assumed-rank variable as the first
argument of intrinsic inquiry functions. */
- if (pointer->rank != -1 && pointer->rank != target->rank)
- {
- if (pointer->rank == 0 || target->rank == 0)
- {
- /* There exists no valid pointer assignment using bounds
- remapping for scalar => array or array => scalar. */
- if (!rank_check (target, 0, pointer->rank))
- t = false;
- }
- else if (target->rank != 1)
- {
- if (!gfc_notify_std (GFC_STD_F2008, "Rank remapping target is not "
- "rank 1 at %L", &target->where))
- t = false;
- }
- else if ((gfc_option.allow_std & GFC_STD_F2003) == 0)
- {
- if (!rank_check (target, 0, pointer->rank))
- t = false;
- }
- }
+ if (pointer->rank != -1 && !rank_check (target, 0, pointer->rank))
+ t = false;
if (target->rank > 0 && target->ref)
{
for (i = 0; i < target->rank; i++)
+++ /dev/null
-! { dg-do run }
-! { dg-options "-std=f2018" }
-! PR fortran/77652 - Invalid rank error in ASSOCIATED when rank is remapped
-! Contributed by Paul Thomas
-
-program p
- real, dimension(100), target :: array
- real, dimension(:,:), pointer :: matrix
- real, dimension(20,5), target :: array2
- real, dimension(:), pointer :: matrix2
- matrix(1:20,1:5) => array
- matrix2(1:100) => array2
- !
- ! F2018:16.9.16, ASSOCIATED (POINTER [, TARGET])
- ! Case(v): If TARGET is present and is an array target, the result is
- ! true if and only if POINTER is associated with a target that has
- ! the same shape as TARGET, ...
- if (associated (matrix, array )) stop 1
- if (associated (matrix2,array2)) stop 2
- call check (matrix2, array2)
-contains
- subroutine check (ptr, tgt)
- real, pointer :: ptr(..)
- real, target :: tgt(:,:)
- if (associated (ptr, tgt)) stop 3
- end subroutine check
-end
+++ /dev/null
-! { dg-do compile }
-! { dg-options "-std=f2003" }
-! PR fortran/77652 - Invalid rank error in ASSOCIATED when rank is remapped
-! Contributed by Paul Thomas
-
-subroutine s
- real, dimension(100), target :: array
- real, dimension(:,:), pointer :: matrix
- real, dimension(20,5), target :: array2
- real, dimension(:), pointer :: matrix2
- real, pointer :: scalar, scalar2
- scalar => scalar2
- print *, associated (scalar, scalar2)
-
- matrix(1:20,1:5) => array ! F2003+
-! matrix2(1:100) => array2 ! F2008+
- print *, associated (matrix, array ) ! Technically legal F2003
- print *, associated (matrix2,array2) ! { dg-error "is not rank 1" }
-
- ! There exists no related valid pointer assignment for these cases:
- print *, associated (scalar,matrix2) ! { dg-error "must be of rank 0" }
- print *, associated (matrix2,scalar) ! { dg-error "must be of rank 1" }
-end