StringMap/DenseMap unittests: use piecewise_construct and ensure no copy occurs.

This makes us no longer relying on move-construction elision by the compiler.
Suggested by D. Blaikie.

From: Mehdi Amini <mehdi.amini@apple.com>
llvm-svn: 264475
This commit is contained in:
Mehdi Amini
2016-03-25 23:25:06 +00:00
parent 221cfdd7b1
commit 412989750d
2 changed files with 22 additions and 22 deletions

View File

@@ -391,21 +391,16 @@ TEST(StringMapCustomTest, InitialSizeTest) {
for (auto Size : {1, 32, 67}) {
StringMap<CountCtorCopyAndMove> Map(Size);
auto NumBuckets = Map.getNumBuckets();
// Prepare the elts in a vector. We do this as a pre-step to shield us
// against the internals of std::pair which can introduce spurious move/copy
std::vector<std::pair<std::string, CountCtorCopyAndMove>> Elts;
for (int i = 0; i < Size; ++i)
Elts.emplace_back(Twine(i).str(), CountCtorCopyAndMove());
CountCtorCopyAndMove::Move = 0;
CountCtorCopyAndMove::Copy = 0;
for (int i = 0; i < Size; ++i)
Map.insert(Elts[i]);
// After the inital copy, the map will move the Elts in the Entry.
EXPECT_EQ((unsigned)Size, CountCtorCopyAndMove::Move);
Map.insert(std::pair<std::string, CountCtorCopyAndMove>(
std::piecewise_construct, std::forward_as_tuple(Twine(i).str()),
std::forward_as_tuple(i)));
// After the inital move, the map will move the Elts in the Entry.
EXPECT_EQ((unsigned)Size * 2, CountCtorCopyAndMove::Move);
// We copy once the pair from the Elts vector
EXPECT_EQ((unsigned)Size, CountCtorCopyAndMove::Copy);
EXPECT_EQ(0u, CountCtorCopyAndMove::Copy);
// Check that the map didn't grow
EXPECT_EQ(Map.getNumBuckets(), NumBuckets);
}