<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/110794>110794</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
Clang-Tidy "readability-use-anyofallof" for loops with side effects
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang-tidy
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
adambadura
</td>
</tr>
</table>
<pre>
For the following code ([Compiler Explorer](https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9ZATwDKjdAGFUtAK4sGe1wAyeAyYAHI%2BAEaYxHoADqgKhE4MHt6%2BcQlJAkEh4SxRMVy2mPaOAkIETMQEqT5%2BRXaYDskVVQQ5YZHRegqV1bXpDX3twZ353VwAlLaoXsTI7BzmAMzByN5YANQmy24Abk1ExDvYJhoAgmfnvcReDpsAIkyV2wDsVq8PO1YXVxGonk2sWImHwogImAgTxeaAYvXMADZNnsxF5MJNvlc9qg8OhNoksAB9TBUKiHQlcKHPJibWHwsxIlHedGYi7Y3H43GYYmk8lmKkwgT0xmolnLH6XC7/QEQ3oQOkEfEEdAgEAHBwkHZuaFME6I5GihQY37vK6bc2bfjETbyoWKpheIj6plozYgA3Mo1mi0mU0XC0BzZ4Kg24GgvDgyEu9HG86Bn1%2BuPxwME7kkskOCkQaMY8Xe5MWkEEOYMS1iJSspPx31ff3J1M8jMEQn8nOVgM1/ObIslzYEW6YSudi4caa0TgAVl4fm4vFQnDc1ms%2BNm80w2zMyx4pAImlH0wA1iAJxp9JxJNO96R5xxeAoQKfdxwtNM4LAYIgUKgWLE6NFyJQaA/n%2BMTAAozCxAoCCoAQfB0BCxD3hAERXhEwRVAAnpw25ocwxAYQA8hE2iHNhvBAWwggEQwtBYc%2BvBYBEXjAG4Yi0Pes6kFgLCGMA4j0VxeAgs0BwcVopCYKoTSOos27BBC44CbQeARMQmEeFgV79ngLBkaQBzEP8SgPJgPFGMpRh7tMVAGGBABqeCYAA7gRsSMHp/CCCIYjsFIMiCIoKjqAJuhFAYlmmJY1j6Cp96QNMqCxGUcKcAAtL06A7A8kVWJYXCvJsqUAOpsYVRWSf2NLFW56CGI4yCFQRyxzgZxBcnFEDTI0zTOBArgDPUEkMOgHR5AUGSJMlA0TVkDCjV0hTFKULTDNNDQlIcK1tPN4yLb0bRrbYww7eNUwzHMCwSGOk6XgJN6bKoAAcCKpQikibMAyANRA/ZeAwB6TDauCECQG5bpMvBPi%2B0wIJgTBYDEnVnhwF6kLpE4TgAdBoACcZgTnjBP44TOOkDO4k3neD47lZpBvp%2BswELEjoAbawH0MQoSsIsT0vW9H1fZsXBmJjZi8OGRy4nonnCKI4h%2BTLgVqFeoWkE5amxGR10cFOZNXjeBGOsziqoCGvOve9n3fb9/2AxAHjs9EYNTJDtMQEgRCeKzVRgWlqXILDyAHgoWWpQAVKQILw0waHKQQGGpV4SipYYGGm2xpu8D7CjKIYJRCNBTnk%2BR36/hzXNsJw5v81bNo2wD4v4JLKpFDL3ny9IitKMrIV6CwAhMGgwNHAAEkwCgWJgjDnI6qCuYwoJ6f3zBD03JDzzO27L4PqAVPgm93sqwScIf%2B%2B5yEtAF6gRd6Z7tAAJIqusvGOOgGH12rGta8juvF9enDPyMKlV%2BGE663Ftg9Z6FsBbW3AQDIGa9rQrCKJsB2ZcnbIIhjTeikwYZwwRpQbWqNdKSEkJjHGGhXiSEodQqhNC9Z3RPrYPQUN9ykCPCeZGzUGEUyYaw3ByMxY8LnHwqy0wDKJGcJIIAA)):
```c++
#include <vector>
struct Data {};
bool predicate(Data const& value);
void side_effect_1(Data const& value);
void side_effect_2(Data const& value);
bool test(const std::vector<Data>& values)
{
for (const auto& value : values)
{
if (predicate(value))
{
side_effect_1(value);
return false;
}
side_effect_2(value);
}
return true;
}
```
I'm getting a `readability-use-anyofallof` report:
```
<source>:11:5: warning: replace loop by 'std::all_of()' [readability-use-anyofallof]
11 | for (const auto& value : values)
| ^
```
Yet, since the loop involves "side effects" converting it to `std::all_of` would end up with is something like this ([Compiler Explorer](https://godbolt.org/#z:OYLghAFBqd5QCxAYwPYBMCmBRdBLAF1QCcAaPECAMzwBtMA7AQwFtMQByARg9KtQYEAysib0QXACx8BBAKoBnTAAUAHpwAMvAFYTStJg1DIApACYAQuYukl9ZATwDKjdAGFUtAK4sGe1wAyeAyYAHI%2BAEaYxHoADqgKhE4MHt6%2BcQlJAkEh4SxRMVy2mPaOAkIETMQEqT5%2BRXaYDskVVQQ5YZHRegqV1bXpDX3twZ353VwAlLaoXsTI7BzmAMzByN5YANQmy25iwCSECCw72CYaAIIraxuY27sAbk1ExKfnV5e9xF4OmwAiTEq2wA7FZgX8dlZLu8IqhPJtYsRMPhRARMBAAUC0AxeuYAGybB5iLyYSaQ94PVB4dCbRJYAD6mCoVGe9K4GMBTE22NxZgJRO8pPJl0p1Np1MwjOZrLMHKxAl5/OJQuWUI%2BF1h8LRvQgPIItII6BAICeDhIOzcmKYbz5hOVCjJ0NB702rs2SIIcwYBqNIDEtHpqCoEAFJIUADoosBghBpnbBRHXLHSC63WmTABWKwZv66hX6pheIj4%2BMkx0XNPp52XSu1zZ4KibCCI5F4VHo0Ok8t1ysmasVnt1umSpkshz02Wdsmq1ODyser2bAjfTDCgdzvsQmtzzYlJSzwd9tU7yvDqVjghskPK6fHk9uhfEb1UMT7mfbjfgg9Vrfrza395N3eDhploTgM14PxuF4VBODcaxrFpWZ5juFYeFIAhNBA6YAGsQAzDR9E4SRIKw0hYI4XgFBAQjMI4LRpjgWAYEQFBUBYWI6GichKDQDiuJiYAFGYWIFAQVACD4Og0WIaiIAiMiImCKoAE9OHQpTmGIFSAHkIm0Z51N4Pi2EEHSGFoNT6N4LAIi8YA9loWhqOg0gsBYQxgHEay3LwJFmieFytFITBVCaItFnQ4I0TAnzaDwCJiFUjwsDI5c8BYIzSCeYhYSUP5MA8ox4qMLDpioAwhIANTwTAAHcdNiRgsv4QQRDEdgpBkQRFBUdQfN0IoDFK0xLGsfQEuoyBplQWIyhxTgAFpenQHY/lGqxLC4YFNkWgB1f1dr20Lly5famvQQxHGQXadOWGCcuICUpuTRpmmcCBXAGeoQoYdAOjyAoMkSebvuBrIGABrpCmKUoWmGMGGhKZ54baKHxhh3o2kR2xhnRoGphmOYFgkUDwNInyKM2VQAA48UWvFJE2YBkBuiBly8BgcMmJtcEIEhtjMZYpl4OiGOmBBMCYLAYmTWKSNITKMwzcMNAATjMDMNa1zXtbV0goOCiiqJojCytIJjWNmAhYiLHi834%2BhiFCVhFlp%2BnGeZ1nNi4MxwzMXhWxeak9Fa4RRHELqw96tQyMG0g6qS2IjLJjgIINsiKJ0otbf1INqbphmmZZtmOa5nmIA8R3okF4XJlF82ICQIhPHtqohKWxbkEl5AcIUNbFoAKlIJFpaYJT4oIFTFq8JRFsMFSg39INeHbhRlEMEohHEurDeM9jOKdl22E4d2i690vvnLwP8GDo0ijD9rI%2BkaOlFjga9BYAQmDQPmXgACSYAoCwmBGAXCLKgRqjBkRZS/swX%2Bt8SBQKguhOBP9UAVHwCgqihpgicBwVgjeIRaDb1QLvLKLdaAAEkjTrE8o4dAKky44QTknFORE04UyNpwOhRhFoMJUk2ZhPMz6exLkIq%2B3NeaIOILXIomwq6HxrmheuZtrKTAllLGWlBU4K0ypISQ4Y1YaGBJIExZjTHmIzpTfBtg9Bi2wqQPCBEOH3WsdwyiajxYcIDu4mCtiHEaOytERIzhJBAA%3D%3D%3D)):
```c++
bool test(const std::vector<Data>& values)
{
return std::all_of(values.begin(), values.end(),
[](const auto& value)
{
if (predicate(value))
{
side_effect_2(value);
return true;
}
else
{
side_effect_1(value);
return false;
}
}
);
}
```
and TBH
1. I don't see how this improves readability. For me, this is significantly less readable.
2. Also, the generated code (assembly) is longer. I would expect it to be worse.
3. And finally, are we sure `std::all_of` is _required_ to evaluate elements in the range in order, from the first one to the last one? While it does seem reasonable (why would anyone implement it otherwise?) I fail to see this being specified in [\[alg.all.of\]](https://eel.is/c++draft/alg.all.of) - but maybe this is stated elsewhere if applicable to a wider range of algorithms.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzsmceSq0q295-GPSF2BV7SoAaJTxAgEDJocgKTAoRJhBGgp_8CVW17dnefr-Pe2SUUqMjK9c9lEuq3qLDr8rRG6J3gRYKXv4RDn-H2PUzCKgqToQ2_RDiZ31Xckn2GyCsuSzzmdUrGOEEkwawJXpRw1eQlakllakrcopbgZYJZZ33fdAQLCEYlGDXFSYTL_g236WuAfRIscIJtmgFVvCe8K00gGHeBaEmV6CXiFqi0K8Ug3CkSsJ6j2FtgBdxR7S1XnIGXbszeDRQwd3lEuWcgTWtRBCYWax-AA9CbEVgPoAb-vjdSWoagAVIA3CEYinJzAf4om7cEaOqhBybXaYgewYzAHAAdEgzPiEAJg0nHQL6nZqZwlt4Lr_HYLQ1QKBm3nzzrODPVLnRAARXfcpW7z7_meOcwkLvieHRdPrjoHkrvRzo6N_KZ7ccLy7PHEZTbEJ87H67EZwWspzjbfABst5oZDkQFrUzyIzAyDNLqWj9iD8lNB2AxH5lR7o739c6hg_Nx0nBdMN0JVvqIU1iB1J9QCILH2QLyxa67SeUtw36U8eaerp3MxkUHxI0vHsxcd8vY1HdGHp30sZtgqaNEC_JVwOocqwVBVazLyizG1KemCpf1VhfO0opgVFdxWew6hXJVlASkCtDFsdAvQ6haigB5Lc_cgF09TCGKmeh6U_xoxiezyRC8CU2Jn0EKWAvTVU5VB-osUeLzwpkpw2npQ05nZdjo2loQa_qVymE3jZayKoqucKTCDa1gfUa8dSoUxQmsPZ0b-67ZTSx9vbIGba1vluLW69o5phZNMKoTwa58BspJCPZDknNxGFJ-Co4ld624h-rWckxX3Wslu1pTI_O05olrAKxKnRoBnQNjajbGZNjORvD4aUIAu-Y1mcbetrgtCGB6MNPTVhFsdTbccNns9UvO8gHAT2kCWJIwcK8iJUqTzGZA8c6ZMnpHAOpmZHgcjxMIXLDOFCbX7ewhgtOYpoo79mIQv6QeYiAq5xvQuCCndqgTCjXdSpoFuBt1nBBIO0oc4yNupMDE_t7BHbMSRYnjpMhFwLPcSkFqelxt6nQrFqErPpXdep_ujHSnalbjZaveOgJNE4F4R1IAwCr1ur2lNwSjSpIEg1unQiuXIDZvd2AMmQqCsqqMgL4JUrMRXNu6S5N2iM0YgH5LCWAF1sXxZARn6WF09wNwmi44eqf9lbG36okXJA1ys6S63jw908skxrWqyD6knr4jgjaVdwelsJxU93hw0PaGVQLKPxaydDtSma-ah60v27bsljA26X5nc_M2oiKvjYJxXCH7MD51Sxr3mlMI59SwhcjEAMSS2bh5kUcWmIHtLZW6IDCKgi-Hg6RIrsZHjfUQd_kr6dQIjdQXA1mpj3U2qkKxbRTOT0EiYiDFl9Svb-KO43zHKWSHK9gaydyqvDTio3kJdKOyVW4YROGoU5aL9x3sfOpx2uj09dKdxcq4XfK1o3kzV-O6lkzIZS9Df5se7yrCp0Lhw2rSPJqKVedin29I1Jzumd-xpD2cB9rU7DXaEIzKgAnot26jBLZvyL3lKqknIfN59NJTeT_DrTwDPcWnU-OCo-nC7UiNoW66rqY1R26fN0GgaRUzNcNaXkk3EwaGJ9miXxcfjzNWIBg1e57tzhj5x5qObMyMMvfgjK3ZqPKWrecNzHvTauFRkEaQWVo62joASjFK6clIb3INhbs0BCM2hCv7FGWKNeTn02FWW253B8ddWm3Y7j7uY3h9rfk68bPSA1VIvUS4rHoADHgfuofmOKmm00yr9eH6NjzUDarl3WyZ5fFlpSmCwKp9urkIaidGJxa4MtTCTeu2kml0InOJ6wjC7OajvBiDyzh6jRud7nZi7pXCuOmalp3zvYIT957Z0ubCers22LkHezMX0k5CF-150JTDHIQjK87WFKy3tT7eZ2qUTUOLDQgBIJjN8mEBQckEBQiB-vjExBKb-DnKsHkdl8Pyl5SVHijucUuwyucvX-eub4e4J-WwD0liJRIrmWDFnydEGJdk06Ikj8MeEcz6NTXGddcTjEA-wnJAL08-rR44T8guT9Bf6HpFcf8X_V_YMP_Z5ifverTMWb_mkl2fLFlhwbdwpUVoifqbSrfIfGisPsXIK27J7xLh0OPvs0mCBb_bkSRJ_rD9PPLrovBzpr77_LPdH22X4_ec_S1iskX90NbkNSw79GP0u6b868Dv-fy73i8mn-J9O_zQ_j7h-_b6uIQEs6rIFPX9QmohSQhUi8IkjPIy7-evQ4e-hvWMr2FZ4ishUGSLGtz2f9-tn5es1OGhjdFSJRbQNMECfkn7GLZ1XqfLjy1qyjBGZIlxQ0YzSTCr75UOy_IvfF1Yccn1iiR48d-4w_8ImqZJYiX9F8UnX3avb175c0yvc4B6gpHILq9j9OLbl_t5_cDlA3UkwTBLlciPKnUEwywb_oHaV17znuzxktvfAxUocsRDmZCoTsihIce8z8i8IztcoT5bTMu8WNbLu_8j6P8NgubzUdorkjSuGCkIAYRtOA0Bs-o-yNq81kcebSaVc6oR5L5yZ0awUi_peZ2Ul-2whvdsZ_RB51m7zAOeJQJwkCgwoSEA2hyJfL6dg33obrjdUeQSKfKMAMhCJeGjhjYmp1mirzCMPV1Sw3PWzc4oqYa2G9oab86l3Vq6OYGSX_jUcIfT4SNfKp2tt97DTXcQ9hAKIoASkjPoPOPKDKInnzlH6WZQtriimLZj9hDGYyDebSgrvd7cJawA1YAHIGPciWkmNnUkevp5q-8lgT1VPhBP5nh5CEJ2Fl44zn2QajFRZ3vX8Mx5P9ALjOeRJEFe5Y46ppxi3dNzV4Xdse7podo3RZc9KeaUdNWdduS5Qy0TgdvVl6U0eT46t-qfz6A09s8x2fSH1fyQ78dbmnXFzhSuerEZsqsS0QfLX1XX6HZN082xvbbPkN3wNovkrCmxn1o0t5sGlTuKjhyHU6s2pwt_G9QAqRBktgiEAGidC56yt1G4vQfNkcoCyJ1TVQTuzYLc1mtu6QkEiquKBzE4QUHL48yUXTkfjDwAqhacoArcI5BkzkmpEwxzCHIrh5VkYqBsHN1t_EqD6h7oBayoC0_b3C5nFEXfayq2fcHmtgDm6wBsSnzK7k5KpZ0YuFOqK-HMbkdDrXKkzr0KffEohbBXa5eDlA_qZyiPkpGrh9vYyZCP12IAn3sJBVmwP-x4C6zxxN2trdzkGIwZBLY_-gDocWLnXto9ONf1ZCVJG7FwPVU8JO7VpiCWVZOatlp3dZUBz2JTuic4Z5OfArVBtasHBKOW2n3aSlyg2sUpFekrnbQMtS1n_hpWD9eddM09h4lz0qR4gNKhGXyvqapYEs9AQ9jFQQKc2wywVexR9BjEFmpAbBupMg_4VGmWpmXmheei0NSnLGMxU3jMlNUe1pqscgI1LQ7yaMN6Ni3m6ALArQ-nh2ooTCAW4pCL5bwW09iqjD5WoJL1N-sSNCXn5JpTiaIlBVsQVP7J3NvQN63xGVs2AP7Nki07pJ_nPjpSKXakPL8b-CbNPTRuJ7sCWZBv9XzNfuz5LFelY6aWH6hea-hC13bOWdP4tM7ZaUJhsVFDzvN0ZXsfN0LvzpZGpcJ9z8Db1rilENpdbhoU7qMrDe171GRVdbn0lRPydQXB2mNxoXJno1TXDJRcmO30_o4z8zRFhVLyIIYHO1IxMEtoqE0YGD6Hoeqr97XhqZ2l7lN2A22kR5lXKpaCM10ZWhlZm5tjJiXDKFzC5MKGejzq7bhbazKm8pu8aT-eJUXolOotDTdiANxKdnfVOQXSPgBYGitRA2dpa6be_SYW3mVPMGo3nl92_XovumY6ZI642xzAUR-l9J5nTZrH4nhMbwh6oRzR7vaxNbdJuBD-zW-VNeYSYBYzx7l-UauOp1DcYbab0cm8TMWWcSiYS7azngKatgW8v9ZibRRCB27PEFfjXdCntsrQcOlb0wdludVOpXjgTGpu4N7lAjoINdGAynS5-XoFn41_Fft0I-bMeHd3kqg4OnvqknHOw9sUxFAeuErqc10JnblXPPjMDHHBcp6Vfz79A0r_n2LYHxD3dzL6MHqLUJrX30BJ-pR6Q3Xyfew3qHy9tPszG_0zqv3_oOJfNf4zvv52_Alg_07Fy4EWfv6HS_-ZxP-89J_B_Fc4_8WhX_qZf8HaYZ2Qvqh_XNBvJCQTXBPMqic7hMgMjx-cl1dNixem_Il830gVt2SFllJ_TOrILk_r_JrHYd2XM1mi7ptFid4-1mDeSFB2-MMIkSmqURv2KPn-RjbsOlRF5Uwwm0WxxHWK2sWxTyidGhT3n_QaIXLEbfdNm30jQZ2Q17wOy0VAIsMWkSMiu6FF_wJ18478q0X3IW9R8teiiZZ6hD0iUYkqVPcdmdcvV9uwTtFygdsEtYv6tcXVx3vlvO16EtdoEXiBePhxTbAqecryEi0OJxh1S1qrJScdrpesLBGP2fwZ3NJH1GjJ9sfaixXuM9SO-VJ6dckJJK9hXi4LLRV6JT5CC5V3DYrza46SxcfXrSURvBiW6VtYlm9LayItd9sf0Byh8i3vCEb9fHAkbXjtCUb9yZbZkF_JaOjJKpwj9KPe_at2y5YfM9Si5YYMm6bM41dwPSZDcswT1H5mD1_JsExxm_dZ1b19Sd7ZZMNuwi_onV4xqzW34gX2S_bOxjTHciHFMjy_FugYIX4jMFcqjlmOX1-pL_k7QzEcTVEMxbMbhn1jOTYMmWsi0DyNKDYmOApVYV6-leWjWnqOL3nXDeidpqnVhvtShhEqu9d_DRgmLsM6_drnyUwwDMHLX9r3xeprNKQdwVFl3vXdD50-70v0Lr1s_DxZekXm3_SDDPNqAJfOrPtopX7uyb4Mbfn-W5-U99kQvcW4WminfHz7-tq0-IbipS6vUJZ6fUbzeGf-XwAAAP__v2jaJQ">