[fpc-devel] Data flow analysis (dfa) and "case ... of"

Juha Manninen juha.manninen62 at gmail.com
Mon Jun 5 16:22:14 CEST 2017


Wiki tells about problems the dfa encounters:
 http://wiki.freepascal.org/FPC_New_Features_3.0#Node_dfa_for_liveness_analysis

In this code if "b" is true in the first test, it will be true also in
the second test, thus using "i" is safe and valid.
  ...
  if b then
    i:=1;
  writeln;
  if b then
    writeln(i);

I understand that complex code can have many variations of such
constructs and analysing them all is difficult.

However for "case ... of" construct with enum types the dfa could be
improved easily, at least I could imagine so.
There is plenty of code like this:

  function TControlBorderSpacing.GetSpace(Kind: TAnchorKind): Integer;
  begin
    case Kind of
    akLeft: Result:=Left;
    akTop: Result:=Top;
    akRight: Result:=Right;
    akBottom: Result:=Bottom;
    end;
  end;

All the enum values are listed and the Result is set for sure, yet FPC
complains:
 controls.pp(3721,1) Warning: Function result variable does not seem
to be initialized

If the compiler used the information about all enums being present, it
would reduce the number of dfa false positives in eg. Lazarus sources
dramatically.

Juha



More information about the fpc-devel mailing list