[gcc r17-2733] cobol: Accept NUL in comments.

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

commit r17-2733-g4eb61759ef5b2a4f67c391f4bbd31d6f9178967f
Author: James K. Lowden <[email protected]>
Date:   Mon Jul 27 14:51:19 2026 -0400

    cobol: Accept NUL in comments.
    
    Previously gcobol reported an error if a NUL appeared in the
    input. Now a NUL in a comment does not affect compilation.
    
    gcc/cobol/ChangeLog:
    
            * lexio.cc (cdftext::free_form_reference_format): Use new sanitize_nul function.
            * lexio.h (struct filespan_t): Define sanitize_nul().

Diff:
---
 gcc/cobol/lexio.cc |  3 +++
 gcc/cobol/lexio.h  | 30 +++++++++++++++++-------------
 2 files changed, 20 insertions(+), 13 deletions(-)

diff --git a/gcc/cobol/lexio.cc b/gcc/cobol/lexio.cc
index 44ca02cc8aa9..39ad4e0ceff9 100644
--- a/gcc/cobol/lexio.cc
+++ b/gcc/cobol/lexio.cc
@@ -1785,6 +1785,7 @@ cdftext::free_form_reference_format( int input,
             erase_source(p, mfile.eol);
           }
         }
+        gcc_assert( ! mfile.line_contains_nul() );
         continue;
       case SPACE:
         break;
@@ -1808,6 +1809,7 @@ cdftext::free_form_reference_format( int input,
         if( indcol < mfile.eol - 1 ) {
           erase_source(indcol, mfile.eol);
         }
+        mfile.sanitize_nul();
         continue;
       case '$':
         if( lexio_dialect_mf() ) {
@@ -1825,6 +1827,7 @@ cdftext::free_form_reference_format( int input,
         break;
       }
     }
+    mfile.sanitize_nul();
     current.line.update(mfile.cur, mfile.eol, format.top().right_margin());
     current.lineno = mfile.lineno();
   } // next line
diff --git a/gcc/cobol/lexio.h b/gcc/cobol/lexio.h
index 2e64d936fcc4..17af7bbd57d9 100644
--- a/gcc/cobol/lexio.h
+++ b/gcc/cobol/lexio.h
@@ -152,6 +152,23 @@ struct filespan_t : public bytespan_t {
    */
   bool was_quote72() const { return iline == line_quote72 + 1; }
 
+  bool line_contains_nul() const {
+    char *nul = std::find(cur, eol, '\0');
+    return nul != eol;
+  }
+
+  void sanitize_nul() {
+    char *nul = std::find(cur, eol, '\0');
+    if( nul != eol ) {
+      int icol = nul - cur; // cppcheck-suppress shadowVariable
+      fprintf(stderr, "%s:%d:%d: error: NUL character detected in input\n%*s\n",
+              cobol_filename(), int(iline), ++icol,
+              int(eol - cur)-1, cur);
+      parse_error_inc();
+      std::replace(nul, eol, '\0', SPACE);
+    }
+  }
+
   size_t next_line(bool is_reference_format) {
     // Before advancing, mark the current line as ending in a quote, if true.
     if( is_reference_format && 72 <= line_length() ) {
@@ -164,19 +181,6 @@ struct filespan_t : public bytespan_t {
 
     eol = std::find(cur, eodata, '\n');
 
-    char *nul = std::find(cur, eol, '\0');
-    if( nul != eol ) {
-      if( std::any_of( nul, eodata,
-                       []( char ch ) { return ch != '\0'; } ) ) {
-        int icol = nul - cur; // cppcheck-suppress shadowVariable
-        fprintf(stderr, "%s:%d:%d: error: NUL character detected in input\n%*s\n",
-                cobol_filename(), int(iline + 1), ++icol,
-                int(eol - cur), cur);
-        parse_error_inc();
-        std::replace(nul, eol, '\0', SPACE);
-      }
-    }
-
     if( eol < eodata ) {
       ++eol;
       ++iline;
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.