OTOH, non declared for loop variables would be an accepted change not needing much discussion, IMO.
Actually, I disagree. IMO a control variable should be defined in the FOR statement itself, which would (a) ensure that type checking could still be used and (b) restrict its scope to the statement immediately following. Wirth's hack that the control variable has an undefined value after a FOR loop is one of the worst things he did, and that was compounded when somebody else added the break statement which (if taken) /did/ leave it with a defined value.
As discussed once upon a time, by not declared, I mean in the VAR section. Thus:
for i := 1 to 100 do // i scope begins and is assigned a register or pushed onto the stack here
begin
blaber(i,x);
if (x> -0.1) and (x<0.1) then break;
fliber (x);
end; // i ceases to exist here
b := a + i; // compiler error
Whether the undeclared value could be another sort of enumeration: for b := apples to oranges do
should be okay, but might prove harder to implement (or not).
I'm pretty sure I used a Pascal compiler once upon a time where the final value of the control variable was either the last value of the loop or the successor, but that may have been a fluke. Just tested it and in both main code and a procedure, the word value is the last value of the loop range after the loop exits. (cue: "But that's not specified, and therefor cannot be relied upon").
OTOH, if the control var is outside of a procedure it can be modified by a called procedure. madness!
As to break (et al), (what a welcome addition! ) it's natural that the control value be as at the break point as it may have been a search of some kind and so i being an index to something would be obviously useful.