Simple test case:
diff --git a/base/bind_unittest.cc b/base/bind_unittest.cc
index 99aaa76ed302..f5c48f898cbf 100644
--- a/base/bind_unittest.cc
+++ b/base/bind_unittest.cc
@@ -1410,5 +1410,13 @@ TEST(BindDeathTest, NullCallback) {
EXPECT_DCHECK_DEATH(base::Bind(null_cb, 42));
}
+void TakesMoveOnly(std::unique_ptr<int> x) {}
+
+TEST(BindFailTest, BindIncompatible) {
+ auto x = std::make_unique<int>(8);
+ // auto cb = base::Bind(&TakesMoveOnly, std::move(x));
+ auto cb2 = base::BindOnce(&TakesMoveOnly, x);
+}
+
} // namespace
} // namespace base
This doesn't hit the static assert, but it causes a failure later:
../../base/bind_internal.h:451:9: error: no matching constructor for initialization of 'std::tuple<u
nique_ptr<int, default_delete<int> > >'
bound_args_(std::forward<ForwardBoundArgs>(bound_args)...) {
^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../../base/bind_internal.h:421:9: note: in instantiation of function template specialization 'base::
internal::BindState<void (*)(std::__1::unique_ptr<int, std::__1::default_delete<int> >), std::__1::u
nique_ptr<int, std::__1::default_delete<int> > >::BindState<void (*)(std::__1::unique_ptr<int, std::
__1::default_delete<int> >), std::__1::unique_ptr<int, std::__1::default_delete<int> > &>' requested
here
: BindState(IsCancellable{},
^
Comment 1 by bugdroid1@chromium.org
, Aug 30 2017