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;
--
2.52.0