Why do you want the code to be illegal? I can imagine use cases where something like that is exactly what you want. I do agree that this is a bit ugly. And how far do you want to go? Since cstring is a pointer type, should this be illegal, too?: var heap: ptr int proc intPtrEscapes(ip: ptr int) = heap = ip var i = 123 intPtrEscapes(ip.addr)
If you **really** want to prevent **all** dangerous usages, you can restrict cstring to be allowed as parameters for procedures. Then you can be sure when someone want's to keep a value of a cstring somewhere he needs to call `$` or something similar to copy the value. But isn't cstring the type you mostly need for writing wrappers? The code where you are often forced to do some "unsafe" operations in order to get it running?