diff --git a/gcc/cobol/genapi.cc b/gcc/cobol/genapi.cc index 71fdca596d93e5432ba7f4ec9162910deca85115..16a647c0547e2b6ff30c96a3ecfcea5962f510d4 100644 --- a/gcc/cobol/genapi.cc +++ b/gcc/cobol/genapi.cc @@ -5918,6 +5918,9 @@ parser_logop( struct cbl_field_t *tgt, gg_assign(tgt->var_decl_node, boolean_true_node); break; + case false_op: + gg_assign(tgt->var_decl_node, boolean_false_node); + break; } TRACE1 @@ -11822,7 +11825,7 @@ parser_set_numeric(struct cbl_field_t *tgt, ssize_t value) SHOW_PARSE { SHOW_PARSE_HEADER - SHOW_PARSE_TEXT(" set") + SHOW_PARSE_TEXT(" set ") SHOW_PARSE_TEXT(tgt->name) SHOW_PARSE_TEXT(" to ") char ach[32]; @@ -11830,6 +11833,7 @@ parser_set_numeric(struct cbl_field_t *tgt, ssize_t value) SHOW_PARSE_TEXT(ach); SHOW_PARSE_END } + gg_call(VOID, "__gg__int128_to_field", 5, @@ -14521,13 +14525,33 @@ parser_local_add(struct cbl_field_t *new_var ) void parser_symbol_add(struct cbl_field_t *new_var ) { - if(new_var->var_decl_node) + if( new_var->var_decl_node ) { - fprintf(stderr, "possible reuse\n"); + if( new_var->type != FldConditional ) + { + // There is a possibility when re-using variables that a temporary that + // was created at compile time might not have a data pointer at run time. + if( new_var->attr & (temporary_e | intermediate_e) ) + { + IF( member(new_var->var_decl_node, "allocated"), + lt_op, + member(new_var->var_decl_node, "capacity") ) + { + gg_free(member(new_var, "data")); + gg_assign(member(new_var, "data"), + gg_cast(UCHAR_P, gg_malloc(new_var->data.capacity))); + gg_assign(member(new_var, "allocated"), + build_int_cst_type(SIZE_T, new_var->data.capacity)); + } + ELSE + { + } + ENDIF + } + } + return; } - - - + if( !(new_var->attr & initialized_e) ) { cbl_field_type_t incoming_type = new_var->type; @@ -15119,6 +15143,6 @@ parser_symbol_add(struct cbl_field_t *new_var ) } else { - //fprintf(stderr, " ...skipped\n"); + fprintf(stderr, "parser_symbol_add() skipping %s", new_var->name); } } diff --git a/gcc/cobol/genapi.h b/gcc/cobol/genapi.h index c66b367cc399929a08161a3fafda4f7ef6a65fbd..7afd147950d6355846a4f127cb7382a3fa81941d 100644 --- a/gcc/cobol/genapi.h +++ b/gcc/cobol/genapi.h @@ -589,9 +589,9 @@ tree parser_cast_long(tree N); void parser_print_long(tree N); void parser_print_long(const char *fmt, tree N); void parser_print_long(long N); -void parser_print_long(const char *fmt, long N); // fmt needs to have a %s in it +void parser_print_long(const char *fmt, long N); // fmt needs to have a %ls in it void parser_print_string(const char *ach); -void parser_print_string(const char *fmt, const char *ach); // fmt needs to have a %ld in it +void parser_print_string(const char *fmt, const char *ach); // fmt needs to have a %s in it void parser_set_statement(const char *statement); char *initial_from_float128(cbl_field_t *field, _Float128 value); diff --git a/gcc/cobol/gengen.cc b/gcc/cobol/gengen.cc index 370ea00abbe3b11559d36be968731d7281356e3f..950f20e92b9dd1563d12f0245d4e29aebf6dbff4 100644 --- a/gcc/cobol/gengen.cc +++ b/gcc/cobol/gengen.cc @@ -1875,6 +1875,7 @@ gg_build_logical_expression(tree operand_a, case xnor_op: case true_op: + case false_op: // This is handled elsewhere break; } diff --git a/gcc/cobol/parse.y b/gcc/cobol/parse.y index 8c82640471b64d20616b7c1500cb619de987f4a0..c7851ba1a361f903d55c4795c184239aa90154d4 100644 --- a/gcc/cobol/parse.y +++ b/gcc/cobol/parse.y @@ -800,6 +800,8 @@ static int prior_statement; static void statement_begin( const YYLTYPE& loc, int token ) { + // The following statement generates a message at run-time + // parser_print_string("statement_begin()\n"); location_set(loc); prior_statement = token; diff --git a/gcc/cobol/symbols.h b/gcc/cobol/symbols.h index 909063f70934d43372b580aad803753aa9aad5de..5f4b5a56b879b98180b12b314e7f3f678afd0916 100644 --- a/gcc/cobol/symbols.h +++ b/gcc/cobol/symbols.h @@ -749,6 +749,7 @@ enum logop_t { xor_op, xnor_op, true_op, + false_op, }; #define SETOP_START 200 @@ -785,6 +786,7 @@ logop_str( enum logop_t logop ) { case xor_op: return "xor"; case xnor_op: return "xnor"; case true_op: return "true"; + case false_op: return "false"; } return "???"; } diff --git a/gcc/cobol/util.cc b/gcc/cobol/util.cc index dfbbc7a89020f2adbf1a9b7f3f5feb30d061d956..733a71efec121cf96eab257258169d5bc2c20b50 100644 --- a/gcc/cobol/util.cc +++ b/gcc/cobol/util.cc @@ -156,6 +156,8 @@ cbl_logop_str( enum logop_t op ) return "xnor_op"; case true_op: return "true_op"; + case false_op: + return "false_op"; } warnx("%s:%d: invalid logop_t %d", __func__, __LINE__, op); return "???"; diff --git a/libgcobol/libgcobol.cc b/libgcobol/libgcobol.cc index d1ce4a8ce5d0128f0868e2200163e9e705d1ba8f..161c150a3c64ed4379d94db809e0c281bf276aff 100644 --- a/libgcobol/libgcobol.cc +++ b/libgcobol/libgcobol.cc @@ -3977,7 +3977,9 @@ __gg__initialize_variable(cblc_refer_t *var_ref, cblc_field_t *var = var_ref->field; if( var_ref->field->data == NULL - && var_ref->field->attr & (temporary_e | intermediate_e) ) + && var_ref->field->attr & (temporary_e | intermediate_e) + && var_ref->field->type != FldLiteralA + && var_ref->field->type != FldLiteralN ) { var_ref->field->data = (unsigned char *)malloc(var_ref->field->capacity); }