forked from OSchip/llvm-project
Bring back APInt self-move assignment check for MSVC only
Summary: It was removed about a year ago in r300477. Bring it back, along with its unittest, when the MSVC STL is in use. The MSVC STL performs self-assignment in std::shuffle. These days, llvm::sort calls std::shuffle when expensive checks are enabled to help find non-determinism bugs. Reviewers: craig.topper, chandlerc Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D46028 llvm-svn: 330776
This commit is contained in:
parent
a2be8f4c35
commit
5176039795
|
@ -739,6 +739,11 @@ public:
|
|||
|
||||
/// @brief Move assignment operator.
|
||||
APInt &operator=(APInt &&that) {
|
||||
#ifdef _MSC_VER
|
||||
// The MSVC std::shuffle implementation still does self-assignment.
|
||||
if (this == &that)
|
||||
return *this;
|
||||
#endif
|
||||
assert(this != &that && "Self-move not supported");
|
||||
if (!isSingleWord())
|
||||
delete[] U.pVal;
|
||||
|
|
|
@ -1659,6 +1659,38 @@ TEST(APIntTest, isShiftedMask) {
|
|||
}
|
||||
}
|
||||
|
||||
// Test that self-move works, but only when we're using MSVC.
|
||||
#if defined(_MSC_VER)
|
||||
#if defined(__clang__)
|
||||
// Disable the pragma warning from versions of Clang without -Wself-move
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wunknown-pragmas"
|
||||
// Disable the warning that triggers on exactly what is being tested.
|
||||
#pragma clang diagnostic push
|
||||
#pragma clang diagnostic ignored "-Wself-move"
|
||||
#endif
|
||||
TEST(APIntTest, SelfMoveAssignment) {
|
||||
APInt X(32, 0xdeadbeef);
|
||||
X = std::move(X);
|
||||
EXPECT_EQ(32u, X.getBitWidth());
|
||||
EXPECT_EQ(0xdeadbeefULL, X.getLimitedValue());
|
||||
|
||||
uint64_t Bits[] = {0xdeadbeefdeadbeefULL, 0xdeadbeefdeadbeefULL};
|
||||
APInt Y(128, Bits);
|
||||
Y = std::move(Y);
|
||||
EXPECT_EQ(128u, Y.getBitWidth());
|
||||
EXPECT_EQ(~0ULL, Y.getLimitedValue());
|
||||
const uint64_t *Raw = Y.getRawData();
|
||||
EXPECT_EQ(2u, Y.getNumWords());
|
||||
EXPECT_EQ(0xdeadbeefdeadbeefULL, Raw[0]);
|
||||
EXPECT_EQ(0xdeadbeefdeadbeefULL, Raw[1]);
|
||||
}
|
||||
#if defined(__clang__)
|
||||
#pragma clang diagnostic pop
|
||||
#pragma clang diagnostic pop
|
||||
#endif
|
||||
#endif // _MSC_VER
|
||||
|
||||
TEST(APIntTest, reverseBits) {
|
||||
EXPECT_EQ(1, APInt(1, 1).reverseBits());
|
||||
EXPECT_EQ(0, APInt(1, 0).reverseBits());
|
||||
|
|
Loading…
Reference in New Issue