<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/119224>119224</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            clang-format's -fcolor-diagnostics is broken
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

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

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

<pre>
    clang-format's `-fcolor-diagnostics` option simply does not work, and the working option `--color` is undocumented. The problem is that `-fcolor-diagnostics` is a complete no-operation; in fact it is a bool that is initialized to true.  gdb shows:

    (gdb) p ShowColors
    $2 = {<llvm::cl::Option> = {
      ... <llvm::cl::opt_storage<bool, false, false>> = {Value = true,  ... }, ...}

on entry to clang-format's main, meaning that specifying the option on the command line does nothing at all.

To see how clang-format determines whether to use colors you need to look at the beginning of `SMDiagnostic::print`, which simply does

    ColorMode Mode = ShowColors ? ColorMode::Auto : ColorMode::Disable;

showing once more that in fact the option cannot force-on the colors (`-fno-color-diagnostics` instead works). Continuing in `SMDiagnostic::print`, this RAII constructor would write the escape sequence to the terminal:

    WithColor S(OS, raw_ostream::SAVEDCOLOR, true, false, Mode);

It ends up in `WithColor::changeColor`, which does

    if (colorsEnabled())
 OS.changeColor(Color, Bold, BG);

Digging further down, `colorsEnabled()` is where the Mode member is consulted:

    bool WithColor::colorsEnabled() {
      switch (Mode) {
        case ColorMode::Enable:
          return true;
        case ColorMode::Disable:
          return false;
 case ColorMode::Auto:
          return AutoDetectFunction(OS);
        }
 llvm_unreachable("All cases handled above.");
      }

and the `AutoDetectFunction` is

    static bool DefaultAutoDetectFunction(const raw_ostream &OS) {
      return *UseColor == cl::BOU_UNSET ? OS.has_colors()
                                        : *UseColor == cl::BOU_TRUE;
    }

`UseColor` is controlled by the `--color` option, so unless that option was set, you go to `OS.has_colors()` even in the presence of `-fcolor-diagnostics`, and terminal colors will *not* be force-enabled.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJyEVttu27oS_Rr6ZWBBpuLbgx8cOzkocHoM1EnPY0BRY4m7FOlNUhHSr98YUr6l3q0hRGJIzmXNmkUK71VtEFds-sim25HoQmPdqrTmpzJqVNrqYyW1MPX4YF0rAuNzD2yWjw_SauvGlRK1sT4o6dksB3sMyhrwqj3qD6gsejA2QG_dD8Y3IEwFocE4VqY-LSd742iPbCgPnams7Fo0AasMXhqEo7OlxpYmQyPCb0JQHgRI2x41BgRjx_aITpAfVjyCMnAQMoAKaWFprU4WlQdlVFBCq59YQbAQXIcZQF2V4Bvbe1asWU4PAADji7oqGV_CEfaN7TcUiz9PPnBgxRbY_JEVG63fW9pcrKVO790xBfR0XpU2AmRZBne32GN488E6USMrNhQ3IXoQ2uPlo3i6svld6A7jgDKhRcn6fEvfWZbRV0zIGkAT3Adl_Uu1W6EMbWhRGCpaRMsfUarDRxrjqZDWxJG0bUul1srgmQQNrRUBhNZZ8vpiwSNCY_sbp1BhQNcqgx76BkODjuLqPBkmkOHDdmAwFUlb-4PMkt8Sa2VijPZADNl_3Z65kUA8OmUCm-WUT98o2VxT9VLcWMyvtkKIfwjCS42BFc-XFcnuugsWWLH-_P-t8qLUyIrHZJx4FOMzEqG1DgfuDay8glIKQ51zsE7i-Ixr8s8Xkf7Gju93gPEBRRW7zDO-zGBjTVCmI8_K_BmZ0CgP39ZfvoC0xgfXyWAd9LbTFfROBYzRoJfiiODx7w4pHeqYBiHVTuibbvm_Ck2EBvaML3Z78uJE_2Z9cCgGpu_X35-2m91_d99iEANnzwyPqPLlGcsvAdBUHrrjkNTZydA4jTA1bgZZuVT8ttTqQHgmZJ8MFasifPmSnnwNu312bYgvhvcGHq2u4vs_11FtVV0TzofOReZWto_dw2b5PSdJsPoGXQI18q3FtkRHE4R_pwNWN2hG0fqc7a_Gb3TF9yrIhnIdcLyZBZDC42f2JmvJNZx_DkPnTKpP8ScT5wa4a2MQrWjk3m5qq3_ZSlNbDCjDc2dkVNNErOVtUEnjgPT0rTMOhWxiQIQQX2sd_XpohKk0ViBK-44Z4_yTobNUno4wNsvvhBDLeSmUDyIomeq1xYPodLgbd2yz64YAxmcxmZsqDakzvn71iY8kTaROp0Picff69vq__dNLFKndPmuEf0vUGAh3DeXvfyRnf3D18u316YLSGSM2y0-7BoJLa4KzmhAuP074XZ35SfSoT7yFzmj0wzk_qGEvPHgMtIDEv7akNmyW38twlgO-oyFRCPHmgD7qUzoT7t8azpeTQbxOUtsrrQkEYwPjayhxEGRMfZaNqlVRLYulGOFqMi-K-XTJ55NRs1qUi1nB-WI2F3I5fxCyKubFdCanc1kVk8VipFY85w8Tni8n04f5dJLN8qrgh4lAMeXVYSbYQ46tUDoj6mbW1SPlfYeryWTJ-cNIixK1P13b3IpWjcuu9uwh18oHf9kXVND46y3uDhJUqtLZH2hGndOrJoRjvPXwZ8afaxWarsykbRl_jveT9Bofnf0LZWD8OUboGX8egnxf8X8CAAD__51QQSs">