[clang] 1d316ef - [Clang] prevent assertion in __has_embed parameter recovery at end-of-directive (#175104)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Jan 26 04:39:14 PST 2026
Author: Oleksandr Tarasiuk
Date: 2026-01-26T14:39:09+02:00
New Revision: 1d316ef4ba71d843f1e49f86e831dbf8c64ebd83
URL: https://github.com/llvm/llvm-project/commit/1d316ef4ba71d843f1e49f86e831dbf8c64ebd83
DIFF: https://github.com/llvm/llvm-project/commit/1d316ef4ba71d843f1e49f86e831dbf8c64ebd83.diff
LOG: [Clang] prevent assertion in __has_embed parameter recovery at end-of-directive (#175104)
Fixes #175088
---
This PR addresses an assertion failure in the preprocessor triggered
when `__has_embed` parameter parsing reaches end-of-directive while
expecting a parenthesized argument.
Added:
Modified:
clang/docs/ReleaseNotes.rst
clang/lib/Lex/PPDirectives.cpp
clang/test/Preprocessor/embed___has_embed_parsing_errors.c
Removed:
################################################################################
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 3f4962bac9d09..d03211a200a29 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -172,6 +172,7 @@ Improvements to Coverage Mapping
Bug Fixes in This Version
-------------------------
+- Fixed a failed assertion in the preprocessor when ``__has_embed`` parameters are missing parentheses. (#GH175088)
- Fix lifetime extension of temporaries in for-range-initializers in templates. (#GH165182)
diff --git a/clang/lib/Lex/PPDirectives.cpp b/clang/lib/Lex/PPDirectives.cpp
index 3d9e7f62757c5..b1d5c3636c99b 100644
--- a/clang/lib/Lex/PPDirectives.cpp
+++ b/clang/lib/Lex/PPDirectives.cpp
@@ -3776,14 +3776,14 @@ Preprocessor::LexEmbedParameters(Token &CurTok, bool ForHasEmbed) {
std::pair<tok::TokenKind, SourceLocation> Matches) {
Diag(CurTok, diag::err_expected) << Expected;
Diag(Matches.second, diag::note_matching) << Matches.first;
- if (CurTok.isNot(EndTokenKind))
+ if (CurTok.isNot(tok::eod))
DiscardUntilEndOfDirective(CurTok);
};
auto ExpectOrDiagAndSkipToEOD = [&](tok::TokenKind Kind) {
if (CurTok.isNot(Kind)) {
Diag(CurTok, diag::err_expected) << Kind;
- if (CurTok.isNot(EndTokenKind))
+ if (CurTok.isNot(tok::eod))
DiscardUntilEndOfDirective(CurTok);
return false;
}
diff --git a/clang/test/Preprocessor/embed___has_embed_parsing_errors.c b/clang/test/Preprocessor/embed___has_embed_parsing_errors.c
index 8ab53f6b89c0d..4c6b03069c518 100644
--- a/clang/test/Preprocessor/embed___has_embed_parsing_errors.c
+++ b/clang/test/Preprocessor/embed___has_embed_parsing_errors.c
@@ -282,3 +282,13 @@
#if __has_embed (__FILE__ limit(1) foo
int a = __has_embed (__FILE__);
#endif
+
+// expected-error at +2 {{expected '('}} \
+ expected-error at +2 {{expected value in expression}}
+#if __has_embed("" if_empty
+#endif
+
+// expected-error at +2 {{expected '('}} \
+ expected-error at +2 {{expected value in expression}}
+#if __has_embed("" limit
+#endif
More information about the cfe-commits
mailing list