[libcxx] r271238 - Mark LWG issue 2565 as complete. Update the tests to check it.

Eric Fiselier via cfe-commits cfe-commits at lists.llvm.org
Mon May 30 17:23:32 PDT 2016


Author: ericwf
Date: Mon May 30 19:23:31 2016
New Revision: 271238

URL: http://llvm.org/viewvc/llvm-project?rev=271238&view=rev
Log:
Mark LWG issue 2565 as complete. Update the tests to check it.

Added:
    libcxx/trunk/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy_move.pass.cpp
Removed:
    libcxx/trunk/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy.pass.cpp
Modified:
    libcxx/trunk/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_rfunction.pass.cpp
    libcxx/trunk/www/cxx1z_status.html

Modified: libcxx/trunk/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_rfunction.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_rfunction.pass.cpp?rev=271238&r1=271237&r2=271238&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_rfunction.pass.cpp (original)
+++ libcxx/trunk/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/alloc_rfunction.pass.cpp Mon May 30 19:23:31 2016
@@ -7,6 +7,8 @@
 //
 //===----------------------------------------------------------------------===//
 
+// UNSUPPORTED: c++98, c++03
+
 // <functional>
 
 // class function<R(ArgTypes...)>
@@ -14,8 +16,10 @@
 // template<class A> function(allocator_arg_t, const A&, function&&);
 
 #include <functional>
+#include <memory>
 #include <cassert>
 
+#include "test_macros.h"
 #include "min_allocator.h"
 #include "count_new.hpp"
 
@@ -46,23 +50,57 @@ public:
 
 int A::count = 0;
 
+int g(int) { return 0; }
+
 int main()
 {
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
     assert(globalMemCounter.checkOutstandingNewEq(0));
     {
-    std::function<int(int)> f = A();
-    assert(A::count == 1);
-    assert(globalMemCounter.checkOutstandingNewEq(1));
-    assert(f.target<A>());
-    assert(f.target<int(*)(int)>() == 0);
-    std::function<int(int)> f2(std::allocator_arg, bare_allocator<A>(), std::move(f));
-    assert(A::count == 1);
-    assert(globalMemCounter.checkOutstandingNewEq(1));
-    assert(f2.target<A>());
-    assert(f2.target<int(*)(int)>() == 0);
-    assert(f.target<A>() == 0);
-    assert(f.target<int(*)(int)>() == 0);
+        std::function<int(int)> f = A();
+        assert(A::count == 1);
+        assert(globalMemCounter.checkOutstandingNewEq(1));
+        assert(f.target<A>());
+        assert(f.target<int(*)(int)>() == 0);
+        std::function<int(int)> f2(std::allocator_arg, bare_allocator<A>(), std::move(f));
+        assert(A::count == 1);
+        assert(globalMemCounter.checkOutstandingNewEq(1));
+        assert(f2.target<A>());
+        assert(f2.target<int(*)(int)>() == 0);
+        assert(f.target<A>() == 0);
+        assert(f.target<int(*)(int)>() == 0);
+    }
+    assert(globalMemCounter.checkOutstandingNewEq(0));
+    {
+        // Test that moving a function constructed from a reference wrapper
+        // is done without allocating.
+        DisableAllocationGuard g;
+        using Ref = std::reference_wrapper<A>;
+        A a;
+        Ref aref(a);
+        std::function<int(int)> f(aref);
+        assert(A::count == 1);
+        assert(f.target<A>() == nullptr);
+        assert(f.target<Ref>());
+        std::function<int(int)> f2(std::allocator_arg, std::allocator<void>{},
+                                   std::move(f));
+        assert(A::count == 1);
+        assert(f2.target<A>() == nullptr);
+        assert(f2.target<Ref>());
+        assert(f.target<Ref>()); // f is unchanged because the target is small
+    }
+    {
+        // Test that moving a function constructed from a function pointer
+        // is done without allocating
+        DisableAllocationGuard guard;
+        using Ptr = int(*)(int);
+        Ptr p = g;
+        std::function<int(int)> f(p);
+        assert(f.target<A>() == nullptr);
+        assert(f.target<Ptr>());
+        std::function<int(int)> f2(std::allocator_arg, std::allocator<void>(),
+                                   std::move(f));
+        assert(f2.target<A>() == nullptr);
+        assert(f2.target<Ptr>());
+        assert(f.target<Ptr>()); // f is unchanged because the target is small
     }
-#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
 }

Removed: libcxx/trunk/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy.pass.cpp?rev=271237&view=auto
==============================================================================
--- libcxx/trunk/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy.pass.cpp (original)
+++ libcxx/trunk/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy.pass.cpp (removed)
@@ -1,118 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-//                     The LLVM Compiler Infrastructure
-//
-// This file is dual licensed under the MIT and the University of Illinois Open
-// Source Licenses. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-// <functional>
-
-// class function<R(ArgTypes...)>
-
-// function(const function& f);
-
-#include <functional>
-#include <cstdlib>
-#include <cassert>
-
-#include "count_new.hpp"
-
-class A
-{
-    int data_[10];
-public:
-    static int count;
-
-    A()
-    {
-        ++count;
-        for (int i = 0; i < 10; ++i)
-            data_[i] = i;
-    }
-
-    A(const A&) {++count;}
-
-    ~A() {--count;}
-
-    int operator()(int i) const
-    {
-        for (int j = 0; j < 10; ++j)
-            i += data_[j];
-        return i;
-    }
-};
-
-int A::count = 0;
-
-int g(int) {return 0;}
-
-int main()
-{
-    assert(globalMemCounter.checkOutstandingNewEq(0));
-    {
-    std::function<int(int)> f = A();
-    assert(A::count == 1);
-    assert(globalMemCounter.checkOutstandingNewEq(1));
-    assert(f.target<A>());
-    assert(f.target<int(*)(int)>() == 0);
-    std::function<int(int)> f2 = f;
-    assert(A::count == 2);
-    assert(globalMemCounter.checkOutstandingNewEq(2));
-    assert(f2.target<A>());
-    assert(f2.target<int(*)(int)>() == 0);
-    }
-    assert(A::count == 0);
-    assert(globalMemCounter.checkOutstandingNewEq(0));
-    {
-    std::function<int(int)> f = g;
-    assert(globalMemCounter.checkOutstandingNewEq(0));
-    assert(f.target<int(*)(int)>());
-    assert(f.target<A>() == 0);
-    std::function<int(int)> f2 = f;
-    assert(globalMemCounter.checkOutstandingNewEq(0));
-    assert(f2.target<int(*)(int)>());
-    assert(f2.target<A>() == 0);
-    }
-    assert(globalMemCounter.checkOutstandingNewEq(0));
-    {
-    std::function<int(int)> f;
-    assert(globalMemCounter.checkOutstandingNewEq(0));
-    assert(f.target<int(*)(int)>() == 0);
-    assert(f.target<A>() == 0);
-    std::function<int(int)> f2 = f;
-    assert(globalMemCounter.checkOutstandingNewEq(0));
-    assert(f2.target<int(*)(int)>() == 0);
-    assert(f2.target<A>() == 0);
-    }
-    {
-    std::function<int(int)> f;
-    assert(globalMemCounter.checkOutstandingNewEq(0));
-    assert(f.target<int(*)(int)>() == 0);
-    assert(f.target<A>() == 0);
-    assert(!f);
-    std::function<long(int)> g = f;
-    assert(globalMemCounter.checkOutstandingNewEq(0));
-    assert(g.target<long(*)(int)>() == 0);
-    assert(g.target<A>() == 0);
-    assert(!g);
-    }
-#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
-    assert(globalMemCounter.checkOutstandingNewEq(0));
-    {
-    std::function<int(int)> f = A();
-    assert(A::count == 1);
-    assert(globalMemCounter.checkOutstandingNewEq(1));
-    assert(f.target<A>());
-    assert(f.target<int(*)(int)>() == 0);
-    std::function<int(int)> f2 = std::move(f);
-    assert(A::count == 1);
-    assert(globalMemCounter.checkOutstandingNewEq(1));
-    assert(f2.target<A>());
-    assert(f2.target<int(*)(int)>() == 0);
-    assert(f.target<A>() == 0);
-    assert(f.target<int(*)(int)>() == 0);
-    }
-#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
-}

Added: libcxx/trunk/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy_move.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy_move.pass.cpp?rev=271238&view=auto
==============================================================================
--- libcxx/trunk/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy_move.pass.cpp (added)
+++ libcxx/trunk/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy_move.pass.cpp Mon May 30 19:23:31 2016
@@ -0,0 +1,152 @@
+//===----------------------------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is dual licensed under the MIT and the University of Illinois Open
+// Source Licenses. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+// <functional>
+
+// class function<R(ArgTypes...)>
+
+// function(const function& f);
+
+#include <functional>
+#include <memory>
+#include <cstdlib>
+#include <cassert>
+
+#include "test_macros.h"
+#include "count_new.hpp"
+
+class A
+{
+    int data_[10];
+public:
+    static int count;
+
+    A()
+    {
+        ++count;
+        for (int i = 0; i < 10; ++i)
+            data_[i] = i;
+    }
+
+    A(const A&) {++count;}
+
+    ~A() {--count;}
+
+    int operator()(int i) const
+    {
+        for (int j = 0; j < 10; ++j)
+            i += data_[j];
+        return i;
+    }
+};
+
+int A::count = 0;
+
+int g(int) {return 0;}
+
+int main()
+{
+    assert(globalMemCounter.checkOutstandingNewEq(0));
+    {
+    std::function<int(int)> f = A();
+    assert(A::count == 1);
+    assert(globalMemCounter.checkOutstandingNewEq(1));
+    assert(f.target<A>());
+    assert(f.target<int(*)(int)>() == 0);
+    std::function<int(int)> f2 = f;
+    assert(A::count == 2);
+    assert(globalMemCounter.checkOutstandingNewEq(2));
+    assert(f2.target<A>());
+    assert(f2.target<int(*)(int)>() == 0);
+    }
+    assert(A::count == 0);
+    assert(globalMemCounter.checkOutstandingNewEq(0));
+    {
+    std::function<int(int)> f = g;
+    assert(globalMemCounter.checkOutstandingNewEq(0));
+    assert(f.target<int(*)(int)>());
+    assert(f.target<A>() == 0);
+    std::function<int(int)> f2 = f;
+    assert(globalMemCounter.checkOutstandingNewEq(0));
+    assert(f2.target<int(*)(int)>());
+    assert(f2.target<A>() == 0);
+    }
+    assert(globalMemCounter.checkOutstandingNewEq(0));
+    {
+    std::function<int(int)> f;
+    assert(globalMemCounter.checkOutstandingNewEq(0));
+    assert(f.target<int(*)(int)>() == 0);
+    assert(f.target<A>() == 0);
+    std::function<int(int)> f2 = f;
+    assert(globalMemCounter.checkOutstandingNewEq(0));
+    assert(f2.target<int(*)(int)>() == 0);
+    assert(f2.target<A>() == 0);
+    }
+    {
+    std::function<int(int)> f;
+    assert(globalMemCounter.checkOutstandingNewEq(0));
+    assert(f.target<int(*)(int)>() == 0);
+    assert(f.target<A>() == 0);
+    assert(!f);
+    std::function<long(int)> g = f;
+    assert(globalMemCounter.checkOutstandingNewEq(0));
+    assert(g.target<long(*)(int)>() == 0);
+    assert(g.target<A>() == 0);
+    assert(!g);
+    }
+#if TEST_STD_VER >= 11
+    assert(globalMemCounter.checkOutstandingNewEq(0));
+    { // Test rvalue references
+        std::function<int(int)> f = A();
+        assert(A::count == 1);
+        assert(globalMemCounter.checkOutstandingNewEq(1));
+        assert(f.target<A>());
+        assert(f.target<int(*)(int)>() == 0);
+        std::function<int(int)> f2 = std::move(f);
+        assert(A::count == 1);
+        assert(globalMemCounter.checkOutstandingNewEq(1));
+        assert(f2.target<A>());
+        assert(f2.target<int(*)(int)>() == 0);
+        assert(f.target<A>() == 0);
+        assert(f.target<int(*)(int)>() == 0);
+    }
+    assert(globalMemCounter.checkOutstandingNewEq(0));
+    {
+        // Test that moving a function constructed from a reference wrapper
+        // is done without allocating.
+        DisableAllocationGuard g;
+        using Ref = std::reference_wrapper<A>;
+        A a;
+        Ref aref(a);
+        std::function<int(int)> f(aref);
+        assert(A::count == 1);
+        assert(f.target<A>() == nullptr);
+        assert(f.target<Ref>());
+        std::function<int(int)> f2(std::move(f));
+        assert(A::count == 1);
+        assert(f2.target<A>() == nullptr);
+        assert(f2.target<Ref>());
+        assert(f.target<Ref>()); // f is unchanged because the target is small
+    }
+    {
+        // Test that moving a function constructed from a function pointer
+        // is done without allocating
+        DisableAllocationGuard guard;
+        using Ptr = int(*)(int);
+        Ptr p = g;
+        std::function<int(int)> f(p);
+        assert(f.target<A>() == nullptr);
+        assert(f.target<Ptr>());
+        std::function<int(int)> f2(std::move(f));
+        assert(f2.target<A>() == nullptr);
+        assert(f2.target<Ptr>());
+        assert(f.target<Ptr>()); // f is unchanged because the target is small
+    }
+#endif  // TEST_STD_VER >= 11
+}

Modified: libcxx/trunk/www/cxx1z_status.html
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/www/cxx1z_status.html?rev=271238&r1=271237&r2=271238&view=diff
==============================================================================
--- libcxx/trunk/www/cxx1z_status.html (original)
+++ libcxx/trunk/www/cxx1z_status.html Mon May 30 19:23:31 2016
@@ -216,7 +216,7 @@
 	<tr><td><a href="http://cplusplus.github.io/LWG/lwg-defects.html#2558">2558</a></td><td>[fund.ts.v2] Logical operator traits are broken in the zero-argument case</td><td>Jacksonville</td><td>Complete</td></tr>
 	<tr><td><a href="http://cplusplus.github.io/LWG/lwg-defects.html#2559">2559</a></td><td>Error in LWG 2234's resolution</td><td>Jacksonville</td><td>Complete</td></tr>
 	<tr><td><a href="http://cplusplus.github.io/LWG/lwg-defects.html#2560">2560</a></td><td><tt>is_constructible</tt> underspecified when applied to a function type</td><td>Jacksonville</td><td>Broken in 3.6; See r261653.</td></tr>
-	<tr><td><a href="http://cplusplus.github.io/LWG/lwg-defects.html#2565">2565</a></td><td><tt>std::function</tt>'s move constructor should guarantee nothrow for <tt>reference_wrapper</tt>s and function pointers</td><td>Jacksonville</td><td></td></tr>
+	<tr><td><a href="http://cplusplus.github.io/LWG/lwg-defects.html#2565">2565</a></td><td><tt>std::function</tt>'s move constructor should guarantee nothrow for <tt>reference_wrapper</tt>s and function pointers</td><td>Jacksonville</td><td>Complete</td></tr>
 	<tr><td><a href="http://cplusplus.github.io/LWG/lwg-defects.html#2566">2566</a></td><td>Requirements on the first template parameter of container adaptors</td><td>Jacksonville</td><td>Complete</td></tr>
 	<tr><td><a href="http://cplusplus.github.io/LWG/lwg-defects.html#2571">2571</a></td><td>§[map.modifiers]/2 imposes nonsensical requirement on <tt>insert(InputIterator, InputIterator)</tt></td><td>Jacksonville</td><td>Complete</td></tr>
 	<tr><td><a href="http://cplusplus.github.io/LWG/lwg-defects.html#2572">2572</a></td><td>The remarks for <tt>shared_ptr::operator*</tt> should apply to <i>cv</i>-qualified <tt>void</tt> as well</td><td>Jacksonville</td><td>Complete</td></tr>




More information about the cfe-commits mailing list