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;