Index: clang/include/clang/Tooling/CommonOptionsParser.h =================================================================== --- clang/include/clang/Tooling/CommonOptionsParser.h +++ clang/include/clang/Tooling/CommonOptionsParser.h @@ -63,21 +63,8 @@ /// } /// \endcode class CommonOptionsParser { -public: - /// Parses command-line, initializes a compilation database. - /// - /// This constructor can change argc and argv contents, e.g. consume - /// command-line options used for creating FixedCompilationDatabase. - /// - /// All options not belonging to \p Category become hidden. - /// - /// This constructor exits program in case of error. - CommonOptionsParser(int &argc, const char **argv, - llvm::cl::OptionCategory &Category, - const char *Overview = nullptr) - : CommonOptionsParser(argc, argv, Category, llvm::cl::OneOrMore, - Overview) {} +protected: /// Parses command-line, initializes a compilation database. /// /// This constructor can change argc and argv contents, e.g. consume @@ -86,16 +73,17 @@ /// All options not belonging to \p Category become hidden. /// /// It also allows calls to set the required number of positional parameters. - CommonOptionsParser(int &argc, const char **argv, - llvm::cl::OptionCategory &Category, - llvm::cl::NumOccurrencesFlag OccurrencesFlag, - const char *Overview = nullptr); + CommonOptionsParser( + int &argc, const char **argv, llvm::cl::OptionCategory &Category, + llvm::cl::NumOccurrencesFlag OccurrencesFlag = llvm::cl::OneOrMore, + const char *Overview = nullptr); +public: /// A factory method that is similar to the above constructor, except /// this returns an error instead exiting the program on error. static llvm::Expected create(int &argc, const char **argv, llvm::cl::OptionCategory &Category, - llvm::cl::NumOccurrencesFlag OccurrencesFlag, + llvm::cl::NumOccurrencesFlag OccurrencesFlag = llvm::cl::OneOrMore, const char *Overview = nullptr); /// Returns a reference to the loaded compilations database. Index: clang/lib/Tooling/CommonOptionsParser.cpp =================================================================== --- clang/lib/Tooling/CommonOptionsParser.cpp +++ clang/lib/Tooling/CommonOptionsParser.cpp @@ -115,8 +115,7 @@ // Stop initializing if command-line option parsing failed. if (!cl::ParseCommandLineOptions(argc, argv, Overview, &OS)) { OS.flush(); - return llvm::make_error("[CommonOptionsParser]: " + - ErrorMessage, + return llvm::make_error(ErrorMessage, llvm::inconvertibleErrorCode()); } Index: clang/tools/clang-check/ClangCheck.cpp =================================================================== --- clang/tools/clang-check/ClangCheck.cpp +++ clang/tools/clang-check/ClangCheck.cpp @@ -160,7 +160,13 @@ llvm::InitializeAllAsmPrinters(); llvm::InitializeAllAsmParsers(); - CommonOptionsParser OptionsParser(argc, argv, ClangCheckCategory); + auto ExpectedParser = + CommonOptionsParser::create(argc, argv, ClangCheckCategory); + if (!ExpectedParser) { + llvm::errs() << ExpectedParser.takeError(); + return 1; + } + CommonOptionsParser &OptionsParser = ExpectedParser.get(); ClangTool Tool(OptionsParser.getCompilations(), OptionsParser.getSourcePathList()); Index: clang/tools/clang-extdef-mapping/ClangExtDefMapGen.cpp =================================================================== --- clang/tools/clang-extdef-mapping/ClangExtDefMapGen.cpp +++ clang/tools/clang-extdef-mapping/ClangExtDefMapGen.cpp @@ -119,8 +119,13 @@ const char *Overview = "\nThis tool collects the USR name and location " "of external definitions in the source files " "(excluding headers).\n"; - CommonOptionsParser OptionsParser(argc, argv, ClangExtDefMapGenCategory, - cl::ZeroOrMore, Overview); + auto ExpectedParser = CommonOptionsParser::create( + argc, argv, ClangExtDefMapGenCategory, cl::ZeroOrMore, Overview); + if (!ExpectedParser) { + llvm::errs() << ExpectedParser.takeError(); + return 1; + } + CommonOptionsParser &OptionsParser = ExpectedParser.get(); ClangTool Tool(OptionsParser.getCompilations(), OptionsParser.getSourcePathList()); Index: clang/tools/clang-refactor/ClangRefactor.cpp =================================================================== --- clang/tools/clang-refactor/ClangRefactor.cpp +++ clang/tools/clang-refactor/ClangRefactor.cpp @@ -612,9 +612,14 @@ ClangRefactorTool RefactorTool; - CommonOptionsParser Options( + auto ExpectedParser = CommonOptionsParser::create( argc, argv, cl::GeneralCategory, cl::ZeroOrMore, "Clang-based refactoring tool for C, C++ and Objective-C"); + if (!ExpectedParser) { + llvm::errs() << ExpectedParser.takeError(); + return 1; + } + CommonOptionsParser &Options = ExpectedParser.get(); if (auto Err = RefactorTool.Init()) { llvm::errs() << llvm::toString(std::move(Err)) << "\n"; Index: clang/tools/clang-rename/ClangRename.cpp =================================================================== --- clang/tools/clang-rename/ClangRename.cpp +++ clang/tools/clang-rename/ClangRename.cpp @@ -98,7 +98,13 @@ cl::cat(ClangRenameOptions)); int main(int argc, const char **argv) { - tooling::CommonOptionsParser OP(argc, argv, ClangRenameOptions); + auto ExpectedParser = + tooling::CommonOptionsParser::create(argc, argv, ClangRenameOptions); + if (!ExpectedParser) { + llvm::errs() << ExpectedParser.takeError(); + return 1; + } + tooling::CommonOptionsParser &OP = ExpectedParser.get(); if (!Input.empty()) { // Populate QualifiedNames and NewNames from a YAML file.