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);
   }