@Mikhail
Снимаю шляпу за твою подробную выборку...
Стандарты то же меняются, до него был другой и этот со временем заменится на новый.
По крайней мере там должно быть описание про break и continue.
А теперь заметь, что все выписки относятся не к языку, а компиляторам и связаны они в основном с одной причиной:
использование в цикле вместо самой переменной ее дубля (это особенности компиляторов).
В описании работы компилятора должны быть четко указаны все ограничения.
Иначе, в случае ошибки программы ставшей причиной аварии, по вине компилятора будет отвечать его разработчик.
Поэтому все используют отказ от ответственности, когда штраф, в случае ошибки по их вине, не может быть больше цены самого продукта.
А вот тебе еще вариант, который не меняет i, но работает не как пример в стандарте:
var
i: Integer;
SL: TStringList;
begin
SL:= TStringList.Create;
SL.Add('1');
for i := 0 to SL.Count do
begin
WriteLn(IntToStr(i));
if i = 0 then SL.Add('2');
end;
В приведенном аналоге стандарта ISO, цикл будет один, а у меня получается два!!!
По твоему, значит ли это, что Lazarus не соответствует ISO и его надо менять!!!

Я не вижу принципиальной разницы между этими двумя переменными (e1 и e2).
Как было сказано выше, результат может отличаться при использовании в компиляторе ++i или i++
И это не относится к правилам языка.