I think a compiler directive is too broad here because you usually don't want it for all types (in particular simple types).
Why would you have "const" on a simple type which would be passed by value to get the same result...?
As far as I can see, the only purpose in the "const" keyword in this case is to get it passed by reference, but not allowed to be modified so you can pass things like strings and records without the cost of copying or the fear of changing your source. For simple types you would just pass by value.
But even then, I'm happy for the compiler to say: "const" with simple values does nothing, "const" with not-simple values is undefined unless the compiler directive XYZ is set, in which case it always passes by reference.
As you all know, I don't like adding new keywords either. Reusing existing keywords is a bit better ... `const var Foo: Bar' ...?
That's fine by me, except if that would allow passing constant strings and such, then how is it different to "protected var" allowing passing constant strings? The latter seems the easiest solution (not to mention keeping the current status and not requiring me to go and change all the interfaces again ;).
Enjoy, Peter.