199be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant//===----------------------------------------------------------------------===//
299be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant//
399be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant//                     The LLVM Compiler Infrastructure
499be8237db0c69ea05bb82bbb8fc8a2273c05743Howard 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.
799be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant//
899be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant//===----------------------------------------------------------------------===//
999be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant
1099be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant// <future>
1199be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant
1299be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant// class shared_future<R>
1399be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant
1499be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant// shared_future& operator=(shared_future&& rhs);
1599be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant
1699be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant#include <future>
1799be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant#include <cassert>
1899be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant
1999be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnantint main()
2099be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant{
2173d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2299be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant    {
2399be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        typedef int T;
2499be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        std::promise<T> p;
2599be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        std::shared_future<T> f0 = p.get_future();
2699be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        std::shared_future<T> f;
2799be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        f = std::move(f0);
2899be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        assert(!f0.valid());
2999be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        assert(f.valid());
3099be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant    }
3199be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant    {
3299be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        typedef int T;
3399be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        std::shared_future<T> f0;
3499be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        std::shared_future<T> f;
3599be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        f = std::move(f0);
3699be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        assert(!f0.valid());
3799be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        assert(!f.valid());
3899be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant    }
3999be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant    {
4099be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        typedef int& T;
4199be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        std::promise<T> p;
4299be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        std::shared_future<T> f0 = p.get_future();
4399be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        std::shared_future<T> f;
4499be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        f = std::move(f0);
4599be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        assert(!f0.valid());
4699be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        assert(f.valid());
4799be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant    }
4899be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant    {
4999be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        typedef int& T;
5099be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        std::shared_future<T> f0;
5199be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        std::shared_future<T> f;
5299be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        f = std::move(f0);
5399be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        assert(!f0.valid());
5499be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        assert(!f.valid());
5599be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant    }
5699be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant    {
5799be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        typedef void T;
5899be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        std::promise<T> p;
5999be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        std::shared_future<T> f0 = p.get_future();
6099be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        std::shared_future<T> f;
6199be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        f = std::move(f0);
6299be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        assert(!f0.valid());
6399be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        assert(f.valid());
6499be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant    }
6599be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant    {
6699be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        typedef void T;
6799be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        std::shared_future<T> f0;
6899be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        std::shared_future<T> f;
6999be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        f = std::move(f0);
7099be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        assert(!f0.valid());
7199be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant        assert(!f.valid());
7299be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant    }
7373d21a4f0774d3fadab98e690619a359cfb160a3Howard Hinnant#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
7499be8237db0c69ea05bb82bbb8fc8a2273c05743Howard Hinnant}
75