diff --git a/clang-tools-extra/clang-query/tool/ClangQuery.cpp b/clang-tools-extra/clang-query/tool/ClangQuery.cpp --- a/clang-tools-extra/clang-query/tool/ClangQuery.cpp +++ b/clang-tools-extra/clang-query/tool/ClangQuery.cpp @@ -35,6 +35,7 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/Signals.h" +#include "llvm/Support/WithColor.h" #include #include @@ -86,7 +87,14 @@ int main(int argc, const char **argv) { llvm::sys::PrintStackTraceOnErrorSignal(argv[0]); - CommonOptionsParser OptionsParser(argc, argv, ClangQueryCategory); + llvm::Expected OptionsParser = + CommonOptionsParser::create(argc, argv, ClangQueryCategory, + llvm::cl::OneOrMore); + + if (!OptionsParser) { + llvm::WithColor::error() << llvm::toString(OptionsParser.takeError()); + return 1; + } if (!Commands.empty() && !CommandFiles.empty()) { llvm::errs() << argv[0] << ": cannot specify both -c and -f\n"; @@ -99,8 +107,8 @@ return 1; } - ClangTool Tool(OptionsParser.getCompilations(), - OptionsParser.getSourcePathList()); + ClangTool Tool(OptionsParser->getCompilations(), + OptionsParser->getSourcePathList()); std::vector> ASTs; int Status = Tool.buildASTs(ASTs); int ASTStatus = 0; diff --git a/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp b/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp --- a/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp +++ b/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp @@ -23,6 +23,7 @@ #include "llvm/Support/Process.h" #include "llvm/Support/Signals.h" #include "llvm/Support/TargetSelect.h" +#include "llvm/Support/WithColor.h" using namespace clang::ast_matchers; using namespace clang::driver; @@ -333,8 +334,14 @@ int clangTidyMain(int argc, const char **argv) { llvm::InitLLVM X(argc, argv); - CommonOptionsParser OptionsParser(argc, argv, ClangTidyCategory, - cl::ZeroOrMore); + llvm::Expected OptionsParser = + CommonOptionsParser::create(argc, argv, ClangTidyCategory, + cl::ZeroOrMore); + if (!OptionsParser) { + llvm::WithColor::error() << llvm::toString(OptionsParser.takeError()); + return 1; + } + llvm::IntrusiveRefCntPtr BaseFS( new vfs::OverlayFileSystem(vfs::getRealFileSystem())); @@ -365,7 +372,7 @@ SmallString<256> ProfilePrefix = MakeAbsolute(StoreCheckProfile); StringRef FileName("dummy"); - auto PathList = OptionsParser.getSourcePathList(); + auto PathList = OptionsParser->getSourcePathList(); if (!PathList.empty()) { FileName = PathList.front(); } @@ -433,7 +440,7 @@ ClangTidyContext Context(std::move(OwningOptionsProvider), AllowEnablingAnalyzerAlphaCheckers); std::vector Errors = - runClangTidy(Context, OptionsParser.getCompilations(), PathList, BaseFS, + runClangTidy(Context, OptionsParser->getCompilations(), PathList, BaseFS, EnableCheckProfile, ProfilePrefix); bool FoundErrors = llvm::find_if(Errors, [](const ClangTidyError &E) { return E.DiagLevel == ClangTidyError::Error; diff --git a/clang-tools-extra/test/clang-query/invalid-command-line.cpp b/clang-tools-extra/test/clang-query/invalid-command-line.cpp new file mode 100644 --- /dev/null +++ b/clang-tools-extra/test/clang-query/invalid-command-line.cpp @@ -0,0 +1,4 @@ +// RUN: not clang-query --invalid-arg 2>&1 | FileCheck %s + +// CHECK: error: [CommonOptionsParser]: clang-query{{(\.exe)?}}: Unknown command line argument '--invalid-arg'. Try: 'clang-query{{(\.exe)?}} --help' +// CHECK-NEXT: clang-query{{(\.exe)?}}: Did you mean '--extra-arg'? diff --git a/clang-tools-extra/test/clang-tidy/infrastructure/invalid-command-line.cpp b/clang-tools-extra/test/clang-tidy/infrastructure/invalid-command-line.cpp new file mode 100644 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/infrastructure/invalid-command-line.cpp @@ -0,0 +1,4 @@ +// RUN: not clang-tidy --invalid-arg 2>&1 | FileCheck %s + +// CHECK: error: [CommonOptionsParser]: clang-tidy{{(\.exe)?}}: Unknown command line argument '--invalid-arg'. Try: 'clang-tidy{{(\.exe)?}} --help' +// CHECK-NEXT: clang-tidy{{(\.exe)?}}: Did you mean '--extra-arg'?