<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=http://email.email.llvm.org/c/eJy9Vk2P0zAQ_TXpxWqVOs2mPeSwsKzggpBA4ogce5IYHLvYTrvl1_OclN0uuxJCfFRpUn_MzJs3b5w2Tp1qud9L56kbtSKjLYXl3lNLfjnQ0OChrY5aGP2NPAtj11GIgQnWCMVafbfUkbXOs9gTnsa4o7Ydk05RVlxn-U2WX2dX-fmah7zQVppREcuKlyF6GGTFq_PidMfkKCO7dY6xrHoxTzJ8MJPxrbaR2YzvHq-lz_AJpiux35NV2BiiSiiK6-g-nQPxbbJMV_HEthEekG7OXgzZLvYwmDezh91ZdXOJNk3dR5rDzC4ehUigpxD3s8nN_e9nmZrub9qZ3JnrI3liSNBoQoYvsaQD8xRGE0khyP9gvbg-Z8K3z1D1t-vyb3l_jvEPiVPZCwuts4Z6cdBu9IntAA5pKsdlVyT9w8Uc5SpnilKegTk7bQ1RRBoIOGIvAMYp3Wp4nkwS3Kt8xd66Ywpw6eaojUH4i1CKRcfytE_bEAkd6GZxzAVIowunTLSR5s6UAq5gi9lzERDzScq40PoxnphKuXs3_pS-CLO3iZq0PZxsFDLq5P-ErveeZHzk-J13jWjMaQIdmXIUUOgKNIgvoIZsoATsKLxlfdI2lNAAALUCkp4k8YN2AXRun_jWdzA_QfZfRw2ToDsLSqUAxTi6AMglMazYGzv3x154YBwN-luKQMklqJLIah4cKQ2MArz_1j-pRr_oBCD7dZ_985547Y50IP-kgIFomBWdNOFHc08iQXYD3iSIwzqy5IVhusXLQ_YoYvTCBrTMIKJGh6TyuBB0Y-iRcN4TsT7GfUi58FtcnVONM3HlPEi6_Ybv14P7eCjvGr9QdaF2xU4sxBh75-vQymXXL0OHRiP5hRajN_VP7nTsx2Yl3YCBMYcfD7z-3GfIGEMdwkgBP0q-LapFX1dKCF41O17xppWbstpKWWw3RSNbwbelWBjRkAl1Vr7IOJcGfbKMWkH9PCtvFn8OQdc85-s153xdrNd5uRLVZrfbtEWZb8pNRVfZJqdBaLNKfhJVC19PLpuxC1g0Gq_vh0URUvMQTYiBMOpo6Hf-EiQxX_wVOCKj6Ty8PB_n8zBJEfV2UIt_OBPDYsqwntL7DnQyoCI>52837</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
cppcoreguidelines-prefer-member-initializer: bad fix-it with for initializer depending on other statements
</td>
</tr>
<tr>
<th>Labels</th>
<td>
clang-tidy
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
sfc-gh-sgiesecke
</td>
</tr>
</table>
<pre>
cppcoreguidelines-prefer-member-initializer suggests a bad fix-it for the following code:
```
#include <string>
struct Foo {
Foo(int n) {
m_str.append(std::to_string(n));
m_bar = m_str.length();
}
std::string m_str;
int m_bar;
};
```
If the fix-it were applied, this resulted in:
```
#include <string>
struct Foo {
Foo(int n) : m_bar(m_str.length()) {
m_str.append(std::to_string(n));
}
std::string m_str;
int m_bar;
};
```
This changes behaviour, since the initializer for `m_bar` depends on the statement that modifies `m_str`. Now, `m_bar` will be initialized to 0, instead of the length of `m_str` after the call to `append`.
This is pretty dangerous behaviour, as the change is syntactically correct.
Probably, it doesn't make sense to warn here (by default), since a proper fix may require significant refactoring. In this particular case, of course, we could do:
```
#include <string>
struct Foo {
Foo(int n) : m_str(std::to_string(n)), m_bar(m_str.length()) {}
std::string m_str;
int m_bar;
};
```
However, it doesn't seem that the rule could determine in general if such a transformation is possible.
See https://godbolt.org/z/qvoWv5xbr
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy9VU1v2zgQ_TXyhbAhU5YVHXRImw22l8UCXWCPBUWOJLYU6ZKUHffX91FyE6cJUBRoa8iS-DEzb97ME1unzo08HKTz1E9akdGWwvrgqSO_Hmls8dBWRy2M_kKehanvKcTABGuFYp1-WOvIOudZHAhPY9xJ255JpygrbrP8Lstvs31-uZYhL7SVZlLEsuJtiB4GWfHXZXG-Y3KSkd07x1hWvVkmGX6YyfiNtpHZjNfP19Jv_ADTjTgcyCpsDFElFMVtdB8ugfhNskxX8cK2FR6Q7i5eDNk-DjBYNrOn3Vl1d402TT1GWsIsLp6FSKDnEI-zyc3j-6tMzfd33ULuwvWJPDEkaDQhw7dY0oF5CpOJpBDkT7Be3F4y4TevUPWr6_J7eX-N8f8Sp3IQFr3OWhrEUbvJJ7YDOKS5HNeqSP0PF0uUfc4UpTwDc3beGqKINBJwxEEAjFO60_A8myS4-3zD_nGnFODazUkbg_BXoRSLjuVpn7YhEhToluZYCpBGV06Z6CItypQCrmCL2UsREPNFyrgg_RjPTKXcvZu-S1-ExdtMTdoezjYKGXXyf4bqvScZnzn-17tWtOY8g45MOQoodAUaxCdQQzZQAnYS3rIh9TY6oQUA6gRaem6Jb7QLoHOHxLd-gPkZbf950jAJuregVApQjE8XALnUDBv2zi76OAgPjJOBvqUIlFyCKomslsGJ0sAowPtj-kk1-oESgOzHOvvtmvjbnehI_kUBA9G4dHTqCT-ZRxIJbTfiJEEc1pMlLwzTHQ4POaCI0QsbIJlRRA2FpPK4EHRr6FnjvCdiQ4yHkHLh97h6p1pn4sZ5kHT_Bf_PR_f_sXxo_Uo1haqLWqyijoZ-5kxL1bg6y04aOkqCvhb4IujEJQA7pOufRB1WkzfNd0jhZGo30o0YGHP89gAK9xEKwVCHMFHAS8lvimo1NLnseL3Pq66uiorajvNalV3RVuW-FnVVrYxoyYQmK99knEsDCa6jVhAWz8q7lW54zrdbzvm22G7zciOqXV3vuqLMd-Wuon22y2kU2mwSkMThyjczpnbqAxaNxrn-tChCUhXRHA_-xRQH55vQyXU_rEOPDxjJT7Sa82jmJL4CuQOKCQ">