https://github.com/Meinersbur updated 
https://github.com/llvm/llvm-project/pull/219540

>From 7c97aa393792ead8e5a20c0fe31dd150d54f58b4 Mon Sep 17 00:00:00 2001
From: Michael Kruse <[email protected]>
Date: Fri, 28 Aug 2026 19:06:02 +0200
Subject: [PATCH 1/6] Remove can_write check

---
 llvm/lib/Support/VirtualOutputBackends.cpp | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/llvm/lib/Support/VirtualOutputBackends.cpp 
b/llvm/lib/Support/VirtualOutputBackends.cpp
index 0c6ce825d02d0..56f6408e82f96 100644
--- a/llvm/lib/Support/VirtualOutputBackends.cpp
+++ b/llvm/lib/Support/VirtualOutputBackends.cpp
@@ -314,12 +314,6 @@ Error OnDiskOutputFile::initializeFile(std::optional<int> 
&FD) {
     if (sys::fs::exists(Status)) {
       if (!sys::fs::is_regular_file(Status))
         Config.setNoAtomicWrite();
-
-      // Fail now if we can't write to the final destination.
-      if (!sys::fs::can_write(OutputPath))
-        return make_error<OutputError>(
-            OutputPath,
-            std::make_error_code(std::errc::operation_not_permitted));
     }
   }
 

>From 7ba7fff8259d753f1562d2cefe04aedf1edd6612 Mon Sep 17 00:00:00 2001
From: Michael Kruse <[email protected]>
Date: Fri, 28 Aug 2026 19:26:14 +0200
Subject: [PATCH 2/6] Keep check in append mode

---
 llvm/lib/Support/VirtualOutputBackends.cpp | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/llvm/lib/Support/VirtualOutputBackends.cpp 
b/llvm/lib/Support/VirtualOutputBackends.cpp
index 56f6408e82f96..a90d9c076fc63 100644
--- a/llvm/lib/Support/VirtualOutputBackends.cpp
+++ b/llvm/lib/Support/VirtualOutputBackends.cpp
@@ -314,6 +314,12 @@ Error OnDiskOutputFile::initializeFile(std::optional<int> 
&FD) {
     if (sys::fs::exists(Status)) {
       if (!sys::fs::is_regular_file(Status))
         Config.setNoAtomicWrite();
+
+      // Fail now if we can't write to the final destination.
+      if (Config.getAppend() && !sys::fs::can_write(OutputPath))
+        return make_error<OutputError>(
+            OutputPath,
+            std::make_error_code(std::errc::operation_not_permitted));
     }
   }
 

>From 358765ae1b4e680e6f8a7291c3468153d39c2ff3 Mon Sep 17 00:00:00 2001
From: Michael Kruse <[email protected]>
Date: Fri, 28 Aug 2026 23:55:07 +0200
Subject: [PATCH 3/6] update comments

---
 llvm/lib/Support/VirtualOutputBackends.cpp | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/llvm/lib/Support/VirtualOutputBackends.cpp 
b/llvm/lib/Support/VirtualOutputBackends.cpp
index a90d9c076fc63..91ed0113409af 100644
--- a/llvm/lib/Support/VirtualOutputBackends.cpp
+++ b/llvm/lib/Support/VirtualOutputBackends.cpp
@@ -306,8 +306,8 @@ Error OnDiskOutputFile::initializeFile(std::optional<int> 
&FD) {
   assert(OutputPath != "-" && "Unexpected request for FD of stdout");
 
   // Disable temporary file for other non-regular files, and if we get a status
-  // object, also check if we can write and disable write-through buffers if
-  // appropriate.
+  // object, also check if in append mode we can write and disable 
write-through
+  // buffers if appropriate.
   if (Config.getAtomicWrite()) {
     sys::fs::file_status Status;
     sys::fs::status(OutputPath, Status);
@@ -315,7 +315,10 @@ Error OnDiskOutputFile::initializeFile(std::optional<int> 
&FD) {
       if (!sys::fs::is_regular_file(Status))
         Config.setNoAtomicWrite();
 
-      // Fail now if we can't write to the final destination.
+      // In append mode, we will open the file for writing which will need 
write
+      // permission. Fail now if it is already clear that we can't write to the
+      // final destination. Otherwise, we will delete and replace the file.
+      // Permission bits of the file itself are irrelvant in this case.
       if (Config.getAppend() && !sys::fs::can_write(OutputPath))
         return make_error<OutputError>(
             OutputPath,

>From 20852fe7a18d77b2764585e6a14e7e5394d0dec4 Mon Sep 17 00:00:00 2001
From: Michael Kruse <[email protected]>
Date: Sat, 29 Aug 2026 00:00:37 +0200
Subject: [PATCH 4/6] Fix typo

---
 llvm/lib/Support/VirtualOutputBackends.cpp | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/Support/VirtualOutputBackends.cpp 
b/llvm/lib/Support/VirtualOutputBackends.cpp
index 91ed0113409af..82ce98355b1c3 100644
--- a/llvm/lib/Support/VirtualOutputBackends.cpp
+++ b/llvm/lib/Support/VirtualOutputBackends.cpp
@@ -317,8 +317,9 @@ Error OnDiskOutputFile::initializeFile(std::optional<int> 
&FD) {
 
       // In append mode, we will open the file for writing which will need 
write
       // permission. Fail now if it is already clear that we can't write to the
-      // final destination. Otherwise, we will delete and replace the file.
-      // Permission bits of the file itself are irrelvant in this case.
+      // final destination.
+      // In non-append more, we will delete and replace the file. Permission
+      // bits of the file itself are irrelevant in this case.
       if (Config.getAppend() && !sys::fs::can_write(OutputPath))
         return make_error<OutputError>(
             OutputPath,

>From 376069e05d7b195152accbc7bf41f1c65600643d Mon Sep 17 00:00:00 2001
From: Michael Kruse <[email protected]>
Date: Sat, 29 Aug 2026 00:50:45 +0200
Subject: [PATCH 5/6] Add regression test

---
 clang/test/VFS/output-file-permissions.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)
 create mode 100644 clang/test/VFS/output-file-permissions.c

diff --git a/clang/test/VFS/output-file-permissions.c 
b/clang/test/VFS/output-file-permissions.c
new file mode 100644
index 0000000000000..42d24b2e166c2
--- /dev/null
+++ b/clang/test/VFS/output-file-permissions.c
@@ -0,0 +1,16 @@
+// UNSUPPORTED: system-windows
+
+// Reset test
+// rm -f %t-ref.o %t-readonly.o
+
+// Create a reference file
+// RUN: %clang -c %s -o %t-ref.o
+
+// Compile something, mark the output as read-only and expect it to be replaced
+// (permission bits of the file itself are irrelevant)
+// RUN: touch %t-readonly.o
+// RUN: chmod 100 %t-readonly.o
+// RUN: %clang -c %s -o %t-readonly.o
+// RUN: cmp %t-ref.o %t-readonly.o
+
+void foo() {}

>From 99a6be9b608c16087a7dfeaee56253a3f1de7a1c Mon Sep 17 00:00:00 2001
From: Michael Kruse <[email protected]>
Date: Sat, 29 Aug 2026 01:46:38 +0200
Subject: [PATCH 6/6] Fix typo

---
 llvm/lib/Support/VirtualOutputBackends.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/lib/Support/VirtualOutputBackends.cpp 
b/llvm/lib/Support/VirtualOutputBackends.cpp
index 82ce98355b1c3..dd92edf5bf296 100644
--- a/llvm/lib/Support/VirtualOutputBackends.cpp
+++ b/llvm/lib/Support/VirtualOutputBackends.cpp
@@ -318,7 +318,7 @@ Error OnDiskOutputFile::initializeFile(std::optional<int> 
&FD) {
       // In append mode, we will open the file for writing which will need 
write
       // permission. Fail now if it is already clear that we can't write to the
       // final destination.
-      // In non-append more, we will delete and replace the file. Permission
+      // In non-append mode, we will delete and replace the file. Permission
       // bits of the file itself are irrelevant in this case.
       if (Config.getAppend() && !sys::fs::can_write(OutputPath))
         return make_error<OutputError>(

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to