brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.9 KiB · 2ee79ea Raw
129 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();17 18#include <future>19#include <cassert>20 21#include "test_macros.h"22 23int main(int, char**)24{25    {26        typedef int T;27        std::future<T> f;28        {29            std::promise<T> p;30            f = p.get_future();31            p.set_value(3);32        }33        assert(f.get() == 3);34    }35#ifndef TEST_HAS_NO_EXCEPTIONS36    {37        typedef int T;38        std::future<T> f;39        {40            std::promise<T> p;41            f = p.get_future();42        }43        try44        {45            T i = f.get();46            ((void)i); // Prevent unused warning47            assert(false);48        }49        catch (const std::future_error& e)50        {51            assert(e.code() == make_error_code(std::future_errc::broken_promise));52        }53    }54#endif55 56    {57        typedef int& T;58        int i = 4;59        std::future<T> f;60        {61            std::promise<T> p;62            f = p.get_future();63            p.set_value(i);64        }65        assert(&f.get() == &i);66    }67#ifndef TEST_HAS_NO_EXCEPTIONS68    {69        typedef int& T;70        std::future<T> f;71        {72            std::promise<T> p;73            f = p.get_future();74        }75        try76        {77            T i = f.get();78            ((void)i); // Prevent unused warning79            assert(false);80        }81        catch (const std::future_error& e)82        {83            assert(e.code() == make_error_code(std::future_errc::broken_promise));84        }85    }86#endif87 88    {89        typedef void T;90        std::future<T> f;91        {92            std::promise<T> p;93            f = p.get_future();94            p.set_value();95        }96        f.get();97        assert(true);98    }99#ifndef TEST_HAS_NO_EXCEPTIONS100    {101        typedef void T;102        std::future<T> f;103        {104            std::promise<T> p;105            f = p.get_future();106        }107        try108        {109            f.get();110            assert(false);111        }112        catch (const std::future_error& e)113        {114            // LWG 2056 changed the values of future_errc, so if we're using new115            // headers with an old library the error codes won't line up.116            //117            // Note that this particular check only applies to promise<void>118            // since the other specializations happen to be implemented in the119            // header rather than the library.120            assert(121                e.code() == make_error_code(std::future_errc::broken_promise) ||122                e.code() == std::error_code(0, std::future_category()));123        }124    }125#endif126 127  return 0;128}129