diff options
-rw-r--r-- | clang/include/clang/Tooling/ArgumentsAdjusters.h | 6 | ||||
-rw-r--r-- | clang/include/clang/Tooling/Tooling.h | 2 | ||||
-rw-r--r-- | clang/lib/Tooling/ArgumentsAdjusters.cpp | 17 | ||||
-rw-r--r-- | clang/lib/Tooling/Tooling.cpp | 5 | ||||
-rw-r--r-- | clang/test/Tooling/clang-check-strip-o.cpp | 11 |
5 files changed, 38 insertions, 3 deletions
diff --git a/clang/include/clang/Tooling/ArgumentsAdjusters.h b/clang/include/clang/Tooling/ArgumentsAdjusters.h index 492ddd2b007..71acef8650f 100644 --- a/clang/include/clang/Tooling/ArgumentsAdjusters.h +++ b/clang/include/clang/Tooling/ArgumentsAdjusters.h @@ -52,6 +52,12 @@ class ClangSyntaxOnlyAdjuster : public ArgumentsAdjuster { virtual CommandLineArguments Adjust(const CommandLineArguments &Args); }; +/// \brief An argument adjuster which removes output-related command line +/// arguments. +class ClangStripOutputAdjuster : public ArgumentsAdjuster { + virtual CommandLineArguments Adjust(const CommandLineArguments &Args); +}; + } // end namespace tooling } // end namespace clang diff --git a/clang/include/clang/Tooling/Tooling.h b/clang/include/clang/Tooling/Tooling.h index dc8163e553f..97bc2ab1464 100644 --- a/clang/include/clang/Tooling/Tooling.h +++ b/clang/include/clang/Tooling/Tooling.h @@ -233,7 +233,7 @@ class ClangTool { // Contains a list of pairs (<file name>, <file content>). std::vector< std::pair<StringRef, StringRef> > MappedFileContents; - SmallVector<ArgumentsAdjuster *, 1> ArgsAdjusters; + SmallVector<ArgumentsAdjuster *, 2> ArgsAdjusters; }; template <typename T> diff --git a/clang/lib/Tooling/ArgumentsAdjusters.cpp b/clang/lib/Tooling/ArgumentsAdjusters.cpp index c44b20dd5a8..a69971e006e 100644 --- a/clang/lib/Tooling/ArgumentsAdjusters.cpp +++ b/clang/lib/Tooling/ArgumentsAdjusters.cpp @@ -37,6 +37,23 @@ ClangSyntaxOnlyAdjuster::Adjust(const CommandLineArguments &Args) { return AdjustedArgs; } +CommandLineArguments +ClangStripOutputAdjuster::Adjust(const CommandLineArguments &Args) { + CommandLineArguments AdjustedArgs; + for (size_t i = 0, e = Args.size(); i < e; ++i) { + StringRef Arg = Args[i]; + if(!Arg.startswith("-o")) + AdjustedArgs.push_back(Args[i]); + + if(Arg == "-o") { + // Output is specified as -o foo. Skip the next argument also. + ++i; + } + // Else, the output is specified as -ofoo. Just do nothing. + } + return AdjustedArgs; +} + } // end namespace tooling } // end namespace clang diff --git a/clang/lib/Tooling/Tooling.cpp b/clang/lib/Tooling/Tooling.cpp index cdb9bc71ee2..a121cd0fd64 100644 --- a/clang/lib/Tooling/Tooling.cpp +++ b/clang/lib/Tooling/Tooling.cpp @@ -236,8 +236,9 @@ void ToolInvocation::addFileMappingsTo(SourceManager &Sources) { ClangTool::ClangTool(const CompilationDatabase &Compilations, ArrayRef<std::string> SourcePaths) - : Files((FileSystemOptions())), - ArgsAdjusters(1, new ClangSyntaxOnlyAdjuster()) { + : Files((FileSystemOptions())) { + ArgsAdjusters.push_back(new ClangStripOutputAdjuster()); + ArgsAdjusters.push_back(new ClangSyntaxOnlyAdjuster()); for (unsigned I = 0, E = SourcePaths.size(); I != E; ++I) { SmallString<1024> File(getAbsolutePath(SourcePaths[I])); diff --git a/clang/test/Tooling/clang-check-strip-o.cpp b/clang/test/Tooling/clang-check-strip-o.cpp new file mode 100644 index 00000000000..38f09a0f92d --- /dev/null +++ b/clang/test/Tooling/clang-check-strip-o.cpp @@ -0,0 +1,11 @@ +// RUN: rm -rf %t +// RUN: mkdir %t +// RUN: echo '[{"directory":".","command":"clang++ -c %t/test.cpp -o foo -ofoo","file":"%t/test.cpp"}]' | sed -e 's/\\/\//g' > %t/compile_commands.json +// RUN: cp "%s" "%t/test.cpp" +// RUN: clang-check -p "%t" "%t/test.cpp" -extra-arg=-v 2>&1|FileCheck %s +// FIXME: Make the above easier. + +// CHECK: Invocation +// CHECK-NOT: {{ -v}} +// CHECK: C++ requires +invalid; |