https://gcc.gnu.org/g:f059aa93d3c5399a657dfa0a44ff20fc02aa68d1
commit r16-7713-gf059aa93d3c5399a657dfa0a44ff20fc02aa68d1 Author: James Bohl <[email protected]> Date: Wed Feb 25 22:59:44 2026 -0500 a68: Add error on integral denotation overflow Signed-off-by: James Bohl <[email protected]> gcc/algol68/ChangeLog * a68-low-units.cc (a68_lower_denotation): Add error on integral denotation overflow. gcc/testsuite/ChangeLog * algol68/compile/error-denotation-1.a68: New test. * algol68/compile/error-denotation-2.a68: Likewise. * algol68/compile/error-denotation-3.a68: Likewise. * algol68/execute/plusab-1.a68: Fixed denotation overflow. Diff: --- gcc/algol68/a68-low-units.cc | 12 ++++++++++++ gcc/testsuite/algol68/compile/error-denotation-1.a68 | 4 ++++ gcc/testsuite/algol68/compile/error-denotation-2.a68 | 6 ++++++ gcc/testsuite/algol68/compile/error-denotation-3.a68 | 6 ++++++ gcc/testsuite/algol68/execute/plusab-1.a68 | 10 +++++----- 5 files changed, 33 insertions(+), 5 deletions(-) diff --git a/gcc/algol68/a68-low-units.cc b/gcc/algol68/a68-low-units.cc index ba0ab5e23829..8257d2dc96c7 100644 --- a/gcc/algol68/a68-low-units.cc +++ b/gcc/algol68/a68-low-units.cc @@ -41,6 +41,7 @@ #include "convert.h" #include "a68.h" +#include "a68-pretty-print.h" /* Note that enclosed clauses, which are units, are handled in a68-low-clauses. */ @@ -250,8 +251,19 @@ a68_lower_denotation (NODE_T *p, LOW_CTX_T ctx) s = SUB (p); type = CTYPE (moid); + errno = 0; +#if defined(INT64_T_IS_LONG) int64_t val = strtol (NSYMBOL (s), &end, 10); +#else + int64_t val = strtoll (NSYMBOL (s), &end, 10); +#endif gcc_assert (end[0] == '\0'); + if (errno == ERANGE || val > wi::max_value (type).to_shwi ()) + { + a68_moid_format_token m (moid); + a68_error (s, "denotation is too large for %e", &m); + } + return build_int_cst (type, val); } if (moid == M_BITS diff --git a/gcc/testsuite/algol68/compile/error-denotation-1.a68 b/gcc/testsuite/algol68/compile/error-denotation-1.a68 new file mode 100644 index 000000000000..f911cc380b83 --- /dev/null +++ b/gcc/testsuite/algol68/compile/error-denotation-1.a68 @@ -0,0 +1,4 @@ +{ dg-options {-fstropping=supper} } +begin int i0 := 123456789012345678901234567890; { dg-error "denotation is too large for int" } + skip +end diff --git a/gcc/testsuite/algol68/compile/error-denotation-2.a68 b/gcc/testsuite/algol68/compile/error-denotation-2.a68 new file mode 100644 index 000000000000..3aa1ef97baed --- /dev/null +++ b/gcc/testsuite/algol68/compile/error-denotation-2.a68 @@ -0,0 +1,6 @@ +{ dg-options {-fstropping=supper} } +{ dg-require-effective-target int32 } +begin int i0 := 2147483648; { dg-error "denotation is too large for int" } + int i1 := 2147483647; + skip +end diff --git a/gcc/testsuite/algol68/compile/error-denotation-3.a68 b/gcc/testsuite/algol68/compile/error-denotation-3.a68 new file mode 100644 index 000000000000..ed27dc1c5bea --- /dev/null +++ b/gcc/testsuite/algol68/compile/error-denotation-3.a68 @@ -0,0 +1,6 @@ +{ dg-options {-fstropping=supper} } +{ dg-require-effective-target longlong64 } +begin long long int i0 := long long 9223372036854775808; { dg-error "denotation is too large for long long int" } + long long int i1 := long long 9223372036854775807; + skip +end diff --git a/gcc/testsuite/algol68/execute/plusab-1.a68 b/gcc/testsuite/algol68/execute/plusab-1.a68 index 8de4e97b046a..48865f8a1fe4 100644 --- a/gcc/testsuite/algol68/execute/plusab-1.a68 +++ b/gcc/testsuite/algol68/execute/plusab-1.a68 @@ -12,11 +12,11 @@ BEGIN BEGIN INT i := 10; i PLUSAB SHORT 100; ASSERT (i = SHORT 1200) END; - BEGIN SHORT SHORT INT i := SHORT SHORT 10000; - i +:= SHORT SHORT 1000; - ASSERT (i = SHORT SHORT 11000); - i PLUSAB SHORT SHORT 1000; - ASSERT (i = SHORT SHORT 12000) + BEGIN SHORT SHORT INT i := SHORT SHORT 100; + i +:= SHORT SHORT 10; + ASSERT (i = SHORT SHORT 110); + i PLUSAB SHORT SHORT 10; + ASSERT (i = SHORT SHORT 120) END; BEGIN LONG INT i := LONG 1000;
