I just noticed the following piece of code in sf::Image::copy (
Image.cpp line 176 and 177):
if (srcRect.width > static_cast<int>(source.m_size.x)) srcRect.width = source.m_size.x;
if (srcRect.height > static_cast<int>(source.m_size.y)) srcRect.height = source.m_size.y;
The source rectangle may still be larger than the source texture this way (e.g. if srcRect.left > 0 and srcRect.width = width of source image).
I suppose what was meant is this:
if (srcRect.width > static_cast<int>(source.m_size.x) - srcRect.left) srcRect.width = source.m_size.x - srcRect.left;
if (srcRect.height > static_cast<int>(source.m_size.y) - srcRect.top ) srcRect.height = source.m_size.y - srcRect.top;