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-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// UNSUPPORTED: no-threads
10// UNSUPPORTED: c++03, c++11, c++14, c++17
11// XFAIL: availability-synchronization_library-missing
12
13// stop_source(const stop_source&) noexcept;
14
15#include <cassert>
16#include <optional>
17#include <stop_token>
18#include <type_traits>
19
20#include "test_macros.h"
21
22static_assert(std::is_nothrow_copy_constructible_v<std::stop_source>);
23
24int main(int, char**) {
25 {
26 std::stop_source source;
27 std::stop_source copy{source};
28
29 assert(source == copy);
30
31 assert(source.stop_possible());
32 assert(!source.stop_requested());
33
34 assert(copy.stop_possible());
35 assert(!copy.stop_requested());
36
37 source.request_stop();
38 assert(source.stop_possible());
39 assert(source.stop_requested());
40
41 assert(copy.stop_possible());
42 assert(copy.stop_requested());
43 }
44
45 // source counter incremented
46 {
47 std::optional<std::stop_source> source(std::in_place);
48 auto st = source->get_token();
49 assert(st.stop_possible());
50
51 std::optional<std::stop_source> copy{source};
52 source.reset();
53
54 assert(st.stop_possible());
55
56 copy.reset();
57 assert(!st.stop_possible());
58 }
59
60 // copy from empty
61 {
62 std::stop_source ss1{std::nostopstate};
63 std::stop_source copy{ss1};
64 assert(!copy.stop_possible());
65 }
66
67 return 0;
68}
69

source code of libcxx/test/std/thread/thread.stoptoken/stopsource/cons.copy.pass.cpp