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

    <tr>
        <th>Summary</th>
        <td>
            `AlignOperands: DontAlign` mostly ignored for `<<`
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            new issue
      </td>
    </tr>

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

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

<pre>
    Hopefully I'm just misunderstanding something here, but I cannot get clang-format (at least v15, v16 and v17) to obey `AlignOperands: DontAlign` for `<<` operators.

Probably related (though not exactly the same scenarios) as:
* https://github.com/llvm/llvm-project/issues/44363; and
* https://github.com/llvm/llvm-project/issues/59797.

Consider this clang-format style:

```
---
Language: Cpp
AlignOperands: DontAlign
...
```

And this example source:

```cpp
    // Incorrectly ignores `AlignOperands: DontAlign`
    qCWarning(lc).noquotex() << a << b << c << d << e << f << g << h << i << j << k << l;

    // Correctly (?) uses ContinuationIndentWidth.
    qCWarning(lc).noquotexx() << a << b << c << d << e << f << g << h << i << j << k << l;

    // Incorrectly ignores `AlignOperands: DontAlign`
    qCWarning(lc).noquotex() << aa << bb << cc << dd << ee << ff << gg << hh << ii << jj << kk;

    // Correctly (?) uses ContinuationIndentWidth.
    qCWarning(lc).noquotexx() << aa << bb << cc << dd << ee << ff << gg << hh << ii << jj << kk;

    // Incorrectly ignores `AlignOperands: DontAlign`
    qCWarning(lc).noquotex() << aaa << bbb << ccc << ddd << eee << fff << ggg << hhh << iii << jjj;

    // Correctly (?) uses ContinuationIndentWidth.
    qCWarning(lc).noquotexx() << aaa << bbb << ccc << ddd << eee << fff << ggg << hhh << iii << jjj;

    // Incorrectly ignores `AlignOperands: DontAlign`
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx << aaa << bbb << ccc << ddd << eee << fff << ggg << hhh << iii << jjj;

    // Correctly (?) uses ContinuationIndentWidth.
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx << aaa << bbb << ccc << ddd << eee << fff << ggg << hhh << iii << jjj;

    // Correctly (?) uses ContinuationIndentWidth.
    qCWarning(lc) + aaa + bbb + ccc + ddd + eee + fff + ggg + hhh + iii + jjj + kkk + lll;

    // Correctly (?) uses ContinuationIndentWidth.
    qCWarning(lc) >> aaa >> bbb >> ccc >> ddd >> eee >> fff >> ggg >> hhh >> iii >> jjj >> kkk;
```

The clang-formatted output is:

```cpp
  // Incorrectly ignores `AlignOperands: DontAlign`
  qCWarning(lc).noquotex() << a << b << c << d << e << f << g << h << i << j
                           << k << l;

  // Correctly (?) uses ContinuationIndentWidth.
  qCWarning(lc).noquotexx()
      << a << b << c << d << e << f << g << h << i << j << k << l;

  // Incorrectly ignores `AlignOperands: DontAlign`
  qCWarning(lc).noquotex() << aa << bb << cc << dd << ee << ff << gg << hh << ii
                           << jj << kk;

  // Correctly (?) uses ContinuationIndentWidth.
  qCWarning(lc).noquotexx()
      << aa << bb << cc << dd << ee << ff << gg << hh << ii << jj << kk;

  // Incorrectly ignores `AlignOperands: DontAlign`
  qCWarning(lc).noquotex() << aaa << bbb << ccc << ddd << eee << fff << ggg
                           << hhh << iii << jjj;

  // Correctly (?) uses ContinuationIndentWidth.
  qCWarning(lc).noquotexx()
      << aaa << bbb << ccc << ddd << eee << fff << ggg << hhh << iii << jjj;

  // Incorrectly ignores `AlignOperands: DontAlign`
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx << aaa << bbb << ccc << ddd << eee
                                             << fff << ggg << hhh << iii << jjj;

  // Correctly (?) uses ContinuationIndentWidth.
  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
      << aaa << bbb << ccc << ddd << eee << fff << ggg << hhh << iii << jjj;

  // Correctly (?) uses ContinuationIndentWidth.
  qCWarning(lc) + aaa + bbb + ccc + ddd + eee + fff + ggg + hhh + iii + jjj +
      kkk + lll;

  // Correctly (?) uses ContinuationIndentWidth.
  qCWarning(lc) >> aaa >> bbb >> ccc >> ddd >> eee >> fff >> ggg >> hhh >>
      iii >> jjj >> kkk;
```

As you can see (or as I inerpret it), there are plenty of cases where the `<<` operators' operands are being wrapped, then aligned, despite the `AlignOperands: DontAlign`, but if the very first operand exceeds some (not consistent) length then the `DontAlign` is obeyed, and the `ContinuationIndentWidth` is used.

This appears to only affect `<<` operators. For example, `+` and `>>` are not affected, and seems to work as I would expect based on how I read the documentation.

Also, although I use a (real-world) example of `qCWarning(lc).noquote()`, the same happens if the first terminal is just some plain (not long enough) variable name too (the `x{42,43}` examples above).

The output above is from clang-format 17.0.2, but I get the same results (or very similar) with v15 and v16 too (haven't tested any other versions).

Thanks ðŸ˜„
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzcmctu4zoShp-G3hRiyPR94UXktDEBBphZDNBrSixJjClSTVJ2_PYDklJLOd25nO4kbhzDsMu6kP_Hn5ZKRWatKBXijixTsrybsNZV2uyaXMvsMsk0v-z-pRssWikvcE_ouoaH1jqohW0VR2MdU1yoEqyu0VU-qtAgoXvIWgf3kDOltIMSHeSSqfKm0KZmDgjdMAcSmXVwmi39CafZCpjicJqtCd2C06AzvABZJbdSlOo_DRqmuCXzW7jTyoWNZJVAoY0_iMz3_r1KQPsjnTZ2SpI7ktzGz_8anbFMXsCgZA65l-Aq3ZYVeIX4yHInL-AqBMtqBJujYkZo68Uw323XGr2FyrkmbKEHQg-lcFWbTXNdE3qQ8tR_3TRGP2DuCD0Ia1u0hB4Wi_lqTuapJ32P9pbb9Xb9hHOvlRUcDbhK2KeDbt1F4gASP1dJ9w4_b25uYvBvpsqWlf5w2DdN3PiCEWH_dDr9aavd2YpHUfjI6kYiWN2a_FlBed8rAEAcGbhXuTYGg1OiVNqgfXWCDI18239lRglVErqROaHbqdLfWu3wkdCNtznOIWB9kPVB3ge8D7APij4o-6DqA9EHD31w7ANJ5umYesS4_07oVc0PXlhr0cJeKydUy5zQ6l5xVO6r4K6avgXwjyL8JBcHyIFywBw4B9CBdEAdWAfYgfZ4ZR-vzPhZTo4wR5wj0BHpCHXEOoId0Y5wH67t5HUZf8_Jxze__hTe3_D07bD_BNofZjAQmkYgmkYamkYUmkYOmkYImkYCmkb5NI3aaRqF09SrDt_H4zF8S_lJd0Yg8y9k_qVzJoTRmRBGZ0IYnQlhdCaE0ZkQRmdCGJ0JYXQmhIExhsfxxfRnOdL_KnySs_lEVbeuaR0I-4ZM6R3-zdfLkga7nnm9nmP87kx59Xo91njNZOozjX73JOOtRr-YhFzF6uvkW59q9jvcqd7q79vvZNcx-yo37Xcw-8MTlFcNftbydxqdX54IfyN5--OmxPvN_o_I4cbD9VI69wEwH5rKjbl-Mau7tXDRLeRMgQ2DutEGmIV7EApNY9CBcP4iRPfgKjQIzCA0EpW7gC4gZ35gzmGPq_CZcieh6_hDcRsayFCoEs6GNQ3yrm0FzF8s4m-OthHue5svX1u6mq4owuEnNBcohLGu7xPwMUfkNtSCPaPSDnKtrLAOlccDiap0VZTR9fmklCtsqPlGcSyUC8NBz0yJ7pTWIp8-TaKFBQ_NjA11ZCUvwIoCc_dcpRgO2vR1Sd95AE79MV5GOCnMBb_BYKgYxwYHrRaxDt2dtTlGd8-6lX5cGt9zxqxP5hVU-gz3YJBFPq7ztkblAt0TjltpdWhddoXqe8_q8026McjkzVkbyf3A9hVVXXitz97sultdNPN7pbvyQ6Vs72w01aGphWLSD3Ao-QdXG8mE6r2VWpWAyivzGk7MCJZJBOUbdVrHCnsw8JGs0wUldL-Yk_WdH8VOsQWW6RN6jX99DOoee8J-r6Iwun5az56tp8mUDosNJbqByqBtpbPdny1MVytqIZnxYs_CVXCaLbsVh1Wvt2InVISu_QBY__DF1AW0_0_6JqzQyv6olamjBXJIyPZAthuyWUz4bs638y2b4G622q5ms81ykUyqXcKTzSyjs9U6Wa7W22S24QXP-WqR0CTfrtlE7GhC57MkmSVJQmkynfEF32LBeE4RC4ZkkWDNhJxKeaqn2pSTsBawW6032_VEsgylDas5lCo8Q9hJKCXLu4nZhVWErC0tWSRSWGeHVpxwEnevLrbU2g4JCf9h7WXSGrn79dWMAPH_AAAA__-4nJDh">