https://github.com/tsfn created https://github.com/llvm/llvm-project/pull/158420
None >From fa5a534fb56d6ca9fe92e9df7cc86cd76ef5c58d Mon Sep 17 00:00:00 2001 From: Yifan Fang <gat...@gmail.com> Date: Sat, 13 Sep 2025 18:20:17 +0800 Subject: [PATCH] [clang] Add LangOpts.ScanDeps to fix #88896 --- clang/include/clang/Basic/LangOptions.def | 2 ++ clang/lib/Lex/DependencyDirectivesScanner.cpp | 1 + clang/lib/Lex/Lexer.cpp | 2 +- .../Lex/DependencyDirectivesScannerTest.cpp | 16 ++++++++++++++++ 4 files changed, 20 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index 84f5ab3443a59..7418181472977 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -438,6 +438,8 @@ LANGOPT(CXXAssumptions, 1, 1, NotCompatible, "Enable or disable codegen and comp LANGOPT(RawStringLiterals, 1, 1, NotCompatible, "Enable or disable raw string literals") +LANGOPT(ScanDeps, 1, 0, NotCompatible, "True if we are scanning by DependencyDirectivesScanner") + ENUM_LANGOPT(StrictFlexArraysLevel, StrictFlexArraysLevelKind, 2, StrictFlexArraysLevelKind::Default, NotCompatible, "Rely on strict definition of flexible arrays") diff --git a/clang/lib/Lex/DependencyDirectivesScanner.cpp b/clang/lib/Lex/DependencyDirectivesScanner.cpp index eee57c786442a..81f7c2edb66cc 100644 --- a/clang/lib/Lex/DependencyDirectivesScanner.cpp +++ b/clang/lib/Lex/DependencyDirectivesScanner.cpp @@ -74,6 +74,7 @@ struct Scanner { LangOpts.ObjC = true; LangOpts.LineComment = true; LangOpts.RawStringLiterals = true; + LangOpts.ScanDeps = true; // FIXME: we do not enable C11 or C++11, so we are missing u/u8/U"". return LangOpts; } diff --git a/clang/lib/Lex/Lexer.cpp b/clang/lib/Lex/Lexer.cpp index b282a600c0e56..e7bf8afb1f835 100644 --- a/clang/lib/Lex/Lexer.cpp +++ b/clang/lib/Lex/Lexer.cpp @@ -2087,7 +2087,7 @@ bool Lexer::LexNumericConstant(Token &Result, const char *CurPtr) { } // If we have a digit separator, continue. - if (C == '\'' && (LangOpts.CPlusPlus14 || LangOpts.C23)) { + if (C == '\'' && (LangOpts.CPlusPlus14 || LangOpts.C23 || LangOpts.ScanDeps)) { auto [Next, NextSize] = getCharAndSizeNoWarn(CurPtr + Size, LangOpts); if (isAsciiIdentifierContinue(Next)) { if (!isLexingRawMode()) diff --git a/clang/unittests/Lex/DependencyDirectivesScannerTest.cpp b/clang/unittests/Lex/DependencyDirectivesScannerTest.cpp index ddc87921ea084..dd8ef8daef816 100644 --- a/clang/unittests/Lex/DependencyDirectivesScannerTest.cpp +++ b/clang/unittests/Lex/DependencyDirectivesScannerTest.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "clang/Lex/DependencyDirectivesScanner.h" +#include "clang/Basic/TokenKinds.h" #include "llvm/ADT/SmallString.h" #include "gtest/gtest.h" @@ -1000,6 +1001,21 @@ int z = 128'78; EXPECT_STREQ("#include <test.h>\n", Out.data()); } +TEST(MinimizeSourceToDependencyDirectivesTest, CharacterLiteralInPreprocessor) { + SmallVector<char, 128> Out; + SmallVector<dependency_directives_scan::Token, 8> Tokens; + SmallVector<Directive, 4> Directives; + + StringRef Source = R"( + #if 1'2 == 12 + #endif + )"; + ASSERT_FALSE(minimizeSourceToDependencyDirectives(Source, Out, Tokens, Directives)); + ASSERT_GE(Tokens.size(), 4u); + EXPECT_EQ(Tokens[2].Kind, tok::numeric_constant); + EXPECT_EQ(Tokens[3].Kind, tok::equalequal); +} + TEST(MinimizeSourceToDependencyDirectivesTest, PragmaOnce) { SmallVector<char, 128> Out; SmallVector<dependency_directives_scan::Token, 4> Tokens; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits