From 9553ecfe016845eb8ee704928b4e20be8d5aa04d Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Mon, 5 Aug 2019 21:47:36 +0200 Subject: [PATCH] AK: Optional::operator=(Optional&&) should clear movee's has_value bit We were forgetting to clear m_has_value in the Optional being moved from when using operator=(Optional&&). --- AK/Optional.h | 1 + AK/Tests/Makefile | 3 +++ AK/Tests/TestOptional.cpp | 30 ++++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 AK/Tests/TestOptional.cpp diff --git a/AK/Optional.h b/AK/Optional.h index ee6320925e..a73db53bcc 100644 --- a/AK/Optional.h +++ b/AK/Optional.h @@ -104,6 +104,7 @@ public: ASSERT(m_has_value); T released_value = move(value()); value().~T(); + m_has_value = false; return released_value; } diff --git a/AK/Tests/Makefile b/AK/Tests/Makefile index dc9837e915..30e940dc3a 100644 --- a/AK/Tests/Makefile +++ b/AK/Tests/Makefile @@ -48,6 +48,9 @@ TestNonnullRefPtr: TestNonnullRefPtr.o $(SHARED_TEST_OBJS) TestRefPtr: TestRefPtr.o $(SHARED_TEST_OBJS) $(PRE_CXX) $(CXX) $(CXXFLAGS) -o $@ TestRefPtr.o $(SHARED_TEST_OBJS) +TestOptional: TestOptional.o $(SHARED_TEST_OBJS) + $(PRE_CXX) $(CXX) $(CXXFLAGS) -o $@ TestOptional.o $(SHARED_TEST_OBJS) + clean: rm -f $(SHARED_TEST_OBJS) rm -f $(PROGRAMS) diff --git a/AK/Tests/TestOptional.cpp b/AK/Tests/TestOptional.cpp new file mode 100644 index 0000000000..02db877cea --- /dev/null +++ b/AK/Tests/TestOptional.cpp @@ -0,0 +1,30 @@ +#include + +#include +#include + +TEST_CASE(basic_optional) +{ + Optional x; + EXPECT_EQ(x.has_value(), false); + x = 3; + EXPECT_EQ(x.has_value(), true); + EXPECT_EQ(x.value(), 3); +} + +TEST_CASE(move_optional) +{ + Optional x; + EXPECT_EQ(x.has_value(), false); + x = 3; + EXPECT_EQ(x.has_value(), true); + EXPECT_EQ(x.value(), 3); + + Optional y; + y = move(x); + EXPECT_EQ(y.has_value(), true); + EXPECT_EQ(y.value(), 3); + EXPECT_EQ(x.has_value(), false); +} + +TEST_MAIN(Optional)