From ec364d727bd3f5b348b72f8e814efa407da94122 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 7 Sep 2017 22:20:38 +0000 Subject: [PATCH] llvm-ar: exit with 1 if there is an error. This is pr34396. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@312752 91177308-0d34-0410-b5e6-96231b3b80d8 --- test/tools/llvm-ar/invalid-command-line.test | 4 +++ tools/llvm-ar/llvm-ar.cpp | 34 ++++++++------------ 2 files changed, 18 insertions(+), 20 deletions(-) create mode 100644 test/tools/llvm-ar/invalid-command-line.test diff --git a/test/tools/llvm-ar/invalid-command-line.test b/test/tools/llvm-ar/invalid-command-line.test new file mode 100644 index 00000000000..44a37286a99 --- /dev/null +++ b/test/tools/llvm-ar/invalid-command-line.test @@ -0,0 +1,4 @@ +Test that llvm-ar exits with 1 when there is an error. + +RUN: not llvm-ar e 2>&1 | FileCheck %s +CHECK: unknown option e. diff --git a/tools/llvm-ar/llvm-ar.cpp b/tools/llvm-ar/llvm-ar.cpp index 4fe12efb7ec..65c61989282 100644 --- a/tools/llvm-ar/llvm-ar.cpp +++ b/tools/llvm-ar/llvm-ar.cpp @@ -54,6 +54,8 @@ static StringRef ToolName; // Show the error message and exit. LLVM_ATTRIBUTE_NORETURN static void fail(Twine Error) { errs() << ToolName << ": " << Error << ".\n"; + // FIXME: Other ar implementations will print the command line help in here. + // Unfortunately cl::PrintHelpMessage() exits with 0, so we can't call it. exit(1); } @@ -164,26 +166,18 @@ static std::string ArchiveName; // on the command line. static std::vector Members; -// Show the error message, the help message and exit. -LLVM_ATTRIBUTE_NORETURN static void -show_help(const std::string &msg) { - errs() << ToolName << ": " << msg << "\n\n"; - cl::PrintHelpMessage(); - exit(1); -} - // Extract the member filename from the command line for the [relpos] argument // associated with a, b, and i modifiers static void getRelPos() { if(RestOfArgs.size() == 0) - show_help("Expected [relpos] for a, b, or i modifier"); + fail("Expected [relpos] for a, b, or i modifier"); RelPos = RestOfArgs[0]; RestOfArgs.erase(RestOfArgs.begin()); } static void getOptions() { if(RestOfArgs.size() == 0) - show_help("Expected options"); + fail("Expected options"); Options = RestOfArgs[0]; RestOfArgs.erase(RestOfArgs.begin()); } @@ -191,7 +185,7 @@ static void getOptions() { // Get the archive file name from the command line static void getArchive() { if(RestOfArgs.size() == 0) - show_help("An archive name must be specified"); + fail("An archive name must be specified"); ArchiveName = RestOfArgs[0]; RestOfArgs.erase(RestOfArgs.begin()); } @@ -275,7 +269,7 @@ static ArchiveOperation parseCommandLine() { Thin = true; break; default: - cl::PrintHelpMessage(); + fail(std::string("unknown option ") + Options[i]); } } @@ -290,26 +284,26 @@ static ArchiveOperation parseCommandLine() { NumOperations = 1; Operation = CreateSymTab; if (!Members.empty()) - show_help("The s operation takes only an archive as argument"); + fail("The s operation takes only an archive as argument"); } // Perform various checks on the operation/modifier specification // to make sure we are dealing with a legal request. if (NumOperations == 0) - show_help("You must specify at least one of the operations"); + fail("You must specify at least one of the operations"); if (NumOperations > 1) - show_help("Only one operation may be specified"); + fail("Only one operation may be specified"); if (NumPositional > 1) - show_help("You may only specify one of a, b, and i modifiers"); + fail("You may only specify one of a, b, and i modifiers"); if (AddAfter || AddBefore) { if (Operation != Move && Operation != ReplaceOrInsert) - show_help("The 'a', 'b' and 'i' modifiers can only be specified with " - "the 'm' or 'r' operations"); + fail("The 'a', 'b' and 'i' modifiers can only be specified with " + "the 'm' or 'r' operations"); } if (OriginalDates && Operation != Extract) - show_help("The 'o' modifier is only applicable to the 'x' operation"); + fail("The 'o' modifier is only applicable to the 'x' operation"); if (OnlyUpdate && Operation != ReplaceOrInsert) - show_help("The 'u' modifier is only applicable to the 'r' operation"); + fail("The 'u' modifier is only applicable to the 'r' operation"); // Return the parsed operation to the caller return Operation; -- 2.50.1