From 53a420fba21cf1644972b34dcd811a43cdb8368d Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Mon, 2 Jan 2017 19:18:58 +0000 Subject: Vendor import of libc++ trunk r290819: https://llvm.org/svn/llvm-project/libcxx/trunk@290819 --- .../func.wrap.func.con/copy_assign.pass.cpp | 119 +++++++++++++-------- 1 file changed, 74 insertions(+), 45 deletions(-) (limited to 'test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy_assign.pass.cpp') diff --git a/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy_assign.pass.cpp b/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy_assign.pass.cpp index c91eaa2d5674..9b83ddecb974 100644 --- a/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy_assign.pass.cpp +++ b/test/std/utilities/function.objects/func.wrap/func.wrap.func/func.wrap.func.con/copy_assign.pass.cpp @@ -16,94 +16,123 @@ #include #include +#include "test_macros.h" #include "count_new.hpp" -class A -{ - int data_[10]; +class A { + int data_[10]; + public: - static int count; + static int count; - A() - { - ++count; - for (int i = 0; i < 10; ++i) - data_[i] = i; - } + A() { + ++count; + for (int i = 0; i < 10; ++i) + data_[i] = i; + } - A(const A&) {++count;} + A(const A &) { ++count; } - ~A() {--count;} + ~A() { --count; } - int operator()(int i) const - { - for (int j = 0; j < 10; ++j) - i += data_[j]; - return i; - } + 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 g0() { return 0; } +int g(int) { return 0; } +int g2(int, int) { return 2; } +int g3(int, int, int) { return 3; } -int main() -{ - assert(globalMemCounter.checkOutstandingNewEq(0)); - { +int main() { + assert(globalMemCounter.checkOutstandingNewEq(0)); + { std::function f = A(); assert(A::count == 1); assert(globalMemCounter.checkOutstandingNewEq(1)); assert(f.target()); - assert(f.target() == 0); + assert(f.target() == 0); std::function f2; f2 = f; assert(A::count == 2); assert(globalMemCounter.checkOutstandingNewEq(2)); assert(f2.target()); - assert(f2.target() == 0); - } - assert(A::count == 0); - assert(globalMemCounter.checkOutstandingNewEq(0)); - { + assert(f2.target() == 0); + } + assert(A::count == 0); + assert(globalMemCounter.checkOutstandingNewEq(0)); + { std::function f = g; assert(globalMemCounter.checkOutstandingNewEq(0)); - assert(f.target()); + assert(f.target()); assert(f.target() == 0); std::function f2; f2 = f; assert(globalMemCounter.checkOutstandingNewEq(0)); - assert(f2.target()); + assert(f2.target()); assert(f2.target() == 0); - } - assert(globalMemCounter.checkOutstandingNewEq(0)); - { + } + assert(globalMemCounter.checkOutstandingNewEq(0)); + { std::function f; assert(globalMemCounter.checkOutstandingNewEq(0)); - assert(f.target() == 0); + assert(f.target() == 0); assert(f.target() == 0); std::function f2; f2 = f; assert(globalMemCounter.checkOutstandingNewEq(0)); - assert(f2.target() == 0); + assert(f2.target() == 0); assert(f2.target() == 0); - } -#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES - assert(globalMemCounter.checkOutstandingNewEq(0)); - { + } + { + typedef std::function Func; + Func f = g0; + Func& fr = (f = f); + assert(&fr == &f); + assert(*f.target() == g0); + } + { + typedef std::function Func; + Func f = g; + Func& fr = (f = f); + assert(&fr == &f); + assert(*f.target() == g); + } + { + typedef std::function Func; + Func f = g2; + Func& fr = (f = f); + assert(&fr == &f); + assert(*f.target() == g2); + } + { + typedef std::function Func; + Func f = g3; + Func& fr = (f = f); + assert(&fr == &f); + assert(*f.target() == g3); + } +#if TEST_STD_VER >= 11 + assert(globalMemCounter.checkOutstandingNewEq(0)); + { std::function f = A(); assert(A::count == 1); assert(globalMemCounter.checkOutstandingNewEq(1)); assert(f.target()); - assert(f.target() == 0); + assert(f.target() == 0); std::function f2; f2 = std::move(f); assert(A::count == 1); assert(globalMemCounter.checkOutstandingNewEq(1)); assert(f2.target()); - assert(f2.target() == 0); + assert(f2.target() == 0); assert(f.target() == 0); - assert(f.target() == 0); - } -#endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES + assert(f.target() == 0); + } +#endif } -- cgit v1.3