]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/common: disable arithmetic operators for atomic enums 43836/head
authorRonen Friedman <rfriedma@redhat.com>
Sun, 7 Nov 2021 09:03:59 +0000 (11:03 +0200)
committerRonen Friedman <rfriedma@redhat.com>
Sun, 7 Nov 2021 09:54:14 +0000 (11:54 +0200)
While class enums are 'integral types', they do not support
all that an int does.

Signed-off-by: Ronen Friedman <rfriedma@redhat.com>
src/common/ceph_atomic.h

index 320963500e7f5f195cf3c5928952e69732a3a75d..4a96ed97e9c7acd54a126d6e7bf9f8316c8b3d70 100644 (file)
@@ -42,6 +42,7 @@ namespace ceph {
     }
     T operator=(T desired) noexcept {
       value = std::move(desired);
+      return *this;
     }
     operator T() const noexcept {
       return value;
@@ -49,23 +50,30 @@ namespace ceph {
 
     // We need to differentiate with SFINAE as std::atomic offers beefier
     // interface for integral types.
-    std::enable_if_t<std::is_integral_v<T>, T> operator++() {
+
+    template<class TT=T>
+    std::enable_if_t<!std::is_enum_v<TT> && std::is_integral_v<TT>, TT>  operator++() {
       return ++value;
     }
-    std::enable_if_t<std::is_integral_v<T>, T> operator++(int) {
+    template<class TT=T>
+    std::enable_if_t<!std::is_enum_v<TT> && std::is_integral_v<TT>, TT> operator++(int) {
       return value++;
     }
-    std::enable_if_t<std::is_integral_v<T>, T> operator--() {
+    template<class TT=T>
+    std::enable_if_t<!std::is_enum_v<TT> && std::is_integral_v<TT>, TT> operator--() {
       return --value;
     }
-    std::enable_if_t<std::is_integral_v<T>, T> operator--(int) {
+    template<class TT=T>
+    std::enable_if_t<!std::is_enum_v<TT> && std::is_integral_v<TT>, TT> operator--(int) {
       return value--;
     }
-    std::enable_if_t<std::is_integral_v<T>, T> operator+=(const dummy_atomic& b) {
+    template<class TT=T>
+    std::enable_if_t<!std::is_enum_v<TT> && std::is_integral_v<TT>, TT> operator+=(const dummy_atomic& b) {
       value += b;
       return value;
     }
-    std::enable_if_t<std::is_integral_v<T>, T> operator-=(const dummy_atomic& b) {
+    template<class TT=T>
+    std::enable_if_t<!std::is_enum_v<TT> && std::is_integral_v<TT>, TT> operator-=(const dummy_atomic& b) {
       value -= b;
       return value;
     }