diff --git a/gcc/cobol/symbols.cc b/gcc/cobol/symbols.cc index 3ba910eb0bc0a28480c0713086a0fc2f4e26d3ec..a2cd7eb97082da0534b74d31e69b29430a2627e9 100644 --- a/gcc/cobol/symbols.cc +++ b/gcc/cobol/symbols.cc @@ -2611,6 +2611,15 @@ symbol_field_alias2( struct symbol_elem_t *e, struct symbol_elem_t *e2, return e; } +class elem_group_t { + const symbol_elem_t *bog, *eog; +public: + elem_group_t( const symbol_elem_t *bog, const symbol_elem_t *eog ) + : bog(bog), eog(eog) {} + const symbol_elem_t *begin() const { return bog; } + const symbol_elem_t *end() const { return eog; } +}; + /* * For SAME AS definition, copy the field metadata and update the parent. * For a group, create new fields and copy members recursively. @@ -2646,31 +2655,28 @@ symbol_field_same_as( cbl_field_t *tgt, const cbl_field_t *src ) { cbl_field_t dup = { .parent = field_index(tgt), .line = tgt->line }; - // for each duplicate, map src index to duplicate index - std::map<size_t, size_t> orig; - orig[isrc] = field_index(tgt); - - class group_t { - const symbol_elem_t *bog, *eog; - public: - group_t( const symbol_elem_t *bog, const symbol_elem_t *eog ) - : bog(bog), eog(eog) {} - const symbol_elem_t *begin() const { return bog; } - const symbol_elem_t *end() const { return eog; } - }; - - group_t group(++bog, eog); + elem_group_t group(++bog, eog); for( const auto& elem : group ) { - const auto& that(*cbl_field_of(&elem)); - memcpy(dup.name, that.name, sizeof(dup.name)); - dup.parent = orig.at(that.parent); - dup.level = that.level; - if(dup.level != 88) dup.level += tgt->level; - dup.same_as( that, src->is_typedef() ); + const cbl_field_t *that(cbl_field_of(&elem)); + if( is_forward(that) ) { + auto e = symbol_field(current_program_index(), 0, that->name); + that = cbl_field_of(e); // must exist + } + memcpy(dup.name, that->name, sizeof(dup.name)); + dup.level = that->level; + switch( dup.level ) { + case 0: + assert(that->type == FldIndex); + case 88: + break; + default: + dup.level += tgt->level; + break; + } + dup.same_as( *that, src->is_typedef() ); last_elem = symbol_field_add( last_elem->program, &dup ); - orig[ symbol_index(&elem) ] = symbol_index(last_elem); } return last_elem;