llvm-ar: print an error when the requested member is not found.
authorRafael Espindola <rafael.espindola@gmail.com>
Tue, 14 Jul 2015 16:02:40 +0000 (16:02 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Tue, 14 Jul 2015 16:02:40 +0000 (16:02 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@242156 91177308-0d34-0410-b5e6-96231b3b80d8

test/Object/archive-extract.test
tools/llvm-ar/llvm-ar.cpp

index 4da2180eff36b7d02898127ccb5829198a555622..606fc753c3358482099919eb487ed050fe9aca8c 100644 (file)
@@ -41,3 +41,7 @@
 ; RUN: env TZ=GMT llvm-ar tv %t.a | FileCheck %s
 
 CHECK: 1465 2004-11-19 03:01:31.000000000 very_long_bytecode_file_name.bc
+
+
+RUN: not llvm-ar x %p/Inputs/GNU.a foo.o 2>&1 | FileCheck --check-prefix=NOTFOUND %s
+NOTFOUND: foo.o was not found
index b3e5043d5008d598aa8997626410a34cdcbb0bf7..50ddf598efee0ab36be5735bb569d6405add3366 100644 (file)
@@ -391,14 +391,18 @@ static bool shouldCreateArchive(ArchiveOperation Op) {
 
 static void performReadOperation(ArchiveOperation Operation,
                                  object::Archive *OldArchive) {
+  bool Filter = !Members.empty();
   for (const object::Archive::Child &C : OldArchive->children()) {
     ErrorOr<StringRef> NameOrErr = C.getName();
     failIfError(NameOrErr.getError());
     StringRef Name = NameOrErr.get();
 
-    if (!Members.empty() &&
-        std::find(Members.begin(), Members.end(), Name) == Members.end())
-      continue;
+    if (Filter) {
+      auto I = std::find(Members.begin(), Members.end(), Name);
+      if (I == Members.end())
+        continue;
+      Members.erase(I);
+    }
 
     switch (Operation) {
     default:
@@ -414,6 +418,11 @@ static void performReadOperation(ArchiveOperation Operation,
       break;
     }
   }
+  if (Members.empty())
+    return;
+  for (StringRef Name : Members)
+    errs() << Name << " was not found\n";
+  std::exit(1);
 }
 
 template <typename T>