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//===----------------------------------------------------------------------===//
9e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant
10e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant// <future>
11e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant
127de47902d08e6cd08977b573b134f21b5782fc4bHoward Hinnant// class future<R>
13e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant
147de47902d08e6cd08977b573b134f21b5782fc4bHoward Hinnant// shared_future<R> share() &&;
15e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant
16e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant#include <future>
17e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant#include <cassert>
18e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant
19e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnantint main()
20e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant{
21e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant    {
22e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        typedef int T;
23e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        std::promise<T> p;
24e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        std::future<T> f0 = p.get_future();
257de47902d08e6cd08977b573b134f21b5782fc4bHoward Hinnant        std::shared_future<T> f = std::move(f0.share());
26e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        assert(!f0.valid());
27e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        assert(f.valid());
28e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant    }
29e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant    {
30e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        typedef int T;
31e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        std::future<T> f0;
327de47902d08e6cd08977b573b134f21b5782fc4bHoward Hinnant        std::shared_future<T> f = std::move(f0.share());
33e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        assert(!f0.valid());
34e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        assert(!f.valid());
35e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant    }
36e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant    {
37e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        typedef int& T;
38e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        std::promise<T> p;
39e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        std::future<T> f0 = p.get_future();
407de47902d08e6cd08977b573b134f21b5782fc4bHoward Hinnant        std::shared_future<T> f = std::move(f0.share());
41e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        assert(!f0.valid());
42e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        assert(f.valid());
43e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant    }
44e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant    {
45e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        typedef int& T;
46e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        std::future<T> f0;
477de47902d08e6cd08977b573b134f21b5782fc4bHoward Hinnant        std::shared_future<T> f = std::move(f0.share());
48e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        assert(!f0.valid());
49e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        assert(!f.valid());
50e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant    }
51e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant    {
52e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        typedef void T;
53e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        std::promise<T> p;
54e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        std::future<T> f0 = p.get_future();
557de47902d08e6cd08977b573b134f21b5782fc4bHoward Hinnant        std::shared_future<T> f = std::move(f0.share());
56e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        assert(!f0.valid());
57e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        assert(f.valid());
58e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant    }
59e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant    {
60e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        typedef void T;
61e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        std::future<T> f0;
627de47902d08e6cd08977b573b134f21b5782fc4bHoward Hinnant        std::shared_future<T> f = std::move(f0.share());
63e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        assert(!f0.valid());
64e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant        assert(!f.valid());
65e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant    }
66e6e4d015530014978920fa46cfe294518dc3490aHoward Hinnant}
67