diff --git a/gcc/cobol/genutil.cc b/gcc/cobol/genutil.cc index 3682b107c5a..4b296e46e87 100644 --- a/gcc/cobol/genutil.cc +++ b/gcc/cobol/genutil.cc @@ -819,7 +819,7 @@ get_binary_value( tree value, } ELSE { - // We are dealing with an ordinary NumericEdited value + // We are dealing with an ordinary NumericDisplay value gg_assign(pointer, source_address); if( rdigits ) diff --git a/gcc/cobol/parse.y b/gcc/cobol/parse.y index 59cc64ddeca..039cb957de0 100644 --- a/gcc/cobol/parse.y +++ b/gcc/cobol/parse.y @@ -11959,7 +11959,10 @@ current_t::udf_args_valid( const cbl_label_t *L, if( arg.field ) { // else omitted auto tgt = cbl_field_of(symbol_at(udf.linkage_fields.at(i).isym)); if( ! valid_move(tgt, arg.field) ) { - auto loc = symbol_field_location(field_index(arg.field)); + auto loc = current_location; + if( ! is_temporary(arg.field) ) { + loc = symbol_field_location(field_index(arg.field)); + } error_msg(loc, "FUNCTION %s argument %zu, '%s' cannot be passed to %s, type %s", L->name, i, arg.field->pretty_name(), tgt->pretty_name(), 3 + cbl_field_type_str(tgt->type) ); diff --git a/gcc/cobol/symbols.cc b/gcc/cobol/symbols.cc index f2cd1b55f80..bbe99b6801f 100644 --- a/gcc/cobol/symbols.cc +++ b/gcc/cobol/symbols.cc @@ -1598,7 +1598,17 @@ extend_66_capacity( cbl_field_t *alias ) { symbol_elem_t *e = symbol_at(alias->parent); symbol_elem_t *e2 = reinterpret_cast(const_cast(alias->data.picture)); +#ifndef __OPTIMIZE__ +#pragma message "The assert(e < e2) needs fixing" + // The following assert fails when valgrind is involved. This is the known + // problem of expecting mmap() to put new memory maps after older memory + // maps; that assumption fails when valgrind is involved. + + // For now I am defeating the assert when using -O0 so that I can run the + // NIST "make valgrind" tests. But this should be fixed so that the + // symbol table index is used, not the entry locations. assert(e < e2); +#endif alias->data.picture = NULL; capacity_of cap; diff --git a/libgcobol/libgcobol.cc b/libgcobol/libgcobol.cc index 42762536681..1b54cfdc389 100644 --- a/libgcobol/libgcobol.cc +++ b/libgcobol/libgcobol.cc @@ -2990,6 +2990,9 @@ format_for_display_internal(char **dest, { // Because a NumericDisplay can have any damned thing as a character, // we are going force things that aren't digits to display as '0' + + // 0xFF is an exception, so that a HIGH-VALUE in a numeric display shows + // up in a unique way. static const uint8_t ascii_chars[256] = { '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', // 0x00 @@ -3007,7 +3010,7 @@ format_for_display_internal(char **dest, '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', // 0xc0 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', // 0xd0 '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', // 0xe0 - '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', // 0xf0 + '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', 0xFF, // 0xf0 }; static const uint8_t ebcdic_chars[256] = { @@ -3026,7 +3029,7 @@ format_for_display_internal(char **dest, 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, // 0xc0 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, // 0xd0 0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, // 0xe0 - 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xf0,0xf0,0xf0,0xf0,0xf0,0xf0, // 0xf0 + 0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xf0,0xf0,0xf0,0xf0,0xf0,0xFF, // 0xf0 } ; // We are going to make use of fact that a NumericDisplay's data is @@ -3114,22 +3117,20 @@ format_for_display_internal(char **dest, // But when it isn't HIGH-VALUE, we don't want to see the effects // of the internal sign. - if( (*dest)[index-1] != (char)DEGENERATE_HIGH_VALUE ) - { - // Another tricky thing, though, is that for various reasons - // the string of digits might not be digits. There can be - // REDEFINES, or the middle of the number might have been changed - // with an INITIALIZE into spaces. But we do want numbers to - // look like numbers. So, we do what we can: - if( internal_is_ebcdic ) - { - ch = ebcdic_chars[ch]; - } - else - { - ch = ascii_chars[ch]; - } + // Another tricky thing, though, is that for various reasons + // the string of digits might not be digits. There can be + // REDEFINES, or the middle of the number might have been changed + // with an INITIALIZE into spaces. But we do want numbers to + // look like numbers. So, we do what we can: + + if( internal_is_ebcdic ) + { + ch = ebcdic_chars[ch]; + } + else + { + ch = ascii_chars[ch]; } (*dest)[index++] = ch; } @@ -3151,16 +3152,13 @@ format_for_display_internal(char **dest, for(int i=0; i= 0 ) + { + pointer += examined + id2_s[ifound]; + } } done: