<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=http://email.email.llvm.org/c/eJylVU17ojAQ_jV4ybM8mIDCgUPV7W0vu3vZk09IBsluJG0StPbX7yRYtLaeiiFOMuGdd76gMfJU_-6APFmzs3xPuCOt0docHVGOHLhWMmEPSbZJsodkkZ3HuKRM9UIPEkjC1tybvRIJ-_6ZUhnnLfD9HXU7-MHCpCR4jZLqPXGe-3BqQ7KErcZ95yMr9jBa3YZz_ObMOB-MkuiRSWgZDrXW7BO6JkH2uFmdDSXL1cV2ayw5n1cTaBTXZD7KCV3FUV0xvoYI17FTGgIQT7XhEoWJ9h72xp62xkqwWwuav4CMZOg82BtZVhFyuXmPeuu67zCwcttCL-CuCS6eB4URRr5sdYuH4T27c6vjqfMmPFaGWK3JXf7A3QfwiflFmHK656pH1Cl-6Ogl6dHy4A15icG_OOxOvbh2UfOhF9075XrM9RpThtP8llOEPX0Bdn7GvsBevHvfHaGpuBDgHBYawe0x0IsMm8oq3mBpYIP1JhSu5J4Ty0MC16QBwQcHBLjoyJhd3MOaBFwB2RupWiW4V6Yn8AJi8OAC_mf1gNbQuIPxUQtu0N4R08alwcmeLQTDvJeEtz7u3bMzGiGxLMhR-S5Y_rQaFllKVoOPWI73yqtXRAZrTQ9mcPqEdJ6MRTqT9ynZIBJGnXTeP7mQAfqIYydEujOyMdqnxu5w5xXvSvxh_AcTr9fF9RN7yYMkUjkxOIfcP8JhIsQ_cwDb4msuFaHVHp_xXmZFTquKBZHRoqiqmayZrFjFZ1g4nbH1I0g7G6yubwhiIIbmDKX14e3vG75V_4LwuFTODeBQKGiV01lX0wVjkGV5JeZQLnPa5iWVVclkVpXLcs5mmjegXZ0U2Jq0hyOJECgnxWb2dQaqphml2Rx_i7zM8jRvFsWyXCwLKGgOi3mSZ4B9qtOAE-I-s3WEbIadQ6VWzruLkmO0dz1AJIwMvfIa8NMSquvXW_5DMlquHZyTT3hjsEamCphFknVk-B_szP4k>52942</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            ThreadSanitizer: false report about data race
        </td>
    </tr>

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

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

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

<pre>
    The program as follows is valid:
```
#include <atomic>
#include <iostream>
#include <future>
    
int state = 0;
std::atomic_int a = 0;

void foo(int from, int to) 
{
    for (int i = 0; i < 10; i++)
    {
        while (a.load(std::memory_order_relaxed) != from) {}
        std::atomic_thread_fence(std::memory_order_acquire);
        state++;
        a.store(to, std::memory_order_release);
    }
}

int main()
{    
    auto x = std::async(std::launch::async, foo, 0, 1);
    auto y = std::async(std::launch::async, foo, 1, 0);
}
```
The access to `state` variable is not a data race, because each thread before the modification executes `atomic_thread_fence` to see the results of the other thread, and after the modification executes atomic store with `memory_order_release`. But the sanitizer erroneously reports data race. Demo: https://gcc.godbolt.org/z/9cY3aM3cz

Related discussion: https://stackoverflow.com/q/70542993/7325599
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJylVMt2mzAQ_Rq80SkHhAGzYBHbza6btpuucgZpMGpllEjCifP1HQnXdpxkVQx49ODeOy91Rh7bnwOyR2t2FvYMHOuN1ubZMeXYAbSSSXGXZNsku0uq7HTPQ16oUehJIkuKDXizVyIpvn60qIzzFmH_yXI_-cnieZHRNVtq9Mx58GHXlmVJsZ7nnY-qiruZ9SHsg5s98_tglCSPTMJXYVNvzT7hGxZsT5PNiSip1xfu3lh22q_OoNHcsHy2E76Od3Ol-BoiXM-D0hiAINUGJBln2XvcG3t8MFaifbCo4QVlFMPzwDerbCJkvX2Leuu6Hyiw8qHHUeCnFCCeJkURJr3F-haPwnty53YNUudN-GwVYrVhn-pHcO_Az8ovxjmne1AjoZ7jR45ekh6ZJ2_YSwz-xWF3HMW1ixqmUQxvFjdzrjeUMnrlt5oi7PE_YPMT9gX24t3b7ghNBUKgc1RojKbnQFcZNZVV0FFpUIONJhSuBA_MQkjghnUoYHLIEMTA5uzSHNUk0gjZ3kjVKwFemZHhC4rJowv4H9UDsRG5w_lTi27S3jHTx6Ghlz0xBGIYJYPex7nPeGYSFsuCPSs_BOYPq6HKUraefMRyMCqvXgkZrTUjmsnpI8l5NJbknL1P2ZaQKOps8P7RhQzwe7p3QqQ7IzujfWrsjmZe6WnErwK-FeL1uri-Uy95lEwqJybnSPt7OEqE-GMOaHs65lIRWu3-iZ46K5e8aYpgFrwsm2Yh20I2RQMLr7xGOihDrH788yZA96Adnlxh0Bny-OzPYrK6vXGFQjZ1J1KtD__-vtD5-xuFp6FybkJHRsmbJV8MLcdV3dTlqq67Kq9EgWVW5JkAuRSF4DJfaOhQuzYpqYn5iM8sQpCdlNuFannGeZbTr1qusmW67KqyXlV1iSVfYpUnywypH3UadIT4LmwbJXXTztGiVs67yyJQVHcjYqQjfGqpwdj2HqVdRN426v4LC-7pXQ">