I am quite excited about Delphi 10.3 Rio inline variable declarations. However I ran into strange problem and it seems that I need to initialize record after it has been inline declared:
program Project8;
{$APPTYPE CONSOLE}
{$R *.res}
uses System.SysUtils,classes;
procedure DoEvil;
  //var sr:TSearchRec; //A
begin
  //var sr:= default(TSearchRec); //B
  var sr:TSearchRec; //C
  sr.Name := EmptyStr; //D
  FindFirst('*.*',faAnyFile,sr);
  while sr.Name<>EmptyStr do
  begin
    Writeln(sr.name);
    sr.Name := EmptyStr;
    FindNext(sr);
  end;
end;
begin
  try
     DoEvil;
    { TODO -oUser -cConsole Main : Insert code here }
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  readln;
end.
The code works fine if I declare sr on line:
- //A (old style declaration) or on line
- //B (inline declaration with initialization).
However if I declare sr on line
- //C then it crashes on line //D, respective in system.pas on line 26222: - MOV ECX,[EDX-skew].StrRec.refCnt { fetch refCnt }
with exception:
Exception class $C0000005 with message 'access violation at 0x0040ac98: read of address 0xfffffff9'. Process Project8.exe (18928)
I would assume from the address -6, that the string member sr.name is not initialized and is nil.
Just to be complete, Delphi is the new 10.3 release 1: Embarcadero® Delphi 10.3 Version 26.0.33219.4899 - Installed Update 1
 
     
    