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
