diff --git a/gcc/cobol/symfind.cc b/gcc/cobol/symfind.cc index 2facc63ad4bcbf62715fb42aabd7ee74a522651c..535710cf3c91cef8d5b95671564310cc1f3cc993 100644 --- a/gcc/cobol/symfind.cc +++ b/gcc/cobol/symfind.cc @@ -400,7 +400,7 @@ symbol_match2( size_t program, { std::vector<size_t> fields; - field_key_t key(program, names.front()); + field_key_t key(program, names.back()); for( auto candidate : symbol_map2[key] ) { auto e = symbol_at(candidate); diff --git a/gcc/cobol/util.cc b/gcc/cobol/util.cc index 4399c7d93258bb5bd37b69d390b427a961a1cecc..02da3160d9593b37b5f13c842c6c4350af621f00 100644 --- a/gcc/cobol/util.cc +++ b/gcc/cobol/util.cc @@ -1990,9 +1990,12 @@ cobol_filename_restore() { return input.name; } +static inline size_t +matched_length( const regmatch_t& rm ) { return rm.rm_eo - rm.rm_so; } + const char * cobol_fileline_set( const char line[] ) { - static const char pattern[] = "#line +([[:alnum:]]+) +([\"'][^\"']+). *\n"; + static const char pattern[] = "#line +([[:alnum:]]+) +[\"']([^\"']+). *\n"; static const int cflags = REG_EXTENDED | REG_ICASE; static regex_t re, *preg = NULL; @@ -2018,8 +2021,8 @@ cobol_fileline_set( const char line[] ) { } const char - *line_str = xstrndup(line + pmatch[1].rm_so, pmatch[1].rm_eo), - *filename = xstrndup(line + pmatch[2].rm_so, pmatch[2].rm_eo); + *line_str = xstrndup(line + pmatch[1].rm_so, matched_length(pmatch[1])), + *filename = xstrndup(line + pmatch[2].rm_so, matched_length(pmatch[2])); int fileline; if( 1 != sscanf(line_str, "%d", &fileline) ) @@ -2027,6 +2030,8 @@ cobol_fileline_set( const char line[] ) { input_file_t input_file( filename, fileline ); + if( getenv(__func__) ) return filename; // ignore #line directive + if( input_filenames.empty() ) { input_filenames.push(input_file); }