diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index b8c222ba807c783ceda02595f2a70a72a747a3ae..1583ef0aadfb4dbaa53a903dbc07f0a7ddab7e44 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,8 @@
+2011-11-07  Jonathan Wakely  <jwakely.gcc@gmail.com>
+
+	* include/std/mutex (call_once): Store closure in __once_functor
+	as bound function wrapper might not be copyable.
+
 2011-11-07  Andrew MacLeod  <amacleod@redhat.com>
 
 	* include/bits/atomic_base.h (atomic_thread_fence): Revert.
diff --git a/libstdc++-v3/include/std/mutex b/libstdc++-v3/include/std/mutex
index bc2675b2b684f9fcc8c596ce1147fb3d153ff480..69e26e6de84d329fede486caa76f44d550d495c8 100644
--- a/libstdc++-v3/include/std/mutex
+++ b/libstdc++-v3/include/std/mutex
@@ -810,8 +810,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       __once_call = &__once_call_impl<decltype(__bound_functor)>;
 #else
       unique_lock<mutex> __functor_lock(__get_once_mutex());
-      __once_functor = std::__bind_simple(std::forward<_Callable>(__f),
+      auto __callable = std::__bind_simple(std::forward<_Callable>(__f),
           std::forward<_Args>(__args)...);
+      __once_functor = [&]() { __callable(); };
       __set_once_functor_lock_ptr(&__functor_lock);
 #endif