diff --git a/gcc/cobol/parse_ante.h b/gcc/cobol/parse_ante.h
index 865dd1c11b0d4da8ee4945f43c60c513bf95539c..376cb289f3d5c75adb0ab2e79e9a02e86131bd15 100644
--- a/gcc/cobol/parse_ante.h
+++ b/gcc/cobol/parse_ante.h
@@ -2166,7 +2166,11 @@ valid_redefine( const cbl_field_t *field, const cbl_field_t *orig ) {
    */
   if( field->type != FldGroup && orig->type != FldGroup ) {
     if( orig->size() < field->size() ) {
-      if( orig->level > 1 || has_field_attr(orig->attr, external_e) ) 
+      if( orig->level > 1 || has_field_attr(orig->attr, external_e) )
+        if( yydebug ) {
+          yyerrorv( "size error orig:  %s", field_str(orig) );
+          yyerrorv( "size error redef: %s", field_str(field) );
+        }
         yyerrorv( "error: %s (%s size %u) larger than REDEFINES %s (%s size %u)",
                   field->name,
                   3 + cbl_field_type_str(field->type), field->size(),
diff --git a/gcc/cobol/util.cc b/gcc/cobol/util.cc
index bbc3e7824c9d56824e10f4e149eed1800de043c0..f3ec7fc036e5c708dd5be5e0148bf433d890a745 100644
--- a/gcc/cobol/util.cc
+++ b/gcc/cobol/util.cc
@@ -752,6 +752,13 @@ 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);