<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Sep 3, 2014 at 6:36 PM, Richard Smith <span dir="ltr"><<a href="mailto:richard@metafoo.co.uk" target="_blank">richard@metafoo.co.uk</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi dblaikie,<br>
<br>
Add an optional output parameter to `can_write` to allow it to indicate why a file is not considered writable (along with a sample use from Clang where we currently produce stupid diagnostics saying `"can't open output file: Success"`).<br>
<br>
I'm not entirely sure this is the right design, and in particular it's a somewhat different interface from the other functions in this file. I also considered:<br>
<br>
  std::error_code can_write(const Twine &Path, bool &result);<br>
<br>
... which seems redundant because `result` is set to `true` iff the error code is `success`, and ...<br>
<br>
  std::error_code can_write(const Twine &Path);<br>
<br>
... which is terrible because `bool(can_write(Path))` is `true` iff the file is *not* writable, and ...<br>
<br>
  std::error_code cannot_write(const Twine &Path);<br>
<br>
... which is inconsistent with other functions near here and ugly.<br></blockquote><div><br></div><div>I'll just put this out there. No idea whether it's sane:<br><br>ErrorOr<void>? (not sure if the ErrorOr template supports void... I suppose it'd need a whole separate specialization)<br><br>(alternatively, struct Success {}; ErrorOr<Success>)</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
<a href="http://reviews.llvm.org/D5182" target="_blank">http://reviews.llvm.org/D5182</a><br>
<br>
Files:<br>
  include/llvm/Support/FileSystem.h<br>
  lib/Frontend/CompilerInstance.cpp<br>
  lib/Support/Unix/Path.inc<br>
  lib/Support/Windows/Path.inc<br>
  test/Frontend/output-failures.c<br>
</blockquote></div><br></div></div>