]> granicus.if.org Git - llvm/commitdiff
llvm-ar: exit with 1 if there is an error.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 7 Sep 2017 22:20:38 +0000 (22:20 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 7 Sep 2017 22:20:38 +0000 (22:20 +0000)
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 [new file with mode: 0644]
tools/llvm-ar/llvm-ar.cpp

diff --git a/test/tools/llvm-ar/invalid-command-line.test b/test/tools/llvm-ar/invalid-command-line.test
new file mode 100644 (file)
index 0000000..44a3728
--- /dev/null
@@ -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.
index 4fe12efb7ec8bca3343b19d3905ae25398028e1e..65c61989282fcc5c08c20181d5e61510908f4aec 100644 (file)
@@ -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<StringRef> 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;