[clang] [clang][clang-scan-deps] Add LangOpts.ScanDeps to fix (#88896) (PR #158420)
Yifan Fang via cfe-commits
cfe-commits at lists.llvm.org
Sat Sep 13 17:01:31 PDT 2025
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 <gatsfn at 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;
More information about the cfe-commits
mailing list