]> git.ipfire.org Git - thirdparty/gcc.git/blob - libstdc++-v3/testsuite/29_atomics/atomic/cons/value_init.cc
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / 29_atomics / atomic / cons / value_init.cc
1 // Copyright (C) 2020-2023 Free Software Foundation, Inc.
2 //
3 // This file is part of the GNU ISO C++ Library. This library is free
4 // software; you can redistribute it and/or modify it under the
5 // terms of the GNU General Public License as published by the
6 // Free Software Foundation; either version 3, or (at your option)
7 // any later version.
8
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
13
14 // You should have received a copy of the GNU General Public License along
15 // with this library; see the file COPYING3. If not see
16 // <http://www.gnu.org/licenses/>.
17
18 // { dg-options "-std=gnu++2a" }
19 // { dg-do run { target c++2a } }
20
21 #include <atomic>
22
23 #ifndef __cpp_lib_atomic_value_initialization
24 # error "Feature test macro for atomic value-initialization is missing"
25 #elif __cpp_lib_atomic_value_initialization < 201911L
26 # error "Feature test macro for atomic value-initialization has wrong value"
27 #endif
28
29 #include <testsuite_hooks.h>
30
31 struct A
32 {
33 constexpr A() : val(42) { }
34 int val;
35 };
36
37 constexpr std::atomic<A> a;
38
39 void
40 test01()
41 {
42 VERIFY(a.load().val == 42);
43 static_assert(!std::is_nothrow_default_constructible_v<std::atomic<A>>);
44 }
45
46 struct B
47 {
48 constexpr B() noexcept : val(99) { }
49 int val;
50 };
51
52 constexpr std::atomic<B> b;
53
54 void
55 test02()
56 {
57 VERIFY(b.load().val == 99);
58 static_assert(std::is_nothrow_default_constructible_v<std::atomic<B>>);
59 }
60
61 constexpr std::atomic<int*> c;
62
63 void
64 test03()
65 {
66 VERIFY(c.load() == nullptr);
67 static_assert(std::is_nothrow_default_constructible_v<std::atomic<int*>>);
68 }
69
70 int
71 main()
72 {
73 test01();
74 test02();
75 test03();
76 }