فهرست منبع

Merged revisions 9264 via svnmerge from
http://svn.freepascal.org/svn/fpc/trunk

........
r9264 | yury | 2007-11-16 15:52:19 +0200 (Пт, 16 ноя 2007) | 3 lines

* Improved warning "Converting pointers to signed integers may result in wrong comparison results and range errors, use an unsigned type instead.":
- check for procedure and class pointers as well;
- do not warn if typecasted pointer is passed as parameter or directly assigned to a variable.
........

git-svn-id: branches/fixes_2_2@10293 -

yury 17 سال پیش
والد
کامیت
62ae8ce47f
3فایلهای تغییر یافته به همراه9 افزوده شده و 4 حذف شده
  1. 2 0
      compiler/ncal.pas
  2. 5 4
      compiler/ncnv.pas
  3. 2 0
      compiler/nld.pas

+ 2 - 0
compiler/ncal.pas

@@ -747,6 +747,8 @@ implementation
            internalerror(200305091);
          expr.fileinfo:=fileinfo;
          callparaflags:=[];
+         if expr.nodetype = typeconvn then
+           ttypeconvnode(expr).warn_pointer_to_signed:=false;
       end;
 
     destructor tcallparanode.destroy;

+ 5 - 4
compiler/ncnv.pas

@@ -37,6 +37,7 @@ interface
           totypedef   : tdef;
           totypedefderef : tderef;
           convtype : tconverttype;
+          warn_pointer_to_signed: boolean;
           constructor create(node : tnode;def:tdef);virtual;
           constructor create_explicit(node : tnode;def:tdef);
           constructor create_internal(node : tnode;def:tdef);
@@ -661,10 +662,6 @@ implementation
              muln:
                cgmessage1(type_h_convert_mul_operands_to_prevent_overflow,def.gettypename);
            end;
-         {Converting pointers to signed integers is a bad idea. Warn.}
-         if (node.resultdef<>nil) and (node.resultdef.typ=pointerdef) and
-           (def.typ=orddef) and (Torddef(def).ordtype in [s8bit,s16bit,s32bit,s64bit]) then
-           cgmessage(type_w_pointer_to_signed);
       end;
 
 
@@ -1927,6 +1924,8 @@ implementation
             ((resultdef.typ=orddef) and
              (left.resultdef.typ in [pointerdef,procvardef,classrefdef]))) then
           begin
+            {Converting pointers to signed integers is a bad idea. Warn.}
+            warn_pointer_to_signed:=(resultdef.typ=orddef) and (Torddef(resultdef).ordtype in [s8bit,s16bit,s32bit,s64bit]);
             { Give a warning when sizes don't match, because then info will be lost }
             if left.resultdef.size=resultdef.size then
               CGMessage(type_h_pointer_to_longint_conv_not_portable)
@@ -2727,6 +2726,8 @@ implementation
 
     function ttypeconvnode.pass_1 : tnode;
       begin
+        if warn_pointer_to_signed then
+          cgmessage(type_w_pointer_to_signed);
         result:=nil;
         firstpass(left);
         if codegenerror then

+ 2 - 0
compiler/nld.pas

@@ -458,6 +458,8 @@ implementation
          inherited create(assignn,l,r);
          l.mark_write;
          assigntype:=at_normal;
+         if r.nodetype = typeconvn then
+           ttypeconvnode(r).warn_pointer_to_signed:=false;
       end;