diff --git a/clang/test/ClangScanDeps/Inputs/regular_cdb.json b/clang/test/ClangScanDeps/Inputs/regular_cdb.json --- a/clang/test/ClangScanDeps/Inputs/regular_cdb.json +++ b/clang/test/ClangScanDeps/Inputs/regular_cdb.json @@ -11,7 +11,7 @@ }, { "directory": "DIR", - "command": "clang -E DIR/regular_cdb_input.cpp -IInputs -o adena.o", + "command": "clang -E -IInputs -o adena.o -- DIR/regular_cdb_input.cpp", "file": "DIR/regular_cdb_input.cpp" } ] diff --git a/clang/tools/clang-scan-deps/ClangScanDeps.cpp b/clang/tools/clang-scan-deps/ClangScanDeps.cpp --- a/clang/tools/clang-scan-deps/ClangScanDeps.cpp +++ b/clang/tools/clang-scan-deps/ClangScanDeps.cpp @@ -418,14 +418,15 @@ bool HasMQ = false; bool HasMD = false; bool HasResourceDir = false; - // We need to find the last -o value. - if (!Args.empty()) { - std::size_t Idx = Args.size() - 1; - for (auto It = Args.rbegin(); It != Args.rend(); ++It) { - StringRef Arg = Args[Idx]; + auto FlagsEnd = llvm::find(Args, "--"); + if (FlagsEnd != Args.begin()) { + // Reverse scan, starting at the end or at the element before "--". + auto R = llvm::make_reverse_iterator(FlagsEnd); + for (auto I = R, E = Args.rend(); I != E; ++I) { + StringRef Arg = *I; if (LastO.empty()) { - if (Arg == "-o" && It != Args.rbegin()) - LastO = Args[Idx + 1]; + if (Arg == "-o" && I != R) + LastO = I[-1]; // Next argument (reverse iterator) else if (Arg.startswith("-o")) LastO = Arg.drop_front(2).str(); } @@ -437,12 +438,11 @@ HasMD = true; if (Arg == "-resource-dir") HasResourceDir = true; - --Idx; } } // If there's no -MT/-MQ Driver would add -MT with the value of the last // -o option. - tooling::CommandLineArguments AdjustedArgs = Args; + tooling::CommandLineArguments AdjustedArgs(Args.begin(), FlagsEnd); AdjustedArgs.push_back("-o"); AdjustedArgs.push_back("/dev/null"); if (!HasMT && !HasMQ) { @@ -472,6 +472,7 @@ AdjustedArgs.push_back(std::string(ResourceDir)); } } + AdjustedArgs.insert(AdjustedArgs.end(), FlagsEnd, Args.end()); return AdjustedArgs; }); AdjustingCompilations->appendArgumentsAdjuster(