It's not a problem that's unique to message-chaining though, though admittedly I see I didn't do a great job of proving that in this commit.

If I change the spec in this commit to :+1: 
```diff
diff --git a/spec/rspec/mocks/matchers/receive_messages_spec.rb b/spec/rspec/mocks/matchers/receive_messages_spec.rb
index b28ad69..bba0acf 100644
--- a/spec/rspec/mocks/matchers/receive_messages_spec.rb
+++ b/spec/rspec/mocks/matchers/receive_messages_spec.rb
@@ -88,6 +88,16 @@ module RSpec
         expect(expectation_error.backtrace[0]).to match(/#{__FILE__}:#{line}/)
       end
 
+      describe 'when verifying fails' do
+        let(:obj2) { double "Object" }
+        it 'cleans up all remaining expectations' do
+          expect(obj).to receive_messages(:a => 1, :b => 2)
+          expect(obj2).to receive_messages(:c => 1, :d => 2)
+          expect { RSpec::Mocks.space.verify_all }.to raise_error RSpec::Mocks::MockExpectationError
+          expect { RSpec::Mocks.space.verify_all }.not_to raise_error
+        end
+      end
+
       it_behaves_like "complains when given blocks"
       it_behaves_like "handles partially mocked objects correctly"
     end
```

then it fails, because you have separate expectations on `obj` & `obj2`, and only the first lot are cleared out by the first `verify_all`.