[clang] [clang] Add LangOpts.ScanDeps to fix #88896 (PR #158420)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Sep 13 03:27:25 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Yifan Fang (tsfn)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/158420.diff
4 Files Affected:
- (modified) clang/include/clang/Basic/LangOptions.def (+2)
- (modified) clang/lib/Lex/DependencyDirectivesScanner.cpp (+1)
- (modified) clang/lib/Lex/Lexer.cpp (+1-1)
- (modified) clang/unittests/Lex/DependencyDirectivesScannerTest.cpp (+16)
``````````diff
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;
``````````
</details>
https://github.com/llvm/llvm-project/pull/158420
More information about the cfe-commits
mailing list