https://github.com/sweiglbosker updated 
https://github.com/llvm/llvm-project/pull/138165

>From 2865b67e6014698e4f5c374aa448020b47b84ca5 Mon Sep 17 00:00:00 2001
From: Stefan Weigl-Bosker <ste...@s00.xyz>
Date: Thu, 1 May 2025 12:24:17 -0400
Subject: [PATCH] [Lex] fix lexing malformed pragma within include directive

---
 clang/docs/ReleaseNotes.rst                  | 3 ++-
 clang/lib/Lex/Pragma.cpp                     | 4 ++--
 clang/test/Preprocessor/_Pragma-in-include.c | 5 +++++
 3 files changed, 9 insertions(+), 3 deletions(-)
 create mode 100644 clang/test/Preprocessor/_Pragma-in-include.c

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 1dd97bcc67364..c0e6889090468 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -535,7 +535,8 @@ Bug Fixes in This Version
 - Fixed visibility calculation for template functions. (#GH103477)
 - Fixed a bug where an attribute before a ``pragma clang attribute`` or
   ``pragma clang __debug`` would cause an assertion. Instead, this now 
diagnoses
-  the invalid attribute location appropriately.  (#GH137861)
+  the invalid attribute location appropriately. (#GH137861)
+- Fixed a crash when a malformed ``_Pragma`` directive appears as part of an 
``#include`` directive. (#GH138094)
 
 Bug Fixes to Compiler Builtins
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/lib/Lex/Pragma.cpp b/clang/lib/Lex/Pragma.cpp
index 5b6a29bdad910..01c85e6ad95d5 100644
--- a/clang/lib/Lex/Pragma.cpp
+++ b/clang/lib/Lex/Pragma.cpp
@@ -220,11 +220,11 @@ void Preprocessor::Handle_Pragma(Token &Tok) {
   if (!tok::isStringLiteral(Tok.getKind())) {
     Diag(PragmaLoc, diag::err__Pragma_malformed);
     // Skip bad tokens, and the ')', if present.
-    if (Tok.isNot(tok::r_paren) && Tok.isNot(tok::eof))
+    if (Tok.isNot(tok::r_paren) && Tok.isNot(tok::eof) && Tok.isNot(tok::eod))
       Lex(Tok);
     while (Tok.isNot(tok::r_paren) &&
            !Tok.isAtStartOfLine() &&
-           Tok.isNot(tok::eof))
+           Tok.isNot(tok::eof) && Tok.isNot(tok::eod))
       Lex(Tok);
     if (Tok.is(tok::r_paren))
       Lex(Tok);
diff --git a/clang/test/Preprocessor/_Pragma-in-include.c 
b/clang/test/Preprocessor/_Pragma-in-include.c
new file mode 100644
index 0000000000000..c31011609e244
--- /dev/null
+++ b/clang/test/Preprocessor/_Pragma-in-include.c
@@ -0,0 +1,5 @@
+// RUN: %clang_cc1 %s -verify
+
+// Don't crash, verify that diagnostics are preserved
+#include _Pragma( // expected-error {{_Pragma takes a parenthesized string 
literal}} \
+                     expected-error {{expected "FILENAME"}} 

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to