[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.