diff --git a/llvm/include/llvm/ADT/SmallVector.h b/llvm/include/llvm/ADT/SmallVector.h index 701d10fc2bf09..e34702bdbb3c1 100644 --- a/llvm/include/llvm/ADT/SmallVector.h +++ b/llvm/include/llvm/ADT/SmallVector.h @@ -949,6 +949,9 @@ class SmallVectorImpl : public SmallVectorTemplateBase { return std::lexicographical_compare(this->begin(), this->end(), RHS.begin(), RHS.end()); } + bool operator>(const SmallVectorImpl &RHS) const { return RHS < *this; } + bool operator<=(const SmallVectorImpl &RHS) const { return !(*this > RHS); } + bool operator>=(const SmallVectorImpl &RHS) const { return !(*this < RHS); } }; template diff --git a/llvm/unittests/ADT/SmallVectorTest.cpp b/llvm/unittests/ADT/SmallVectorTest.cpp index 3fbea5299501b..07479ecdf5f8a 100644 --- a/llvm/unittests/ADT/SmallVectorTest.cpp +++ b/llvm/unittests/ADT/SmallVectorTest.cpp @@ -123,14 +123,30 @@ class Constructable { return numCopyAssignmentCalls; } - friend bool operator==(const Constructable & c0, const Constructable & c1) { + friend bool operator==(const Constructable &c0, const Constructable &c1) { return c0.getValue() == c1.getValue(); } - friend bool LLVM_ATTRIBUTE_UNUSED - operator!=(const Constructable & c0, const Constructable & c1) { + friend bool LLVM_ATTRIBUTE_UNUSED operator!=(const Constructable &c0, + const Constructable &c1) { return c0.getValue() != c1.getValue(); } + + friend bool operator<(const Constructable &c0, const Constructable &c1) { + return c0.getValue() < c1.getValue(); + } + friend bool LLVM_ATTRIBUTE_UNUSED operator<=(const Constructable &c0, + const Constructable &c1) { + return c0.getValue() <= c1.getValue(); + } + friend bool LLVM_ATTRIBUTE_UNUSED operator>(const Constructable &c0, + const Constructable &c1) { + return c0.getValue() > c1.getValue(); + } + friend bool LLVM_ATTRIBUTE_UNUSED operator>=(const Constructable &c0, + const Constructable &c1) { + return c0.getValue() >= c1.getValue(); + } }; int Constructable::numConstructorCalls; @@ -766,8 +782,8 @@ TYPED_TEST(SmallVectorTest, InsertEmptyRangeTest) { } // Comparison tests. -TYPED_TEST(SmallVectorTest, ComparisonTest) { - SCOPED_TRACE("ComparisonTest"); +TYPED_TEST(SmallVectorTest, ComparisonEqualityTest) { + SCOPED_TRACE("ComparisonEqualityTest"); this->makeSequence(this->theVector, 1, 3); this->makeSequence(this->otherVector, 1, 3); @@ -782,6 +798,36 @@ TYPED_TEST(SmallVectorTest, ComparisonTest) { EXPECT_TRUE(this->theVector != this->otherVector); } +// Comparison tests. +TYPED_TEST(SmallVectorTest, ComparisonLessThanTest) { + SCOPED_TRACE("ComparisonLessThanTest"); + + this->theVector = {1, 2, 4}; + this->otherVector = {1, 4}; + + EXPECT_TRUE(this->theVector < this->otherVector); + EXPECT_TRUE(this->theVector <= this->otherVector); + EXPECT_FALSE(this->theVector > this->otherVector); + EXPECT_FALSE(this->theVector >= this->otherVector); + + EXPECT_FALSE(this->otherVector < this->theVector); + EXPECT_FALSE(this->otherVector <= this->theVector); + EXPECT_TRUE(this->otherVector > this->theVector); + EXPECT_TRUE(this->otherVector >= this->theVector); + + this->otherVector = {1, 2, 4}; + + EXPECT_FALSE(this->theVector < this->otherVector); + EXPECT_TRUE(this->theVector <= this->otherVector); + EXPECT_FALSE(this->theVector > this->otherVector); + EXPECT_TRUE(this->theVector >= this->otherVector); + + EXPECT_FALSE(this->otherVector < this->theVector); + EXPECT_TRUE(this->otherVector <= this->theVector); + EXPECT_FALSE(this->otherVector > this->theVector); + EXPECT_TRUE(this->otherVector >= this->theVector); +} + // Constant vector tests. TYPED_TEST(SmallVectorTest, ConstVectorTest) { const TypeParam constVector;