https://gcc.gnu.org/g:8e15a13e2a756ef05ea285c9c46454d786e05cb5

commit r16-7622-g8e15a13e2a756ef05ea285c9c46454d786e05cb5
Author: Jose E. Marchesi <[email protected]>
Date:   Sun Feb 22 01:49:32 2026 +0100

    a68: fix trimmers with implicit lower and upper bounds
    
    Signed-off-by: Jose E. Marchesi <[email protected]>
    
    gcc/algol68/ChangeLog
    
            * a68-low-units.cc (lower_subscript_for_trimmers): Do not crash
            with trimmers with implicit lower and upper bounds.
    
    gcc/testsuite/ChangeLog
    
            * algol68/execute/trimmer-11.a68: New test.

Diff:
---
 gcc/algol68/a68-low-units.cc                 | 25 ++++++++++++++-----------
 gcc/testsuite/algol68/execute/trimmer-11.a68 | 14 ++++++++++++++
 2 files changed, 28 insertions(+), 11 deletions(-)

diff --git a/gcc/algol68/a68-low-units.cc b/gcc/algol68/a68-low-units.cc
index e9660d750dd6..cc1fd15fccad 100644
--- a/gcc/algol68/a68-low-units.cc
+++ b/gcc/algol68/a68-low-units.cc
@@ -552,22 +552,25 @@ lower_subscript_for_trimmers (NODE_T *p, LOW_CTX_T ctx,
                  {
                    /* Lower bound is implicit.  */
                    FORWARD (q);
-                   if (IS (q, AT_SYMBOL))
-                     {
-                       /* Upper bound is implicit, AT specified.  */
-                       gcc_assert (IS (q, AT_SYMBOL));
-                       at = save_expr (fold_convert (ssizetype, a68_lower_tree 
(NEXT (q), ctx)));
-                     }
-                   else
+                   if (q != NO_NODE)
                      {
-                       upper_bound
-                         = save_expr (fold_convert (ssizetype, a68_lower_tree 
(q, ctx)));
-                       FORWARD (q);
-                       if (q != NO_NODE)
+                       if (IS (q, AT_SYMBOL))
                          {
+                           /* Upper bound is implicit, AT specified.  */
                            gcc_assert (IS (q, AT_SYMBOL));
                            at = save_expr (fold_convert (ssizetype, 
a68_lower_tree (NEXT (q), ctx)));
                          }
+                       else
+                         {
+                           upper_bound
+                             = save_expr (fold_convert (ssizetype, 
a68_lower_tree (q, ctx)));
+                           FORWARD (q);
+                           if (q != NO_NODE)
+                             {
+                               gcc_assert (IS (q, AT_SYMBOL));
+                               at = save_expr (fold_convert (ssizetype, 
a68_lower_tree (NEXT (q), ctx)));
+                             }
+                         }
                      }
                  }
                else
diff --git a/gcc/testsuite/algol68/execute/trimmer-11.a68 
b/gcc/testsuite/algol68/execute/trimmer-11.a68
new file mode 100644
index 000000000000..0d989d7a29fc
--- /dev/null
+++ b/gcc/testsuite/algol68/execute/trimmer-11.a68
@@ -0,0 +1,14 @@
+begin [,]int aa = ((1,2,3),
+                   (4,5,6),
+                   (7,8,9));
+      [,]int bb = aa[2:,:];
+
+      assert(1 ELEMS bb = 2);
+      assert(2 ELEMS bb = 3);
+      assert(bb[1,1] = 4);
+      assert(bb[1,2] = 5);
+      assert(bb[1,3] = 6);
+      assert(bb[2,1] = 7);
+      assert(bb[2,2] = 8);
+      assert(bb[2,3] = 9)
+end

Reply via email to