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/execute/plusab-1.a68: Fixed denotation overflow.
---
 gcc/algol68/a68-low-units.cc                         |  9 +++++++++
 gcc/testsuite/algol68/compile/error-denotation-1.a68 |  5 +++++
 gcc/testsuite/algol68/execute/plusab-1.a68           | 10 +++++-----
 3 files changed, 19 insertions(+), 5 deletions(-)
 create mode 100644 gcc/testsuite/algol68/compile/error-denotation-1.a68

diff --git a/gcc/algol68/a68-low-units.cc b/gcc/algol68/a68-low-units.cc
index cc1fd15fcca..e99f4b2cd63 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,16 @@ a68_lower_denotation (NODE_T *p, LOW_CTX_T ctx)
        s = SUB (p);
 
       type = CTYPE (moid);
+      errno = 0;
       int64_t val = strtol (NSYMBOL (s), &end, 10);
       gcc_assert (end[0] == '\0');
+      tree t = build_int_cst (long_long_integer_type_node, val);
+      if (errno == ERANGE || !int_fits_type_p (t, type))
+       {
+         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..4b037aac5fa
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-denotation-1.a68
@@ -0,0 +1,5 @@
+{ dg-options {-fstropping=supper} }
+begin int i := 20000000000000000000; { dg-error "denotation is too large for 
int" }
+      int j := 2000000000000000000; { dg-error "denotation is too large for 
int" }
+      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

Reply via email to