diff --git a/gcc/cobol/genapi.cc b/gcc/cobol/genapi.cc index 5ab508c43840321872f122086039ab2307576d97..92f2ac95a7c30283981b47b0fc9ad56a4ca4bebd 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 @@ -14522,9 +14525,31 @@ 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) ) diff --git a/gcc/cobol/genapi.h b/gcc/cobol/genapi.h index 69113aab2693d962ebb7010b86802bcac6a3d83c..3b17f977d1698a18f12acda0f7677a6e59705362 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 783f01343fc8e713635c00cf9f9013ee9c84bc81..edb2371d6e5b6a29e7b7c90a9f944f17ffb3bec9 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 bd7f26b0cfc3f0088718aa310b45afc928e7d0af..02f1e6dea69986ad149603b3a8fda3d40a43ba19 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 "???";