Index: clang/lib/Tooling/Tooling.cpp =================================================================== --- clang/lib/Tooling/Tooling.cpp +++ clang/lib/Tooling/Tooling.cpp @@ -435,13 +435,22 @@ static void injectResourceDir(CommandLineArguments &Args, const char *Argv0, void *MainAddr) { // Allow users to override the resource dir. - for (StringRef Arg : Args) + // Don't search/inject past "--", as the subsequent arguments are only file + // names. + auto FlagsEnd = Args.end(); + for (auto B = Args.begin(), I = B, E = Args.end(); I != E; ++I) { + StringRef Arg = *I; + if (Arg == "--") { + FlagsEnd = I; + break; + } if (Arg.startswith("-resource-dir")) return; + } // If there's no override in place add our resource dir. - Args.push_back("-resource-dir=" + - CompilerInvocation::GetResourcesPath(Argv0, MainAddr)); + Args.insert(FlagsEnd, "-resource-dir=" + CompilerInvocation::GetResourcesPath( + Argv0, MainAddr)); } int ClangTool::run(ToolAction *Action) { Index: clang/test/ClangScanDeps/Inputs/regular_cdb.json =================================================================== --- clang/test/ClangScanDeps/Inputs/regular_cdb.json +++ 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" } ] Index: clang/tools/clang-scan-deps/ClangScanDeps.cpp =================================================================== --- clang/tools/clang-scan-deps/ClangScanDeps.cpp +++ clang/tools/clang-scan-deps/ClangScanDeps.cpp @@ -421,14 +421,18 @@ bool HasMQ = false; bool HasMD = false; bool HasResourceDir = false; + auto FlagsEnd = llvm::find(Args, "--"); + // 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]; + if (FlagsEnd != Args.begin()) { + // Reverse scan, starting at the end or at the element before "--". + for (auto RB = llvm::make_reverse_iterator(FlagsEnd), RI = RB, + RE = Args.rend(); + RI != RE; ++RI) { + StringRef Arg = *RI; if (LastO.empty()) { - if (Arg == "-o" && It != Args.rbegin()) - LastO = Args[Idx + 1]; + if (Arg == "-o" && RI != RB) + LastO = RI[-1]; // Next argument (reverse iterator) else if (Arg.startswith("-o")) LastO = Arg.drop_front(2).str(); } @@ -440,12 +444,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) { @@ -475,6 +478,7 @@ AdjustedArgs.push_back(std::string(ResourceDir)); } } + AdjustedArgs.insert(AdjustedArgs.end(), FlagsEnd, Args.end()); return AdjustedArgs; }); AdjustingCompilations->appendArgumentsAdjuster(