<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=http://email.email.llvm.org/c/eJy1WNtu4zYQ_Rr7hYigiyVZD35wHLtdNLtbbBYI-hRQEiWzoUiDpHL5-86QtmU5aTebbQxBEinOmTPDIYfjUtXPi6-SPHJZq0dDeEM-kY7qe0JJwwUj1BDNaH2hpHgmVNbEbhnRvSSTLKwEle1Fo3RHLbng0EOUhAHQ4hYghSAN5QLe7Ba6uSHG0ur-wmpasUmynIRXk_Bwz8L95ZpLY5i2HOAQgdUwmrTMrgRn0k7i-SQuyCTO4IJHfMVpK5WxvPIDiFSWGAYDI_g6iVfelhXqTFeVqhk8hHjoLnZa_c0qi71oDHbzEu6X1PAKngNyUO12iCS4ZCSNZp7nn9fr5c2amL7swGRKyr4Ff-2UtsQqsrV2Z1BpvIELvpkAtQZKt9B27uSyEn3NnFsrTc2WlOAi56HAq7hBn5G673ZHl4UBcb8_tWo17QjVbd-B3aiLBAHwfmkfXGXPRb1_5dK_nM5hwJ4YzCN4j1YVM8aZ7BSCk5OQhE8h_PKmyaM8LNK8CMnvYINgyxIN_k_3YvPo3Zt-hy6Ct1sfd9jHW0mFCcAhgDML53APB-3RoB3CsYjKCrogEPZKbz99ufp6e4M4f918X39OYnjtK21Lalgd1EJM4svwKUMxiJ0BNz7Drefz4h24KDbCTca4cTIr05_HzVFshDs7xw3j_D24IDbCTc9wo7B4h39zFBvhZud8adS8hy-IjXDz02jMGlpGcUz8GgbgZDksXLOWLaxZ372GZbrqtYbFMowAOqVSAveUX98ikmUa5ePYnY-5lkkSste5XuIKZXrgCtQeFK_fTG2_nZz0vEJzC0hREqVjlsWZR1lZzd_AcpKvX375ONZpNrDGbeFsV5qVWZhjbqJSyedO9YZI2jGzw4wT557y0qqOV1SI58_qgdUbyA1HW1759jNB8Y09am7Z8Kb3QTGbzcbEo3PiUVOduvsg71vARbv2agsjPC_zs27-EcUsH1OMxxERJvN8dkrRZ43T97fxsLDYzFnugeYKmxufifaM0nTMKDljFKdZDMcVLv9nxWkajRXPRrOVNEUI64XLB3XP7pz-2uunYQT3u0el7-EZ4W6GCo3GYH6ojgRc8nuo4Dykbb87jhjakIrvKtV1SkJGFACeF2NG6TmjKGPk7s4A9F7QEbszbPvx5OL5fMwue8GOvcbu45klydlM5ufMYtiMkcvq2_cbj_MhrFDFPrqis3V2kh-aiGVVHkKafzVHPhvLOpcj_1h_-7K-TuLg6vrapcgIpY4pEmGLU9gmDOMs_WFKlxZS7jHtpigyYI6P6P7-3R3rGesMHnhLBldFe8PgEEnqIQdX_lzuxtqAvLbLunrB6mfEYe40LU8QCNNa6UMFIvEjdTWCl6PuBIqH6N3-THzgoRrX3XFjuGyJJxJAlQMFibwnoxrGbFUvaoJicJQHCp3SgMhq2qr2yAHSiaEtg-WPYgiKCkBII43e03jUCj7smHaKlTTBqddAu-asRlMb3vagBOW26tH3PPlqqYS-TwRsceWMGyUdOHuiFfQo0WOJhFXJIxwoHHcGtRYQqbYMigbubXfFD-C53Z6W0Gi06jBLviXJQFXniTgFoC23gAjzQAndcSR8VEZfqgrIbz346yB-mGC1Y_KEm3QCjloHO7ib5q0rLby96PeRA28P9tYK_NAxnMzWF5r0GFsdxpZTYNRQlipvgo8YtExT5zJUBMai0YG69zUmGo9QBPzdIySIo1bcEkZ8ICwGGj4KqIXCzbVVr0_Xwj4GJ8nGqcfJbWjHBaf6pFQG3440LCU4DuKz3WKZt5nWi6QukoJOaQ_demF1P-21WIxrzhbw-jKALREargbzj2NyjDcQnz2eJTZpUoTxdLtoijKvWB2xopzVcDBpaBaziJVZXuRl0rCpoCUTZjFJL6G6HuVSKLbTq-mvk-CLOIzhivIohjNfEdQlbNdVMmdpSWd1Xk1mIYMdVRzr6aleOEgssuGj4MYOxfYUtgooLxlznIGh5VZA49_-wqAn_3m4-ME_Icw-vAiskmfSt_DtWKpPHf-FI_8Poh1pFQ>53902</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            `clang-format -i` on a read-only file fails with a very ugly backtrace
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            clang-format
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          tru
      </td>
    </tr>
</table>

<pre>
    On windows if I mark a file as read-only and the run `clang-format -i` on that it will fail with this stack-trace:

```
Assertion failed: getClient() && "DiagnosticClient not set!", file C:\code\llvm-project\clang\lib\Basic\Diagnostic.cpp, line 514
PLEASE submit a bug report to https://bugs.llvm.org/ and include the crash backtrace.
Stack dump:
0.      Program arguments: ..\\llvm-project\\build\\bin\\clang-format.exe -i noaccess.cpp
 #0 0x00007ff717095790 HandleAbort C:\code\llvm-project\llvm\lib\Support\Windows\Signals.inc:408:0
 #1 0x00007ffead91bc31 (C:\WINDOWS\SYSTEM32\ucrtbased.dll+0x6bc31)
 #2 0x00007ffead91d889 (C:\WINDOWS\SYSTEM32\ucrtbased.dll+0x6d889)
 #3 0x00007ffead9234b5 (C:\WINDOWS\SYSTEM32\ucrtbased.dll+0x734b5)
 #4 0x00007ffead923027 (C:\WINDOWS\SYSTEM32\ucrtbased.dll+0x73027)
 #5 0x00007ffead921091 (C:\WINDOWS\SYSTEM32\ucrtbased.dll+0x71091)
 #6 0x00007ffead923a1f (C:\WINDOWS\SYSTEM32\ucrtbased.dll+0x73a1f)
 #7 0x00007ff716fab122 clang::DiagnosticsEngine::EmitCurrentDiagnostic(bool) C:\code\llvm-project\clang\lib\Basic\Diagnostic.cpp:517:0
 #8 0x00007ff716fb330e clang::DiagnosticBuilder::Emit(void) C:\code\llvm-project\clang\include\clang\Basic\Diagnostic.h:1315:0
 #9 0x00007ff716faebc8 clang::DiagnosticBuilder::~DiagnosticBuilder(void) C:\code\llvm-project\clang\include\clang\Basic\Diagnostic.h:1356:0
#10 0x00007ff71704b607 `anonymous namespace'::AtomicallyMovedFile::~AtomicallyMovedFile C:\code\llvm-project\clang\lib\Rewrite\Rewriter.cpp:444:0
#11 0x00007ff71704b1fc clang::Rewriter::overwriteChangedFiles(void) C:\code\llvm-project\clang\lib\Rewrite\Rewriter.cpp:467:0
#12 0x00007ff716f03874 clang::format::format C:\code\llvm-project\clang\tools\clang-format\ClangFormat.cpp:455:0
#13 0x00007ff716f02562 main C:\code\llvm-project\clang\tools\clang-format\ClangFormat.cpp:551:0
#14 0x00007ff7173f9039 invoke_main d:\a01\_work\12\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:79:0
#15 0x00007ff7173f916e __scrt_common_main_seh d:\a01\_work\12\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:288:0
#16 0x00007ff7173f91ee __scrt_common_main d:\a01\_work\12\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl:331:0
#17 0x00007ff7173f920e mainCRTStartup d:\a01\_work\12\s\src\vctools\crt\vcstartup\src\startup\exe_main.cpp:17:0
#18 0x00007fff1e6c7034 (C:\WINDOWS\System32\KERNEL32.DLL+0x17034)
#19 0x00007fff1f002651 (C:\WINDOWS\SYSTEM32\ntdll.dll+0x52651)
```

This seems to be because no diagnosticsclient is set. AtomicallyMovedFile will try to emit an diagnostic error and then an assert will abort the program because of the missing client. I think clang-format should use a bit more pedagogic error message informing the user about the wrong permissions.

I tried to figure out how to fix this but I am not sure on the exact solution, we could either check if the file is writeable from `Rewriter::overwriteChangedFiles` but I couldn't find a api to check if a file is writeable. Guess I could try to open the file in writable mode and handle the error.

We could do something with atomicallymovedfile so that it won't abort but rather the `File.ok()` call actually would work.

or something about attaching our diagnostics client? but not familiar with this api.

Any thoughts?
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy1V1tvqzgQ_jXJi1UEJkB4yEOaJrtH23PR6ZGqfaoMGOIt2JFtevn3O2MnIaTdPT3dbYQCvsw334zHHk-hqufFV0kehazUoyGiJp9Ix_Q9YaQWLSfMEM1ZdaFk-0yYrIjdcqJ7SSZpWLZMNhe10h2z5EJAD1ESJkBLWIBsW1Iz0cKX3UK3MMRYVt5fWM1KPomXk_BqEh7-03D_uObSGK6tADhE4BXMJg23q1ZwaSd0PqE5mdAUHnjRK8EaqYwVpZ9ApLLEcJgYweiErrwtK9SZrEpVcXi17UN3sdPqL15a7EVjsFsU8H_JjCjhPSAH5W6HSK2QnCTRzPP8dr1e3qyJ6YsOTGak6Bvw105pS6wiW2t3BpXSDTwwZgLUGijdQNu5U8iy7Svu3FpqZrakABc5DwVexQ36jFR9tzu6LAyI-33TqtGsI0w3fQd2oy4SBMD7pX3wFL1oq_2nkP7jdA0D_sRhHcF7rCy5Mc5kpxCcHIckfArhl9V1FmVhnmR5SH4HG1q-LNDgf3UvNo_evel36CL4uvVxh32ikaw1ATgEcGbhHP7DQXs0aIdwzKOihC4IhL3S209frr7e3iDOnzc_1p9jCp99qW3BDK-Cqm0n9DJ8SlEMYmfApWe41XyevwMXxUa48RiXxrMi-XXcDMVGuLNz3JBm78EFsRFucoYbhfk7_Juh2Ag3PefLovo9fEFshJudRmNasyKilPg9DMDxcti4Zi0b2LO-ew3bdNVrDZtlmAF0CqVaPFP--xERL5MoG8fufMy1iOOQv871Enco1wNXoPagRPVmavvj5KTnFZpbQIriKBmzzM88yoty_gaWk2z9cuTjWCfpwBqPhbNTaVakYYa5iUklnzvVGyJZx80OMw7NPOWlVZ0oWds-f1YPvNpAbjja8srYrwTFd_6oheXDl94HxWw2GxOPzolHdXnq7oO8bwEX7dqrLczwvMyvuvlnFNNsTJGOIyKM59nslKLPGqffb-NhYbOZs9wDzRU2Nz4T7RklyZhRfMaIJimF64qQ_7PiJInGimej1YrrPIT9IuSDuud3Tn_l9bMwgv-7R6Xv4R3haYYKjcZgfiiPBFzyeyjhPqRtvzvOGNqQiu9K1XVKQkZsATzLx4ySc0ZRysndnQHovaAjdmf49uPJ0fl8zC59wY6_xu7jmcXx2Upm58woHMbIZfX9x43H-RBWqGIfXdHZPjvJD3XE0zILIc2_miOfjeWdy5F_rL9_WV_HNLi6vnYpMkKpY4pE2PwUtg5DmiY_TenSQso9pt0ERQbM8RXd__9w13rOO4MX3oLDU7LecLhEkmrIwaW_l7u5NiCvnbKuXrD6GXG4u03LEwTCtVb6UIFIHGSuRvByzN1A8RK929-JDzxU7bo7YYyQDfFEAqhyoCCR92RUw5it6tuKoBhc5YFCpzQg8oo1qjlygHRiWMNh-6MYgqICENJIo_c0HrWCgR3XTrGSJjj1GmjXgldoai2aHpSg3FY9-p4nXy0V0PeJgC2unHGzpAPnT6yEHtX2WCJhVfIIFwrHnUOtBUTKLYeiQXjbXfEDeO60ZwU0aq06zJJvSTJQ1XkiTgFoyywgwjowwnYCCR-VsZeqAvJbD_46iB8WWO24POEmnYCj1sEJ7pZ560oLby_6feTA24O9lQI_dBwXs_GFJjvGVoex5RQYNZSlypvgIwYt08y5DBWBsWh0oO59jYnGIxQBf_cICeKoFY-EER8Ii4GGjwJmoXBzbdXr072wj8FJvHHqcXFr1olWMH1SKoNvRxqWEhwH8dlssczbTKtFXOVxzqZW2JYv_rEcZyf1u_MFFtRm7yoCK_5M-gbGjmXntNftYly5NjC5LwI4WKHhKjn_OqZYuoEo7_FGskniPKTT7aKYpVGUF3D2zHkBRy0PSzqnNI_qqippVkxbVvDWLCbJJdToo4wMJXtyNRULGlJ4oiyicO_LgwrAsjKe86RgsyorJ7OQw6naHmvqqV44Vlhow2ArjB0K7ikcF1Bicu40Aj7rwZ16YXU_deQXjvnf65JTOw">