* fixed pred/succ for integer constants that equal the low/high bound of a

built-in integer type (reported by Stefan Kisdaroczi) 

git-svn-id: trunk@14537 -
This commit is contained in:
Jonas Maebe 2010-01-04 15:12:27 +00:00
parent 40cea8d4d5
commit 83c3e7a94b
3 changed files with 45 additions and 10 deletions

1
.gitattributes vendored
View File

@ -8254,6 +8254,7 @@ tests/tbs/tb0561b.pp svneol=native#text/plain
tests/tbs/tb0564.pp svneol=native#text/plain
tests/tbs/tb0565.pp svneol=native#text/plain
tests/tbs/tb0566.pp svneol=native#text/plain
tests/tbs/tb0567.pp svneol=native#text/plain
tests/tbs/tb205.pp svneol=native#text/plain
tests/tbs/ub0060.pp svneol=native#text/plain
tests/tbs/ub0069.pp svneol=native#text/plain

View File

@ -1413,7 +1413,6 @@ implementation
hp : tnode;
vl,vl2 : TConstExprInt;
vr : bestreal;
checkrange: boolean;
begin { simplify }
result:=nil;
@ -1635,16 +1634,20 @@ implementation
in_pred_x,
in_succ_x:
begin
{ only perform range checking if the result is an enum }
checkrange:=(resultdef.typ=enumdef);
if (left.nodetype=ordconstn) then
begin
if (inlinenumber=in_succ_x) then
result:=cordconstnode.create(tordconstnode(left).value+1,left.resultdef,checkrange)
else
result:=cordconstnode.create(tordconstnode(left).value-1,left.resultdef,checkrange);
end;
begin
if (inlinenumber=in_succ_x) then
vl:=tordconstnode(left).value+1
else
vl:=tordconstnode(left).value-1;
if is_integer(left.resultdef) then
{ the type of the original integer constant is irrelevant,
it should be automatically adapted to the new value }
result:=genintconstnode(vl)
else
{ check the range for enums, chars, booleans }
result:=cordconstnode.create(vl,left.resultdef,true)
end
end;
in_low_x,
in_high_x:

31
tests/tbs/tb0567.pp Normal file
View File

@ -0,0 +1,31 @@
begin
if (pred(-128)<>-129) or
(succ(127)<>128) then
halt(1);
if (pred(0)<>-1) or
(succ(255)<>256) then
halt(2);
if (pred(-32768)<>-32769) or
(succ(32767)<>32768) then
halt(3);
if (succ(65535)<>65536) then
halt(4);
if (pred(-2147483648)<>-2147483649) or
(succ(2147483647)<>2147483648) then
halt(5);
if (succ(4294967295)<>4294967296) then
halt(6);
if (pred(bytebool(false))<>bytebool(true)) then
halt(7);
if (succ(bytebool(true))<>bytebool(false)) then
halt(8);
if (pred(wordbool(false))<>wordbool(true)) then
halt(9);
if (succ(wordbool(true))<>wordbool(false)) then
halt(10);
if (pred(longbool(false))<>longbool(true)) then
halt(11);
if (succ(longbool(true))<>longbool(false)) then
halt(12);
end.