PR libstdc++/42819, DR 1315
2010-02-12 Jonathan Wakely <jwakely.gcc@gmail.com> Paolo Carlini <paolo.carlini@oracle.com> 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 <paolo.carlini@oracle.com> From-SVN: r156742
This commit is contained in:
parent
da7d88bfc2
commit
73c5c5bbb3
9 changed files with 96 additions and 16 deletions
|
@ -1,3 +1,18 @@
|
|||
2010-02-12 Jonathan Wakely <jwakely.gcc@gmail.com>
|
||||
Paolo Carlini <paolo.carlini@oracle.com>
|
||||
|
||||
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 <paolo.carlini@oracle.com>
|
||||
|
||||
* config/abi/pre/gnu.ver: Revert last changes.
|
||||
|
|
|
@ -119,11 +119,14 @@ namespace std
|
|||
enum class launch { any, async, sync };
|
||||
|
||||
template<typename _Fn, typename... _Args>
|
||||
future<typename _Fn::result_type>
|
||||
future<typename result_of<_Fn(_Args...)>::type>
|
||||
async(launch __policy, _Fn&& __fn, _Args&&... __args);
|
||||
|
||||
template<typename _Fn, typename... _Args>
|
||||
future<typename _Fn::result_type>
|
||||
typename
|
||||
enable_if<!is_same<typename decay<_Fn>::type, launch>::value,
|
||||
future<decltype(std::declval<_Fn>()(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<typename> friend class packaged_task;
|
||||
template<typename _Fn, typename... _Args>
|
||||
friend future<typename _Fn::result_type>
|
||||
friend future<typename result_of<_Fn(_Args...)>::type>
|
||||
async(launch, _Fn&&, _Args&&...);
|
||||
|
||||
typedef __basic_future<_Res> _Base_type;
|
||||
|
@ -599,7 +602,7 @@ namespace std
|
|||
friend class promise<_Res&>;
|
||||
template<typename> friend class packaged_task;
|
||||
template<typename _Fn, typename... _Args>
|
||||
friend future<typename _Fn::result_type>
|
||||
friend future<typename result_of<_Fn(_Args...)>::type>
|
||||
async(launch, _Fn&&, _Args&&...);
|
||||
|
||||
typedef __basic_future<_Res&> _Base_type;
|
||||
|
@ -640,7 +643,7 @@ namespace std
|
|||
friend class promise<void>;
|
||||
template<typename> friend class packaged_task;
|
||||
template<typename _Fn, typename... _Args>
|
||||
friend future<typename _Fn::result_type>
|
||||
friend future<typename result_of<_Fn(_Args...)>::type>
|
||||
async(launch, _Fn&&, _Args&&...);
|
||||
|
||||
typedef __basic_future<void> _Base_type;
|
||||
|
@ -1322,10 +1325,10 @@ namespace std
|
|||
};
|
||||
|
||||
template<typename _Fn, typename... _Args>
|
||||
future<typename _Fn::result_type>
|
||||
future<typename result_of<_Fn(_Args...)>::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<typename _Fn, typename... _Args>
|
||||
future<typename _Fn::result_type>
|
||||
inline typename
|
||||
enable_if<!is_same<typename decay<_Fn>::type, launch>::value,
|
||||
future<decltype(std::declval<_Fn>()(std::declval<_Args>()...))>
|
||||
>::type
|
||||
async(_Fn&& __fn, _Args&&... __args)
|
||||
{
|
||||
return async(launch::any, std::forward<_Fn>(__fn),
|
||||
|
|
59
libstdc++-v3/testsuite/30_threads/async/42819.cc
Normal file
59
libstdc++-v3/testsuite/30_threads/async/42819.cc
Normal file
|
@ -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
|
||||
// <http://www.gnu.org/licenses/>.
|
||||
|
||||
#include <future>
|
||||
#include <testsuite_hooks.h>
|
||||
|
||||
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;
|
||||
}
|
|
@ -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 }
|
||||
|
|
|
@ -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 }
|
||||
|
|
|
@ -33,4 +33,4 @@ void test01()
|
|||
}
|
||||
|
||||
// { dg-error "used here" "" { target *-*-* } 32 }
|
||||
// { dg-error "deleted function" "" { target *-*-* } 1225 }
|
||||
// { dg-error "deleted function" "" { target *-*-* } 1228 }
|
||||
|
|
|
@ -32,4 +32,4 @@ void test01()
|
|||
}
|
||||
|
||||
// { dg-error "used here" "" { target *-*-* } 31 }
|
||||
// { dg-error "deleted function" "" { target *-*-* } 1224 }
|
||||
// { dg-error "deleted function" "" { target *-*-* } 1227 }
|
||||
|
|
|
@ -33,4 +33,4 @@ void test01()
|
|||
}
|
||||
|
||||
// { dg-error "used here" "" { target *-*-* } 32 }
|
||||
// { dg-error "deleted function" "" { target *-*-* } 868 }
|
||||
// { dg-error "deleted function" "" { target *-*-* } 871 }
|
||||
|
|
|
@ -32,4 +32,4 @@ void test01()
|
|||
}
|
||||
|
||||
// { dg-error "used here" "" { target *-*-* } 31 }
|
||||
// { dg-error "deleted function" "" { target *-*-* } 852 }
|
||||
// { dg-error "deleted function" "" { target *-*-* } 855 }
|
||||
|
|
Loading…
Add table
Reference in a new issue