Procházet zdrojové kódy

* 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 -

Jonas Maebe před 15 roky
rodič
revize
83c3e7a94b
3 změnil soubory, kde provedl 45 přidání a 10 odebrání
  1. 1 0
      .gitattributes
  2. 13 10
      compiler/ninl.pas
  3. 31 0
      tests/tbs/tb0567.pp

+ 1 - 0
.gitattributes

@@ -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

+ 13 - 10
compiler/ninl.pas

@@ -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 - 0
tests/tbs/tb0567.pp

@@ -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.