[gcc r17-2830] cobol: Allow REDEFINES to have OCCURS at 01 level.
"James K. Lowden via Gcc-cvs" <[email protected]> Thu, 30 Jul 2026 15:41:39 +0000 (GMT)
| Newsgroups | gmane.comp.gcc.cvs |
|---|---|
| Message-ID | <[email protected]> |
https://gcc.gnu.org/g:d2d281c2f81b58fb7298da4c40c4e8434c097b71 commit r17-2830-gd2d281c2f81b58fb7298da4c40c4e8434c097b71 Author: James K. Lowden <[email protected]> Date: Thu Jul 30 11:20:08 2026 -0400 cobol: Allow REDEFINES to have OCCURS at 01 level. Remove asserts in the parser that prevented compilation. Codegen unchanged. gcc/cobol/ChangeLog: PR cobol/126393 * symbols.cc (symbol_redefines_root): Describe purpose in comment. (symbol_explicitly_redefines): Remove function. (symbols_update): Remove over-constrained validation. Diff: --- gcc/cobol/symbols.cc | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/gcc/cobol/symbols.cc b/gcc/cobol/symbols.cc index 7b6902a36e23..3ba1f84b735d 100644 --- a/gcc/cobol/symbols.cc +++ b/gcc/cobol/symbols.cc @@ -762,6 +762,11 @@ symbol_redefines( const struct cbl_field_t *field ) { return NULL; } +/* + * Find the first REDEFINES in a chain of redefines, which may be the input + * field itself. ISO disallows a chain; one may not redefine something that + * redefines something else. That is allowed under -dialect mf. + */ cbl_field_t * symbol_redefines_root( const struct cbl_field_t *field ) { cbl_field_t *root = const_cast<cbl_field_t *>(field); @@ -771,13 +776,6 @@ symbol_redefines_root( const struct cbl_field_t *field ) { return root; } -static cbl_field_t * -symbol_explicitly_redefines( const cbl_field_t *field ) { - auto f = symbol_redefines(field); - if( f && is_record_area(f) ) return NULL; - return f; -} - static uint32_t field_size( const struct cbl_field_t *field ) { size_t n = field->occurs.ntimes(); @@ -1892,13 +1890,7 @@ symbols_update( size_t first, bool parsed_ok ) { } } - bool size_invalid = field->data.memsize > 0 && symbol_redefines(field); - if( size_invalid ) { // redefine of record area is ok - const cbl_field_t * redefined = symbol_redefines(field); - size_invalid = ! is_record_area(redefined); - } - - if( !field->is_valid() || size_invalid ) + if( !field->is_valid() ) { size_t isym = p - symbols_begin(); symbols_dump(symbols.first_program, true); @@ -1950,7 +1942,6 @@ symbols_update( size_t first, bool parsed_ok ) { (fmt_size_t)symbol_index(p), field_str(cbl_field_of(p)) ); } assert(field->data.memsize == 0 || field_size(field) <= field_memsize(field)); - assert( !(field->data.memsize > 0 && symbol_explicitly_redefines(field)) ); } // A shared record area has no 01 child because that child redefines its parent.