Hello,

I'm going to push shortly the attached patch.
Fortran-tested on aarch64-unknown-linux-gnu.

Mikael
From a9146d715eba94033eb7ff15f1ad720fa2a5a8d8 Mon Sep 17 00:00:00 2001
From: Mikael Morin <[email protected]>
Date: Sat, 15 Aug 2026 17:23:27 +0200
Subject: [PATCH] fortran: Dereference descriptor pointer in IS_CONTIGUOUS code
 [PR126892]

In the IS_CONTIGUOUS implementation, add the missing dereference to really
have a descriptor-typed expression, usable with the descriptor accessors.

Without this change, the pointer resulting from the evaluation of the
IS_CONTIGUOUS argument was stabilized to a variable and then directly used
to access the descriptor fields.  This was causing an internal compiler
error because the descriptor accessors aren't prepared to receive a pointer.

	PR fortran/126892

gcc/fortran/ChangeLog:

	* trans-intrinsic.cc (gfc_conv_is_contiguous_expr): Dereference the
	pointer variable before using it as descriptor.

gcc/testsuite/ChangeLog:

	* gfortran.dg/is_contiguous_6.f90: New test.
---
 gcc/fortran/trans-intrinsic.cc                |  5 +++--
 gcc/testsuite/gfortran.dg/is_contiguous_6.f90 | 11 +++++++++++
 2 files changed, 14 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gfortran.dg/is_contiguous_6.f90

diff --git a/gcc/fortran/trans-intrinsic.cc b/gcc/fortran/trans-intrinsic.cc
index 5e3681da467..69a6034b3d3 100644
--- a/gcc/fortran/trans-intrinsic.cc
+++ b/gcc/fortran/trans-intrinsic.cc
@@ -2348,9 +2348,10 @@ gfc_conv_is_contiguous_expr (gfc_se *se, gfc_expr *arg)
       gfc_conv_expr_descriptor (&argse, arg);
       gfc_add_block_to_block (&se->pre, &argse.pre);
       gfc_add_block_to_block (&se->post, &argse.post);
-      desc = gfc_evaluate_now (argse.expr, &se->pre);
+      tree ptr = gfc_evaluate_now (argse.expr, &se->pre);
       fncall0 = build_call_expr_loc (input_location,
-				     gfor_fndecl_is_contiguous0, 1, desc);
+				     gfor_fndecl_is_contiguous0, 1, ptr);
+      desc = build_fold_indirect_ref_loc (input_location, ptr);
       se->expr = fncall0;
       se->expr = convert (boolean_type_node, se->expr);
     }
diff --git a/gcc/testsuite/gfortran.dg/is_contiguous_6.f90 b/gcc/testsuite/gfortran.dg/is_contiguous_6.f90
new file mode 100644
index 00000000000..28d11823567
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/is_contiguous_6.f90
@@ -0,0 +1,11 @@
+! { dg-do compile }
+!
+! PR fortran/126892
+! The translation of the IS_CONTIGUOUS call used to cause an internal error
+! because the variable used as descriptor for A was one pointer dereference
+! away from the real descriptor.
+
+subroutine s(a)
+  integer, pointer, intent(in) :: a(..)
+  print *, is_contiguous(a)
+end subroutine
-- 
2.53.0

Reply via email to