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@+2 {{expected '('}} \ + expected-error@+2 {{expected value in expression}} +#if __has_embed("" if_empty +#endif + +// expected-error@+2 {{expected '('}} \ + expected-error@+2 {{expected value in expression}} +#if __has_embed("" limit +#endif _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
