WTF::Expected should use std::addressof instead of operator&
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 12 Mar 2019 06:04:22 +0000 (06:04 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 12 Mar 2019 06:04:22 +0000 (06:04 +0000)
https://bugs.webkit.org/show_bug.cgi?id=195604

Patch by Alex Christensen <achristensen@webkit.org> on 2019-03-11
Reviewed by Myles Maxfield.

Source/WTF:

The latter was causing problems with types that do tricky things with constructors and operator&,
specifically UniqueRef but I made a reduced test case.  When it used operator&, it would get the contained
type and call the constructor that takes a contained type instead of the move constructor.

* wtf/Expected.h:
(std::experimental::fundamentals_v3::__expected_detail::base::base):
(std::experimental::fundamentals_v3::expected::swap):

Tools:

* TestWebKitAPI/Tests/WTF/Expected.cpp:
(TestWebKitAPI::Unique::Unique):
(TestWebKitAPI::Unique::operator&):
(TestWebKitAPI::TEST):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@242778 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WTF/ChangeLog
Source/WTF/wtf/Expected.h
Tools/ChangeLog
Tools/TestWebKitAPI/Tests/WTF/Expected.cpp

index 289cf12..a573944 100644 (file)
@@ -1,3 +1,18 @@
+2019-03-11  Alex Christensen  <achristensen@webkit.org>
+
+        WTF::Expected should use std::addressof instead of operator&
+        https://bugs.webkit.org/show_bug.cgi?id=195604
+
+        Reviewed by Myles Maxfield.
+
+        The latter was causing problems with types that do tricky things with constructors and operator&,
+        specifically UniqueRef but I made a reduced test case.  When it used operator&, it would get the contained
+        type and call the constructor that takes a contained type instead of the move constructor.
+
+        * wtf/Expected.h:
+        (std::experimental::fundamentals_v3::__expected_detail::base::base):
+        (std::experimental::fundamentals_v3::expected::swap):
+
 2019-03-11  Ross Kirsling  <ross.kirsling@sony.com>
 
         Add Optional to Forward.h.
index 14dee86..6141773 100644 (file)
@@ -334,17 +334,17 @@ struct base {
         : has(o.has)
     {
         if (has)
-            ::new (&s.val) value_type(o.s.val);
+            ::new (std::addressof(s.val)) value_type(o.s.val);
         else
-            ::new (&s.err) error_type(o.s.err);
+            ::new (std::addressof(s.err)) error_type(o.s.err);
     }
     base(base&& o)
         : has(o.has)
     {
         if (has)
-            ::new (&s.val) value_type(std::move(o.s.val));
+            ::new (std::addressof(s.val)) value_type(std::move(o.s.val));
         else
-            ::new (&s.err) error_type(std::move(o.s.err));
+            ::new (std::addressof(s.err)) error_type(std::move(o.s.err));
     }
     ~base()
     {
@@ -386,13 +386,13 @@ struct base<void, E> {
         : has(o.has)
     {
         if (!has)
-            ::new (&s.err) error_type(o.s.err);
+            ::new (std::addressof(s.err)) error_type(o.s.err);
     }
     base(base&& o)
         : has(o.has)
     {
         if (!has)
-            ::new (&s.err) error_type(std::move(o.s.err));
+            ::new (std::addressof(s.err)) error_type(std::move(o.s.err));
     }
     ~base()
     {
@@ -461,16 +461,16 @@ public:
         else if (base::has && !o.has) {
             error_type e(std::move(o.s.err));
             __expected_detail::destroy(o.s.err);
-            ::new (&o.s.val) value_type(std::move(base::s.val));
+            ::new (std::addressof(o.s.val)) value_type(std::move(base::s.val));
             __expected_detail::destroy(base::s.val);
-            ::new (&base::s.err) error_type(std::move(e));
+            ::new (std::addressof(base::s.err)) error_type(std::move(e));
             swap(base::has, o.has);
         } else if (!base::has && o.has) {
             value_type v(std::move(o.s.val));
             __expected_detail::destroy(o.s.val);
-            ::new (&o.s.err) error_type(std::move(base::s.err));
+            ::new (std::addressof(o.s.err)) error_type(std::move(base::s.err));
             __expected_detail::destroy(base::s.err);
-            ::new (&base::s.val) value_type(std::move(v));
+            ::new (std::addressof(base::s.val)) value_type(std::move(v));
             swap(base::has, o.has);
         } else
             swap(base::s.err, o.s.err);
@@ -536,10 +536,10 @@ public:
             // Do nothing.
         } else if (base::has && !o.has) {
             error_type e(std::move(o.s.err));
-            ::new (&base::s.err) error_type(e);
+            ::new (std::addressof(base::s.err)) error_type(e);
             swap(base::has, o.has);
         } else if (!base::has && o.has) {
-            ::new (&o.s.err) error_type(std::move(base::s.err));
+            ::new (std::addressof(o.s.err)) error_type(std::move(base::s.err));
             swap(base::has, o.has);
         } else
             swap(base::s.err, o.s.err);
index 77e3e1d..fc7a0ae 100644 (file)
@@ -1,3 +1,15 @@
+2019-03-11  Alex Christensen  <achristensen@webkit.org>
+
+        WTF::Expected should use std::addressof instead of operator&
+        https://bugs.webkit.org/show_bug.cgi?id=195604
+
+        Reviewed by Myles Maxfield.
+
+        * TestWebKitAPI/Tests/WTF/Expected.cpp:
+        (TestWebKitAPI::Unique::Unique):
+        (TestWebKitAPI::Unique::operator&):
+        (TestWebKitAPI::TEST):
+
 2019-03-11  Ross Kirsling  <ross.kirsling@sony.com>
 
         Add Optional to Forward.h.
index 3bd48d3..bcbe2e8 100644 (file)
@@ -472,4 +472,23 @@ TEST(WTF_Expected, Ref)
     ASSERT_STREQ("ref(a) deref(a) ", takeLogStr().c_str());
 }
 
+class NeedsStdAddress {
+public:
+    NeedsStdAddress(NeedsStdAddress&& other)
+        : m_ptr(WTFMove(other.m_ptr)) { }
+    NeedsStdAddress(int& other)
+        : m_ptr(&other) { }
+    int* operator&() { ASSERT_NOT_REACHED(); return nullptr; }
+private:
+    std::unique_ptr<int> m_ptr;
+};
+
+TEST(WTF_Expected, Address)
+{
+    NeedsStdAddress a(*new int(3));
+    Expected<NeedsStdAddress, float> b(WTFMove(a));
+    Expected<NeedsStdAddress, float> c(WTFMove(b));
+    (void)c;
+}
+
 } // namespace TestWebkitAPI