Author: sammccall Date: Tue May 7 07:34:06 2019 New Revision: 360153 URL: http://llvm.org/viewvc/llvm-project?rev=360153&view=rev Log: [Tooling] Add -x flags when inferring compile commands for files with no/invalid extension.
Summary: We treat them as headers, as the motivating case is C++ standard library. Reviewers: kadircet Subscribers: cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D61633 Modified: cfe/trunk/lib/Tooling/InterpolatingCompilationDatabase.cpp cfe/trunk/unittests/Tooling/CompilationDatabaseTest.cpp Modified: cfe/trunk/lib/Tooling/InterpolatingCompilationDatabase.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Tooling/InterpolatingCompilationDatabase.cpp?rev=360153&r1=360152&r2=360153&view=diff ============================================================================== --- cfe/trunk/lib/Tooling/InterpolatingCompilationDatabase.cpp (original) +++ cfe/trunk/lib/Tooling/InterpolatingCompilationDatabase.cpp Tue May 7 07:34:06 2019 @@ -205,10 +205,13 @@ struct TransferableCommand { bool TypeCertain; auto TargetType = guessType(Filename, &TypeCertain); // If the filename doesn't determine the language (.h), transfer with -x. - if (TargetType != types::TY_INVALID && !TypeCertain && Type) { - TargetType = types::onlyPrecompileType(TargetType) // header? - ? types::lookupHeaderTypeForSourceType(*Type) - : *Type; + if ((!TargetType || !TypeCertain) && Type) { + // Use *Type, or its header variant if the file is a header. + // Treat no/invalid extension as header (e.g. C++ standard library). + TargetType = + (!TargetType || types::onlyPrecompileType(TargetType)) // header? + ? types::lookupHeaderTypeForSourceType(*Type) + : *Type; if (ClangCLMode) { const StringRef Flag = toCLFlag(TargetType); if (!Flag.empty()) Modified: cfe/trunk/unittests/Tooling/CompilationDatabaseTest.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/Tooling/CompilationDatabaseTest.cpp?rev=360153&r1=360152&r2=360153&view=diff ============================================================================== --- cfe/trunk/unittests/Tooling/CompilationDatabaseTest.cpp (original) +++ cfe/trunk/unittests/Tooling/CompilationDatabaseTest.cpp Tue May 7 07:34:06 2019 @@ -723,14 +723,17 @@ TEST_F(InterpolateTest, Language) { // .h is ambiguous, so we add explicit language flags EXPECT_EQ(getCommand("foo.h"), "clang -D dir/foo.cpp -x c++-header -std=c++17"); + // Same thing if we have no extension. (again, we treat as header). + EXPECT_EQ(getCommand("foo"), "clang -D dir/foo.cpp -x c++-header -std=c++17"); + // and invalid extensions. + EXPECT_EQ(getCommand("foo.cce"), + "clang -D dir/foo.cpp -x c++-header -std=c++17"); // and don't add -x if the inferred language is correct. EXPECT_EQ(getCommand("foo.hpp"), "clang -D dir/foo.cpp -std=c++17"); // respect -x if it's already there. EXPECT_EQ(getCommand("baz.h"), "clang -D dir/baz.cee -x c-header"); // prefer a worse match with the right extension. EXPECT_EQ(getCommand("foo.c"), "clang -D dir/bar.c"); - // make sure we don't crash on queries with invalid extensions. - EXPECT_EQ(getCommand("foo.cce"), "clang -D dir/foo.cpp"); Entries.erase(path(StringRef("dir/bar.c"))); // Now we transfer across languages, so drop -std too. EXPECT_EQ(getCommand("foo.c"), "clang -D dir/foo.cpp"); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits