On 26 August 2012 15:48, H.J. Lu <hjl.to...@gmail.com> wrote: > On Sun, Aug 26, 2012 at 7:00 AM, Jonathan Wakely <jwakely....@gmail.com> > wrote: >> On 26 August 2012 00:02, Jonathan Wakely wrote: >>> This fixes a stupid mistake I made where the functor and asynchronous >>> result can go out of scope before the async thread is joined. >>> >>> The _Async_state_common destructor still needs to be exported from the >>> library, which is what the macro hack is for. >>> >>> PR libstdc++/54297 >>> * include/std/future (~_Async_state_impl): Join thread before >>> derived class members are destroyed. >>> (~_Async_state_common): Only define non-trivial destructor when >>> included from future.cc for ABI compatibility reasons. >>> * src/c++11/future.cc (_GLIBCXX_ABI_COMPAT_ASYNC): Define. >>> * testsuite/30_threads/async/54297.cc: New. >>> >>> Tested x86_64-linux, committed to trunk and 4.7 >> >> I realised the compatibility symbols should be in one of the files >> used for that purpose, so this moves them to >> src/c++11/compatibility-thread-c++0x.cc >> >> PR libstdc++/54297 >> * src/c++11/future.cc (~_Async_state_common): Move to... >> * src/c++11/compatibility-thread-c++0x.cc (~_Async_state_common): >> Here. >> (_GLIBCXX_ABI_COMPAT_ASYNC): Rename to _GLIBCXX_ASYNC_ABI_COMPAT. >> * include/std/future (_GLIBCXX_ABI_COMPAT_ASYNC): Likewise. >> >> Tested x86_64-linux, committed to trunk and 4.7 > > Does it fix:
No, that needs an extra dg-requires-xxx in the test, sorry about that. I'll fix it now. > output is: > /export/gnu/import/git/gcc/libstdc++-v3/testsuite/30_threads/async/54297.cc: > In member function 'void Task::operator()() const':^M > /export/gnu/import/git/gcc/libstdc++-v3/testsuite/30_threads/async/54297.cc:42:5: > error: 'sleep_for' is not a member of 'std::this_thread'^M > std::this_thread::sleep_for(std::chrono::seconds(1));^M > ^^M > > FAIL: 30_threads/async/54297.cc (test for excess errors) > Excess errors: > /export/gnu/import/git/gcc/libstdc++-v3/testsuite/30_threads/async/54297.cc:42:5: > error: 'sleep_for' is not a member of 'std::this_thread' > > > -- > H.J.