var c1, c2: Cardinal; begin c1:= 0; c2:= 100; Inc(c1, c2);
Варнинг относится к строчке инкремента, и выдается только если включена любая из проверок: Range, Overflow, Verify method calls. проверки IO и Stack не влияют. Причем это не просто варнинг, при включенных проверках оно реально генерит код 64-битного сложения. Может так задумано? P.S. fpc-2.2.2/Win32
посмотри какого типа формальные параметры у функции Inc - скорее всего целый знаковый, вот тебе компилятор и говорит, что тут можно и нарваться за выход диапазона значений (обрежет твое число). замени на
Никто не спорит, что варнинги -- это полезно. Но вот что касается Inc/Dec, то это вроде как не функции, это операторы-псевдофункции по типу SizeOf/ReadLn/WriteLn. Они умеют работать с любыми ordinal-ами (а не только с целыми числами), а значит ни о каком знаке тут речи идти не может. А сишные операторы не подходят т.к. нужна совместимость с Delphi.
mike писал(а):Никто не спорит, что варнинги -- это полезно. Но вот что касается Inc/Dec, то это вроде как не функции, это операторы-псевдофункции по типу SizeOf/ReadLn/WriteLn. Они умеют работать с любыми ordinal-ами (а не только с целыми числами), а значит ни о каком знаке тут речи идти не может.
Ну, это Вы уже на другую тему перескочили. Компилятор то совершенно о другом говорит - то что Вы получаете в результате действия Inc() - это уже другой тип данных и об этом Вы должны знать на случай, если будет какая-то неявная ошибка в вычислениях..
Компилятор ведет себя несколько параноидально в отношении беззнаковых чисел. При любом намеке на вычитание он считает, что результат имеет знак, и если при этом в выражении есть другие беззнаковые операнды - генерится 64-битный код. Судя по этом посту, вычитание даже не обязательно... хотя нужно поглядеть своими глазами, может оно откуда из кода проверки берется. С другой стороны, 2.2.2 уже весьма стар, имеет смысл смотреть на 2.2.4.
Судя по всему, в режиме вышеназванных проверок компилятор просто использует старшие 32 бита результата как признак переполнения. Странный подход, ведь проверки CF вполне достаточно. Или может это результат обобщения на случай иных аппаратных платформ, в которых вместо установки флага переполнения генерится исключение?