Browse Source

* integrated hack from 1.0.x so we can parse low(int64) as int64 instead
of as double (in 1.0.x, it was necessary for low(longint))

Jonas Maebe 21 years ago
parent
commit
b46b7ff792
1 changed files with 35 additions and 3 deletions
  1. 35 3
      compiler/pexpr.pas

+ 35 - 3
compiler/pexpr.pas

@@ -2200,8 +2200,36 @@ implementation
            _MINUS :
              begin
                consume(_MINUS);
-               p1:=sub_expr(oppower,false);
-               p1:=cunaryminusnode.create(p1);
+               if (token = _INTCONST) then
+                  begin
+                    { ugly hack, but necessary to be able to parse }
+                    { -9223372036854775808 as int64 (JM)           }
+                    pattern := '-'+pattern;
+                    p1:=sub_expr(oppower,false);
+                    {  -1 ** 4 should be - (1 ** 4) and not
+                       (-1) ** 4
+                       This was the reason of tw0869.pp test failure PM }
+                    if p1.nodetype=starstarn then
+                      begin
+                        if tbinarynode(p1).left.nodetype=ordconstn then
+                          begin
+                            tordconstnode(tbinarynode(p1).left).value:=-tordconstnode(tbinarynode(p1).left).value;
+                            p1:=cunaryminusnode.create(p1);
+                          end
+                        else if tbinarynode(p1).left.nodetype=realconstn then
+                          begin
+                            trealconstnode(tbinarynode(p1).left).value_real:=-trealconstnode(tbinarynode(p1).left).value_real;
+                            p1:=cunaryminusnode.create(p1);
+                          end
+                        else
+                          internalerror(20021029);
+                      end;
+                  end
+               else
+                 begin
+                   p1:=sub_expr(oppower,false);
+                   p1:=cunaryminusnode.create(p1);
+                 end;
              end;
 
            _OP_NOT :
@@ -2497,7 +2525,11 @@ implementation
 end.
 {
   $Log$
-  Revision 1.144  2003-12-08 22:35:28  peter
+  Revision 1.145  2003-12-29 17:19:35  jonas
+    * integrated hack from 1.0.x so we can parse low(int64) as int64 instead
+      of as double (in 1.0.x, it was necessary for low(longint))
+
+  Revision 1.144  2003/12/08 22:35:28  peter
     * again procvar fixes
 
   Revision 1.143  2003/11/29 16:19:54  peter