Parcourir la source

* do not warn about internally generated parameters, resolves #25914

git-svn-id: trunk@29636 -
florian il y a 10 ans
Parent
commit
932b68310e
3 fichiers modifiés avec 49 ajouts et 3 suppressions
  1. 1 0
      .gitattributes
  2. 6 3
      compiler/psub.pas
  3. 42 0
      tests/webtbs/tw25914.pp

+ 1 - 0
.gitattributes

@@ -14153,6 +14153,7 @@ tests/webtbs/tw25869.pp svneol=native#text/plain
 tests/webtbs/tw2588.pp svneol=native#text/plain
 tests/webtbs/tw2589.pp svneol=native#text/plain
 tests/webtbs/tw25895.pp svneol=native#text/pascal
+tests/webtbs/tw25914.pp svneol=native#text/pascal
 tests/webtbs/tw25916a.pp svneol=native#text/pascal
 tests/webtbs/tw25916b.pp svneol=native#text/pascal
 tests/webtbs/tw25917.pp svneol=native#text/pascal

+ 6 - 3
compiler/psub.pas

@@ -1346,11 +1346,14 @@ implementation
                 begin
                   if DFASetIn(GetUserCode.optinfo^.life,i) then
                     begin
-                      { do not warn about parameters passed by var }
+                      { do not warn for certain parameters: }
                       if not((tnode(dfabuilder.nodemap[i]).nodetype=loadn) and (tloadnode(dfabuilder.nodemap[i]).symtableentry.typ=paravarsym) and
-                        (tparavarsym(tloadnode(dfabuilder.nodemap[i]).symtableentry).varspez=vs_var) and
+                        { do not warn about parameters passed by var }
+                        (((tparavarsym(tloadnode(dfabuilder.nodemap[i]).symtableentry).varspez=vs_var) and
                         { function result is passed by var but it must be initialized }
-                        not(vo_is_funcret in tparavarsym(tloadnode(dfabuilder.nodemap[i]).symtableentry).varoptions)) then
+                        not(vo_is_funcret in tparavarsym(tloadnode(dfabuilder.nodemap[i]).symtableentry).varoptions)) or
+                        { do not warn about initialized hidden parameters }
+                        ((tparavarsym(tloadnode(dfabuilder.nodemap[i]).symtableentry).varoptions*[vo_is_high_para,vo_is_parentfp,vo_is_result,vo_is_self])<>[]))) then
                         CheckAndWarn(GetUserCode,tnode(dfabuilder.nodemap[i]));
                     end
                   else

+ 42 - 0
tests/webtbs/tw25914.pp

@@ -0,0 +1,42 @@
+{ %opt=-Sh }
+{$MODE OBJFPC}
+{$HINTS ON}
+{$OPTIMIZATION DFA}
+program test;
+
+type
+   TTest1 = class
+      FArray: array of record end; // or AnsiString
+      procedure TestMethod();
+   end;
+
+procedure TTest1.TestMethod();
+begin
+   SetLength(FArray, 0); // Hint: Local variable "$self" does not seem to be initialized
+end;
+
+type
+   TTest2 = class
+      FString: AnsiString; // or dynamic array
+      procedure TestMethod();
+   end;
+
+procedure TTest2.TestMethod();
+begin
+   FString := Default(AnsiString); // Hint: Local variable "$self" does not seem to be initialized
+end;
+
+type
+   TTest3 = class
+      FValue: Integer;
+      procedure TestMethod(var Value: Integer);
+   end;
+
+procedure TTest3.TestMethod(var Value: Integer);
+begin
+   TestMethod(FValue); // Hint: Local variable "$self" does not seem to be initialized
+   Value:=FValue;
+end;
+
+begin
+end.