Yes. The documentation.
https://www.freepascal.org/docs-html/ref/refsu56.html
First sentence.
That's unfair, because he says "a,b and c are declared and initialized Strings". So while he can be faulted for relying on that statement and not posting a compilable program, I feel that the point made by the manual needs expansion.
What matters is /how/ they're declared, and /how/ they're initialised: basically
const
a= 'a';
b= 'b';
c= 'c';
is OK, while neither
var
a: string= 'a';
b: string= 'b';
c: string= 'c';
nor the precisely-equivalent
var
a, b, c: string;
begin
a := 'a';
b := 'b';
c := 'c'
end.
is acceptable since in those cases a, b and c are storage locations initialised by runtime code, rather than being constants fully accessible to the compiler. And that rule applies to both case statements operating on ordinals (integer, individual characters etc.) which I believe are implemented by jump tables, ans case statements operating on strings which are basically "syntactic sugar" translated to if-then-else etc.
It could be argued that the compiler should be able to work it out, but basically the developers have to stop somewhere and IMO there's already too much in the core language.
MarkMLl