Browse Source

+ constant operations on enums, only in fpc mode

peter 26 years ago
parent
commit
d38e5e0d34
1 changed files with 20 additions and 9 deletions
  1. 20 9
      compiler/tcadd.pas

+ 20 - 9
compiler/tcadd.pas

@@ -80,6 +80,7 @@ implementation
          lt,rt   : ttreetyp;
          rv,lv   : longint;
          rvd,lvd : bestreal;
+         resdef,
          rd,ld   : pdef;
          tempdef : pdef;
          concatstrings : boolean;
@@ -191,18 +192,25 @@ implementation
               rt:=realconstn;
            end;
 
-       { both are int constants ? }
-         if is_constintnode(p^.left) and is_constintnode(p^.right) then
+       { both are int constants, also allow operations on two equal enums
+         in fpc mode (Needed for conversion of C code) }
+         if ((lt=ordconstn) and (rt=ordconstn)) and
+            ((is_constintnode(p^.left) and is_constintnode(p^.right)) or
+             ((ld^.deftype=enumdef) and is_equal(ld,rd) and (m_fpc in aktmodeswitches))) then
            begin
+              if ld^.deftype=enumdef then
+                resdef:=ld
+              else
+                resdef:=s32bitdef;
               lv:=p^.left^.value;
               rv:=p^.right^.value;
               case p^.treetype of
-                addn : t:=genordinalconstnode(lv+rv,s32bitdef);
-                subn : t:=genordinalconstnode(lv-rv,s32bitdef);
-                muln : t:=genordinalconstnode(lv*rv,s32bitdef);
-                xorn : t:=genordinalconstnode(lv xor rv,s32bitdef);
-                 orn : t:=genordinalconstnode(lv or rv,s32bitdef);
-                andn : t:=genordinalconstnode(lv and rv,s32bitdef);
+                addn : t:=genordinalconstnode(lv+rv,resdef);
+                subn : t:=genordinalconstnode(lv-rv,resdef);
+                muln : t:=genordinalconstnode(lv*rv,resdef);
+                xorn : t:=genordinalconstnode(lv xor rv,resdef);
+                 orn : t:=genordinalconstnode(lv or rv,resdef);
+                andn : t:=genordinalconstnode(lv and rv,resdef);
                  ltn : t:=genordinalconstnode(ord(lv<rv),booldef);
                 lten : t:=genordinalconstnode(ord(lv<=rv),booldef);
                  gtn : t:=genordinalconstnode(ord(lv>rv),booldef);
@@ -1074,7 +1082,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.29  1999-05-06 09:05:32  peter
+  Revision 1.30  1999-05-11 00:47:02  peter
+    + constant operations on enums, only in fpc mode
+
+  Revision 1.29  1999/05/06 09:05:32  peter
     * generic write_float and str_float
     * fixed constant float conversions