llvm-ar: Let opening a directory failed in llvm-ar.
authorNAKAMURA Takumi <geek4civic@gmail.com>
Fri, 8 Nov 2013 12:35:56 +0000 (12:35 +0000)
committerNAKAMURA Takumi <geek4civic@gmail.com>
Fri, 8 Nov 2013 12:35:56 +0000 (12:35 +0000)
Linux cannot open directories with open(2), although cygwin and *bsd can.

Motivation: The test, Object/directory.ll, had been failing with --target=cygwin on Linux. XFAIL was improper for host issues.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194257 91177308-0d34-0410-b5e6-96231b3b80d8

test/Object/directory.ll
tools/llvm-ar/llvm-ar.cpp

index bf8ff3259502f37aef392aeaecba899c2f06f08f..48eefcb6ecb8d087023a671525491ae77d61192a 100644 (file)
@@ -2,9 +2,6 @@
 ;RUN: not llvm-ar r %T/test.a . 2>&1 | FileCheck %s
 ;CHECK: .: Is a directory
 
-; Opening a directory works on cygwin and freebsd.
-;XFAIL: freebsd, cygwin
-
 ;RUN: rm -f %T/test.a
 ;RUN: touch %T/a-very-long-file-name
 ;RUN: llvm-ar r %T/test.a %s %T/a-very-long-file-name
index 64ef3fa1bb9b35fe0296c6d64440c78ce435f89e..d70db728f2da1a8e899944b1409063d222a4d812 100644 (file)
@@ -782,6 +782,13 @@ static void performWriteOperation(ArchiveOperation Operation,
       sys::fs::file_status Status;
       failIfError(sys::fs::status(FD, Status), FileName);
 
+      // Opening a directory doesn't make sense. Let it failed.
+      // Linux cannot open directories with open(2), although
+      // cygwin and *bsd can.
+      if (Status.type() == sys::fs::file_type::directory_file)
+        failIfError(error_code(errc::is_a_directory, posix_category()),
+                    FileName);
+
       OwningPtr<MemoryBuffer> File;
       failIfError(MemoryBuffer::getOpenFile(FD, FileName, File,
                                             Status.getSize(), false),