brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.0 KiB · 350db2a Raw
100 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// UNSUPPORTED: no-threads10// UNSUPPORTED: c++0311 12// <future>13 14// class promise<R>15 16// promise& operator=(promise&& rhs);17 18#include <future>19#include <cassert>20 21#include "test_macros.h"22#include "test_allocator.h"23 24int main(int, char**)25{26    test_allocator_statistics alloc_stats;27    assert(alloc_stats.alloc_count == 0);28    {29        std::promise<int> p0(std::allocator_arg, test_allocator<int>(&alloc_stats));30        std::promise<int> p(std::allocator_arg, test_allocator<int>(&alloc_stats));31        assert(alloc_stats.alloc_count == 2);32        p = std::move(p0);33        assert(alloc_stats.alloc_count == 1);34        std::future<int> f = p.get_future();35        assert(alloc_stats.alloc_count == 1);36        assert(f.valid());37#ifndef TEST_HAS_NO_EXCEPTIONS38        try39        {40            f = p0.get_future();41            assert(false);42        }43        catch (const std::future_error& e)44        {45            assert(e.code() == make_error_code(std::future_errc::no_state));46        }47#endif48        assert(alloc_stats.alloc_count == 1);49    }50    assert(alloc_stats.alloc_count == 0);51    {52        std::promise<int&> p0(std::allocator_arg, test_allocator<int>(&alloc_stats));53        std::promise<int&> p(std::allocator_arg, test_allocator<int>(&alloc_stats));54        assert(alloc_stats.alloc_count == 2);55        p = std::move(p0);56        assert(alloc_stats.alloc_count == 1);57        std::future<int&> f = p.get_future();58        assert(alloc_stats.alloc_count == 1);59        assert(f.valid());60#ifndef TEST_HAS_NO_EXCEPTIONS61        try62        {63            f = p0.get_future();64            assert(false);65        }66        catch (const std::future_error& e)67        {68            assert(e.code() == make_error_code(std::future_errc::no_state));69        }70#endif71        assert(alloc_stats.alloc_count == 1);72    }73    assert(alloc_stats.alloc_count == 0);74    {75        std::promise<void> p0(std::allocator_arg, test_allocator<void>(&alloc_stats));76        std::promise<void> p(std::allocator_arg, test_allocator<void>(&alloc_stats));77        assert(alloc_stats.alloc_count == 2);78        p = std::move(p0);79        assert(alloc_stats.alloc_count == 1);80        std::future<void> f = p.get_future();81        assert(alloc_stats.alloc_count == 1);82        assert(f.valid());83#ifndef TEST_HAS_NO_EXCEPTIONS84        try85        {86            f = p0.get_future();87            assert(false);88        }89        catch (const std::future_error& e)90        {91            assert(e.code() == make_error_code(std::future_errc::no_state));92        }93#endif94        assert(alloc_stats.alloc_count == 1);95    }96    assert(alloc_stats.alloc_count == 0);97 98  return 0;99}100