https://github.com/tsfn updated https://github.com/llvm/llvm-project/pull/158420
>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 1/2] [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; >From 07a634725410118dbbd69ddc3354d4654a969905 Mon Sep 17 00:00:00 2001 From: Yifan Fang <gat...@gmail.com> Date: Tue, 16 Sep 2025 22:08:45 +0800 Subject: [PATCH 2/2] [clang][clang-scan-deps] Add LangOptions::AllowLiteralDigitSeparator and enable it by default for CPlusPlus14 or C23 and set it explicitly by Scanner --- clang/include/clang/Basic/LangOptions.def | 2 +- clang/include/clang/Basic/LangStandard.h | 3 +++ clang/lib/Basic/LangOptions.cpp | 1 + clang/lib/Lex/DependencyDirectivesScanner.cpp | 2 +- clang/lib/Lex/Lexer.cpp | 2 +- 5 files changed, 7 insertions(+), 3 deletions(-) diff --git a/clang/include/clang/Basic/LangOptions.def b/clang/include/clang/Basic/LangOptions.def index 7418181472977..50ec95225b7ba 100644 --- a/clang/include/clang/Basic/LangOptions.def +++ b/clang/include/clang/Basic/LangOptions.def @@ -438,7 +438,7 @@ 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") +LANGOPT(AllowLiteralDigitSeparator, 1, 0, NotCompatible, "Allow literal digit seperator in source") ENUM_LANGOPT(StrictFlexArraysLevel, StrictFlexArraysLevelKind, 2, StrictFlexArraysLevelKind::Default, NotCompatible, diff --git a/clang/include/clang/Basic/LangStandard.h b/clang/include/clang/Basic/LangStandard.h index 49412232c9c5e..05294f2416da1 100644 --- a/clang/include/clang/Basic/LangStandard.h +++ b/clang/include/clang/Basic/LangStandard.h @@ -140,6 +140,9 @@ struct LangStandard { return isCPlusPlus11() || (!isCPlusPlus() && isC99() && isGNUMode()); } + /// allowLiteralDigitSeparator - Language supports literal digit seperator + bool allowLiteralDigitSeparator() const { return isCPlusPlus14() || isC23(); } + /// isGNUMode - Language includes GNU extensions. bool isGNUMode() const { return Flags & GNUMode; } diff --git a/clang/lib/Basic/LangOptions.cpp b/clang/lib/Basic/LangOptions.cpp index f034514466d3f..d55100202ee87 100644 --- a/clang/lib/Basic/LangOptions.cpp +++ b/clang/lib/Basic/LangOptions.cpp @@ -128,6 +128,7 @@ void LangOptions::setLangDefaults(LangOptions &Opts, Language Lang, Opts.WChar = Std.isCPlusPlus(); Opts.Digraphs = Std.hasDigraphs(); Opts.RawStringLiterals = Std.hasRawStringLiterals(); + Opts.AllowLiteralDigitSeparator = Std.allowLiteralDigitSeparator(); Opts.NamedLoops = Std.isC2y(); Opts.HLSL = Lang == Language::HLSL; diff --git a/clang/lib/Lex/DependencyDirectivesScanner.cpp b/clang/lib/Lex/DependencyDirectivesScanner.cpp index 81f7c2edb66cc..4d1502816f68a 100644 --- a/clang/lib/Lex/DependencyDirectivesScanner.cpp +++ b/clang/lib/Lex/DependencyDirectivesScanner.cpp @@ -74,7 +74,7 @@ struct Scanner { LangOpts.ObjC = true; LangOpts.LineComment = true; LangOpts.RawStringLiterals = true; - LangOpts.ScanDeps = true; + LangOpts.AllowLiteralDigitSeparator = 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 e7bf8afb1f835..1af4f6ca02ef4 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 || LangOpts.ScanDeps)) { + if (C == '\'' && LangOpts.AllowLiteralDigitSeparator) { auto [Next, NextSize] = getCharAndSizeNoWarn(CurPtr + Size, LangOpts); if (isAsciiIdentifierContinue(Next)) { if (!isLexingRawMode()) _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits