Forráskód Böngészése

AK: Remove operators && and || from DistinctNumeric

These don't do short-circuit evaluation, and so I ran into some
some very subtle side-effects when converting code to DistinctNumeric.

In code like this:

    MyDistinctNumeric n;
    if (n && check_thing(n))
        return;

There would be no short-circuit evaluation if the return type of
check_thing() was implicitly convertible to MyDistinctNumeric.

Ran into this while making Ext2FS::GroupIndex a DistinctNumeric.
Andreas Kling 4 éve
szülő
commit
acf341862a
2 módosított fájl, 0 hozzáadás és 19 törlés
  1. 0 10
      AK/DistinctNumeric.h
  2. 0 9
      AK/Tests/TestDistinctNumeric.cpp

+ 0 - 10
AK/DistinctNumeric.h

@@ -150,16 +150,6 @@ public:
         static_assert(Bool, "'!a' is only available for DistinctNumeric types with 'Bool'.");
         return !this->m_value;
     }
-    bool operator&&(const Self& other) const
-    {
-        static_assert(Bool, "'a&&b' is only available for DistinctNumeric types with 'Bool'.");
-        return this->m_value && other.m_value;
-    }
-    bool operator||(const Self& other) const
-    {
-        static_assert(Bool, "'a||b' is only available for DistinctNumeric types with 'Bool'.");
-        return this->m_value || other.m_value;
-    }
     // Intentionally don't define `operator bool() const` here. C++ is a bit
     // overzealos, and whenever there would be a type error, C++ instead tries
     // to convert to a common int-ish type first. `bool` is int-ish, so

+ 0 - 9
AK/Tests/TestDistinctNumeric.cpp

@@ -123,13 +123,6 @@ TEST_CASE(operator_bool)
     EXPECT_EQ(!a, true);
     EXPECT_EQ(!b, false);
     EXPECT_EQ(!c, false);
-    EXPECT_EQ(a && b, false);
-    EXPECT_EQ(a && c, false);
-    EXPECT_EQ(b && c, true);
-    EXPECT_EQ(a || a, false);
-    EXPECT_EQ(a || b, true);
-    EXPECT_EQ(a || c, true);
-    EXPECT_EQ(b || c, true);
 }
 
 TEST_CASE(operator_flags)
@@ -233,8 +226,6 @@ TEST_CASE(composability)
     EXPECT_EQ(a >= b, false);
     // Bool
     EXPECT_EQ(!a, true);
-    EXPECT_EQ(a && b, false);
-    EXPECT_EQ(a || b, true);
     // Flags
     EXPECT_EQ(a & b, GeneralNumeric(0));
     EXPECT_EQ(a | b, GeneralNumeric(1));