diff --git a/clang/lib/Lex/Lexer.cpp b/clang/lib/Lex/Lexer.cpp --- a/clang/lib/Lex/Lexer.cpp +++ b/clang/lib/Lex/Lexer.cpp @@ -4408,6 +4408,22 @@ 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 --- /dev/null +++ b/clang/test/ClangScanDeps/depscan-lex-has-include.c @@ -0,0 +1,28 @@ +// 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 + +//--- cdb.json.template +[ + { + "directory": "DIR", + "command": "clang -fsyntax-only DIR/t.c -I DIR", + "file": "DIR/t.c" + } +] + +//--- t.c + +#define something + +// Make sure the include is lexed as a literal, ignoring the macro. +#if __has_include() +#include +#endif + +//--- something/something.h