The following removes uses of strtof128 which are all in some way verifying something parses as _Float128 but which lexing should have guarnateed.
Tested on x86_64-unknown-linux-gnu. Richard. gcc/cobol/ * parse.y (intrinsic): Remove checking that $r1->field->data.initial parses as _Float128. (numstr2i): Remove checking that all of the string is consumed by the converted from number. * symbols.h (strtof128): Remove. (cbl_field_data_t::valify): Remove checking that all of the string is consumed by the number conversion. --- gcc/cobol/parse.y | 21 +++++---------------- gcc/cobol/symbols.h | 20 -------------------- 2 files changed, 5 insertions(+), 36 deletions(-) diff --git a/gcc/cobol/parse.y b/gcc/cobol/parse.y index 390e115f37e..5fa472a3645 100644 --- a/gcc/cobol/parse.y +++ b/gcc/cobol/parse.y @@ -10326,16 +10326,7 @@ intrinsic: function_udf } if( $1 == NUMVAL_F ) { if( is_literal($r1->field) ) { - _Float128 output __attribute__ ((__unused__)); - auto input = $r1->field->data.initial; - auto local = xstrdup(input), pend = local; - std::replace(local, local + strlen(local), ',', '.'); - std::remove_if(local, local + strlen(local), isspace); - output = strtof128(local, &pend); - // bad if strtof128 could not convert input - if( *pend != '\0' ) { - error_msg(@r1, "'%s' is not a numeric string", input); - } + // we assume $r1->field->data.initial parses as float } } if( ! intrinsic_call_1($$, $1, $r1, @r1)) YYERROR; @@ -12065,20 +12056,18 @@ static REAL_VALUE_TYPE numstr2i( const char input[], radix_t radix ) { REAL_VALUE_TYPE output; size_t integer = 0; - int erc=0, n=0; + int erc=0; switch( radix ) { case decimal_e: { // Use decimal point for comma, just in case. - auto local = xstrdup(input), pend = local; + auto local = xstrdup(input); if( !local ) { erc = -1; break; } std::replace(local, local + strlen(local), ',', '.'); real_from_string3 (&output, local, TYPE_MODE (float128_type_node)); - strtof128(local, &pend); - n = pend - local; } break; case hexadecimal_e: - erc = sscanf(input, "%zx%n", &integer, &n); + erc = sscanf(input, "%zx", &integer); real_from_integer (&output, VOIDmode, integer, UNSIGNED); break; case boolean_e: @@ -12101,7 +12090,7 @@ numstr2i( const char input[], radix_t radix ) { real_from_integer (&output, VOIDmode, integer, UNSIGNED); return output; } - if( erc == -1 || n < int(strlen(input)) ) { + if( erc == -1 ) { yywarn("'%s' was accepted as %lld", input, output); } return output; diff --git a/gcc/cobol/symbols.h b/gcc/cobol/symbols.h index 72bb188ec5b..35e4d816233 100644 --- a/gcc/cobol/symbols.h +++ b/gcc/cobol/symbols.h @@ -48,17 +48,6 @@ #define PICTURE_MAX 64 -#if ! (__HAVE_FLOAT128 && __GLIBC_USE (IEC_60559_TYPES_EXT)) -static_assert( sizeof(output) == sizeof(long double), "long doubles?" ); - -// ??? This is still used for verificataion that __nptr parses as -// float number via setting *__endptr. -static inline _Float128 -strtof128 (const char *__restrict __nptr, char **__restrict __endptr) { - return strtold(nptr, endptr); -} -#endif - extern const char *numed_message; enum cbl_dialect_t { @@ -352,15 +341,6 @@ struct cbl_field_data_t { std::replace(input.begin(), input.end(), ',', '.'); } - char *pend = NULL; - - strtof128(input.c_str(), &pend); - - if( pend != input.c_str() + len ) { - dbgmsg("%s: error: could not interpret '%s' of '%s' as a number", - __func__, pend, initial); - } - REAL_VALUE_TYPE r; real_from_string (&r, input.c_str()); r = real_value_truncate (TYPE_MODE (float128_type_node), r); -- 2.43.0