Very odd, I always get -1 (windows 7, fpc 3.0.4, 32 bit).
From
http://wiki.freepascal.org/Shr: "unlike the >> operator in the C language, the shr operator is a logical (not arithmetic) bit shift, even if the left operand is a signed integer. An implicit typecast and extension to a larger unsigned type may be performed before the shift operation."
I guess the shr is in fact done on the native integer size 32 bit:
vs := -1;
writeln (vs shr 1);
results in 2147483647 ($7FFFFFFF)
The code
hence tries to assign 2147483647 to a smallint which is not possible. When turning on the range checks {$R+}, which is always a good idea, the code throws a range check error, otherwise vs will be -1. I am rather surprised that some get a different result than that.