[llvm] [TableGen] Treat carriage return as line end in prepSkipRegion (PR #212411)
Kevin Bravo via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 28 07:02:25 PDT 2026
https://github.com/kbrav updated https://github.com/llvm/llvm-project/pull/212411
>From 831f3e25592c1a46511b09e46b5a6f20ea83f8c5 Mon Sep 17 00:00:00 2001
From: kbrav <kbravjr at gmail.com>
Date: Mon, 27 Jul 2026 09:25:17 -0400
Subject: [PATCH 1/5] treat \r as line end in prepSkipRegion
---
llvm/lib/TableGen/TGLexer.cpp | 2 +-
llvm/test/TableGen/cr-after-endif.td | 9 +++++++++
2 files changed, 10 insertions(+), 1 deletion(-)
create mode 100644 llvm/test/TableGen/cr-after-endif.td
diff --git a/llvm/lib/TableGen/TGLexer.cpp b/llvm/lib/TableGen/TGLexer.cpp
index 238b1a35a85d3..ea0b10b1b443a 100644
--- a/llvm/lib/TableGen/TGLexer.cpp
+++ b/llvm/lib/TableGen/TGLexer.cpp
@@ -913,7 +913,7 @@ 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 != '\r')
++CurPtr;
// Find the first non-whitespace symbol in the next line(s).
diff --git a/llvm/test/TableGen/cr-after-endif.td b/llvm/test/TableGen/cr-after-endif.td
new file mode 100644
index 0000000000000..3b991ced1e673
--- /dev/null
+++ b/llvm/test/TableGen/cr-after-endif.td
@@ -0,0 +1,9 @@
+// LineEnd ::= newline | return | EOF
+// Preprocessor must treat the \r after `hello` as a line end so that it
+// doesn't skip the first #endif thinking that it's part of the #ifdef body.
+// RUN: not llvm-tblgen %s 2>&1 | FileCheck %s
+// CHECK: :[[@LINE+4]]:2: error: #endif without #ifdef
+// CHECK: :[[@LINE+3]]:2: error: Unexpected token at top level
+#ifdef FOO
+hello
#endif
+#endif
>From bd32f8e15493290ffca5d7bb09a7a911505b3e83 Mon Sep 17 00:00:00 2001
From: kbrav <kbravjr at gmail.com>
Date: Tue, 28 Jul 2026 05:52:04 -0400
Subject: [PATCH 2/5] \n -> \r in test, use echo to make \r visible
---
llvm/test/TableGen/cr-after-endif.td | 14 ++++++--------
1 file changed, 6 insertions(+), 8 deletions(-)
diff --git a/llvm/test/TableGen/cr-after-endif.td b/llvm/test/TableGen/cr-after-endif.td
index 3b991ced1e673..1a25000f9a89d 100644
--- a/llvm/test/TableGen/cr-after-endif.td
+++ b/llvm/test/TableGen/cr-after-endif.td
@@ -1,9 +1,7 @@
// LineEnd ::= newline | return | EOF
-// Preprocessor must treat the \r after `hello` as a line end so that it
-// doesn't skip the first #endif thinking that it's part of the #ifdef body.
-// RUN: not llvm-tblgen %s 2>&1 | FileCheck %s
-// CHECK: :[[@LINE+4]]:2: error: #endif without #ifdef
-// CHECK: :[[@LINE+3]]:2: error: Unexpected token at top level
-#ifdef FOO
-hello
#endif
-#endif
+// Preprocessor must treat all the \r's as line ends.
+// This means, for example, not skipping the first #endif thinking that it's
+// part of the #ifdef body.
+// RUN: echo -e "#ifdef FOO\rhello\r#endif\r#endif\r" | not llvm-tblgen 2>&1 | FileCheck %s
+// CHECK: :1:26: error: #endif without #ifdef
+// CHECK: :1:26: error: Unexpected token at top level
>From 4c9af33936baab213b8cd7cd280aeb5c23871396 Mon Sep 17 00:00:00 2001
From: kbrav <kbravjr at gmail.com>
Date: Tue, 28 Jul 2026 05:56:32 -0400
Subject: [PATCH 3/5] rename test
---
.../{cr-after-endif.td => ifdef-cr-instead-of-newline.td} | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename llvm/test/TableGen/{cr-after-endif.td => ifdef-cr-instead-of-newline.td} (100%)
diff --git a/llvm/test/TableGen/cr-after-endif.td b/llvm/test/TableGen/ifdef-cr-instead-of-newline.td
similarity index 100%
rename from llvm/test/TableGen/cr-after-endif.td
rename to llvm/test/TableGen/ifdef-cr-instead-of-newline.td
>From 19854fab32e344b372edf804d59b880eec6f8404 Mon Sep 17 00:00:00 2001
From: kbrav <kbravjr at gmail.com>
Date: Tue, 28 Jul 2026 06:38:21 -0400
Subject: [PATCH 4/5] check for absence of redundant error message in parser
parallel commit 437b42f23250660f9a3f262ca6626324cd32a094 eliminated
redundant diagnostic in parser when it sees tgtok::Error, because
lexer already emitted a diagnostic
---
llvm/test/TableGen/ifdef-cr-instead-of-newline.td | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/test/TableGen/ifdef-cr-instead-of-newline.td b/llvm/test/TableGen/ifdef-cr-instead-of-newline.td
index 1a25000f9a89d..ad36bd1c17dc2 100644
--- a/llvm/test/TableGen/ifdef-cr-instead-of-newline.td
+++ b/llvm/test/TableGen/ifdef-cr-instead-of-newline.td
@@ -4,4 +4,4 @@
// part of the #ifdef body.
// RUN: echo -e "#ifdef FOO\rhello\r#endif\r#endif\r" | not llvm-tblgen 2>&1 | FileCheck %s
// CHECK: :1:26: error: #endif without #ifdef
-// CHECK: :1:26: error: Unexpected token at top level
+// CHECK-NOT: error:
>From 41cf5168e91b3033845208fc6cd6a4fa2545b8ab Mon Sep 17 00:00:00 2001
From: kbrav <kbravjr at gmail.com>
Date: Tue, 28 Jul 2026 09:50:14 -0400
Subject: [PATCH 5/5] printf instead of echo. echo can behave differently on
macos
---
llvm/test/TableGen/ifdef-cr-instead-of-newline.td | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/llvm/test/TableGen/ifdef-cr-instead-of-newline.td b/llvm/test/TableGen/ifdef-cr-instead-of-newline.td
index ad36bd1c17dc2..207e8abdd368c 100644
--- a/llvm/test/TableGen/ifdef-cr-instead-of-newline.td
+++ b/llvm/test/TableGen/ifdef-cr-instead-of-newline.td
@@ -2,6 +2,6 @@
// Preprocessor must treat all the \r's as line ends.
// This means, for example, not skipping the first #endif thinking that it's
// part of the #ifdef body.
-// RUN: echo -e "#ifdef FOO\rhello\r#endif\r#endif\r" | not llvm-tblgen 2>&1 | FileCheck %s
+// RUN: printf "#ifdef FOO\rhello\r#endif\r#endif\r" | not llvm-tblgen 2>&1 | FileCheck %s
// CHECK: :1:26: error: #endif without #ifdef
// CHECK-NOT: error:
More information about the llvm-commits
mailing list