diff --git a/test/Object/ar-create.test b/test/Object/ar-create.test new file mode 100644 index 00000000000..40e391da029 --- /dev/null +++ b/test/Object/ar-create.test @@ -0,0 +1,17 @@ +Test which operations create an archive and which don't. + +RUN: touch %t +RUN: rm -f %t.foo.a +RUN: not llvm-ar p %t.foo.a %t 2>&1 | FileCheck %s +RUN: not llvm-ar d %t.foo.a %t 2>&1 | FileCheck %s +RUN: not llvm-ar m %t.foo.a %t 2>&1 | FileCheck %s +RUN: not llvm-ar t %t.foo.a %t 2>&1 | FileCheck %s +RUN: not llvm-ar x %t.foo.a %t 2>&1 | FileCheck %s + +RUN: llvm-ar q %t.foo.a %t 2>&1 | FileCheck --check-prefix=CREATE %s +RUN: rm -f %t.foo.a +RUN: llvm-ar r %t.foo.a %t 2>&1 | FileCheck --check-prefix=CREATE %s +RUN: rm -f %t.foo.a + +CHECK: .foo.a': No such file or directory +CREATE: creating {{.*}}.foo.a diff --git a/tools/llvm-ar/llvm-ar.cpp b/tools/llvm-ar/llvm-ar.cpp index 53707154910..515f8991e84 100644 --- a/tools/llvm-ar/llvm-ar.cpp +++ b/tools/llvm-ar/llvm-ar.cpp @@ -642,6 +642,21 @@ doReplaceOrInsert(std::string* ErrMsg) { return false; } +bool shouldCreateArchive(ArchiveOperation Op) { + switch (Op) { + case Print: + case Delete: + case Move: + case DisplayTable: + case Extract: + return false; + + case QuickAppend: + case ReplaceOrInsert: + return true; + } +} + // main - main program for llvm-ar .. see comments in the code int main(int argc, char **argv) { program_name = argv[0]; @@ -665,13 +680,15 @@ int main(int argc, char **argv) { ArchiveOperation Operation = parseCommandLine(); // Create or open the archive object. - if (!llvm::sys::fs::exists(ArchiveName)) { + if (shouldCreateArchive(Operation) && !llvm::sys::fs::exists(ArchiveName)) { // Produce a warning if we should and we're creating the archive if (!Create) errs() << argv[0] << ": creating " << ArchiveName << "\n"; TheArchive = Archive::CreateEmpty(ArchiveName, Context); TheArchive->writeToDisk(); - } else { + } + + if (!TheArchive) { std::string Error; TheArchive = Archive::OpenAndLoad(ArchiveName, Context, &Error); if (TheArchive == 0) {