From fcf463e1c1f55b91cd14e589e1a8ae44f7b6aaef Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Thu, 25 Jan 2018 17:24:22 +0000 Subject: [PATCH] [ADT] Make moving Optional not reset the Optional it moves from. This brings it in line with std::optional. My recent changes to make Optional of trivial types trivially copyable introduced diverging behavior depending on the type, which is bad. Now all types have the same moving behavior. llvm-svn: 323445 --- llvm/include/llvm/ADT/Optional.h | 2 -- llvm/unittests/ADT/OptionalTest.cpp | 12 ++++++------ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/llvm/include/llvm/ADT/Optional.h b/llvm/include/llvm/ADT/Optional.h index 0f073fab2a96..353e5d0ec9df 100644 --- a/llvm/include/llvm/ADT/Optional.h +++ b/llvm/include/llvm/ADT/Optional.h @@ -46,7 +46,6 @@ template struct OptionalStorage { OptionalStorage(OptionalStorage &&O) : hasVal(O.hasVal) { if (O.hasVal) { new (storage.buffer) T(std::move(*O.getPointer())); - O.reset(); } } @@ -64,7 +63,6 @@ template struct OptionalStorage { reset(); else { *this = std::move(*O.getPointer()); - O.reset(); } return *this; } diff --git a/llvm/unittests/ADT/OptionalTest.cpp b/llvm/unittests/ADT/OptionalTest.cpp index be49b85f4860..2e09c5340fa3 100644 --- a/llvm/unittests/ADT/OptionalTest.cpp +++ b/llvm/unittests/ADT/OptionalTest.cpp @@ -268,12 +268,12 @@ TEST_F(OptionalTest, MoveOnlyMoveConstruction) { Optional A(MoveOnly(3)); MoveOnly::ResetCounts(); Optional B(std::move(A)); - EXPECT_FALSE((bool)A); + EXPECT_TRUE((bool)A); EXPECT_TRUE((bool)B); EXPECT_EQ(3, B->val); EXPECT_EQ(1u, MoveOnly::MoveConstructions); EXPECT_EQ(0u, MoveOnly::MoveAssignments); - EXPECT_EQ(1u, MoveOnly::Destructions); + EXPECT_EQ(0u, MoveOnly::Destructions); } TEST_F(OptionalTest, MoveOnlyAssignment) { @@ -292,12 +292,12 @@ TEST_F(OptionalTest, MoveOnlyInitializingAssignment) { Optional B; MoveOnly::ResetCounts(); B = std::move(A); - EXPECT_FALSE((bool)A); + EXPECT_TRUE((bool)A); EXPECT_TRUE((bool)B); EXPECT_EQ(3, B->val); EXPECT_EQ(1u, MoveOnly::MoveConstructions); EXPECT_EQ(0u, MoveOnly::MoveAssignments); - EXPECT_EQ(1u, MoveOnly::Destructions); + EXPECT_EQ(0u, MoveOnly::Destructions); } TEST_F(OptionalTest, MoveOnlyNullingAssignment) { @@ -317,12 +317,12 @@ TEST_F(OptionalTest, MoveOnlyAssigningAssignment) { Optional B(MoveOnly(4)); MoveOnly::ResetCounts(); B = std::move(A); - EXPECT_FALSE((bool)A); + EXPECT_TRUE((bool)A); EXPECT_TRUE((bool)B); EXPECT_EQ(3, B->val); EXPECT_EQ(0u, MoveOnly::MoveConstructions); EXPECT_EQ(1u, MoveOnly::MoveAssignments); - EXPECT_EQ(1u, MoveOnly::Destructions); + EXPECT_EQ(0u, MoveOnly::Destructions); } struct Immovable {