Commit cb2dc2c8 authored by Zejun Wu's avatar Zejun Wu Committed by Tudor Bosman

Check for self-assignment in move assignment

Summary:
Check for self-assignment in move assignment. Otherwise
Optional<Neko> cat = whatever;
cat = std::move(cat);
cat.hasValue(); // always returns false

Test Plan: fbmake runtests

Reviewed By: tjackson@fb.com

FB internal diff: D1440633
parent b6a8eb2e
...@@ -136,6 +136,7 @@ class Optional { ...@@ -136,6 +136,7 @@ class Optional {
} }
void assign(Optional&& src) { void assign(Optional&& src) {
if (this != &src) {
if (src.hasValue()) { if (src.hasValue()) {
assign(std::move(src.value())); assign(std::move(src.value()));
src.clear(); src.clear();
...@@ -143,6 +144,7 @@ class Optional { ...@@ -143,6 +144,7 @@ class Optional {
clear(); clear();
} }
} }
}
void assign(const Optional& src) { void assign(const Optional& src) {
if (src.hasValue()) { if (src.hasValue()) {
......
...@@ -379,6 +379,16 @@ TEST(Optional, MakeOptional) { ...@@ -379,6 +379,16 @@ TEST(Optional, MakeOptional) {
EXPECT_EQ(**optIntPtr, 3); EXPECT_EQ(**optIntPtr, 3);
} }
TEST(Optional, SelfAssignment) {
Optional<int> a = 42;
a = a;
ASSERT_TRUE(a.hasValue() && a.value() == 42);
Optional<int> b = 23333333;
b = std::move(b);
ASSERT_TRUE(b.hasValue() && b.value() == 23333333);
}
class ContainsOptional { class ContainsOptional {
public: public:
ContainsOptional() { } ContainsOptional() { }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment