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