Given that it's relatively harmless to do something like for x in * do local y=$x:r # etc. done It occurred to me that it should similarly be possible to do that with "local -P" or "private", but without the appended patch that generates a warning message and leaves $y unchanged without aborting the loop. With the below it remains an error to try to change the type of a private parameter (and that is an actual error rather than just a warning, like most other typeset errors) but simply reassigning something of the same type is allowed.