That is exactly what I though when I looked at your code snippet. Indeed caffe only propagates diffs backwards. The loss layer is responsible to compute the topmost diff values. Since you provided them yourself, there is no need for a loss layer.
By the way: I don't think caffe creates any layer automatically that you did not explicitly request. And for the loss: I have read (but not used myself) that in caffe every layer can made to contribute to the loss, by setting "loss_weight" to something other than 0 (
https://groups.google.com/d/msg/caffe-users/4wRzMk5Lq0g/YrQpPeEAEQAJ). Not sure how/if this is useful, but it is nice to have the flexibility. loss_weight is by default 1 for layers of loss type and 0 for all other layers.
Jan