From 73c5c5bbb3db6cc97e55cb3a207d827f4404f32f Mon Sep 17 00:00:00 2001 From: Jonathan Wakely Date: Fri, 12 Feb 2010 22:31:15 +0000 Subject: [PATCH] PR libstdc++/42819, DR 1315 2010-02-12 Jonathan Wakely Paolo Carlini PR libstdc++/42819, DR 1315 * include/std/future (async): Use std::result_of for the template argument of the std::future return type; adjust everywhere. * testsuite/30_threads/async/42819.cc: New. * testsuite/30_threads/packaged_task/cons/assign_neg.cc: Adjust dg-error line number. * testsuite/30_threads/packaged_task/cons/copy_neg.cc: Likewise. * testsuite/30_threads/future/cons/assign_neg.cc: Likewise. * testsuite/30_threads/future/cons/copy_neg.cc: Likewise. * testsuite/30_threads/promise/cons/assign_neg.cc: Likewise. * testsuite/30_threads/promise/cons/assign_neg.cc: Likewise. Co-Authored-By: Paolo Carlini From-SVN: r156742 --- libstdc++-v3/ChangeLog | 15 +++++ libstdc++-v3/include/std/future | 22 ++++--- .../testsuite/30_threads/async/42819.cc | 59 +++++++++++++++++++ .../30_threads/future/cons/assign_neg.cc | 4 +- .../30_threads/future/cons/copy_neg.cc | 4 +- .../packaged_task/cons/assign_neg.cc | 2 +- .../30_threads/packaged_task/cons/copy_neg.cc | 2 +- .../30_threads/promise/cons/assign_neg.cc | 2 +- .../30_threads/promise/cons/copy_neg.cc | 2 +- 9 files changed, 96 insertions(+), 16 deletions(-) create mode 100644 libstdc++-v3/testsuite/30_threads/async/42819.cc diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index b24ae7a831a..8dace9d17e3 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,18 @@ +2010-02-12 Jonathan Wakely + Paolo Carlini + + PR libstdc++/42819, DR 1315 + * include/std/future (async): Use std::result_of for the template + argument of the std::future return type; adjust everywhere. + * testsuite/30_threads/async/42819.cc: New. + * testsuite/30_threads/packaged_task/cons/assign_neg.cc: Adjust + dg-error line number. + * testsuite/30_threads/packaged_task/cons/copy_neg.cc: Likewise. + * testsuite/30_threads/future/cons/assign_neg.cc: Likewise. + * testsuite/30_threads/future/cons/copy_neg.cc: Likewise. + * testsuite/30_threads/promise/cons/assign_neg.cc: Likewise. + * testsuite/30_threads/promise/cons/assign_neg.cc: Likewise. + 2010-02-11 Paolo Carlini * config/abi/pre/gnu.ver: Revert last changes. diff --git a/libstdc++-v3/include/std/future b/libstdc++-v3/include/std/future index 1ef03643d04..c97682dfff1 100644 --- a/libstdc++-v3/include/std/future +++ b/libstdc++-v3/include/std/future @@ -119,11 +119,14 @@ namespace std enum class launch { any, async, sync }; template - future + future::type> async(launch __policy, _Fn&& __fn, _Args&&... __args); template - future + typename + enable_if::type, launch>::value, + future()(std::declval<_Args>()...))> + >::type async(_Fn&& __fn, _Args&&... __args); #if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1) \ @@ -558,7 +561,7 @@ namespace std friend class promise<_Res>; template friend class packaged_task; template - friend future + friend future::type> async(launch, _Fn&&, _Args&&...); typedef __basic_future<_Res> _Base_type; @@ -599,7 +602,7 @@ namespace std friend class promise<_Res&>; template friend class packaged_task; template - friend future + friend future::type> async(launch, _Fn&&, _Args&&...); typedef __basic_future<_Res&> _Base_type; @@ -640,7 +643,7 @@ namespace std friend class promise; template friend class packaged_task; template - friend future + friend future::type> async(launch, _Fn&&, _Args&&...); typedef __basic_future _Base_type; @@ -1322,10 +1325,10 @@ namespace std }; template - future + future::type> async(launch __policy, _Fn&& __fn, _Args&&... __args) { - typedef typename _Fn::result_type result_type; + typedef typename result_of<_Fn(_Args...)>::type result_type; std::shared_ptr<__future_base::_State> __state; if (__policy == launch::async) { @@ -1343,7 +1346,10 @@ namespace std } template - future + inline typename + enable_if::type, launch>::value, + future()(std::declval<_Args>()...))> + >::type async(_Fn&& __fn, _Args&&... __args) { return async(launch::any, std::forward<_Fn>(__fn), diff --git a/libstdc++-v3/testsuite/30_threads/async/42819.cc b/libstdc++-v3/testsuite/30_threads/async/42819.cc new file mode 100644 index 00000000000..c41606ec63d --- /dev/null +++ b/libstdc++-v3/testsuite/30_threads/async/42819.cc @@ -0,0 +1,59 @@ +// { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* alpha*-*-osf* mips-sgi-irix6* } } +// { dg-options " -std=gnu++0x -pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* alpha*-*-osf* mips-sgi-irix6* } } +// { dg-options " -std=gnu++0x -pthreads" { target *-*-solaris* } } +// { dg-options " -std=gnu++0x " { target *-*-cygwin *-*-darwin* } } +// { dg-require-cstdint "" } +// { dg-require-gthreads "" } +// { dg-require-atomic-builtins "" } + +// Copyright (C) 2010 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include + +int do_work1(int value) { return value; } +int do_work2(int value) { return value * 2; } + +int work1(int value) +{ + auto handle = std::async([=] { return do_work2(value); }); + int tmp = do_work1(value); + return tmp + handle.get(); +} + +int work2(int value) +{ + auto handle = std::async(do_work2, value); + int tmp = do_work1(value); + return tmp + handle.get(); +} + +// libstdc++/42819 +void test01() +{ + bool test __attribute__((unused)) = true; + + VERIFY( work1(1) == 3 ); + VERIFY( work2(2) == 6 ); +} + +int main() +{ + test01(); + return 0; +} diff --git a/libstdc++-v3/testsuite/30_threads/future/cons/assign_neg.cc b/libstdc++-v3/testsuite/30_threads/future/cons/assign_neg.cc index ecdc27c3b8d..eef41497055 100644 --- a/libstdc++-v3/testsuite/30_threads/future/cons/assign_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/future/cons/assign_neg.cc @@ -4,7 +4,7 @@ // { dg-require-gthreads "" } // { dg-require-atomic-builtins "" } -// Copyright (C) 2009 Free Software Foundation, Inc. +// Copyright (C) 2009, 2010 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -35,4 +35,4 @@ void test01() } // { dg-error "used here" "" { target *-*-* } 34 } -// { dg-error "deleted function" "" { target *-*-* } 578 } +// { dg-error "deleted function" "" { target *-*-* } 581 } diff --git a/libstdc++-v3/testsuite/30_threads/future/cons/copy_neg.cc b/libstdc++-v3/testsuite/30_threads/future/cons/copy_neg.cc index c76075da120..14d7046bed5 100644 --- a/libstdc++-v3/testsuite/30_threads/future/cons/copy_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/future/cons/copy_neg.cc @@ -4,7 +4,7 @@ // { dg-require-gthreads "" } // { dg-require-atomic-builtins "" } -// Copyright (C) 2009 Free Software Foundation, Inc. +// Copyright (C) 2009, 2010 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -34,4 +34,4 @@ void test01() } // { dg-error "used here" "" { target *-*-* } 33 } -// { dg-error "deleted function" "" { target *-*-* } 577 } +// { dg-error "deleted function" "" { target *-*-* } 580 } diff --git a/libstdc++-v3/testsuite/30_threads/packaged_task/cons/assign_neg.cc b/libstdc++-v3/testsuite/30_threads/packaged_task/cons/assign_neg.cc index 69cfdd32aae..2b57a1c5b2f 100644 --- a/libstdc++-v3/testsuite/30_threads/packaged_task/cons/assign_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/packaged_task/cons/assign_neg.cc @@ -33,4 +33,4 @@ void test01() } // { dg-error "used here" "" { target *-*-* } 32 } -// { dg-error "deleted function" "" { target *-*-* } 1225 } +// { dg-error "deleted function" "" { target *-*-* } 1228 } diff --git a/libstdc++-v3/testsuite/30_threads/packaged_task/cons/copy_neg.cc b/libstdc++-v3/testsuite/30_threads/packaged_task/cons/copy_neg.cc index b3fbdbcff3b..baf718354e5 100644 --- a/libstdc++-v3/testsuite/30_threads/packaged_task/cons/copy_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/packaged_task/cons/copy_neg.cc @@ -32,4 +32,4 @@ void test01() } // { dg-error "used here" "" { target *-*-* } 31 } -// { dg-error "deleted function" "" { target *-*-* } 1224 } +// { dg-error "deleted function" "" { target *-*-* } 1227 } diff --git a/libstdc++-v3/testsuite/30_threads/promise/cons/assign_neg.cc b/libstdc++-v3/testsuite/30_threads/promise/cons/assign_neg.cc index a52ceae7019..80b5e06e1d0 100644 --- a/libstdc++-v3/testsuite/30_threads/promise/cons/assign_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/promise/cons/assign_neg.cc @@ -33,4 +33,4 @@ void test01() } // { dg-error "used here" "" { target *-*-* } 32 } -// { dg-error "deleted function" "" { target *-*-* } 868 } +// { dg-error "deleted function" "" { target *-*-* } 871 } diff --git a/libstdc++-v3/testsuite/30_threads/promise/cons/copy_neg.cc b/libstdc++-v3/testsuite/30_threads/promise/cons/copy_neg.cc index 22d44cef341..27884b0bd1a 100644 --- a/libstdc++-v3/testsuite/30_threads/promise/cons/copy_neg.cc +++ b/libstdc++-v3/testsuite/30_threads/promise/cons/copy_neg.cc @@ -32,4 +32,4 @@ void test01() } // { dg-error "used here" "" { target *-*-* } 31 } -// { dg-error "deleted function" "" { target *-*-* } 852 } +// { dg-error "deleted function" "" { target *-*-* } 855 }