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