Signed-off-by: Jose E. Marchesi <[email protected]>

gcc/algol68/ChangeLog

        * a68-low-units.cc (a68_lower_denotation): Check for denotations
        too big for bits modes.

gcc/testsuite/ChangeLog

        * algol68/compile/error-bits-denotation-1.a68: New test.
        * algol68/execute/and-bits-1.a68: Fix invalid bits denotations.
        * algol68/execute/bits-shift-2.a68: Likewise.
        * algol68/execute/bits-shift-3.a68: Likewise.
        * algol68/execute/not-bits-1.a68: Likewise.
        * algol68/execute/or-bits-1.a68: Likewise.
---
 gcc/algol68/a68-low-units.cc                              | 8 ++++++++
 gcc/testsuite/algol68/compile/error-bits-denotation-1.a68 | 6 ++++++
 gcc/testsuite/algol68/execute/and-bits-1.a68              | 6 +++---
 gcc/testsuite/algol68/execute/bits-shift-2.a68            | 8 ++++----
 gcc/testsuite/algol68/execute/bits-shift-3.a68            | 8 ++++----
 gcc/testsuite/algol68/execute/not-bits-1.a68              | 4 ++--
 gcc/testsuite/algol68/execute/or-bits-1.a68               | 6 +++---
 7 files changed, 30 insertions(+), 16 deletions(-)
 create mode 100644 gcc/testsuite/algol68/compile/error-bits-denotation-1.a68

diff --git a/gcc/algol68/a68-low-units.cc b/gcc/algol68/a68-low-units.cc
index e3650aea952..ed92a1fd517 100644
--- a/gcc/algol68/a68-low-units.cc
+++ b/gcc/algol68/a68-low-units.cc
@@ -302,6 +302,14 @@ a68_lower_denotation (NODE_T *p, LOW_CTX_T ctx)
       uint64_t val = strtoull (end, &end, radix);
 #endif
       gcc_assert (errno == 0 && end[0] == '\0');
+
+      uint64_t max_positive = uint64_t (wi::max_value (type).to_uhwi ());
+      if (errno == ERANGE || val > max_positive)
+       {
+         a68_moid_format_token m (moid);
+         a68_error (s, "denotation is too large for %e", &m);
+       }
+
       return build_int_cst (type, val);
     }
   else if (moid == M_REAL
diff --git a/gcc/testsuite/algol68/compile/error-bits-denotation-1.a68 
b/gcc/testsuite/algol68/compile/error-bits-denotation-1.a68
new file mode 100644
index 00000000000..455007c2905
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/error-bits-denotation-1.a68
@@ -0,0 +1,6 @@
+begin short short bits a
+            = short short 10r256; { dg-error "denotation is too large for 
short short bits" }
+      short bits b
+            = short 16rffff1; { dg-error "denotation is too large for short 
bits" }
+      skip
+end
diff --git a/gcc/testsuite/algol68/execute/and-bits-1.a68 
b/gcc/testsuite/algol68/execute/and-bits-1.a68
index e6530bcdfb0..ece00717c32 100644
--- a/gcc/testsuite/algol68/execute/and-bits-1.a68
+++ b/gcc/testsuite/algol68/execute/and-bits-1.a68
@@ -12,7 +12,7 @@ BEGIN BITS b = 16r0f0f0;
       SHORT BITS ss = SHORT 16r0f0f0;
       ASSERT ((ss AND SHORT 16r0f0f) = SHORT 16r0);
       ASSERT ((ss AND SHORT 16r00ff) = SHORT 16rf0);
-      SHORT SHORT BITS sss = SHORT SHORT 16r0f0f0;
-      ASSERT ((sss AND SHORT SHORT 16r0f0f) = SHORT SHORT 16r0);
-      ASSERT ((sss AND SHORT SHORT 16r00ff) = SHORT SHORT 16rf0)
+      SHORT SHORT BITS sss = SHORT SHORT 16rf0;
+      ASSERT ((sss AND SHORT SHORT 16r0f) = SHORT SHORT 16r0);
+      ASSERT ((sss AND SHORT SHORT 16rff) = SHORT SHORT 16rf0)
 END
diff --git a/gcc/testsuite/algol68/execute/bits-shift-2.a68 
b/gcc/testsuite/algol68/execute/bits-shift-2.a68
index e946b978728..d3a0d1f6281 100644
--- a/gcc/testsuite/algol68/execute/bits-shift-2.a68
+++ b/gcc/testsuite/algol68/execute/bits-shift-2.a68
@@ -1,24 +1,24 @@
 { Shifting by L_bits_width results in all bits being zero. }
 
-begin assert (short short 16rffff SHR short_short_bits_width = short short 
16r0);
+begin assert (short short 16rff SHR short_short_bits_width = short short 16r0);
       assert (short 16rffff SHR short_bits_width = short 16r0);
       assert (16rffff SHR bits_width = 16r0);
       assert (long 16rffff SHR long_bits_width = long 16r0);
       assert (long long 16rffff SHR long_long_bits_width = long long 16r0);
 
-      assert (short short 16rffff SHR -short_short_bits_width = short short 
16r0);
+      assert (short short 16rff SHR -short_short_bits_width = short short 
16r0);
       assert (short 16rffff SHR -short_bits_width = short 16r0);
       assert (16rffff SHR -bits_width = 16r0);
       assert (long 16rffff SHR -long_bits_width = long 16r0);
       assert (long long 16rffff SHR -long_long_bits_width = long long 16r0);
 
-      assert (short short 16rffff SHL short_short_bits_width = short short 
16r0);
+      assert (short short 16rff SHL short_short_bits_width = short short 16r0);
       assert (short 16rffff SHL short_bits_width = short 16r0);
       assert (16rffff SHL bits_width = 16r0);
       assert (long 16rffff SHL long_bits_width = long 16r0);
       assert (long long 16rffff SHL long_long_bits_width = long long 16r0);
 
-      assert (short short 16rffff SHL -short_short_bits_width = short short 
16r0);
+      assert (short short 16rff SHL -short_short_bits_width = short short 
16r0);
       assert (short 16rffff SHL -short_bits_width = short 16r0);
       assert (16rffff SHL -bits_width = 16r0);
       assert (long 16rffff SHL -long_bits_width = long 16r0);
diff --git a/gcc/testsuite/algol68/execute/bits-shift-3.a68 
b/gcc/testsuite/algol68/execute/bits-shift-3.a68
index b4536dc4368..12dd342ae2d 100644
--- a/gcc/testsuite/algol68/execute/bits-shift-3.a68
+++ b/gcc/testsuite/algol68/execute/bits-shift-3.a68
@@ -1,24 +1,24 @@
 { Shifting by > L_bits_width results in all bits being zero. }
 
-begin assert (short short 16rffff SHR (short_short_bits_width + 1) = short 
short 16r0);
+begin assert (short short 16rff SHR (short_short_bits_width + 1) = short short 
16r0);
       assert (short 16rffff SHR (short_bits_width + 1) = short 16r0);
       assert (16rffff SHR (bits_width + 1) = 16r0);
       assert (long 16rffff SHR (long_bits_width + 1) = long 16r0);
       assert (long long 16rffff SHR (long_long_bits_width + 1) = long long 
16r0);
 
-      assert (short short 16rffff SHR -(short_short_bits_width + 1) = short 
short 16r0);
+      assert (short short 16rff SHR -(short_short_bits_width + 1) = short 
short 16r0);
       assert (short 16rffff SHR -(short_bits_width + 1) = short 16r0);
       assert (16rffff SHR -(bits_width + 1) = 16r0);
       assert (long 16rffff SHR -(long_bits_width + 1) = long 16r0);
       assert (long long 16rffff SHR -(long_long_bits_width + 1) = long long 
16r0);
 
-      assert (short short 16rffff SHL (short_short_bits_width + 1) = short 
short 16r0);
+      assert (short short 16rff SHL (short_short_bits_width + 1) = short short 
16r0);
       assert (short 16rffff SHL (short_bits_width + 1) = short 16r0);
       assert (16rffff SHL (bits_width + 1) = 16r0);
       assert (long 16rffff SHL (long_bits_width + 1) = long 16r0);
       assert (long long 16rffff SHL (long_long_bits_width + 1) = long long 
16r0);
 
-      assert (short short 16rffff SHL -(short_short_bits_width + 1) = short 
short 16r0);
+      assert (short short 16rff SHL -(short_short_bits_width + 1) = short 
short 16r0);
       assert (short 16rffff SHL -(short_bits_width + 1) = short 16r0);
       assert (16rffff SHL -(bits_width + 1) = 16r0);
       assert (long 16rffff SHL -(long_bits_width + 1) = long 16r0);
diff --git a/gcc/testsuite/algol68/execute/not-bits-1.a68 
b/gcc/testsuite/algol68/execute/not-bits-1.a68
index 8334f7f7a7f..ee461d919dc 100644
--- a/gcc/testsuite/algol68/execute/not-bits-1.a68
+++ b/gcc/testsuite/algol68/execute/not-bits-1.a68
@@ -8,6 +8,6 @@ BEGIN BITS b = 16rf0f0;
       ASSERT ((NOT bbb AND LONG LONG 16rffff) = LONG LONG 16r0f0f);
       SHORT BITS ss = SHORT 16rf0f0;
       ASSERT ((NOT ss AND SHORT 16rffff) = SHORT 16r0f0f);
-      SHORT SHORT BITS sss = SHORT SHORT 16rf0f0;
-      ASSERT ((NOT sss AND SHORT SHORT 16rffff) = SHORT SHORT 16r0f0f)
+      SHORT SHORT BITS sss = SHORT SHORT 16rf0;
+      ASSERT ((NOT sss AND SHORT SHORT 16rff) = SHORT SHORT 16r0f)
 END
diff --git a/gcc/testsuite/algol68/execute/or-bits-1.a68 
b/gcc/testsuite/algol68/execute/or-bits-1.a68
index 4fc1b06225d..945c22a4170 100644
--- a/gcc/testsuite/algol68/execute/or-bits-1.a68
+++ b/gcc/testsuite/algol68/execute/or-bits-1.a68
@@ -12,7 +12,7 @@ BEGIN BITS b = 16rf0f0;
       SHORT BITS ss = SHORT 16rf0f0;
       ASSERT ((ss OR SHORT 16r0f0f) = SHORT 16rffff);
       ASSERT ((ss OR SHORT 16r00ff) = SHORT 16rf0ff);
-      SHORT SHORT BITS sss = SHORT SHORT 16rf0f0;
-      ASSERT ((sss OR SHORT SHORT 16r0f0f) = SHORT SHORT 16rffff);
-      ASSERT ((sss OR SHORT SHORT 16r00ff) = SHORT SHORT 16rf0ff)
+      SHORT SHORT BITS sss = SHORT SHORT 16rf0;
+      ASSERT ((sss OR SHORT SHORT 16r0f) = SHORT SHORT 16rff);
+      ASSERT ((sss OR SHORT SHORT 16rff) = SHORT SHORT 16rff)
 END
-- 
2.39.5

Reply via email to