@@ -42,43 +42,78 @@ constexpr bool does_not_have_increment_nor_decrement_operators() {
42
42
43
43
template <typename T>
44
44
struct TestDoesNotHaveIncrementDecrement {
45
- void operator ()() const { static_assert (does_not_have_increment_nor_decrement_operators<T >()); }
45
+ void operator ()() const { static_assert (does_not_have_increment_nor_decrement_operators<std::atomic_ref<T> >()); }
46
46
};
47
47
48
48
template <typename T>
49
49
struct TestIncrementDecrement {
50
50
void operator ()() const {
51
- static_assert (std::is_integral_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 (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--);
51
+ if constexpr (std::is_integral_v<T>) {
52
+ T x (T (1 ));
53
+ std::atomic_ref<T> const a (x);
54
+
55
+ {
56
+ std::same_as<T> decltype (auto ) y = ++a;
57
+ assert (y == T (2 ));
58
+ assert (x == T (2 ));
59
+ ASSERT_NOEXCEPT (++a);
60
+ }
61
+
62
+ {
63
+ std::same_as<T> decltype (auto ) y = --a;
64
+ assert (y == T (1 ));
65
+ assert (x == T (1 ));
66
+ ASSERT_NOEXCEPT (--a);
67
+ }
68
+
69
+ {
70
+ std::same_as<T> decltype (auto ) y = a++;
71
+ assert (y == T (1 ));
72
+ assert (x == T (2 ));
73
+ ASSERT_NOEXCEPT (a++);
74
+ }
75
+
76
+ {
77
+ std::same_as<T> decltype (auto ) y = a--;
78
+ assert (y == T (2 ));
79
+ assert (x == T (1 ));
80
+ ASSERT_NOEXCEPT (a--);
81
+ }
82
+ } else if constexpr (std::is_pointer_v<T>) {
83
+ using U = std::remove_pointer_t <T>;
84
+ U t[9 ] = {};
85
+ T p{&t[1 ]};
86
+ std::atomic_ref<T> const a (p);
87
+
88
+ {
89
+ std::same_as<T> decltype (auto ) y = ++a;
90
+ assert (y == &t[2 ]);
91
+ assert (p == &t[2 ]);
92
+ ASSERT_NOEXCEPT (++a);
93
+ }
94
+
95
+ {
96
+ std::same_as<T> decltype (auto ) y = --a;
97
+ assert (y == &t[1 ]);
98
+ assert (p == &t[1 ]);
99
+ ASSERT_NOEXCEPT (--a);
100
+ }
101
+
102
+ {
103
+ std::same_as<T> decltype (auto ) y = a++;
104
+ assert (y == &t[1 ]);
105
+ assert (p == &t[2 ]);
106
+ ASSERT_NOEXCEPT (a++);
107
+ }
108
+
109
+ {
110
+ std::same_as<T> decltype (auto ) y = a--;
111
+ assert (y == &t[2 ]);
112
+ assert (p == &t[1 ]);
113
+ ASSERT_NOEXCEPT (a--);
114
+ }
115
+ } else {
116
+ static_assert (std::is_void_v<T>);
82
117
}
83
118
}
84
119
};
@@ -88,7 +123,7 @@ int main(int, char**) {
88
123
89
124
TestEachFloatingPointType<TestDoesNotHaveIncrementDecrement>()();
90
125
91
- TestEachPointerType<TestDoesNotHaveIncrementDecrement >()();
126
+ TestEachPointerType<TestIncrementDecrement >()();
92
127
93
128
TestDoesNotHaveIncrementDecrement<bool >()();
94
129
TestDoesNotHaveIncrementDecrement<UserAtomicType>()();
0 commit comments