[gcc(refs/users/mikael/heads/pr126895_v01)] fortran: Make IS_CONTIGUOUS true for assumed-rank scalars [PR126895]

Mikael Morin via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:559861d6562f9bd42073a29a379bb24a128a5dc8

commit 559861d6562f9bd42073a29a379bb24a128a5dc8
Author: Mikael Morin <[email protected]>
Date:   Sat Aug 15 21:54:06 2026 +0200

    fortran: Make IS_CONTIGUOUS true for assumed-rank scalars [PR126895]
    
    If the argument to IS_CONTIGUOUS is an assumed-rank variable, add a
    condition making the intrinsic return true if the variable rank is zero at
    execution time.  With the testcase, the function returned false regardless
    of the rank, because of a check of the span against the element size that
    compared unequal.
    
            PR fortran/126895
    
    gcc/fortran/ChangeLog:
    
            * trans-intrinsic.cc (gfc_conv_is_contiguous_expr): If the argument
            to IS_CONTIGUOUS is an assumed-rank variable, add a conditional
            making the value true if the runtime rank is zero.
    
    gcc/testsuite/ChangeLog:
    
            * gfortran.dg/is_contiguous_7.f90: New test.

Diff:
---
 gcc/fortran/trans-intrinsic.cc                |  9 +++++++++
 gcc/testsuite/gfortran.dg/is_contiguous_7.f90 | 26 ++++++++++++++++++++++++++
 2 files changed, 35 insertions(+)

diff --git a/gcc/fortran/trans-intrinsic.cc b/gcc/fortran/trans-intrinsic.cc
index 69a6034b3d38..31d81e517e72 100644
--- a/gcc/fortran/trans-intrinsic.cc
+++ b/gcc/fortran/trans-intrinsic.cc
@@ -2400,6 +2400,15 @@ gfc_conv_is_contiguous_expr (gfc_se *se, gfc_expr *arg)
 				  convert (boolean_type_node, se->expr));
     }
 
+  if (as && as->type == AS_ASSUMED_RANK)
+    {
+      tree rank = gfc_conv_descriptor_rank_get (desc);
+      tree scalar = fold_build2_loc (input_location, EQ_EXPR, boolean_type_node,
+				     rank, gfc_rank_cst[0]);
+      se->expr = fold_build2_loc (input_location, TRUTH_ORIF_EXPR,
+				  TREE_TYPE (se->expr), scalar, se->expr);
+    }
+
   gfc_free_ss_chain (ss);
 }
 
diff --git a/gcc/testsuite/gfortran.dg/is_contiguous_7.f90 b/gcc/testsuite/gfortran.dg/is_contiguous_7.f90
new file mode 100644
index 000000000000..806f1f318744
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/is_contiguous_7.f90
@@ -0,0 +1,26 @@
+! { dg-do run }
+!
+! PR fortran/126895
+! The IS_CONTIGUOUS intrinsic used to erroneously return FALSE for pointer
+! assumed-rank dummies associated with a scalar value.
+
+program prog
+  implicit none
+  type :: t
+    integer :: c1
+  end type
+  type, extends(t) :: u
+    integer :: c2
+  end type
+  type(t), target :: x
+  type(u), target :: y
+  call s1(x, 1)
+  call s1(y, 2)
+contains
+  subroutine s1(a, e)
+    class(t), pointer, intent(in) :: a(..)
+    integer, value :: e
+    !print *, is_contiguous(a)
+    if (.not. is_contiguous(a)) error stop e
+  end subroutine
+end program
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.