1f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant//===----------------------------------------------------------------------===//
2f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant//
3f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant//                     The LLVM Compiler Infrastructure
4f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward 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.
7f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant//
8f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant//===----------------------------------------------------------------------===//
9f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant
10f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant// <future>
11f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant
12f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant// class promise<R>
13f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant
14f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant// void promise<R&>::set_value(R& r);
15f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant
16f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant#include <future>
17f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant#include <cassert>
18f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant
19f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnantint main()
20f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant{
21f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant    {
22f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant        typedef int& T;
23f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant        int i = 3;
24f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant        std::promise<T> p;
25f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant        std::future<T> f = p.get_future();
26f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant        p.set_value(i);
2754da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant        int& j = f.get();
2854da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant        assert(j == 3);
29f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant        ++i;
3054da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant        assert(j == 4);
31f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant        try
32f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant        {
33f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant            p.set_value(i);
34f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant            assert(false);
35f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant        }
36f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant        catch (const std::future_error& e)
37f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant        {
38f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant            assert(e.code() == make_error_code(std::future_errc::promise_already_satisfied));
39f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant        }
40f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant    }
41f39daa8e5a5f7d7eb19f391497a29b4fa0eec28dHoward Hinnant}
42