File tree Expand file tree Collapse file tree 1 file changed +66
-30
lines changed
libcxx/test/std/atomics/atomics.ref Expand file tree Collapse file tree 1 file changed +66
-30
lines changed Original file line number Diff line number Diff line change @@ -49,36 +49,72 @@ template <typename T>
4949struct TestIncrementDecrement {
5050 void operator ()() const {
5151 static_assert (std::is_integral_v<T> || std::is_pointer_v<T>);
52-
53- T x (T (1 ));
54- std::atomic_ref<T> const a (x);
55-
56- {
57- std::same_as<T> decltype (auto ) y = ++a;
58- assert (y == T (1 ) + 1 );
59- assert (x == T (1 ) + 1 );
60- ASSERT_NOEXCEPT (++a);
61- }
62-
63- {
64- std::same_as<T> decltype (auto ) y = --a;
65- assert (y == T (1 ));
66- assert (x == T (1 ));
67- ASSERT_NOEXCEPT (--a);
68- }
69-
70- {
71- std::same_as<T> decltype (auto ) y = a++;
72- assert (y == T (1 ));
73- assert (x == T (1 ) + 1 );
74- ASSERT_NOEXCEPT (a++);
75- }
76-
77- {
78- std::same_as<T> decltype (auto ) y = a--;
79- assert (y == T (1 ) + 1 );
80- assert (x == T (1 ));
81- ASSERT_NOEXCEPT (a--);
52+ if constexpr (std::is_integral_v<T>) {
53+ T x (T (1 ));
54+ std::atomic_ref<T> const a (x);
55+
56+ {
57+ std::same_as<T> decltype (auto ) y = ++a;
58+ assert (y == T (2 ));
59+ assert (x == T (2 ));
60+ ASSERT_NOEXCEPT (++a);
61+ }
62+
63+ {
64+ std::same_as<T> decltype (auto ) y = --a;
65+ assert (y == T (1 ));
66+ assert (x == T (1 ));
67+ ASSERT_NOEXCEPT (--a);
68+ }
69+
70+ {
71+ std::same_as<T> decltype (auto ) y = a++;
72+ assert (y == T (1 ));
73+ assert (x == T (2 ));
74+ ASSERT_NOEXCEPT (a++);
75+ }
76+
77+ {
78+ std::same_as<T> decltype (auto ) y = a--;
79+ assert (y == T (2 ));
80+ assert (x == T (1 ));
81+ ASSERT_NOEXCEPT (a--);
82+ }
83+ } else if constexpr (std::is_pointer_v<T>) {
84+ using U = std::remove_pointer_t <T>;
85+ U t[9 ] = {};
86+ T p{&t[1 ]};
87+ std::atomic_ref<T> const a (p);
88+
89+ {
90+ std::same_as<T> decltype (auto ) y = ++a;
91+ assert (y == &t[2 ]);
92+ assert (p == &t[2 ]);
93+ ASSERT_NOEXCEPT (++a);
94+ }
95+
96+ {
97+ std::same_as<T> decltype (auto ) y = --a;
98+ assert (y == &t[1 ]);
99+ assert (p == &t[1 ]);
100+ ASSERT_NOEXCEPT (--a);
101+ }
102+
103+ {
104+ std::same_as<T> decltype (auto ) y = a++;
105+ assert (y == &t[1 ]);
106+ assert (p == &t[2 ]);
107+ ASSERT_NOEXCEPT (a++);
108+ }
109+
110+ {
111+ std::same_as<T> decltype (auto ) y = a--;
112+ assert (y == &t[2 ]);
113+ assert (p == &t[1 ]);
114+ ASSERT_NOEXCEPT (a--);
115+ }
116+ } else {
117+ static_assert (std::is_void_v<T>);
82118 }
83119 }
84120};
You can’t perform that action at this time.
0 commit comments