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

    <tr>
        <th>Summary</th>
        <td>
            std::future<T>::wait_for does not wait and returns timeout for large timeout_durations
        </td>
    </tr>

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

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

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

<pre>
    Related: #59260
 
`std::future<T>::wait_for` behaves incorrectly if it is provided with a large value for `timeout_duration`.  Instead of waiting, it returns immediately and returns `std::future_status::timeout`. 

[Example 1 comparing GCC, Clang and MSVC implementation](https://godbolt.org/z/b4Pxa8En3), only MSVC behaves as expected
```c++
#include <iostream>
#include <chrono>
#include <limits>
#include <future>
 
using namespace std::chrono_literals;
 
int main()
{
    std::promise<void> p;
    std::future<void> f = p.get_future();
    
    std::thread t ([&p]() {
        std::this_thread::sleep_for(2s);
        p.set_value();
    });

    // changing limit to int or a small value works as expected
    auto longWait = std::numeric_limits<long>::max();
    auto status = f.wait_for(std::chrono::nanoseconds{longWait});
 
    if (status == std::future_status::timeout)
        std::cout << "timeout occurred\n";
    else if (status == std::future_status::ready)
        std::cout << "ready, no timeout occurred\n";
    
    t.join();
}
```

[Example 2 comparing GCC, Clang and MSVC implementation](https://godbolt.org/z/vhxoxf8x4), only MSVC behaves as expected
```c++
#include <iostream>
#include <chrono>
#include <limits>
#include <future>
 
using namespace std::chrono_literals;

void worker_thread()
{
    std::this_thread::sleep_for(2s);
}
 
int main()
{
    std::future<void> f = std::async(std::launch::async, worker_thread);

    // changing limit to int or a small value works as expected
    auto longWait = std::numeric_limits<long>::max();
    auto status = f.wait_for(std::chrono::milliseconds{longWait});
 
    if (status == std::future_status::timeout)
        std::cout << "timeout occurred\n";
    else if (status == std::future_status::ready)
        std::cout << "ready, no timeout occurred\n";
}
```

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJztVkGPqzYQ_jVwsYqCIQkcOLwl2aqHSlVbtcfI4Enwq7GRbbLZ_vqOIbBJXtLu6uld2kZssnjGM59nvvnkSvPX4meQzAEPkk8koMkyp6tFsNgEC3wdfoLVwjpvxmffu95AkJS_Bsl2XHphwu322qAbqaBhR7BEqFobA7WTr0TsiXBEWNIZfRQcOHkRriGMSGYOQI5M9kBwP8EATrSge7fjvWFOaIVLESE_KOuAcaL3xCcT6hDQ0gc1gGgUpmtb4AIPgemY4vP6l8h31jHX23HpnG1Icj7q-L182p5Y20kgMal12zGDOcn3ZenzlpLhi0_z4y-_IQzv14JyI-DlJqBZ41w35KDP-Bw0r7R0kTaI-_lP_KvSn04s26okoLkPqRUCH6JNBWSWwKnDAmJfpiaMTx3QJ_-MqzTBUsueA8GeCG2dAdb61twx143RSj8wStEKZx8Yp65vr3jRW18VxVqwHauBzKUeE-2kcGCYxKBPV_uEcqRlQmGh_PnHfOvJBz9zIGRMK6yn21ELXNuS7i3YpeNMy8lvj7A3pIsOgNwcjWO2y-13ArnGeKY54t2XWOhVN7YU95IrkDfbhN2Ne8cFKwG6YSpoRu1tYv_pIovYBvbfg7beXC5dGAZKkbpBEvryD30jThNfVRwiRmzLpDyP1Ys2f9whkw_EetwktTr8jiM1VGs-jepbMKLeTZwovds87y073QE8hBuHawi2j2ZdoNkNM85ZmNIWaq24xcJOSG4OftEj1JEh1JTiCvLfTPdEsS-aVqPVsxsfjEzP_kTXdY_axYNliRSlV6cEaeHDQDwrXt8N4-xdEqXJeyC9_eeiz3qeqpk5WM9rAXmgdPSbKN2xOenTPjul_y2lG7-9GA0jCGYSh3-UvA8oydzaD-vqA7mc7cy-qvpybiXrVd1cGcvbk_271aoVUor_5eqr5OqRFoVQxKtVnsXpKqchLxKeJzkLnXASivdcPQnXqCRKu-F-eHUFnDB5r_HCeXvHtGFvZHEjZHhD7asIFRFfpDxOP9_hjeQzUhNfhbU94Dw--wtzFjbFHvYxj_OU1jyuqjrNkiRbJ2ydpzzjq3gZSlZhQwp_rVhuQlHQBaVxnCzihKbpOkppkq8hp2y5jvPVogrSBeA4y8gn9pIammLAUPUHi0ako7NvRmatOCiAKT5SvNGmePnUKzDhgLYYoP4FbiqMog">