1e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant//===----------------------------------------------------------------------===//
2e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant//
3e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant//                     The LLVM Compiler Infrastructure
4e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant//
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant//
8e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant//===----------------------------------------------------------------------===//
98d86b2e6867297fb2109824c67c50de67f3a31f2Jonathan Roelofs//
108d86b2e6867297fb2109824c67c50de67f3a31f2Jonathan Roelofs// UNSUPPORTED: libcpp-has-no-threads
11031a3d203ab2795050492d71da44179939b42bb3Eric Fiselier// UNSUPPORTED: c++98, c++03
12e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant
13e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant// <future>
14e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant
157de47902d08e6cd08977b573b134f21b5782fc4bHoward Hinnant// class future<R>
16e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant
177de47902d08e6cd08977b573b134f21b5782fc4bHoward Hinnant// shared_future<R> share() &&;
18e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant
19e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant#include <future>
20e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant#include <cassert>
21e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant
22e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnantint main()
23e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant{
24e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant    {
25e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        typedef int T;
26e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        std::promise<T> p;
27e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        std::future<T> f0 = p.get_future();
289bb0cca6462f3ce85b3f6e8a117bec8e9d15f98cMarshall Clow        static_assert( noexcept(f0.share()), "");
29041fb56800c84bd3695aef8f4273c68b4248f107Stephan T. Lavavej        std::shared_future<T> f = f0.share();
30e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        assert(!f0.valid());
31e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        assert(f.valid());
32e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant    }
33e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant    {
34e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        typedef int T;
35e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        std::future<T> f0;
369bb0cca6462f3ce85b3f6e8a117bec8e9d15f98cMarshall Clow        static_assert( noexcept(f0.share()), "");
37041fb56800c84bd3695aef8f4273c68b4248f107Stephan T. Lavavej        std::shared_future<T> f = f0.share();
38e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        assert(!f0.valid());
39e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        assert(!f.valid());
40e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant    }
41e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant    {
42e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        typedef int& T;
43e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        std::promise<T> p;
44e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        std::future<T> f0 = p.get_future();
459bb0cca6462f3ce85b3f6e8a117bec8e9d15f98cMarshall Clow        static_assert( noexcept(f0.share()), "");
46041fb56800c84bd3695aef8f4273c68b4248f107Stephan T. Lavavej        std::shared_future<T> f = f0.share();
47e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        assert(!f0.valid());
48e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        assert(f.valid());
49e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant    }
50e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant    {
51e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        typedef int& T;
52e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        std::future<T> f0;
539bb0cca6462f3ce85b3f6e8a117bec8e9d15f98cMarshall Clow        static_assert( noexcept(f0.share()), "");
54041fb56800c84bd3695aef8f4273c68b4248f107Stephan T. Lavavej        std::shared_future<T> f = f0.share();
55e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        assert(!f0.valid());
56e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        assert(!f.valid());
57e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant    }
58e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant    {
59e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        typedef void T;
60e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        std::promise<T> p;
61e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        std::future<T> f0 = p.get_future();
629bb0cca6462f3ce85b3f6e8a117bec8e9d15f98cMarshall Clow        static_assert( noexcept(f0.share()), "");
63041fb56800c84bd3695aef8f4273c68b4248f107Stephan T. Lavavej        std::shared_future<T> f = f0.share();
64e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        assert(!f0.valid());
65e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        assert(f.valid());
66e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant    }
67e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant    {
68e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        typedef void T;
69e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        std::future<T> f0;
709bb0cca6462f3ce85b3f6e8a117bec8e9d15f98cMarshall Clow        static_assert( noexcept(f0.share()), "");
71041fb56800c84bd3695aef8f4273c68b4248f107Stephan T. Lavavej        std::shared_future<T> f = f0.share();
72e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        assert(!f0.valid());
73e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        assert(!f.valid());
74e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant    }
75e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant}
76