| Index: base/bind_unittest.cc
|
| diff --git a/base/bind_unittest.cc b/base/bind_unittest.cc
|
| index 654a2775a2f23efc2f266d8db8286e20fed15b0a..372523ba99cde6b9c06279b6f91fb40f9a3cdf61 100644
|
| --- a/base/bind_unittest.cc
|
| +++ b/base/bind_unittest.cc
|
| @@ -199,10 +199,18 @@ void RefArgSet(int &n) {
|
| n = 2;
|
| }
|
|
|
| +void PtrArgSet(int *n) {
|
| + *n = 2;
|
| +}
|
| +
|
| int FunctionWithWeakFirstParam(WeakPtr<NoRef> o, int n) {
|
| return n;
|
| }
|
|
|
| +void TakesACallback(const Closure& callback) {
|
| + callback.Run();
|
| +}
|
| +
|
| class BindTest : public ::testing::Test {
|
| public:
|
| BindTest() {
|
| @@ -284,6 +292,25 @@ TEST_F(BindTest, CurryingTest) {
|
| EXPECT_EQ(63, c0.Run());
|
| }
|
|
|
| +// Test that currying the rvalue result of another Bind() works correctly.
|
| +// - rvalue should be usable as argument to Bind().
|
| +// - multiple runs of resulting Callback remain valid.
|
| +TEST_F(BindTest, CurryingRvalueResultOfBind) {
|
| + int n = 0;
|
| + Closure cb = base::Bind(&TakesACallback, base::Bind(&PtrArgSet, &n));
|
| +
|
| + // If we implement Bind() such that the return value has auto_ptr-like
|
| + // semantics, the second call here will fail because ownership of
|
| + // the internal BindState<> would have been transfered to a *temporary*
|
| + // constructon of a Callback object on the first call.
|
| + cb.Run();
|
| + EXPECT_EQ(2, n);
|
| +
|
| + n = 0;
|
| + cb.Run();
|
| + EXPECT_EQ(2, n);
|
| +}
|
| +
|
| // Function type support.
|
| // - Normal function.
|
| // - Normal function bound with non-refcounted first argument.
|
|
|