I don't know of a succinct set of rules and it's not that well documented. However, from the reference:
And as for the example:
// Reborrows can happen as a form of coercion at coercion sites
// A binding with an type annotation is a coercion site:
let sss: &mut String;
sss = mut_ref_s; //reborrow from mut_ref_s
// Function parameters annotated to be `&mut _` reborrow too
dummy(mut_ref_s); // moving newly reborrowed tmp from mut_ref_s
// Bindings without explicit types do not coerce or reborrow
let ss = mut_ref_s; // moving mut_ref_s;