Jim discovered a couple of tests that succeed on my system didn't succeed
on his.  That led to the discovery that some stuff in my test environment
hadn't actually found its way in to trunk.

This fixes that.

>From 0747d51de55ae29430cb3ae6371210076d7b7c0d Mon Sep 17 00:00:00 2001
From: Robert Dubner mailto:rdub...@symas.com
Date: Wed, 26 Mar 2025 16:07:44 -0400
Subject: [PATCH] cobol: Bring trunk into line with Dubner's test system.

gcc/cobol

        * genapi.cc: (parser_display_internal): Adjust for E vs e exponent
notation.
        * parse.y: (literal_refmod_valid): Display correct value in error
message.
---
 gcc/cobol/genapi.cc | 24 ++++++++++++++++++++++--
 gcc/cobol/parse.y   |  4 ++--
 2 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/gcc/cobol/genapi.cc b/gcc/cobol/genapi.cc
index 8a58423264e4..301ae9fffe0f 100644
--- a/gcc/cobol/genapi.cc
+++ b/gcc/cobol/genapi.cc
@@ -4890,14 +4890,34 @@ parser_display_internal(tree file_descriptor,
     if( !p )
       {
       // Probably INF -INF NAN or -NAN, so ach has our result
+      // Except that real_to_decimal prints -0.0 and 0.0 like that with
+      // no e.
+      if( ach[0] == '0' || ( ach[0] == '-' && ach[1] == '0' ))
+        __gg__remove_trailing_zeroes(ach);
       }
     else
       {
-      p += 1;
-      int exp = atoi(p);
+      int exp = atoi(p+1);
       if( exp >= 6 || exp <= -5 )
         {
         // We are going to stick with the E notation, so ach has our
result
+        // Except that real_to_decimal prints with e notation rather than
E
+        // and doesn't guarantee at least two exponent digits.
+        *p = 'E';
+        if( exp < 0 && exp >= -9 )
+          {
+            p[1] = '-';
+            p[2] = '0';
+            p[3] = '0' - exp;
+            p[4] = '\0';
+          }
+        else if( exp >= 0 && exp <= 9 )
+          {
+            p[1] = '+';
+            p[2] = '0';
+            p[3] = '0' + exp;
+            p[4] = '\0';
+          }
         }
       else if (exp == 0)
         {
diff --git a/gcc/cobol/parse.y b/gcc/cobol/parse.y
index bad99528e599..538e56fa64d1 100644
--- a/gcc/cobol/parse.y
+++ b/gcc/cobol/parse.y
@@ -12856,14 +12856,14 @@ literal_refmod_valid( YYLTYPE loc, const
cbl_refer_t& r ) {
     if( ! is_literal(refmod.len->field) ) return true;
     auto edge = refmod.len->field->as_integer();
     if( 0 < edge ) {
-      if( --edge < r.field->data.capacity ) return true;
+      if( edge-1 < r.field->data.capacity ) return true;
     }
     // len < 0 or not: 0 < from + len <= capacity
     error_msg(loc, "%s(%s:%zu) out of bounds, "
                   "size is %u",
              r.field->name,
              refmod.from->name(),
-             size_t(refmod.len->field->data.value_of()),
+             size_t(edge),
              static_cast<unsigned int>(r.field->data.capacity) );
     return false;
   }
-- 
2.34.1

Reply via email to