ソースを参照

* fixed warnings for length/high/low(<normal array>; <ord>; <enum>)

git-svn-id: trunk@5795 -
florian 18 年 前
コミット
80d4887e67
3 ファイル変更34 行追加2 行削除
  1. 1 0
      .gitattributes
  2. 10 2
      compiler/ninl.pas
  3. 23 0
      tests/tbs/tb0521.pp

+ 1 - 0
.gitattributes

@@ -6246,6 +6246,7 @@ tests/tbs/tb0517.pp svneol=native#text/plain
 tests/tbs/tb0518.pp svneol=native#text/plain
 tests/tbs/tb0519.pp svneol=native#text/plain
 tests/tbs/tb0520.pp svneol=native#text/plain
+tests/tbs/tb0521.pp svneol=native#text/plain
 tests/tbs/ub0060.pp svneol=native#text/plain
 tests/tbs/ub0069.pp svneol=native#text/plain
 tests/tbs/ub0119.pp svneol=native#text/plain

+ 10 - 2
compiler/ninl.pas

@@ -1111,6 +1111,7 @@ implementation
            case def.typ of
              orddef:
                begin
+                  set_varstate(left,vs_read,[]);
                   if inlinenumber=in_low_x then
                     v:=torddef(def).low
                   else
@@ -1150,6 +1151,7 @@ implementation
                end;
              enumdef:
                begin
+                  set_varstate(left,vs_read,[]);
                   enum:=tenumsym(tenumdef(def).firstenum);
                   v:=tenumdef(def).maxval;
                   if inlinenumber=in_high_x then
@@ -1567,7 +1569,11 @@ implementation
 
               in_length_x:
                 begin
-                  set_varstate(left,vs_read,[vsf_must_be_valid]);
+                  if not(is_special_array(left.resultdef)) or
+                    (left.resultdef.typ=orddef) then
+                    set_varstate(left,vs_read,[])
+                  else
+                    set_varstate(left,vs_read,[vsf_must_be_valid]);
 
                   case left.resultdef.typ of
                     variantdef:
@@ -1887,6 +1893,7 @@ implementation
                       begin
                         if inlinenumber=in_low_x then
                          begin
+                           set_varstate(left,vs_read,[]);
                            result:=cordconstnode.create(tarraydef(
                             left.resultdef).lowrange,tarraydef(left.resultdef).rangedef,true);
                          end
@@ -1912,6 +1919,7 @@ implementation
                               end
                            else
                             begin
+                              set_varstate(left,vs_read,[]);
                               result:=cordconstnode.create(tarraydef(
                                left.resultdef).highrange,tarraydef(left.resultdef).rangedef,true);
                             end;
@@ -2389,7 +2397,7 @@ implementation
                      inserttypeconv(hpp,resultnode.resultdef);
                    { avoid any possible warnings }
                    inserttypeconv_internal(hpp,resultnode.resultdef);
-                   
+
                    addstatement(newstatement,cassignmentnode.create(resultnode,hpp));
                    { deallocate the temp }
                    if assigned(tempnode) then

+ 23 - 0
tests/tbs/tb0521.pp

@@ -0,0 +1,23 @@
+{ %opt=-vw -Sew }
+{ %norun }
+procedure p;
+  var
+    c : char;
+    w : widechar;
+    a : array[0..1] of longint;
+    i : integer;
+    e : (e1,e2,e3);
+  begin
+    writeln(length(c));
+    writeln(length(w));
+    writeln(length(a));
+    writeln(low(i));
+    writeln(high(i));
+    writeln(ord(low(e)));
+    writeln(ord(high(e)));
+    writeln(low(a));
+    writeln(high(a));
+  end;
+
+begin
+end.