2
0
Эх сурвалжийг харах

* compare longint-cardinal also makes types wider

peter 22 жил өмнө
parent
commit
4245cedfed
1 өөрчлөгдсөн 37 нэмэгдсэн , 40 устгасан
  1. 37 40
      compiler/nadd.pas

+ 37 - 40
compiler/nadd.pas

@@ -738,39 +738,20 @@ implementation
              { is there a cardinal? }
              else if ((torddef(rd).typ=u32bit) or (torddef(ld).typ=u32bit)) then
                begin
-                 if is_signed(ld) and
-                    { then rd = u32bit }
-                    (nodetype in [addn,subn,muln]) and
-                    { convert positive constants to u32bit }
-                    not(is_constintnode(left) and
-                        (tordconstnode(left).value >= 0)) then
+                 { and,or,xor work on bit patterns and don't care
+                   about the sign }
+                 if nodetype in [andn,orn,xorn] then
                    begin
-                     { perform the operation in 64bit }
-                     CGMessage(type_w_mixed_signed_unsigned);
-                     inserttypeconv(left,cs64bittype);
-                     inserttypeconv(right,cs64bittype);
+                     inserttypeconv_explicit(left,u32bittype);
+                     inserttypeconv_explicit(right,u32bittype);
                    end
                  else
                    begin
-                     { and,or,xor work on bit patterns and don't care
-                       about the sign }
-                     if nodetype in [andn,orn,xorn] then
-                      inserttypeconv_explicit(left,u32bittype)
-                     else
-                      begin
-                        if is_signed(ld) and
-                           not(is_constintnode(left) and
-                               (tordconstnode(left).value >= 0)) then
-                          CGMessage(type_w_mixed_signed_unsigned2);
-                        inserttypeconv(left,u32bittype);
-                      end;
-
-                     if is_signed(rd) and
-                        { then ld = u32bit }
-                        (nodetype in [addn,subn,muln]) and
+                     if is_signed(ld) and
+                        { then rd = u32bit }
                         { convert positive constants to u32bit }
-                        not(is_constintnode(right) and
-                            (tordconstnode(right).value >= 0)) then
+                        not(is_constintnode(left) and
+                            (tordconstnode(left).value >= 0)) then
                        begin
                          { perform the operation in 64bit }
                          CGMessage(type_w_mixed_signed_unsigned);
@@ -779,18 +760,31 @@ implementation
                        end
                      else
                        begin
-                         { and,or,xor work on bit patterns and don't care
-                           about the sign }
-                         if nodetype in [andn,orn,xorn] then
-                          inserttypeconv_explicit(left,u32bittype)
+                         if is_signed(ld) and
+                            not(is_constintnode(left) and
+                                (tordconstnode(left).value >= 0)) then
+                           CGMessage(type_w_mixed_signed_unsigned2);
+                         inserttypeconv(left,u32bittype);
+
+                         if is_signed(rd) and
+                            { then ld = u32bit }
+                            { convert positive constants to u32bit }
+                            not(is_constintnode(right) and
+                                (tordconstnode(right).value >= 0)) then
+                           begin
+                             { perform the operation in 64bit }
+                             CGMessage(type_w_mixed_signed_unsigned);
+                             inserttypeconv(left,cs64bittype);
+                             inserttypeconv(right,cs64bittype);
+                           end
                          else
-                          begin
-                            if is_signed(rd) and
-                               not(is_constintnode(right) and
-                                   (tordconstnode(right).value >= 0)) then
-                              CGMessage(type_w_mixed_signed_unsigned2);
-                            inserttypeconv(right,u32bittype);
-                          end;
+                           begin
+                             if is_signed(rd) and
+                                not(is_constintnode(right) and
+                                    (tordconstnode(right).value >= 0)) then
+                               CGMessage(type_w_mixed_signed_unsigned2);
+                             inserttypeconv(right,u32bittype);
+                           end;
                        end;
                    end;
                end
@@ -1875,7 +1869,10 @@ begin
 end.
 {
   $Log$
-  Revision 1.98  2003-10-21 18:16:13  peter
+  Revision 1.99  2003-10-28 15:35:18  peter
+    * compare longint-cardinal also makes types wider
+
+  Revision 1.98  2003/10/21 18:16:13  peter
     * IncompatibleTypes() added that will include unit names when
       the typenames are the same