diff --git a/gcc/cobol/parse.y b/gcc/cobol/parse.y index 01140e74c164b5a5b477001c01c191da55eabc29..c108a0358ab970bcd365c4d9743b4c0bb77e252f 100644 --- a/gcc/cobol/parse.y +++ b/gcc/cobol/parse.y @@ -3172,10 +3172,11 @@ data_clauses: data_clause YYERROR; } cbl_field_t *field = current_field(); +#if 0 if( symbol_redefines(field) ) { redefine_field(field); } - +#endif const int globex = (global_e | external_e); if( (($$ | $2) & globex) == globex ) { yyerror("GLOBAL and EXTERNAL specified"); diff --git a/gcc/cobol/symbols.cc b/gcc/cobol/symbols.cc index 110c3f038255721950cb5d98adf463a29c3e9550..dbb56bc54a59b2ac9461bbbd683fa90231702824 100644 --- a/gcc/cobol/symbols.cc +++ b/gcc/cobol/symbols.cc @@ -1312,6 +1312,13 @@ static struct symbol_elem_t * if( redefined ) { assert( group == redefined ); max_memsize = std::max(max_memsize, field_memsize(field)); + field->data.capacity = redefined->data.capacity; + if( is_table(field) ) { // reduce capacity by occurs, if any + if( field->data.digits == field->data.capacity ) { + field->data.digits /= field->occurs.ntimes(); + } + field->data.capacity /= field->occurs.ntimes(); + } field->data.memsize = 0; continue; } diff --git a/gcc/cobol/util.cc b/gcc/cobol/util.cc index f3ec7fc036e5c708dd5be5e0148bf433d890a745..7f94c2e8d9ccc425e8f3afc7b20b89443cf51917 100644 --- a/gcc/cobol/util.cc +++ b/gcc/cobol/util.cc @@ -753,13 +753,6 @@ redefine_field( cbl_field_t *field ) { if( field->data.capacity == 0 ) field->data = primary->data; - if( field->occurs.ntimes() > 0 ) { - if( field->data.digits == field->data.capacity ) { - field->data.digits /= field->occurs.ntimes(); - } - field->data.capacity /= field->occurs.ntimes(); - } - if( is_numeric(field->type) && field->usage == FldDisplay ) { fOK = symbol_field_type_update(field, FldNumericDisplay, false); }