[clang] ed6d09d - [Lex] For dependency directive lexing, angled includes in `__has_include` should be lexed as string literals
Argyrios Kyrtzidis via cfe-commits
cfe-commits at lists.llvm.org
Thu Jan 19 15:24:45 PST 2023
Author: Argyrios Kyrtzidis
Date: 2023-01-19T15:23:21-08:00
New Revision: ed6d09dd4ead70d2858d56c530af38eefa1ef595
URL: https://github.com/llvm/llvm-project/commit/ed6d09dd4ead70d2858d56c530af38eefa1ef595
DIFF: https://github.com/llvm/llvm-project/commit/ed6d09dd4ead70d2858d56c530af38eefa1ef595.diff
LOG: [Lex] For dependency directive lexing, angled includes in `__has_include` should be lexed as string literals
rdar://104386604
Differential Revision: https://reviews.llvm.org/D142143
Added:
clang/test/ClangScanDeps/depscan-lex-has-include.c
Modified:
clang/lib/Lex/Lexer.cpp
Removed:
################################################################################
diff --git a/clang/lib/Lex/Lexer.cpp b/clang/lib/Lex/Lexer.cpp
index 578bd69ddbfbc..d49d9e9e4b142 100644
--- a/clang/lib/Lex/Lexer.cpp
+++ b/clang/lib/Lex/Lexer.cpp
@@ -4408,6 +4408,22 @@ bool Lexer::LexDependencyDirectiveToken(Token &Result) {
MIOpt.ReadToken();
}
+ if (ParsingFilename && DDTok.is(tok::less)) {
+ BufferPtr = BufferStart + DDTok.Offset;
+ LexAngledStringLiteral(Result, BufferPtr + 1);
+ if (Result.isNot(tok::header_name))
+ return true;
+ // Advance the index of lexed tokens.
+ while (true) {
+ const dependency_directives_scan::Token &NextTok =
+ DepDirectives.front().Tokens[NextDepDirectiveTokenIndex];
+ if (BufferStart + NextTok.Offset >= BufferPtr)
+ break;
+ ++NextDepDirectiveTokenIndex;
+ }
+ return true;
+ }
+
const char *TokPtr = convertDependencyDirectiveToken(DDTok, Result);
if (Result.is(tok::hash) && Result.isAtStartOfLine()) {
diff --git a/clang/test/ClangScanDeps/depscan-lex-has-include.c b/clang/test/ClangScanDeps/depscan-lex-has-include.c
new file mode 100644
index 0000000000000..4d46e8d7d19e2
--- /dev/null
+++ b/clang/test/ClangScanDeps/depscan-lex-has-include.c
@@ -0,0 +1,46 @@
+// RUN: rm -rf %t
+// RUN: split-file %s %t
+// RUN: sed -e "s|DIR|%/t|g" %t/cdb.json.template > %t/cdb.json
+
+// RUN: clang-scan-deps -compilation-database %t/cdb.json | FileCheck %s
+// CHECK: t.c
+// CHECK: something.h
+
+// RUN: sed -e "s|DIR|%/t|g" %t/cdb-error.json.template > %t/cdb-error.json
+// RUN: not clang-scan-deps -compilation-database %t/cdb-error.json 2>&1 | FileCheck %s -check-prefix=ERROR
+// ERROR: error: expected '>'
+// ERROR: error: expected value in expression
+
+//--- cdb.json.template
+[
+ {
+ "directory": "DIR",
+ "command": "clang -fsyntax-only DIR/t.c -I DIR",
+ "file": "DIR/t.c"
+ }
+]
+
+//--- cdb-error.json.template
+[
+ {
+ "directory": "DIR",
+ "command": "clang -fsyntax-only DIR/error.c",
+ "file": "DIR/error.c"
+ }
+]
+
+//--- t.c
+
+#define something
+
+// Make sure the include is lexed as a literal, ignoring the macro.
+#if __has_include(<something/something.h>)
+#include <something/something.h>
+#endif
+
+//--- something/something.h
+
+//--- error.c
+#if __has_include(<something/something.h)
+#define MAC
+#endif
More information about the cfe-commits
mailing list