Hello James.
I just installed the patch on your behalf. Thank you! > 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. > --- > 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(-) > create mode 100644 gcc/testsuite/algol68/compile/error-denotation-1.a68 > create mode 100644 gcc/testsuite/algol68/compile/error-denotation-2.a68 > create mode 100644 gcc/testsuite/algol68/compile/error-denotation-3.a68 > > diff --git a/gcc/algol68/a68-low-units.cc b/gcc/algol68/a68-low-units.cc > index ba0ab5e2382..8257d2dc96c 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 00000000000..f911cc380b8 > --- /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 00000000000..3aa1ef97bae > --- /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 00000000000..ed27dc1c5be > --- /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 8de4e97b046..48865f8a1fe 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;
