Index: clang/lib/Tooling/InterpolatingCompilationDatabase.cpp =================================================================== --- clang/lib/Tooling/InterpolatingCompilationDatabase.cpp +++ clang/lib/Tooling/InterpolatingCompilationDatabase.cpp @@ -329,7 +329,7 @@ StringRef Path = Strings.save(StringRef(OriginalPaths[I]).lower()); Paths.emplace_back(Path, I); - Types.push_back(foldType(guessType(Path))); + Types.push_back(foldType(guessType(OriginalPaths[I]))); Stems.emplace_back(sys::path::stem(Path), I); auto Dir = ++sys::path::rbegin(Path), DirEnd = sys::path::rend(Path); for (int J = 0; J < DirectorySegmentsIndexed && Dir != DirEnd; ++J, ++Dir) Index: clang/unittests/Tooling/CompilationDatabaseTest.cpp =================================================================== --- clang/unittests/Tooling/CompilationDatabaseTest.cpp +++ clang/unittests/Tooling/CompilationDatabaseTest.cpp @@ -845,6 +845,14 @@ EXPECT_EQ(getProxy("foo/bar/baz/shout.C"), "FOO/BAR/BAZ/SHOUT.cc"); } +TEST_F(InterpolateTest, LanguagePreference) { + add("foo/bar/baz/exact.C"); + add("foo/bar/baz/exact.c"); + add("other/random/path.cpp"); + // Proxies for ".H" files are ".C" files, and not ".c files". + EXPECT_EQ(getProxy("foo/bar/baz/exact.H"), "foo/bar/baz/exact.C"); +} + TEST_F(InterpolateTest, Aliasing) { add("foo.cpp", "-faligned-new");