[llvm] [TableGen] Check for EOF in prepSkipRegion to avoid preprocessor crash. (PR #208961)

Kevin Bravo via llvm-commits llvm-commits at lists.llvm.org
Wed Jul 15 19:41:16 PDT 2026


https://github.com/kbrav updated https://github.com/llvm/llvm-project/pull/208961

>From 25451f378cb8dbdc8543b477e047a46f85c907c4 Mon Sep 17 00:00:00 2001
From: kbrav <kbravjr at gmail.com>
Date: Sat, 11 Jul 2026 18:21:13 -0400
Subject: [PATCH 1/2] [TableGen] Check for EOF in prepSkipRegion to avoid
 preprocessor crash.

---
 llvm/lib/TableGen/TGLexer.cpp         | 3 ++-
 llvm/test/TableGen/eof-after-endif.td | 5 +++++
 2 files changed, 7 insertions(+), 1 deletion(-)
 create mode 100644 llvm/test/TableGen/eof-after-endif.td

diff --git a/llvm/lib/TableGen/TGLexer.cpp b/llvm/lib/TableGen/TGLexer.cpp
index ac46054a74d9e..b63e807572040 100644
--- a/llvm/lib/TableGen/TGLexer.cpp
+++ b/llvm/lib/TableGen/TGLexer.cpp
@@ -913,8 +913,9 @@ bool TGLexer::prepSkipRegion(bool MustNeverBeFalse) {
 
   do {
     // Skip all symbols to the line end.
-    while (*CurPtr != '\n')
+    while (CurPtr != CurBuf.end() && *CurPtr != '\n') {
       ++CurPtr;
+    }
 
     // Find the first non-whitespace symbol in the next line(s).
     if (!prepSkipLineBegin())
diff --git a/llvm/test/TableGen/eof-after-endif.td b/llvm/test/TableGen/eof-after-endif.td
new file mode 100644
index 0000000000000..a77ab9b18382f
--- /dev/null
+++ b/llvm/test/TableGen/eof-after-endif.td
@@ -0,0 +1,5 @@
+// Do not modify this file from a text editor.
+// It has no whitespace, newline, or carriage return after #endif.
+// RUN: not llvm-tblgen %s
+#ifdef FOO 
+#endif
\ No newline at end of file

>From 3fa8b596aac9ef15e12c6bd8a732eb420655e888 Mon Sep 17 00:00:00 2001
From: kbrav <kbravjr at gmail.com>
Date: Wed, 15 Jul 2026 22:40:34 -0400
Subject: [PATCH 2/2] conform to coding standards, make test more clear

---
 llvm/lib/TableGen/TGLexer.cpp         | 3 +--
 llvm/test/TableGen/eof-after-endif.td | 9 +++++++--
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/llvm/lib/TableGen/TGLexer.cpp b/llvm/lib/TableGen/TGLexer.cpp
index b63e807572040..238b1a35a85d3 100644
--- a/llvm/lib/TableGen/TGLexer.cpp
+++ b/llvm/lib/TableGen/TGLexer.cpp
@@ -913,9 +913,8 @@ bool TGLexer::prepSkipRegion(bool MustNeverBeFalse) {
 
   do {
     // Skip all symbols to the line end.
-    while (CurPtr != CurBuf.end() && *CurPtr != '\n') {
+    while (CurPtr != CurBuf.end() && *CurPtr != '\n')
       ++CurPtr;
-    }
 
     // Find the first non-whitespace symbol in the next line(s).
     if (!prepSkipLineBegin())
diff --git a/llvm/test/TableGen/eof-after-endif.td b/llvm/test/TableGen/eof-after-endif.td
index a77ab9b18382f..558a7422a5269 100644
--- a/llvm/test/TableGen/eof-after-endif.td
+++ b/llvm/test/TableGen/eof-after-endif.td
@@ -1,5 +1,10 @@
 // Do not modify this file from a text editor.
 // It has no whitespace, newline, or carriage return after #endif.
-// RUN: not llvm-tblgen %s
-#ifdef FOO 
+// It tests that the lexer doesn't crash on EOF at the end of a preprocessor
+// directive.
+// RUN: not llvm-tblgen %s 2>&1 | FileCheck %s
+// CHECK: :[[@LINE+4]]:7: error: reached EOF without matching #endif
+// CHECK: :[[@LINE+2]]:8: error: the latest preprocessor control is here
+// CHECK: :[[@LINE+2]]:7: error: Unexpected token at top level
+#ifdef FOO
 #endif
\ No newline at end of file



More information about the llvm-commits mailing list