[gcc r17-2632] cobol: Improve "sameness" test when deciding whether a CDF token was used.

"James K. Lowden via Gcc-cvs" <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:70add872be783070deab8285ebb3a175d42256e3

commit r17-2632-g70add872be783070deab8285ebb3a175d42256e3
Author: James K. Lowden <[email protected]>
Date:   Wed Jul 22 17:50:47 2026 -0400

    cobol: Improve "sameness" test when deciding whether a CDF token was used.
    
    In establishing whether or not the CDF parser discarded a lookahead
    token, compare not just the last scanned token's type, but also its
    location.
    
    gcc/cobol/ChangeLog:
    
            * cdf.y (cdf::location): New function.
            * scan_post.h (same_end): New function to match token ending
            locations.
            (same_token): New function to match two tokens.

Diff:
---
 gcc/cobol/cdf.y       |  7 +++++++
 gcc/cobol/scan_post.h | 26 ++++++++++++++++++++++++--
 2 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/gcc/cobol/cdf.y b/gcc/cobol/cdf.y
index f239e60ae602..9196a545b6a5 100644
--- a/gcc/cobol/cdf.y
+++ b/gcc/cobol/cdf.y
@@ -932,6 +932,13 @@ location_set( const cbl_loc_t& loc ) {
   return cdf_location = loc;
 }
 
+namespace cdf {
+    cbl_loc_t
+    location() {
+        return ::cdf_location;
+    }
+}
+
 bool // used by cobol1.cc
 defined_cmd( const char arg[] )
 {
diff --git a/gcc/cobol/scan_post.h b/gcc/cobol/scan_post.h
index 838882b44cb4..0ad0f95fcdb2 100644
--- a/gcc/cobol/scan_post.h
+++ b/gcc/cobol/scan_post.h
@@ -251,11 +251,31 @@ struct recent_token_t {
   cbl_loc_t loc;
   recent_token_t( int token, YYSTYPE value, cbl_loc_t loc )
     : token(token), value(value), loc(loc) {}
+  // for matching the current token against the token queue
+  recent_token_t( int token, cbl_loc_t loc )
+    : token(token), loc(loc) {}
 };
 #define RECENT(T) recent_token_t( (T), yylval )
 
 namespace cdf {
   int used_token();
+  cbl_loc_t location();
+}
+
+static bool
+same_end(const cbl_loc_t& a, const cbl_loc_t& b ) {
+  return a.last_line == b.last_line
+    &&   a.last_column == b.last_column;
+}
+
+/*
+ * Two tokens are one and the same if they have the type and end at the same
+ * place.  The scanner's idea of the current location might embrace more
+ * characters.
+ */
+static bool
+same_token( const recent_token_t& a, const recent_token_t& b ) {
+  return a.token == b.token && same_end(a.loc, b.loc);
 }
 
 /*
@@ -299,8 +319,9 @@ static struct recent_tokens_t : protected std::queue<recent_token_t>
      * the lookahead token.  Because it was the last one returned by lexer(),
      * the location is accurate.  Else return the next token.
      */
-    if( ! empty() && front().token == end_token ) pop();
-    if( ! empty() && back().token == end_token ) c.clear();
+    recent_token_t ending(end_token, cdf::location());
+    if( ! empty() && same_token(front(), ending) ) pop();
+    if( ! empty() && same_token(back(), ending) ) c.clear();
 
     end_token = 0;
 
@@ -312,6 +333,7 @@ static struct recent_tokens_t : protected std::queue<recent_token_t>
       }
     }
 
+    dbgmsg("%s:%d: returning %s", __func__, __LINE__, keyword_str(end_token));
     return end_token;
   }
 } recent_tokens;
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.