ソースを参照

* factored out SymbolCandidateForWarningOrHint
* do not issue a hint if a normal parameter is passed to another procedure by var
+ test

git-svn-id: trunk@33248 -

florian 9 年 前
コミット
45807056c5
3 ファイル変更38 行追加25 行削除
  1. 1 0
      .gitattributes
  2. 23 25
      compiler/optdfa.pas
  3. 14 0
      tests/test/opt/tdfa18.pp

+ 1 - 0
.gitattributes

@@ -11706,6 +11706,7 @@ tests/test/opt/tdfa14.pp svneol=native#text/pascal
 tests/test/opt/tdfa15.pp svneol=native#text/pascal
 tests/test/opt/tdfa16.pp svneol=native#text/pascal
 tests/test/opt/tdfa17.pp svneol=native#text/pascal
+tests/test/opt/tdfa18.pp svneol=native#text/pascal
 tests/test/opt/tdfa2.pp svneol=native#text/pascal
 tests/test/opt/tdfa3.pp svneol=native#text/pascal
 tests/test/opt/tdfa4.pp svneol=native#text/pascal

+ 23 - 25
compiler/optdfa.pas

@@ -678,6 +678,27 @@ unit optdfa;
           PSearchNodeInfo(arg)^.warnedfilelocs[high(PSearchNodeInfo(arg)^.warnedfilelocs)]:=f;
         end;
 
+
+      { Checks if the symbol is a candidate for a warning.
+        Emit warning/note for living locals, result and parameters, but only about the current
+        symtables }
+      function SymbolCandidateForWarningOrHint(sym : tabstractnormalvarsym) : Boolean;
+        begin
+          Result:=(((sym.owner=current_procinfo.procdef.localst) and
+                    (current_procinfo.procdef.localst.symtablelevel=sym.owner.symtablelevel)
+                   ) or
+                   ((sym.owner=current_procinfo.procdef.parast) and
+                    (sym.typ=paravarsym) and
+                    (current_procinfo.procdef.parast.symtablelevel=sym.owner.symtablelevel) and
+                    { all parameters except out parameters are initialized by the caller }
+                    (tparavarsym(sym).varspez=vs_out)
+                   ) or
+                   ((vo_is_funcret in sym.varoptions) and
+                    (current_procinfo.procdef.parast.symtablelevel=sym.owner.symtablelevel)
+                   )
+                  ) and not(vo_is_external in sym.varoptions)
+        end;
+
       var
         varsym : tabstractnormalvarsym;
         methodpointer,
@@ -695,14 +716,7 @@ unit optdfa;
                   while assigned(hpt) and (hpt.nodetype in [subscriptn,vecn,typeconvn]) do
                     hpt:=tunarynode(hpt).left;
                   if assigned(hpt) and (hpt.nodetype=loadn) and not(WarnedForLocation(hpt.fileinfo)) and
-                    { warn only on the current symtable level }
-                    (((tabstractnormalvarsym(tloadnode(hpt).symtableentry).owner=current_procinfo.procdef.localst) and
-                      (current_procinfo.procdef.localst.symtablelevel=tabstractnormalvarsym(tloadnode(hpt).symtableentry).owner.symtablelevel)
-                     ) or
-                     ((tabstractnormalvarsym(tloadnode(hpt).symtableentry).owner=current_procinfo.procdef.parast) and
-                      (current_procinfo.procdef.parast.symtablelevel=tabstractnormalvarsym(tloadnode(hpt).symtableentry).owner.symtablelevel)
-                     )
-                    ) and
+                    SymbolCandidateForWarningOrHint(tabstractnormalvarsym(tloadnode(hpt).symtableentry)) and
                     PSearchNodeInfo(arg)^.nodetosearch.isequal(hpt) then
                     begin
                       { issue only a hint for var, when encountering the node passed as out, we need only to stop searching }
@@ -768,23 +782,7 @@ unit optdfa;
                 begin
                   varsym:=tabstractnormalvarsym(tloadnode(n).symtableentry);
 
-                  { Give warning/note for living locals, result and parameters, but only about the current
-                    symtables }
-                  if assigned(varsym.owner) and
-                    (((varsym.owner=current_procinfo.procdef.localst) and
-                      (current_procinfo.procdef.localst.symtablelevel=varsym.owner.symtablelevel)
-                     ) or
-                     ((varsym.owner=current_procinfo.procdef.parast) and
-                      (varsym.typ=paravarsym) and
-                      (current_procinfo.procdef.parast.symtablelevel=varsym.owner.symtablelevel) and
-                      { all parameters except out parameters are initialized by the caller }
-                      (tparavarsym(varsym).varspez=vs_out)
-                     ) or
-                     ((vo_is_funcret in varsym.varoptions) and
-                      (current_procinfo.procdef.parast.symtablelevel=varsym.owner.symtablelevel)
-                     )
-                    ) and
-                    not(vo_is_external in varsym.varoptions) then
+                  if assigned(varsym.owner) and SymbolCandidateForWarningOrHint(varsym) then
                     begin
                       if (vo_is_funcret in varsym.varoptions) and not(WarnedForLocation(n.fileinfo)) then
                         begin

+ 14 - 0
tests/test/opt/tdfa18.pp

@@ -0,0 +1,14 @@
+{ %OPT=-Oodfa -vwh -Seh }
+procedure modify(var p: pointer);
+begin
+  inc(p);
+end;
+
+procedure test(p: pointer);
+begin
+  modify(p);
+end;
+
+begin
+  test(nil);
+end.