From 1f24c67ffd19e22d5722a5403e90c991fe42beb2 Mon Sep 17 00:00:00 2001
From: Bob Dubner <rdubner@symas.com>
Date: Mon, 15 Apr 2024 19:58:55 -0400
Subject: [PATCH] refer_fill_internal() handling FldLiteralA

---
 gcc/cobol/genutil.cc | 72 +++++++++++++++++++++-----------------------
 1 file changed, 35 insertions(+), 37 deletions(-)

diff --git a/gcc/cobol/genutil.cc b/gcc/cobol/genutil.cc
index a49033650fd0..00e8479aa488 100644
--- a/gcc/cobol/genutil.cc
+++ b/gcc/cobol/genutil.cc
@@ -2446,15 +2446,28 @@ refer_fill_internal(cbl_refer_t &refer, refer_type_t refer_type)
             integer_zero_node,
             build_int_cst_type(SIZE_T, sizeof(cblc_refer_t)));
 
-
-
-
-
-
-
-
-
-  if( refer.field )
+  if( refer.field && refer.field->type == FldLiteralA )
+    {
+    gg_assign(member(refer.refer_decl_node, "field"),
+              gg_cast(cblc_field_p_type_node,
+                      gg_get_address_of(pseudo_alpha)));
+    if(refer.all)
+      {
+      gg_assign(member(refer.refer_decl_node, "move_all"),
+                refer.all ? integer_one_node : integer_zero_node);
+      }
+    if(refer.addr_of)
+      {
+      gg_assign(member(refer.refer_decl_node, "address_of"),
+              refer.addr_of ? integer_one_node : integer_zero_node);
+      }
+    char *litstring = get_literal_string(refer.field);
+    gg_assign(member(refer.refer_decl_node, "qual_data"),
+              gg_cast(UCHAR_P, gg_string_literal(litstring)));
+    gg_assign(member(refer.refer_decl_node, "qual_size"),
+              build_int_cst_type(SIZE_T, refer.field->data.capacity));
+    }
+  else if( refer.field )
     {
     gg_assign(member(refer.refer_decl_node, "field"),
               gg_cast(cblc_field_p_type_node,
@@ -2476,38 +2489,23 @@ refer_fill_internal(cbl_refer_t &refer, refer_type_t refer_type)
       // This routine establishes the qualifed .qual_data and .qual_size values
       // from the original .data and .capacity values
 
-      // Establish the baseline:
-      if( refer.field->type == FldLiteralA )
+      gg_assign(member(refer.refer_decl_node, "qual_data"),
+                member(refer.field->var_decl_node, "data"));
+      if( refer.field->attr & (intermediate_e | any_length_e) )
         {
-        gg_assign(member(refer.refer_decl_node, "field"),
-                  gg_cast(cblc_field_p_type_node,
-                          gg_get_address_of(pseudo_alpha)));
-        char *litstring = get_literal_string(refer.field);
-        gg_assign(member(refer.refer_decl_node, "qual_data"),
-                  gg_cast(UCHAR_P, gg_string_literal(litstring)));
-        gg_assign(member(refer.refer_decl_node, "qual_size"),
-                  build_int_cst_type(SIZE_T, refer.field->data.capacity));
+        // This is an intermediate; use the length that might have changed
+        // because of a FUNCTION TRIM, or whatnot.
+
+        // We also pick up capacity for variables that were specified in
+        // linkage as ANY LENGTH
+        gg_assign(member(refer.refer_decl_node,"qual_size"),
+                  member(refer.field->var_decl_node, "capacity"));
         }
       else
         {
-        gg_assign(member(refer.refer_decl_node, "qual_data"),
-                  member(refer.field->var_decl_node, "data"));
-        if( refer.field->attr & (intermediate_e | any_length_e) )
-          {
-          // This is an intermediate; use the length that might have changed
-          // because of a FUNCTION TRIM, or whatnot.
-
-          // We also pick up capacity for variables that were specified in
-          // linkage as ANY LENGTH
-          gg_assign(member(refer.refer_decl_node,"qual_size"),
-                    member(refer.field->var_decl_node, "capacity"));
-          }
-        else
-          {
-          // Use the compile-time value
-          gg_assign(member(refer.refer_decl_node,"qual_size"),
-                    build_int_cst_type(SIZE_T, refer.field->data.capacity));
-          }
+        // Use the compile-time value
+        gg_assign(member(refer.refer_decl_node,"qual_size"),
+                  build_int_cst_type(SIZE_T, refer.field->data.capacity));
         }
 
       // Modify qual_data if there are subscripts:
-- 
GitLab