Author: Ben Langmuir Date: 2023-05-03T13:53:21-07:00 New Revision: 7b492d1be0ea5b767cc567ca2792a291242f9973
URL: https://github.com/llvm/llvm-project/commit/7b492d1be0ea5b767cc567ca2792a291242f9973 DIFF: https://github.com/llvm/llvm-project/commit/7b492d1be0ea5b767cc567ca2792a291242f9973.diff LOG: [clang][deps] Teach dep directive scanner about #pragma clang system_header This ensures we get the correct FileCharacteristic during scanning. In a yet-to-be-upstreamed branch this fixes observable failures, but it's also good to handle this on principle: the FileCharacteristic is a property of the file that is observable in the scanner, so there is nothing preventing us from depending on it. rdar://108627403 Differential Revision: https://reviews.llvm.org/D149777 Added: Modified: clang/include/clang/Lex/DependencyDirectivesScanner.h clang/lib/Lex/DependencyDirectivesScanner.cpp clang/lib/Lex/Lexer.cpp clang/unittests/Lex/DependencyDirectivesScannerTest.cpp Removed: ################################################################################ diff --git a/clang/include/clang/Lex/DependencyDirectivesScanner.h b/clang/include/clang/Lex/DependencyDirectivesScanner.h index 529b93aa0ffbf..0e115906fbfe5 100644 --- a/clang/include/clang/Lex/DependencyDirectivesScanner.h +++ b/clang/include/clang/Lex/DependencyDirectivesScanner.h @@ -68,6 +68,7 @@ enum DirectiveKind : uint8_t { pp_pragma_push_macro, pp_pragma_pop_macro, pp_pragma_include_alias, + pp_pragma_system_header, pp_include_next, pp_if, pp_ifdef, diff --git a/clang/lib/Lex/DependencyDirectivesScanner.cpp b/clang/lib/Lex/DependencyDirectivesScanner.cpp index 0adbaa36bf7cd..a506b49176302 100644 --- a/clang/lib/Lex/DependencyDirectivesScanner.cpp +++ b/clang/lib/Lex/DependencyDirectivesScanner.cpp @@ -652,9 +652,22 @@ bool Scanner::lexPragma(const char *&First, const char *const End) { return false; } - // #pragma clang. - if (!isNextIdentifierOrSkipLine("module", First, End)) + FoundId = tryLexIdentifierOrSkipLine(First, End); + if (!FoundId) return false; + Id = *FoundId; + + // #pragma clang system_header + if (Id == "system_header") { + lexPPDirectiveBody(First, End); + pushDirective(pp_pragma_system_header); + return false; + } + + if (Id != "module") { + skipLine(First, End); + return false; + } // #pragma clang module. if (!isNextIdentifierOrSkipLine("import", First, End)) diff --git a/clang/lib/Lex/Lexer.cpp b/clang/lib/Lex/Lexer.cpp index 53cd43d63ea02..1b00f7cde1fb8 100644 --- a/clang/lib/Lex/Lexer.cpp +++ b/clang/lib/Lex/Lexer.cpp @@ -4480,6 +4480,7 @@ bool Lexer::LexDependencyDirectiveTokenWhileSkipping(Token &Result) { case pp_pragma_push_macro: case pp_pragma_pop_macro: case pp_pragma_include_alias: + case pp_pragma_system_header: case pp_include_next: case decl_at_import: case cxx_module_decl: diff --git a/clang/unittests/Lex/DependencyDirectivesScannerTest.cpp b/clang/unittests/Lex/DependencyDirectivesScannerTest.cpp index 5222df9fb9eb2..2f8804784a2e4 100644 --- a/clang/unittests/Lex/DependencyDirectivesScannerTest.cpp +++ b/clang/unittests/Lex/DependencyDirectivesScannerTest.cpp @@ -90,7 +90,8 @@ TEST(MinimizeSourceToDependencyDirectivesTest, AllTokens) { "#pragma pop_macro(A)\n" "#pragma include_alias(<A>, <B>)\n" "export module m;\n" - "import m;\n", + "import m;\n" + "#pragma clang system_header\n", Out, Tokens, Directives)); EXPECT_EQ(pp_define, Directives[0].Kind); EXPECT_EQ(pp_undef, Directives[1].Kind); @@ -113,7 +114,8 @@ TEST(MinimizeSourceToDependencyDirectivesTest, AllTokens) { EXPECT_EQ(pp_pragma_include_alias, Directives[18].Kind); EXPECT_EQ(cxx_export_module_decl, Directives[19].Kind); EXPECT_EQ(cxx_import_decl, Directives[20].Kind); - EXPECT_EQ(pp_eof, Directives[21].Kind); + EXPECT_EQ(pp_pragma_system_header, Directives[21].Kind); + EXPECT_EQ(pp_eof, Directives[22].Kind); } TEST(MinimizeSourceToDependencyDirectivesTest, EmptyHash) { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits