https://gcc.gnu.org/g:3d8093d7cb7acb98288657ae34a9c99f8fd5a14c
commit r17-2279-g3d8093d7cb7acb98288657ae34a9c99f8fd5a14c Author: James K. Lowden <[email protected]> Date: Thu Jul 9 10:42:42 2026 -0400 cobol: prevent invalid TYPE reference, and define YYLOCATION_PRINT gcc/cobol/ChangeLog: PR cobol/126105 * parse.y: Remove unnecessary test and improve diagnostic message. * parse_ante.h (yylocation_print): New function. (YYLOCATION_PRINT): Define, because user-defined cbl_loc_t location. * symbols.cc (symbol_typedef): Exclude current field from type search. * symbols.h (symbol_typedef): Delete unused overload. Diff: --- gcc/cobol/parse.y | 16 +++++++--------- gcc/cobol/parse_ante.h | 9 +++++++++ gcc/cobol/symbols.cc | 2 +- gcc/cobol/symbols.h | 1 - 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/gcc/cobol/parse.y b/gcc/cobol/parse.y index 2d9263d983c5..f7a2be95a0ab 100644 --- a/gcc/cobol/parse.y +++ b/gcc/cobol/parse.y @@ -5468,19 +5468,17 @@ sign_separate: %empty { $$ = false; } type_clause: TYPE to typename { cbl_field_t *field = current_field(); - if( $typename ) { - const auto e = symbol_field_same_as(field, $typename); - symbol_field_location( symbol_index(e), @typename ); - } + assert( $typename ); + const auto e = symbol_field_same_as(field, $typename); + symbol_field_location( symbol_index(e), @typename ); } | USAGE is typename { dialect_ok(@typename, MfUsageTypename, "USAGE TYPENAME"); cbl_field_t *field = current_field(); - if( $typename ) { - const auto e = symbol_field_same_as(field, $typename); - symbol_field_location( symbol_index(e), @typename ); - } + assert( $typename ); + const auto e = symbol_field_same_as(field, $typename); + symbol_field_location( symbol_index(e), @typename ); } ; @@ -7415,7 +7413,7 @@ typename: NAME { auto e = symbol_typedef(PROGRAM, $NAME); if( ! e ) { - error_msg(@1, "DATA-ITEM '%s' not found", $NAME ); + error_msg(@1, "TYPE %qs not found", $NAME ); YYERROR; } $$ = cbl_field_of(e); diff --git a/gcc/cobol/parse_ante.h b/gcc/cobol/parse_ante.h index 01d546cb85ae..b0b062f80dc6 100644 --- a/gcc/cobol/parse_ante.h +++ b/gcc/cobol/parse_ante.h @@ -129,6 +129,15 @@ static bool successful_parse() { void input_file_status_notify(); +static void +yylocation_print(FILE* file, const cbl_loc_t& loc) { + fprintf(file, "%d.%d-%d.%d", + loc.first_line, loc.first_column, + loc.last_line, loc.last_column); +} + +#define YYLOCATION_PRINT(File, Loc) yylocation_print(File, *Loc) + #define YYLLOC_DEFAULT(Current, Rhs, N) \ do { \ if (N) \ diff --git a/gcc/cobol/symbols.cc b/gcc/cobol/symbols.cc index 951eac6a955d..d11bcb25ae97 100644 --- a/gcc/cobol/symbols.cc +++ b/gcc/cobol/symbols.cc @@ -2893,7 +2893,7 @@ symbol_typedef( size_t program, const char name[] ) auto beg = std::reverse_iterator<symbol_elem_t *>(symbols_end()); auto end = std::reverse_iterator<symbol_elem_t *>(symbols_begin(program)); - auto p = std::find_if( beg, end, + auto p = std::find_if( ++beg, end, [name]( const symbol_elem_t& sym ) { if( sym.type == SymField ) { auto f = cbl_field_of(&sym); diff --git a/gcc/cobol/symbols.h b/gcc/cobol/symbols.h index 3744b3a7f616..fe167c90df4a 100644 --- a/gcc/cobol/symbols.h +++ b/gcc/cobol/symbols.h @@ -2847,7 +2847,6 @@ cbl_namelist_t teed_up_names(); size_t end_of_group( size_t igroup ); -symbol_elem_t * symbol_typedef( size_t program, std::list<const char *> names ); symbol_elem_t * symbol_typedef( size_t program, const char name[] ); symbol_elem_t * symbol_field( size_t program, size_t parent, const char name[] ); cbl_label_t * symbol_label( size_t program, cbl_label_type_t type,
