//===----------------------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// UNSUPPORTED: libcpp-has-no-threads
// UNSUPPORTED: c++98, c++03

// <future>

// template <class F, class... Args>
//     future<typename result_of<F(Args...)>::type>
//     async(F&& f, Args&&... args);

// template <class F, class... Args>
//     future<typename result_of<F(Args...)>::type>
//     async(launch policy, F&& f, Args&&... args);

// This test is designed to cause and allow TSAN to detect the race condition
// reported in PR23293: https://bugs.llvm.org/show_bug.cgi?id=23293

#include <future>
#include <chrono>
#include <thread>
#include <memory>
#include <cassert>

#include "test_macros.h"

int f_async() {
    typedef std::chrono::milliseconds ms;
    std::this_thread::sleep_for(ms(200));
    return 42;
}

bool ran = false;

int f_deferred() {
    ran = true;
    return 42;
}

void test_each() {
    {
        std::future<int> f = std::async(f_async);
        int const result = f.get();
        assert(result == 42);
    }
    {
        std::future<int> f = std::async(std::launch::async, f_async);
        int const result = f.get();
        assert(result == 42);
    }
    {
        ran = false;
        std::future<int> f = std::async(std::launch::deferred, f_deferred);
        assert(ran == false);
        int const result = f.get();
        assert(ran == true);
        assert(result == 42);
    }
}

int main(int, char**) {
    for (int i=0; i < 25; ++i) test_each();

  return 0;
}
