]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
a68: check for overflow in bits denotations
authorJose E. Marchesi <jemarch@gnu.org>
Sun, 5 Jul 2026 10:25:28 +0000 (12:25 +0200)
committerJose E. Marchesi <jemarch@gnu.org>
Sun, 5 Jul 2026 12:06:21 +0000 (14:06 +0200)
Signed-off-by: Jose E. Marchesi <jemarch@gnu.org>
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
gcc/testsuite/algol68/compile/error-bits-denotation-1.a68 [new file with mode: 0644]
gcc/testsuite/algol68/execute/and-bits-1.a68
gcc/testsuite/algol68/execute/bits-shift-2.a68
gcc/testsuite/algol68/execute/bits-shift-3.a68
gcc/testsuite/algol68/execute/not-bits-1.a68
gcc/testsuite/algol68/execute/or-bits-1.a68

index e3650aea9521b3b671eb9d4a41f78fb6d7b680e6..ed92a1fd5178a0d66e9f09a535c4e5f35af30ad1 100644 (file)
@@ -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 (file)
index 0000000..455007c
--- /dev/null
@@ -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
index e6530bcdfb016a4329269016c6040a33317090b2..ece00717c322697dcb2b305698aec5f4d9418a4d 100644 (file)
@@ -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
index e946b9787289c831898d3700251ffd7c23f738a1..d3a0d1f628176c434bffcb113691c36fe9ab1e4a 100644 (file)
@@ -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);
index b4536dc436847353dc89a65677dfd23e9534cfb8..12dd342ae2d2398e2457279c98af9024b168d67c 100644 (file)
@@ -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);
index 8334f7f7a7f780564659f6b4885043531ae336e0..ee461d919dc88553770d95d938a889fe0a325eff 100644 (file)
@@ -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
index 4fc1b06225d7fd19d8c79e71c79fd2e85e24b268..945c22a4170b541eb3d722c811f4a866b0dfca02 100644 (file)
@@ -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