Revert 115441 - Redo r113722 - Add Pass(), which implements move semantics, to scoped_ptr, scoped_array....

(This undoes the revert in r114247. Win canaries still can't link, but
this change has been deemed safe).

Add Pass(), which implements move semantics, to scoped_ptr, scoped_array, and
scoped_ptr_malloc.

This modification to the scopers implements the "moveable but not copyable"
semantics that were introduced in C++11's unique_ptr<>.

With this, is now possible to use scopers as an argument type or a return type.
This signifies, in the type system, transfer of ownership into a function or out
of a function respectively.  Calling, or returning such a function MUST use the
temporary resulting from a function or explicit cast.

This distinction makes it possible to avoid the implicit ownership transfer
issues of auto_ptr, but still allow us to have compiler enforced ownership
transfer.

Also adds a Passed() helper that allows using a scoper with Bind().

BUG=96118
TEST=new unittests

Review URL: http://codereview.chromium.org/9021032

TBR=ajwong@chromium.org
Review URL: http://codereview.chromium.org/8949057

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@115444 0039d316-1c4b-4281-b951-d872f2087c98


CrOS-Libchrome-Original-Commit: 088badbc399465ef8fc2ea9e5c12cc0c98c3bba6
diff --git a/base/bind_helpers.h b/base/bind_helpers.h
index df8cf82..6e0f8fe 100644
--- a/base/bind_helpers.h
+++ b/base/bind_helpers.h
@@ -6,29 +6,19 @@
 // can be used specify the refcounting and reference semantics of arguments
 // that are bound by the Bind() function in base/bind.h.
 //
-// The public functions are base::Unretained(), base::Owned(), bass::Passed(),
-// base::ConstRef(), and base::IgnoreResult().
+// The public functions are base::Unretained(), base::Owned(),
+// base::ConstRef(), and base::IgnoreReturn().
 //
 // Unretained() allows Bind() to bind a non-refcounted class, and to disable
 // refcounting on arguments that are refcounted objects.
-//
 // Owned() transfers ownership of an object to the Callback resulting from
 // bind; the object will be deleted when the Callback is deleted.
-//
-// Passed() is for transferring movable-but-not-copyable types (eg. scoped_ptr)
-// through a Callback. Logically, this signifies a destructive transfer of
-// the state of the argument into the target function.  Invoking
-// Callback::Run() twice on a Callback that was created with a Passed()
-// argument will CHECK() because the first invocation would have already
-// transferred ownership to the target function.
-//
 // ConstRef() allows binding a constant reference to an argument rather
 // than a copy.
+// IgnoreReturn() is used to adapt a 0-argument Callback with a return type to
+// a Closure. This is useful if you need to PostTask with a function that has
+// a return value that you don't care about.
 //
-// IgnoreResult() is used to adapt a function or Callback with a return type to
-// one with a void return. This is most useful if you have a function with,
-// say, a pesky ignorable bool return that you want to use with PostTask or
-// something else that expect a Callback with a void return.
 //
 // EXAMPLE OF Unretained():
 //
@@ -85,45 +75,13 @@
 // its bound callbacks.
 //
 //
-// EXAMPLE OF IgnoreResult():
+// EXAMPLE OF IgnoreReturn():
 //
 //   int DoSomething(int arg) { cout << arg << endl; }
-//
-//   // Assign to a Callback with a void return type.
-//   Callback<void(int)> cb = Bind(IgnoreResult(&DoSomething));
-//   cb->Run(1);  // Prints "1".
-//
-//   // Prints "1" on |ml|.
-//   ml->PostTask(FROM_HERE, Bind(IgnoreResult(&DoSomething), 1);
-//
-//
-// EXAMPLE OF Passed():
-//
-//   void TakesOwnership(scoped_ptr<Foo> arg) { }
-//   scoped_ptr<Foo> CreateFoo() { return scoped_ptr<Foo>(new Foo()); }
-//
-//   scoped_ptr<Foo> f(new Foo());
-//
-//   // |cb| is given ownership of Foo(). |f| is now NULL.
-//   // You can use f.Pass() in place of &f, but it's more verbose.
-//   Closure cb = Bind(&TakesOwnership, Passed(&f));
-//
-//   // Run was never called so |cb| still owns Foo() and deletes
-//   // it on Reset().
-//   cb.Reset();
-//
-//   // |cb| is given a new Foo created by CreateFoo().
-//   cb = Bind(&TakesOwnership, Passed(CreateFoo()));
-//
-//   // |arg| in TakesOwnership() is given ownership of Foo(). |cb|
-//   // no longer owns Foo() and, if reset, would not delete Foo().
-//   cb.Run();  // Foo() is now transferred to |arg| and deleted.
-//   cb.Run();  // This CHECK()s since Foo() already been used once.
-//
-// Passed() is particularly useful with PostTask() when you are transferring
-// ownership of an argument into a task, but don't necessarily know if the
-// task will always be executed. This can happen if the task is cancellable
-// or if it is posted to a MessageLoopProxy.
+//   Callback<int(void)> cb = Bind(&DoSomething, 1);
+//   Closure c = IgnoreReturn(cb);  // Prints "1"
+//       or
+//   ml->PostTask(FROM_HERE, IgnoreReturn(cb));  // Prints "1" on |ml|
 
 #ifndef BASE_BIND_HELPERS_H_
 #define BASE_BIND_HELPERS_H_
@@ -329,45 +287,6 @@
   mutable T* ptr_;
 };
 
-// PassedWrapper is a copyable adapter for a scoper that ignores const.
-//
-// It is needed to get around the fact that Bind() takes a const reference to
-// all its arguments.  Because Bind() takes a const reference to avoid
-// unnecessary copies, it is incompatible with movable-but-not-copyable
-// types; doing a destructive "move" of the type into Bind() would violate
-// the const correctness.
-//
-// This conundrum cannot be solved without either C++11 rvalue references or
-// a O(2^n) blowup of Bind() templates to handle each combination of regular
-// types and movable-but-not-copyable types.  Thus we introduce a wrapper type
-// that is copyable to transmit the correct type information down into
-// BindState<>. Ignoring const in this type makes sense because it is only
-// created when we are explicitly trying to do a destructive move.
-//
-// Two notes:
-//  1) PassedWrapper supports any type that has a "Pass()" function.
-//     This is intentional. The whitelisting of which specific types we
-//     support is maintained by CallbackParamTraits<>.
-//  2) is_valid_ is distinct from NULL because it is valid to bind a "NULL"
-//     scoper to a Callback and allow the Callback to execute once.
-template <typename T>
-class PassedWrapper {
- public:
-  explicit PassedWrapper(T scoper) : is_valid_(true), scoper_(scoper.Pass()) {}
-  PassedWrapper(const PassedWrapper& other)
-      : is_valid_(other.is_valid_), scoper_(other.scoper_.Pass()) {
-  }
-  T Pass() const {
-    CHECK(is_valid_);
-    is_valid_ = false;
-    return scoper_.Pass();
-  }
-
- private:
-  mutable bool is_valid_;
-  mutable T scoper_;
-};
-
 // Unwrap the stored parameters for the wrappers above.
 template <typename T>
 struct UnwrapTraits {
@@ -411,17 +330,9 @@
   }
 };
 
-template <typename T>
-struct UnwrapTraits<PassedWrapper<T> > {
-  typedef T ForwardType;
-  static T Unwrap(PassedWrapper<T>& o) {
-    return o.Pass();
-  }
-};
-
 // Utility for handling different refcounting semantics in the Bind()
 // function.
-template <bool is_method, typename T>
+template <bool, typename T>
 struct MaybeRefcount;
 
 template <typename T>
@@ -437,17 +348,23 @@
 };
 
 template <typename T>
-struct MaybeRefcount<true, T> {
-  static void AddRef(const T&) {}
-  static void Release(const T&) {}
-};
-
-template <typename T>
 struct MaybeRefcount<true, T*> {
   static void AddRef(T* o) { o->AddRef(); }
   static void Release(T* o) { o->Release(); }
 };
 
+template <typename T>
+struct MaybeRefcount<true, UnretainedWrapper<T> > {
+  static void AddRef(const UnretainedWrapper<T>&) {}
+  static void Release(const UnretainedWrapper<T>&) {}
+};
+
+template <typename T>
+struct MaybeRefcount<true, OwnedWrapper<T> > {
+  static void AddRef(const OwnedWrapper<T>&) {}
+  static void Release(const OwnedWrapper<T>&) {}
+};
+
 // No need to additionally AddRef() and Release() since we are storing a
 // scoped_refptr<> inside the storage object already.
 template <typename T>
@@ -462,13 +379,19 @@
   static void Release(const T* o) { o->Release(); }
 };
 
+template <typename T>
+struct MaybeRefcount<true, WeakPtr<T> > {
+  static void AddRef(const WeakPtr<T>&) {}
+  static void Release(const WeakPtr<T>&) {}
+};
+
 template <typename R>
 void VoidReturnAdapter(Callback<R(void)> callback) {
   callback.Run();
 }
 
 // IsWeakMethod is a helper that determine if we are binding a WeakPtr<> to a
-// method.  It is used internally by Bind() to select the correct
+// method.  It is unsed internally by Bind() to select the correct
 // InvokeHelper that will no-op itself in the event the WeakPtr<> for
 // the target object is invalidated.
 //
@@ -499,20 +422,6 @@
   return internal::OwnedWrapper<T>(o);
 }
 
-// We offer 2 syntaxes for calling Passed().  The first takes a temporary and
-// is best suited for use with the return value of a function. The second
-// takes a pointer to the scoper and is just syntactic sugar to avoid having
-// to write Passed(scoper.Pass()).
-template <typename T>
-static inline internal::PassedWrapper<T> Passed(T scoper) {
-  return internal::PassedWrapper<T>(scoper.Pass());
-}
-template <typename T>
-static inline internal::PassedWrapper<T> Passed(T* scoper) {
-  return internal::PassedWrapper<T>(scoper->Pass());
-}
-
-// -- DEPRECATED -- Use IgnoreResult instead.
 template <typename R>
 static inline Closure IgnoreReturn(Callback<R(void)> callback) {
   return Bind(&internal::VoidReturnAdapter<R>, callback);
@@ -529,6 +438,7 @@
   return internal::IgnoreResultHelper<Callback<T> >(data);
 }
 
+
 }  // namespace base
 
 #endif  // BASE_BIND_HELPERS_H_
diff --git a/base/bind_internal.h b/base/bind_internal.h
index 50ffaa5..ccd7ab2 100644
--- a/base/bind_internal.h
+++ b/base/bind_internal.h
@@ -76,6 +76,7 @@
 //                 into the Bind() system, doing most of the type resolution.
 //                 There are ARITY BindState types.
 
+
 // RunnableAdapter<>
 //
 // The RunnableAdapter<> templates provide a uniform interface for invoking
@@ -166,7 +167,7 @@
   }
 
   R Run(typename CallbackParamTraits<A1>::ForwardType a1) {
-    return function_(CallbackForward(a1));
+    return function_(a1);
   }
 
  private:
@@ -185,7 +186,7 @@
   }
 
   R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1) {
-    return (object->*method_)(CallbackForward(a1));
+    return (object->*method_)(a1);
   }
 
  private:
@@ -204,7 +205,7 @@
   }
 
   R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1) {
-    return (object->*method_)(CallbackForward(a1));
+    return (object->*method_)(a1);
   }
 
  private:
@@ -223,7 +224,7 @@
 
   R Run(typename CallbackParamTraits<A1>::ForwardType a1,
       typename CallbackParamTraits<A2>::ForwardType a2) {
-    return function_(CallbackForward(a1), CallbackForward(a2));
+    return function_(a1, a2);
   }
 
  private:
@@ -243,7 +244,7 @@
 
   R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1,
       typename CallbackParamTraits<A2>::ForwardType a2) {
-    return (object->*method_)(CallbackForward(a1), CallbackForward(a2));
+    return (object->*method_)(a1, a2);
   }
 
  private:
@@ -263,7 +264,7 @@
 
   R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1,
       typename CallbackParamTraits<A2>::ForwardType a2) {
-    return (object->*method_)(CallbackForward(a1), CallbackForward(a2));
+    return (object->*method_)(a1, a2);
   }
 
  private:
@@ -283,8 +284,7 @@
   R Run(typename CallbackParamTraits<A1>::ForwardType a1,
       typename CallbackParamTraits<A2>::ForwardType a2,
       typename CallbackParamTraits<A3>::ForwardType a3) {
-    return function_(CallbackForward(a1), CallbackForward(a2),
-        CallbackForward(a3));
+    return function_(a1, a2, a3);
   }
 
  private:
@@ -305,8 +305,7 @@
   R Run(T* object, typename CallbackParamTraits<A1>::ForwardType a1,
       typename CallbackParamTraits<A2>::ForwardType a2,
       typename CallbackParamTraits<A3>::ForwardType a3) {
-    return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
-        CallbackForward(a3));
+    return (object->*method_)(a1, a2, a3);
   }
 
  private:
@@ -327,8 +326,7 @@
   R Run(const T* object, typename CallbackParamTraits<A1>::ForwardType a1,
       typename CallbackParamTraits<A2>::ForwardType a2,
       typename CallbackParamTraits<A3>::ForwardType a3) {
-    return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
-        CallbackForward(a3));
+    return (object->*method_)(a1, a2, a3);
   }
 
  private:
@@ -349,8 +347,7 @@
       typename CallbackParamTraits<A2>::ForwardType a2,
       typename CallbackParamTraits<A3>::ForwardType a3,
       typename CallbackParamTraits<A4>::ForwardType a4) {
-    return function_(CallbackForward(a1), CallbackForward(a2),
-        CallbackForward(a3), CallbackForward(a4));
+    return function_(a1, a2, a3, a4);
   }
 
  private:
@@ -373,8 +370,7 @@
       typename CallbackParamTraits<A2>::ForwardType a2,
       typename CallbackParamTraits<A3>::ForwardType a3,
       typename CallbackParamTraits<A4>::ForwardType a4) {
-    return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
-        CallbackForward(a3), CallbackForward(a4));
+    return (object->*method_)(a1, a2, a3, a4);
   }
 
  private:
@@ -397,8 +393,7 @@
       typename CallbackParamTraits<A2>::ForwardType a2,
       typename CallbackParamTraits<A3>::ForwardType a3,
       typename CallbackParamTraits<A4>::ForwardType a4) {
-    return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
-        CallbackForward(a3), CallbackForward(a4));
+    return (object->*method_)(a1, a2, a3, a4);
   }
 
  private:
@@ -421,8 +416,7 @@
       typename CallbackParamTraits<A3>::ForwardType a3,
       typename CallbackParamTraits<A4>::ForwardType a4,
       typename CallbackParamTraits<A5>::ForwardType a5) {
-    return function_(CallbackForward(a1), CallbackForward(a2),
-        CallbackForward(a3), CallbackForward(a4), CallbackForward(a5));
+    return function_(a1, a2, a3, a4, a5);
   }
 
  private:
@@ -446,8 +440,7 @@
       typename CallbackParamTraits<A3>::ForwardType a3,
       typename CallbackParamTraits<A4>::ForwardType a4,
       typename CallbackParamTraits<A5>::ForwardType a5) {
-    return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
-        CallbackForward(a3), CallbackForward(a4), CallbackForward(a5));
+    return (object->*method_)(a1, a2, a3, a4, a5);
   }
 
  private:
@@ -471,8 +464,7 @@
       typename CallbackParamTraits<A3>::ForwardType a3,
       typename CallbackParamTraits<A4>::ForwardType a4,
       typename CallbackParamTraits<A5>::ForwardType a5) {
-    return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
-        CallbackForward(a3), CallbackForward(a4), CallbackForward(a5));
+    return (object->*method_)(a1, a2, a3, a4, a5);
   }
 
  private:
@@ -496,9 +488,7 @@
       typename CallbackParamTraits<A4>::ForwardType a4,
       typename CallbackParamTraits<A5>::ForwardType a5,
       typename CallbackParamTraits<A6>::ForwardType a6) {
-    return function_(CallbackForward(a1), CallbackForward(a2),
-        CallbackForward(a3), CallbackForward(a4), CallbackForward(a5),
-        CallbackForward(a6));
+    return function_(a1, a2, a3, a4, a5, a6);
   }
 
  private:
@@ -523,9 +513,7 @@
       typename CallbackParamTraits<A4>::ForwardType a4,
       typename CallbackParamTraits<A5>::ForwardType a5,
       typename CallbackParamTraits<A6>::ForwardType a6) {
-    return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
-        CallbackForward(a3), CallbackForward(a4), CallbackForward(a5),
-        CallbackForward(a6));
+    return (object->*method_)(a1, a2, a3, a4, a5, a6);
   }
 
  private:
@@ -550,9 +538,7 @@
       typename CallbackParamTraits<A4>::ForwardType a4,
       typename CallbackParamTraits<A5>::ForwardType a5,
       typename CallbackParamTraits<A6>::ForwardType a6) {
-    return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
-        CallbackForward(a3), CallbackForward(a4), CallbackForward(a5),
-        CallbackForward(a6));
+    return (object->*method_)(a1, a2, a3, a4, a5, a6);
   }
 
  private:
@@ -577,9 +563,7 @@
       typename CallbackParamTraits<A5>::ForwardType a5,
       typename CallbackParamTraits<A6>::ForwardType a6,
       typename CallbackParamTraits<A7>::ForwardType a7) {
-    return function_(CallbackForward(a1), CallbackForward(a2),
-        CallbackForward(a3), CallbackForward(a4), CallbackForward(a5),
-        CallbackForward(a6), CallbackForward(a7));
+    return function_(a1, a2, a3, a4, a5, a6, a7);
   }
 
  private:
@@ -605,9 +589,7 @@
       typename CallbackParamTraits<A5>::ForwardType a5,
       typename CallbackParamTraits<A6>::ForwardType a6,
       typename CallbackParamTraits<A7>::ForwardType a7) {
-    return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
-        CallbackForward(a3), CallbackForward(a4), CallbackForward(a5),
-        CallbackForward(a6), CallbackForward(a7));
+    return (object->*method_)(a1, a2, a3, a4, a5, a6, a7);
   }
 
  private:
@@ -633,9 +615,7 @@
       typename CallbackParamTraits<A5>::ForwardType a5,
       typename CallbackParamTraits<A6>::ForwardType a6,
       typename CallbackParamTraits<A7>::ForwardType a7) {
-    return (object->*method_)(CallbackForward(a1), CallbackForward(a2),
-        CallbackForward(a3), CallbackForward(a4), CallbackForward(a5),
-        CallbackForward(a6), CallbackForward(a7));
+    return (object->*method_)(a1, a2, a3, a4, a5, a6, a7);
   }
 
  private:
@@ -857,7 +837,7 @@
 struct InvokeHelper<false, ReturnType, Runnable,
     void(A1)>  {
   static ReturnType MakeItSo(Runnable runnable, A1 a1) {
-    return runnable.Run(CallbackForward(a1));
+    return runnable.Run(a1);
   }
 };
 
@@ -865,7 +845,7 @@
 struct InvokeHelper<false, void, Runnable,
     void(A1)>  {
   static void MakeItSo(Runnable runnable, A1 a1) {
-    runnable.Run(CallbackForward(a1));
+    runnable.Run(a1);
   }
 };
 
@@ -877,7 +857,7 @@
       return;
     }
 
-    runnable.Run(CallbackForward(a1));
+    runnable.Run(a1);
   }
 };
 
@@ -885,7 +865,7 @@
 struct InvokeHelper<false, ReturnType, Runnable,
     void(A1, A2)>  {
   static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2) {
-    return runnable.Run(CallbackForward(a1), CallbackForward(a2));
+    return runnable.Run(a1, a2);
   }
 };
 
@@ -893,7 +873,7 @@
 struct InvokeHelper<false, void, Runnable,
     void(A1, A2)>  {
   static void MakeItSo(Runnable runnable, A1 a1, A2 a2) {
-    runnable.Run(CallbackForward(a1), CallbackForward(a2));
+    runnable.Run(a1, a2);
   }
 };
 
@@ -905,7 +885,7 @@
       return;
     }
 
-    runnable.Run(CallbackForward(a1), CallbackForward(a2));
+    runnable.Run(a1, a2);
   }
 };
 
@@ -914,8 +894,7 @@
 struct InvokeHelper<false, ReturnType, Runnable,
     void(A1, A2, A3)>  {
   static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3) {
-    return runnable.Run(CallbackForward(a1), CallbackForward(a2),
-        CallbackForward(a3));
+    return runnable.Run(a1, a2, a3);
   }
 };
 
@@ -923,7 +902,7 @@
 struct InvokeHelper<false, void, Runnable,
     void(A1, A2, A3)>  {
   static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3) {
-    runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3));
+    runnable.Run(a1, a2, a3);
   }
 };
 
@@ -935,7 +914,7 @@
       return;
     }
 
-    runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3));
+    runnable.Run(a1, a2, a3);
   }
 };
 
@@ -944,8 +923,7 @@
 struct InvokeHelper<false, ReturnType, Runnable,
     void(A1, A2, A3, A4)>  {
   static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4) {
-    return runnable.Run(CallbackForward(a1), CallbackForward(a2),
-        CallbackForward(a3), CallbackForward(a4));
+    return runnable.Run(a1, a2, a3, a4);
   }
 };
 
@@ -953,8 +931,7 @@
 struct InvokeHelper<false, void, Runnable,
     void(A1, A2, A3, A4)>  {
   static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4) {
-    runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3),
-        CallbackForward(a4));
+    runnable.Run(a1, a2, a3, a4);
   }
 };
 
@@ -966,8 +943,7 @@
       return;
     }
 
-    runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3),
-        CallbackForward(a4));
+    runnable.Run(a1, a2, a3, a4);
   }
 };
 
@@ -977,8 +953,7 @@
     void(A1, A2, A3, A4, A5)>  {
   static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4,
       A5 a5) {
-    return runnable.Run(CallbackForward(a1), CallbackForward(a2),
-        CallbackForward(a3), CallbackForward(a4), CallbackForward(a5));
+    return runnable.Run(a1, a2, a3, a4, a5);
   }
 };
 
@@ -987,8 +962,7 @@
 struct InvokeHelper<false, void, Runnable,
     void(A1, A2, A3, A4, A5)>  {
   static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {
-    runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3),
-        CallbackForward(a4), CallbackForward(a5));
+    runnable.Run(a1, a2, a3, a4, a5);
   }
 };
 
@@ -1001,8 +975,7 @@
       return;
     }
 
-    runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3),
-        CallbackForward(a4), CallbackForward(a5));
+    runnable.Run(a1, a2, a3, a4, a5);
   }
 };
 
@@ -1012,9 +985,7 @@
     void(A1, A2, A3, A4, A5, A6)>  {
   static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4,
       A5 a5, A6 a6) {
-    return runnable.Run(CallbackForward(a1), CallbackForward(a2),
-        CallbackForward(a3), CallbackForward(a4), CallbackForward(a5),
-        CallbackForward(a6));
+    return runnable.Run(a1, a2, a3, a4, a5, a6);
   }
 };
 
@@ -1024,8 +995,7 @@
     void(A1, A2, A3, A4, A5, A6)>  {
   static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5,
       A6 a6) {
-    runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3),
-        CallbackForward(a4), CallbackForward(a5), CallbackForward(a6));
+    runnable.Run(a1, a2, a3, a4, a5, a6);
   }
 };
 
@@ -1039,8 +1009,7 @@
       return;
     }
 
-    runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3),
-        CallbackForward(a4), CallbackForward(a5), CallbackForward(a6));
+    runnable.Run(a1, a2, a3, a4, a5, a6);
   }
 };
 
@@ -1050,9 +1019,7 @@
     void(A1, A2, A3, A4, A5, A6, A7)>  {
   static ReturnType MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4,
       A5 a5, A6 a6, A7 a7) {
-    return runnable.Run(CallbackForward(a1), CallbackForward(a2),
-        CallbackForward(a3), CallbackForward(a4), CallbackForward(a5),
-        CallbackForward(a6), CallbackForward(a7));
+    return runnable.Run(a1, a2, a3, a4, a5, a6, a7);
   }
 };
 
@@ -1062,9 +1029,7 @@
     void(A1, A2, A3, A4, A5, A6, A7)>  {
   static void MakeItSo(Runnable runnable, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5,
       A6 a6, A7 a7) {
-    runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3),
-        CallbackForward(a4), CallbackForward(a5), CallbackForward(a6),
-        CallbackForward(a7));
+    runnable.Run(a1, a2, a3, a4, a5, a6, a7);
   }
 };
 
@@ -1078,9 +1043,7 @@
       return;
     }
 
-    runnable.Run(CallbackForward(a1), CallbackForward(a2), CallbackForward(a3),
-        CallbackForward(a4), CallbackForward(a5), CallbackForward(a6),
-        CallbackForward(a7));
+    runnable.Run(a1, a2, a3, a4, a5, a6, a7);
   }
 };
 
@@ -1143,7 +1106,7 @@
     return InvokeHelper<StorageType::IsWeakCall::value, R,
            typename StorageType::RunnableType,
            void(typename CallbackParamTraits<X1>::ForwardType x1)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1));
+               ::MakeItSo(storage->runnable_, x1);
   }
 };
 
@@ -1167,7 +1130,7 @@
     return InvokeHelper<StorageType::IsWeakCall::value, R,
            typename StorageType::RunnableType,
            void(typename Bound1UnwrapTraits::ForwardType)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1));
+               ::MakeItSo(storage->runnable_, x1);
   }
 };
 
@@ -1193,8 +1156,7 @@
            typename StorageType::RunnableType,
            void(typename CallbackParamTraits<X1>::ForwardType x1,
                typename CallbackParamTraits<X2>::ForwardType x2)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2));
+               ::MakeItSo(storage->runnable_, x1, x2);
   }
 };
 
@@ -1221,8 +1183,7 @@
            typename StorageType::RunnableType,
            void(typename Bound1UnwrapTraits::ForwardType,
                typename CallbackParamTraits<X2>::ForwardType x2)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2));
+               ::MakeItSo(storage->runnable_, x1, x2);
   }
 };
 
@@ -1250,8 +1211,7 @@
            typename StorageType::RunnableType,
            void(typename Bound1UnwrapTraits::ForwardType,
                typename Bound2UnwrapTraits::ForwardType)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2));
+               ::MakeItSo(storage->runnable_, x1, x2);
   }
 };
 
@@ -1281,8 +1241,7 @@
            void(typename CallbackParamTraits<X1>::ForwardType x1,
                typename CallbackParamTraits<X2>::ForwardType x2,
                typename CallbackParamTraits<X3>::ForwardType x3)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3));
+               ::MakeItSo(storage->runnable_, x1, x2, x3);
   }
 };
 
@@ -1313,8 +1272,7 @@
            void(typename Bound1UnwrapTraits::ForwardType,
                typename CallbackParamTraits<X2>::ForwardType x2,
                typename CallbackParamTraits<X3>::ForwardType x3)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3));
+               ::MakeItSo(storage->runnable_, x1, x2, x3);
   }
 };
 
@@ -1346,8 +1304,7 @@
            void(typename Bound1UnwrapTraits::ForwardType,
                typename Bound2UnwrapTraits::ForwardType,
                typename CallbackParamTraits<X3>::ForwardType x3)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3));
+               ::MakeItSo(storage->runnable_, x1, x2, x3);
   }
 };
 
@@ -1380,8 +1337,7 @@
            void(typename Bound1UnwrapTraits::ForwardType,
                typename Bound2UnwrapTraits::ForwardType,
                typename Bound3UnwrapTraits::ForwardType)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3));
+               ::MakeItSo(storage->runnable_, x1, x2, x3);
   }
 };
 
@@ -1414,9 +1370,7 @@
                typename CallbackParamTraits<X2>::ForwardType x2,
                typename CallbackParamTraits<X3>::ForwardType x3,
                typename CallbackParamTraits<X4>::ForwardType x4)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4);
   }
 };
 
@@ -1450,9 +1404,7 @@
                typename CallbackParamTraits<X2>::ForwardType x2,
                typename CallbackParamTraits<X3>::ForwardType x3,
                typename CallbackParamTraits<X4>::ForwardType x4)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4);
   }
 };
 
@@ -1487,9 +1439,7 @@
                typename Bound2UnwrapTraits::ForwardType,
                typename CallbackParamTraits<X3>::ForwardType x3,
                typename CallbackParamTraits<X4>::ForwardType x4)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4);
   }
 };
 
@@ -1525,9 +1475,7 @@
                typename Bound2UnwrapTraits::ForwardType,
                typename Bound3UnwrapTraits::ForwardType,
                typename CallbackParamTraits<X4>::ForwardType x4)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4);
   }
 };
 
@@ -1564,9 +1512,7 @@
                typename Bound2UnwrapTraits::ForwardType,
                typename Bound3UnwrapTraits::ForwardType,
                typename Bound4UnwrapTraits::ForwardType)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4);
   }
 };
 
@@ -1602,9 +1548,7 @@
                typename CallbackParamTraits<X3>::ForwardType x3,
                typename CallbackParamTraits<X4>::ForwardType x4,
                typename CallbackParamTraits<X5>::ForwardType x5)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4), CallbackForward(x5));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5);
   }
 };
 
@@ -1641,9 +1585,7 @@
                typename CallbackParamTraits<X3>::ForwardType x3,
                typename CallbackParamTraits<X4>::ForwardType x4,
                typename CallbackParamTraits<X5>::ForwardType x5)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4), CallbackForward(x5));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5);
   }
 };
 
@@ -1681,9 +1623,7 @@
                typename CallbackParamTraits<X3>::ForwardType x3,
                typename CallbackParamTraits<X4>::ForwardType x4,
                typename CallbackParamTraits<X5>::ForwardType x5)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4), CallbackForward(x5));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5);
   }
 };
 
@@ -1722,9 +1662,7 @@
                typename Bound3UnwrapTraits::ForwardType,
                typename CallbackParamTraits<X4>::ForwardType x4,
                typename CallbackParamTraits<X5>::ForwardType x5)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4), CallbackForward(x5));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5);
   }
 };
 
@@ -1764,9 +1702,7 @@
                typename Bound3UnwrapTraits::ForwardType,
                typename Bound4UnwrapTraits::ForwardType,
                typename CallbackParamTraits<X5>::ForwardType x5)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4), CallbackForward(x5));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5);
   }
 };
 
@@ -1807,9 +1743,7 @@
                typename Bound3UnwrapTraits::ForwardType,
                typename Bound4UnwrapTraits::ForwardType,
                typename Bound5UnwrapTraits::ForwardType)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4), CallbackForward(x5));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5);
   }
 };
 
@@ -1848,10 +1782,7 @@
                typename CallbackParamTraits<X4>::ForwardType x4,
                typename CallbackParamTraits<X5>::ForwardType x5,
                typename CallbackParamTraits<X6>::ForwardType x6)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4), CallbackForward(x5),
-                   CallbackForward(x6));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6);
   }
 };
 
@@ -1891,10 +1822,7 @@
                typename CallbackParamTraits<X4>::ForwardType x4,
                typename CallbackParamTraits<X5>::ForwardType x5,
                typename CallbackParamTraits<X6>::ForwardType x6)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4), CallbackForward(x5),
-                   CallbackForward(x6));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6);
   }
 };
 
@@ -1935,10 +1863,7 @@
                typename CallbackParamTraits<X4>::ForwardType x4,
                typename CallbackParamTraits<X5>::ForwardType x5,
                typename CallbackParamTraits<X6>::ForwardType x6)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4), CallbackForward(x5),
-                   CallbackForward(x6));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6);
   }
 };
 
@@ -1980,10 +1905,7 @@
                typename CallbackParamTraits<X4>::ForwardType x4,
                typename CallbackParamTraits<X5>::ForwardType x5,
                typename CallbackParamTraits<X6>::ForwardType x6)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4), CallbackForward(x5),
-                   CallbackForward(x6));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6);
   }
 };
 
@@ -2026,10 +1948,7 @@
                typename Bound4UnwrapTraits::ForwardType,
                typename CallbackParamTraits<X5>::ForwardType x5,
                typename CallbackParamTraits<X6>::ForwardType x6)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4), CallbackForward(x5),
-                   CallbackForward(x6));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6);
   }
 };
 
@@ -2073,10 +1992,7 @@
                typename Bound4UnwrapTraits::ForwardType,
                typename Bound5UnwrapTraits::ForwardType,
                typename CallbackParamTraits<X6>::ForwardType x6)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4), CallbackForward(x5),
-                   CallbackForward(x6));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6);
   }
 };
 
@@ -2121,10 +2037,7 @@
                typename Bound4UnwrapTraits::ForwardType,
                typename Bound5UnwrapTraits::ForwardType,
                typename Bound6UnwrapTraits::ForwardType)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4), CallbackForward(x5),
-                   CallbackForward(x6));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6);
   }
 };
 
@@ -2166,10 +2079,7 @@
                typename CallbackParamTraits<X5>::ForwardType x5,
                typename CallbackParamTraits<X6>::ForwardType x6,
                typename CallbackParamTraits<X7>::ForwardType x7)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4), CallbackForward(x5),
-                   CallbackForward(x6), CallbackForward(x7));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6, x7);
   }
 };
 
@@ -2212,10 +2122,7 @@
                typename CallbackParamTraits<X5>::ForwardType x5,
                typename CallbackParamTraits<X6>::ForwardType x6,
                typename CallbackParamTraits<X7>::ForwardType x7)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4), CallbackForward(x5),
-                   CallbackForward(x6), CallbackForward(x7));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6, x7);
   }
 };
 
@@ -2259,10 +2166,7 @@
                typename CallbackParamTraits<X5>::ForwardType x5,
                typename CallbackParamTraits<X6>::ForwardType x6,
                typename CallbackParamTraits<X7>::ForwardType x7)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4), CallbackForward(x5),
-                   CallbackForward(x6), CallbackForward(x7));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6, x7);
   }
 };
 
@@ -2307,10 +2211,7 @@
                typename CallbackParamTraits<X5>::ForwardType x5,
                typename CallbackParamTraits<X6>::ForwardType x6,
                typename CallbackParamTraits<X7>::ForwardType x7)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4), CallbackForward(x5),
-                   CallbackForward(x6), CallbackForward(x7));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6, x7);
   }
 };
 
@@ -2356,10 +2257,7 @@
                typename CallbackParamTraits<X5>::ForwardType x5,
                typename CallbackParamTraits<X6>::ForwardType x6,
                typename CallbackParamTraits<X7>::ForwardType x7)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4), CallbackForward(x5),
-                   CallbackForward(x6), CallbackForward(x7));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6, x7);
   }
 };
 
@@ -2406,10 +2304,7 @@
                typename Bound5UnwrapTraits::ForwardType,
                typename CallbackParamTraits<X6>::ForwardType x6,
                typename CallbackParamTraits<X7>::ForwardType x7)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4), CallbackForward(x5),
-                   CallbackForward(x6), CallbackForward(x7));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6, x7);
   }
 };
 
@@ -2457,10 +2352,7 @@
                typename Bound5UnwrapTraits::ForwardType,
                typename Bound6UnwrapTraits::ForwardType,
                typename CallbackParamTraits<X7>::ForwardType x7)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4), CallbackForward(x5),
-                   CallbackForward(x6), CallbackForward(x7));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6, x7);
   }
 };
 
@@ -2509,10 +2401,7 @@
                typename Bound5UnwrapTraits::ForwardType,
                typename Bound6UnwrapTraits::ForwardType,
                typename Bound7UnwrapTraits::ForwardType)>
-               ::MakeItSo(storage->runnable_, CallbackForward(x1),
-                   CallbackForward(x2), CallbackForward(x3),
-                   CallbackForward(x4), CallbackForward(x5),
-                   CallbackForward(x6), CallbackForward(x7));
+               ::MakeItSo(storage->runnable_, x1, x2, x3, x4, x5, x6, x7);
   }
 };
 
diff --git a/base/bind_internal.h.pump b/base/bind_internal.h.pump
index 7fd63d8..53dcbd3 100644
--- a/base/bind_internal.h.pump
+++ b/base/bind_internal.h.pump
@@ -82,6 +82,7 @@
 //                 into the Bind() system, doing most of the type resolution.
 //                 There are ARITY BindState types.
 
+
 // RunnableAdapter<>
 //
 // The RunnableAdapter<> templates provide a uniform interface for invoking
@@ -120,7 +121,7 @@
   }
 
   R Run($for ARG , [[typename CallbackParamTraits<A$(ARG)>::ForwardType a$(ARG)]]) {
-    return function_($for ARG , [[CallbackForward(a$(ARG))]]);
+    return function_($for ARG , [[a$(ARG)]]);
   }
 
  private:
@@ -142,7 +143,7 @@
 
   R Run(T* object[[]]
 $if ARITY > 0[[, ]]  $for ARG, [[typename CallbackParamTraits<A$(ARG)>::ForwardType a$(ARG)]]) {
-    return (object->*method_)($for ARG , [[CallbackForward(a$(ARG))]]);
+    return (object->*method_)($for ARG , [[a$(ARG)]]);
   }
 
  private:
@@ -164,7 +165,7 @@
 
   R Run(const T* object[[]]
 $if ARITY > 0[[, ]]  $for ARG, [[typename CallbackParamTraits<A$(ARG)>::ForwardType a$(ARG)]]) {
-    return (object->*method_)($for ARG , [[CallbackForward(a$(ARG))]]);
+    return (object->*method_)($for ARG , [[a$(ARG)]]);
   }
 
  private:
@@ -290,7 +291,7 @@
     void($for ARG , [[A$(ARG)]])>  {
   static ReturnType MakeItSo(Runnable runnable[[]]
 $if ARITY > 0[[, ]] $for ARG , [[A$(ARG) a$(ARG)]]) {
-    return runnable.Run($for ARG , [[CallbackForward(a$(ARG))]]);
+    return runnable.Run($for ARG , [[a$(ARG)]]);
   }
 };
 
@@ -300,7 +301,7 @@
     void($for ARG , [[A$(ARG)]])>  {
   static void MakeItSo(Runnable runnable[[]]
 $if ARITY > 0[[, ]] $for ARG , [[A$(ARG) a$(ARG)]]) {
-    runnable.Run($for ARG , [[CallbackForward(a$(ARG))]]);
+    runnable.Run($for ARG , [[a$(ARG)]]);
   }
 };
 
@@ -315,7 +316,7 @@
       return;
     }
 
-    runnable.Run($for ARG , [[CallbackForward(a$(ARG))]]);
+    runnable.Run($for ARG , [[a$(ARG)]]);
   }
 };
 
@@ -403,7 +404,7 @@
 ]]
 )>
                ::MakeItSo(storage->runnable_
-$if ARITY > 0[[, ]] $for ARG , [[CallbackForward(x$(ARG))]]);
+$if ARITY > 0[[, ]] $for ARG , [[x$(ARG)]]);
   }
 };
 
diff --git a/base/bind_unittest.cc b/base/bind_unittest.cc
index 354b225..372523b 100644
--- a/base/bind_unittest.cc
+++ b/base/bind_unittest.cc
@@ -5,9 +5,6 @@
 #include "base/bind.h"
 
 #include "base/callback.h"
-#include "base/memory/ref_counted.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/memory/weak_ptr.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -105,7 +102,7 @@
     (*copies_)++;
   }
 
-  // Probing for copies from coercion.
+  // Probing for copies from coerscion.
   CopyCounter(const DerivedCopyCounter& other)
       : copies_(other.copies_),
         assigns_(other.assigns_) {
@@ -152,11 +149,6 @@
   int* deletes_;
 };
 
-template <typename T>
-T PassThru(T scoper) {
-  return scoper.Pass();
-}
-
 // Some test functions that we can Bind to.
 template <typename T>
 T PolymorphicIdentity(T t) {
@@ -676,8 +668,8 @@
   // return the same value.
   Callback<DeleteCounter*(void)> no_capture_cb =
       Bind(&PolymorphicIdentity<DeleteCounter*>, Owned(counter));
-  ASSERT_EQ(counter, no_capture_cb.Run());
-  ASSERT_EQ(counter, no_capture_cb.Run());
+  EXPECT_EQ(counter, no_capture_cb.Run());
+  EXPECT_EQ(counter, no_capture_cb.Run());
   EXPECT_EQ(0, deletes);
   no_capture_cb.Reset();  // This should trigger a delete.
   EXPECT_EQ(1, deletes);
@@ -692,60 +684,11 @@
   EXPECT_EQ(1, deletes);
 }
 
-// Passed() wrapper support.
-//   - Passed() can be constructed from a pointer to scoper.
-//   - Passed() can be constructed from a scoper rvalue.
-//   - Using Passed() gives Callback Ownership.
-//   - Ownership is transferred from Callback to callee on the first Run().
-//   - Callback supports unbound arguments.
-TEST_F(BindTest, ScopedPtr) {
-  int deletes = 0;
-
-  // Tests the Passed() function's support for pointers.
-  scoped_ptr<DeleteCounter> ptr(new DeleteCounter(&deletes));
-  Callback<scoped_ptr<DeleteCounter>(void)> unused_callback =
-      Bind(&PassThru<scoped_ptr<DeleteCounter> >, Passed(&ptr));
-  EXPECT_FALSE(ptr.get());
-  EXPECT_EQ(0, deletes);
-
-  // If we never invoke the Callback, it retains ownership and deletes.
-  unused_callback.Reset();
-  EXPECT_EQ(1, deletes);
-
-  // Tests the Passed() function's support for rvalues.
-  deletes = 0;
-  DeleteCounter* counter = new DeleteCounter(&deletes);
-  Callback<scoped_ptr<DeleteCounter>(void)> callback =
-      Bind(&PassThru<scoped_ptr<DeleteCounter> >,
-           Passed(scoped_ptr<DeleteCounter>(counter)));
-  EXPECT_FALSE(ptr.get());
-  EXPECT_EQ(0, deletes);
-
-  // Check that ownership can be transferred back out.
-  scoped_ptr<DeleteCounter> result = callback.Run();
-  ASSERT_EQ(counter, result.get());
-  EXPECT_EQ(0, deletes);
-
-  // Resetting does not delete since ownership was transferred.
-  callback.Reset();
-  EXPECT_EQ(0, deletes);
-
-  // Ensure that we actually did get ownership.
-  result.reset();
-  EXPECT_EQ(1, deletes);
-
-  // Test unbound argument forwarding.
-  Callback<scoped_ptr<DeleteCounter>(scoped_ptr<DeleteCounter>)> cb_unbound =
-      Bind(&PassThru<scoped_ptr<DeleteCounter> >);
-  ptr.reset(new DeleteCounter(&deletes));
-  cb_unbound.Run(ptr.Pass());
-}
-
 // Argument Copy-constructor usage for non-reference parameters.
 //   - Bound arguments are only copied once.
 //   - Forwarded arguments are only copied once.
-//   - Forwarded arguments with coercions are only copied twice (once for the
-//     coercion, and one for the final dispatch).
+//   - Forwarded arguments with coerscions are only copied twice (once for the
+//     coerscion, and one for the final dispatch).
 TEST_F(BindTest, ArgumentCopies) {
   int copies = 0;
   int assigns = 0;
diff --git a/base/callback.h b/base/callback.h
index 318bff0..abaa438 100644
--- a/base/callback.h
+++ b/base/callback.h
@@ -312,7 +312,7 @@
     PolymorphicInvoke f =
         reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
 
-    return f(bind_state_.get(), internal::CallbackForward(a1));
+    return f(bind_state_.get(), a1);
   }
 
  private:
@@ -353,8 +353,8 @@
     PolymorphicInvoke f =
         reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
 
-    return f(bind_state_.get(), internal::CallbackForward(a1),
-             internal::CallbackForward(a2));
+    return f(bind_state_.get(), a1,
+             a2);
   }
 
  private:
@@ -397,9 +397,9 @@
     PolymorphicInvoke f =
         reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
 
-    return f(bind_state_.get(), internal::CallbackForward(a1),
-             internal::CallbackForward(a2),
-             internal::CallbackForward(a3));
+    return f(bind_state_.get(), a1,
+             a2,
+             a3);
   }
 
  private:
@@ -444,10 +444,10 @@
     PolymorphicInvoke f =
         reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
 
-    return f(bind_state_.get(), internal::CallbackForward(a1),
-             internal::CallbackForward(a2),
-             internal::CallbackForward(a3),
-             internal::CallbackForward(a4));
+    return f(bind_state_.get(), a1,
+             a2,
+             a3,
+             a4);
   }
 
  private:
@@ -495,11 +495,11 @@
     PolymorphicInvoke f =
         reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
 
-    return f(bind_state_.get(), internal::CallbackForward(a1),
-             internal::CallbackForward(a2),
-             internal::CallbackForward(a3),
-             internal::CallbackForward(a4),
-             internal::CallbackForward(a5));
+    return f(bind_state_.get(), a1,
+             a2,
+             a3,
+             a4,
+             a5);
   }
 
  private:
@@ -549,12 +549,12 @@
     PolymorphicInvoke f =
         reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
 
-    return f(bind_state_.get(), internal::CallbackForward(a1),
-             internal::CallbackForward(a2),
-             internal::CallbackForward(a3),
-             internal::CallbackForward(a4),
-             internal::CallbackForward(a5),
-             internal::CallbackForward(a6));
+    return f(bind_state_.get(), a1,
+             a2,
+             a3,
+             a4,
+             a5,
+             a6);
   }
 
  private:
@@ -606,13 +606,13 @@
     PolymorphicInvoke f =
         reinterpret_cast<PolymorphicInvoke>(polymorphic_invoke_);
 
-    return f(bind_state_.get(), internal::CallbackForward(a1),
-             internal::CallbackForward(a2),
-             internal::CallbackForward(a3),
-             internal::CallbackForward(a4),
-             internal::CallbackForward(a5),
-             internal::CallbackForward(a6),
-             internal::CallbackForward(a7));
+    return f(bind_state_.get(), a1,
+             a2,
+             a3,
+             a4,
+             a5,
+             a6,
+             a7);
   }
 
  private:
diff --git a/base/callback.h.pump b/base/callback.h.pump
index d2285e9..2216a3c 100644
--- a/base/callback.h.pump
+++ b/base/callback.h.pump
@@ -293,7 +293,7 @@
     return f(bind_state_.get()[[]]
 $if ARITY != 0 [[, ]]
 $for ARG ,
-             [[internal::CallbackForward(a$(ARG))]]);
+             [[a$(ARG)]]);
   }
 
  private:
diff --git a/base/callback_internal.h b/base/callback_internal.h
index 21599bf..4bb8aa9 100644
--- a/base/callback_internal.h
+++ b/base/callback_internal.h
@@ -13,7 +13,6 @@
 
 #include "base/base_export.h"
 #include "base/memory/ref_counted.h"
-#include "base/memory/scoped_ptr.h"
 
 namespace base {
 namespace internal {
@@ -111,64 +110,6 @@
   typedef const T* StorageType;
 };
 
-// Parameter traits for movable-but-not-copyable scopers.
-//
-// Callback<>/Bind() understands movable-but-not-copyable semantics where
-// the type cannot be copied but can still have its state destructively
-// transferred (aka. moved) to another instance of the same type by calling a
-// helper function.  When used with Bind(), this signifies transferal of the
-// object's state to the target function.
-//
-// For these types, the ForwardType must not be a const reference, or a
-// reference.  A const reference is inappropriate, and would break const
-// correctness, because we are implementing a destructive move.  A non-const
-// reference cannot be used with temporaries which means the result of a
-// function or a cast would not be usable with Callback<> or Bind().
-//
-// TODO(ajwong): We might be able to use SFINAE to search for the existence of
-// a Pass() function in the type and avoid the whitelist in CallbackParamTraits
-// and CallbackForward.
-template <typename T>
-struct CallbackParamTraits<scoped_ptr<T> > {
-  typedef scoped_ptr<T> ForwardType;
-  typedef scoped_ptr<T> StorageType;
-};
-
-template <typename T>
-struct CallbackParamTraits<scoped_array<T> > {
-  typedef scoped_array<T> ForwardType;
-  typedef scoped_array<T> StorageType;
-};
-
-template <typename T>
-struct CallbackParamTraits<scoped_ptr_malloc<T> > {
-  typedef scoped_ptr_malloc<T> ForwardType;
-  typedef scoped_ptr_malloc<T> StorageType;
-};
-
-// CallbackForward() is a very limited simulation of C++11's std::forward()
-// used by the Callback/Bind system for a set of movable-but-not-copyable
-// types.  It is needed because forwarding a movable-but-not-copyable
-// argument to another function requires us to invoke the proper move
-// operator to create a rvalue version of the type.  The supported types are
-// whitelisted below as overloads of the CallbackForward() function. The
-// default template compiles out to be a no-op.
-//
-// In C++11, std::forward would replace all uses of this function.  However, it
-// is impossible to implement a general std::forward with C++11 due to a lack
-// of rvalue references.
-template <typename T>
-T& CallbackForward(T& t) { return t; }
-
-template <typename T>
-scoped_ptr<T> CallbackForward(scoped_ptr<T>& p) { return p.Pass(); }
-
-template <typename T>
-scoped_ptr<T> CallbackForward(scoped_array<T>& p) { return p.Pass(); }
-
-template <typename T>
-scoped_ptr<T> CallbackForward(scoped_ptr_malloc<T>& p) { return p.Pass(); }
-
 }  // namespace internal
 }  // namespace base
 
diff --git a/base/memory/scoped_ptr.h b/base/memory/scoped_ptr.h
index 2d69a9d..5ac6846 100644
--- a/base/memory/scoped_ptr.h
+++ b/base/memory/scoped_ptr.h
@@ -32,41 +32,6 @@
 //     foo.get()->Method();  // Foo::Method on the 0th element.
 //     foo[10].Method();     // Foo::Method on the 10th element.
 //   }
-//
-// These scopers also implement part of the functionality of C++11 unique_ptr
-// in that they are "movable but not copyable."  You can use the scopers in
-// the parameter and return types of functions to signify ownership transfer
-// in to and out of a function.  When calling a function that has a scoper
-// as the argument type, it must be called with the result of an analogous
-// scoper's Pass() function or another function that generates a temporary;
-// passing by copy will NOT work.  Here is an example using scoped_ptr:
-//
-//   void TakesOwnership(scoped_ptr<Foo> arg) {
-//     // Do something with arg
-//   }
-//   scoped_ptr<Foo> CreateFoo() {
-//     // No need for calling Pass() because we are constructing a temporary
-//     // for the return value.
-//     return scoped_ptr<Foo>(new Foo("new"));
-//   }
-//   scoped_ptr<Foo> PassThru(scoped_ptr<Foo> arg) {
-//     return arg.Pass();
-//   }
-//
-//   {
-//     scoped_ptr<Foo> ptr(new Foo("yay"));  // ptr manages Foo("yay)"
-//     TakesOwnership(ptr.Pass());           // ptr no longer owns Foo("yay").
-//     scoped_ptr<Foo> ptr2 = CreateFoo();   // ptr2 owns the return Foo.
-//     scoped_ptr<Foo> ptr3 =                // ptr3 now owns what was in ptr2.
-//         PassThru(ptr2.Pass());            // ptr2 is correspondingly NULL.
-//   }
-//
-// Notice that if you do not call Pass() when returning from PassThru(), or
-// when invoking TakesOwnership(), the code will not compile because scopers
-// are not copyable; they only implement move semantics which require calling
-// the Pass() function to signify a destructive transfer of state. CreateFoo()
-// is different though because we are constructing a temporary on the return
-// line and thus can avoid needing to call Pass().
 
 #ifndef BASE_MEMORY_SCOPED_PTR_H_
 #define BASE_MEMORY_SCOPED_PTR_H_
@@ -82,35 +47,12 @@
 
 #include "base/compiler_specific.h"
 
-// Macro with the boilerplate C++03 move emulation for a class.
-//
-// In C++11, this is done via rvalue references.  Here, we use C++03 move
-// emulation to fake an rvalue reference.  For a more thorough explanation
-// of the technique, see:
-//
-//   http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Move_Constructor
-//
-#define CPP_03_MOVE_EMULATION(scoper, field) \
- private: \
-  struct RValue { \
-    explicit RValue(scoper& obj) : obj_(obj) {} \
-    scoper& obj_; \
-  }; \
- public: \
-  operator RValue() { return RValue(*this); } \
-  scoper(RValue proxy) : field(proxy.obj_.release()) { } \
-  scoper& operator=(RValue proxy) { \
-    swap(proxy.obj_); \
-    return *this; \
-  } \
-  scoper Pass() { return scoper(RValue(*this)); }
-
 // A scoped_ptr<T> is like a T*, except that the destructor of scoped_ptr<T>
 // automatically deletes the pointer it holds (if any).
 // That is, scoped_ptr<T> owns the T object that it points to.
 // Like a T*, a scoped_ptr<T> may hold either NULL or a pointer to a T object.
 // Also like T*, scoped_ptr<T> is thread-compatible, and once you
-// dereference it, you get the thread safety guarantees of T.
+// dereference it, you get the threadsafety guarantees of T.
 //
 // The size of a scoped_ptr is small:
 // sizeof(scoped_ptr<C>) == sizeof(C*)
@@ -180,8 +122,6 @@
     return retVal;
   }
 
-  CPP_03_MOVE_EMULATION(scoped_ptr, ptr_);
-
  private:
   C* ptr_;
 
@@ -191,10 +131,9 @@
   template <class C2> bool operator==(scoped_ptr<C2> const& p2) const;
   template <class C2> bool operator!=(scoped_ptr<C2> const& p2) const;
 
-  // Disallow evil constructors.  Note that MUST NOT take a const& because we
-  // are implementing move semantics.  See the CPP_03_MOVE_EMULATION macro.
-  scoped_ptr(scoped_ptr&);
-  void operator=(scoped_ptr&);
+  // Disallow evil constructors
+  scoped_ptr(const scoped_ptr&);
+  void operator=(const scoped_ptr&);
 };
 
 // Free functions
@@ -219,7 +158,7 @@
 // As with scoped_ptr<C>, a scoped_array<C> either points to an object
 // or is NULL.  A scoped_array<C> owns the object that it points to.
 // scoped_array<T> is thread-compatible, and once you index into it,
-// the returned objects have only the thread safety guarantees of T.
+// the returned objects have only the threadsafety guarantees of T.
 //
 // Size: sizeof(scoped_array<C>) == sizeof(C*)
 template <class C>
@@ -229,7 +168,7 @@
   // The element type
   typedef C element_type;
 
-  // Constructor.  Defaults to initializing with NULL.
+  // Constructor.  Defaults to intializing with NULL.
   // There is no way to create an uninitialized scoped_array.
   // The input parameter must be allocated with new [].
   explicit scoped_array(C* p = NULL) : array_(p) { }
@@ -290,8 +229,6 @@
     return retVal;
   }
 
-  CPP_03_MOVE_EMULATION(scoped_array, array_);
-
  private:
   C* array_;
 
@@ -299,10 +236,9 @@
   template <class C2> bool operator==(scoped_array<C2> const& p2) const;
   template <class C2> bool operator!=(scoped_array<C2> const& p2) const;
 
-  // Disallow evil constructors.  Note that MUST NOT take a const& because we
-  // are implementing move semantics.  See the CPP_03_MOVE_EMULATION macro.
-  scoped_array(scoped_array&);
-  void operator=(scoped_array&);
+  // Disallow evil constructors
+  scoped_array(const scoped_array&);
+  void operator=(const scoped_array&);
 };
 
 // Free functions
@@ -411,8 +347,6 @@
     return tmp;
   }
 
-  CPP_03_MOVE_EMULATION(scoped_ptr_malloc, ptr_);
-
  private:
   C* ptr_;
 
@@ -422,14 +356,11 @@
   template <class C2, class GP>
   bool operator!=(scoped_ptr_malloc<C2, GP> const& p) const;
 
-  // Disallow evil constructors.  Note that MUST NOT take a const& because we
-  // are implementing move semantics.  See the CPP_03_MOVE_EMULATION macro.
-  scoped_ptr_malloc(scoped_ptr_malloc&);
-  void operator=(scoped_ptr_malloc&);
+  // Disallow evil constructors
+  scoped_ptr_malloc(const scoped_ptr_malloc&);
+  void operator=(const scoped_ptr_malloc&);
 };
 
-#undef CPP_03_MOVE_EMULATION
-
 template<class C, class FP> inline
 void swap(scoped_ptr_malloc<C, FP>& a, scoped_ptr_malloc<C, FP>& b) {
   a.swap(b);
diff --git a/base/memory/scoped_ptr_unittest.cc b/base/memory/scoped_ptr_unittest.cc
index 9a37cbf..7519051 100644
--- a/base/memory/scoped_ptr_unittest.cc
+++ b/base/memory/scoped_ptr_unittest.cc
@@ -23,19 +23,6 @@
   DISALLOW_COPY_AND_ASSIGN(ConDecLogger);
 };
 
-scoped_ptr<ConDecLogger> PassThru(scoped_ptr<ConDecLogger> logger) {
-  return logger.Pass();
-}
-
-void GrabAndDrop(scoped_ptr<ConDecLogger> logger) {
-}
-
-// Do not delete this function!  It's existence is to test that you can
-// return a temporarily constructed version of the scoper.
-scoped_ptr<ConDecLogger> TestReturnOfType(int* constructed) {
-  return scoped_ptr<ConDecLogger>(new ConDecLogger(constructed));
-}
-
 }  // namespace
 
 TEST(ScopedPtrTest, ScopedPtr) {
@@ -179,83 +166,4 @@
   EXPECT_EQ(0, constructed);
 }
 
-TEST(ScopedPtrTest, PassBehavior) {
-  int constructed = 0;
-  {
-    ConDecLogger* logger = new ConDecLogger(&constructed);
-    scoped_ptr<ConDecLogger> scoper(logger);
-    EXPECT_EQ(1, constructed);
-
-    // Test Pass() with constructor;
-    scoped_ptr<ConDecLogger> scoper2(scoper.Pass());
-    EXPECT_EQ(1, constructed);
-
-    // Test Pass() with assignment;
-    scoped_ptr<ConDecLogger> scoper3;
-    scoper3 = scoper2.Pass();
-    EXPECT_EQ(1, constructed);
-    EXPECT_FALSE(scoper.get());
-    EXPECT_FALSE(scoper2.get());
-    EXPECT_TRUE(scoper3.get());
-  }
-
-  // Test uncaught Pass() does not leak.
-  {
-    ConDecLogger* logger = new ConDecLogger(&constructed);
-    scoped_ptr<ConDecLogger> scoper(logger);
-    EXPECT_EQ(1, constructed);
-
-    // Should auto-destruct logger by end of scope.
-    scoper.Pass();
-    EXPECT_FALSE(scoper.get());
-  }
-  EXPECT_EQ(0, constructed);
-
-  // Test that passing to function which does nothing does not leak.
-  {
-    ConDecLogger* logger = new ConDecLogger(&constructed);
-    scoped_ptr<ConDecLogger> scoper(logger);
-    EXPECT_EQ(1, constructed);
-
-    // Should auto-destruct logger by end of scope.
-    GrabAndDrop(scoper.Pass());
-    EXPECT_FALSE(scoper.get());
-  }
-  EXPECT_EQ(0, constructed);
-}
-
-TEST(ScopedPtrTest, ReturnTypeBehavior) {
-  int constructed = 0;
-
-  // Test that we can return a scoped_ptr.
-  {
-    ConDecLogger* logger = new ConDecLogger(&constructed);
-    scoped_ptr<ConDecLogger> scoper(logger);
-    EXPECT_EQ(1, constructed);
-
-    PassThru(scoper.Pass());
-    EXPECT_FALSE(scoper.get());
-  }
-  EXPECT_EQ(0, constructed);
-
-  // Test uncaught return type not leak.
-  {
-    ConDecLogger* logger = new ConDecLogger(&constructed);
-    scoped_ptr<ConDecLogger> scoper(logger);
-    EXPECT_EQ(1, constructed);
-
-    // Should auto-destruct logger by end of scope.
-    PassThru(scoper.Pass());
-    EXPECT_FALSE(scoper.get());
-  }
-  EXPECT_EQ(0, constructed);
-
-  // Call TestReturnOfType() so the compiler doesn't warn for an unused
-  // function.
-  {
-    TestReturnOfType(&constructed);
-  }
-  EXPECT_EQ(0, constructed);
-}
-
 // TODO scoped_ptr_malloc