Files
android_external_libcxx/test/std/thread/futures/futures.async/async_race.38682.pass.cpp
Louis Dionne 8e2d4ad9c5 [libcxx] Make UNSUPPORTED for std::async test more fine grained
The test was previously marked as unsupported on all Apple platforms, when
we really just want to mark it as unsupported for previously shipped dylibs
on macosx.

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@347920 91177308-0d34-0410-b5e6-96231b3b80d8
2018-11-29 21:25:29 +00:00

70 lines
2.0 KiB
C++

//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// UNSUPPORTED: libcpp-has-no-threads
// UNSUPPORTED: c++98, c++03
// There's currently no release of OS X whose dylib contains the patch for
// PR38682. Since the fix for future<void> is in the dylib, this test may fail.
// UNSUPPORTED: with_system_cxx_lib=macosx10.14
// UNSUPPORTED: with_system_cxx_lib=macosx10.13
// UNSUPPORTED: with_system_cxx_lib=macosx10.12
// UNSUPPORTED: with_system_cxx_lib=macosx10.11
// UNSUPPORTED: with_system_cxx_lib=macosx10.10
// UNSUPPORTED: with_system_cxx_lib=macosx10.9
// UNSUPPORTED: with_system_cxx_lib=macosx10.8
// UNSUPPORTED: with_system_cxx_lib=macosx10.7
// This test is designed to cause and allow TSAN to detect a race condition
// in std::async, as reported in https://bugs.llvm.org/show_bug.cgi?id=38682.
#include <cassert>
#include <functional>
#include <future>
#include <numeric>
#include <vector>
static int worker(std::vector<int> const& data) {
return std::accumulate(data.begin(), data.end(), 0);
}
static int& worker_ref(int& i) { return i; }
static void worker_void() { }
int main() {
// future<T>
{
std::vector<int> const v{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (int i = 0; i != 20; ++i) {
std::future<int> fut = std::async(std::launch::async, worker, v);
int answer = fut.get();
assert(answer == 55);
}
}
// future<T&>
{
for (int i = 0; i != 20; ++i) {
std::future<int&> fut = std::async(std::launch::async, worker_ref, std::ref(i));
int& answer = fut.get();
assert(answer == i);
}
}
// future<void>
{
for (int i = 0; i != 20; ++i) {
std::future<void> fut = std::async(std::launch::async, worker_void);
fut.get();
}
}
}