|
@@ -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
|