As of CMake commit https://gitlab.kitware.com/cmake/cmake/-/commit/d993ebd4,
which first appeared in CMake 3.19.x series, in the compile commands for
clang-cl, CMake puts -- before the input file. When operating on such a
database, the InterpolatingCompilationDatabase - specifically, the
TransferableCommand constructor - does not recognize that pattern and so, does
not strip the input, or the double dash when 'transferring' the compile command.
This results in a incorrect compile command - with the double dash and old input
file left in, and the language options and new input file appended after them,
where they're all treated as inputs, including the language version option.
Test files for some tests have names similar enough to be matched to commands
from the database, e.g.:
.../path-mappings.test.tmp/server/bar.cpp
can be matched to:
.../Driver/ToolChains/BareMetal.cpp
etc. When that happens, the tool being tested tries to use the matched, and
incorrectly 'transferred' compile command, and fails, reporting errors similar
to:
error: no such file or directory: '/std:c++14'; did you mean '/std:c++14'? [clang-diagnostic-error]
This happens in at least 4 tests:
Clang Tools :: clang-tidy/checkers/performance-trivially-destructible.cpp Clangd :: check-fail.test Clangd :: check.test Clangd :: path-mappings.test
The fix for TransferableCommand removes the -- and everything after it when
determining the arguments that apply to the new file. -- is inserted in the
'transferred' command if the new file name starts with - and when operating in
clang-cl mode, also /. Additionally, other places in the code known to do
argument adjustment without accounting for the -- and causing the tests to
fail are fixed as well.
we should perform this either in all or none. thinking about this again, there are a lot more things that can go wrong but they happen pretty rarely so let's just drop this change and replace the push_back below with getInsertArgumentAdjuster("-fsyntax-only")(AdjustedArgs, "");
copying over args once more isn't crucial here as this happen only once before parsing a translation unit, which by far dominates the latency.