Illegal IL generated in some case

Hi,

Some strange IL generation error related to a doSomething() procedure. IlVerify shows stackUnderflow error

namespace ConsoleApplication5;

uses
System.Threading.Tasks;
type
EmptyClass = class

end;

Class1 = public class

private

procedure doSomething( var o);
begin
  o := nil;
end ;

procedure doSomething2( var o : EmptyClass);
begin
  o := nil;
end ;

public

method TestA() : Boolean;
begin
  var obj := new EmptyClass() ;
  doSomething( var obj ) ;
  Console.WriteLine("TestA");
  exit true;
end ;

method TestB(): Task<Boolean>;
begin
  Result := await Task.Run(->
    begin
      var obj := new EmptyClass() ;

//          doSomething( var obj ) ; //must be commented out!
await Task.Delay(1);
Console.WriteLine(“TestB”);
exit true;
end);
end;

method TestC() : Task<Boolean>;
begin
  Result := await Task.Run(->
    begin
      var obj := new EmptyClass() ;
      doSomething2( var obj ) ; //this works
      await Task.Delay(1);
      Console.WriteLine("TestC");
      exit true ;
    end);
end ;

method TestD() : Task<Boolean>;
begin
  Result := await Task.Run(->
    begin
      var obj := new EmptyClass() ;
      doSomething( var obj ) ; // this causes IL (stackUnderflow)
      await Task.Delay(1);
      Console.WriteLine("TestD");
      exit true ;
   end);
 end ;

end;

Program = class
public
class method test : Task;
begin
var cl := new Class1() ;

  cl.TestA;
  await cl.TestB ;
  await cl.TestC ;
  await cl.TestD ;
end;

class method Main(args: array of String): Int32;
begin
  // add your own code here
  writeLn("The magic happens here.");
  test;
  while(true) do;
end;

end;

end.

Thanx; reprouced, and n arrowed it down quite a bit, this suffices.

namespace ConsoleApplication5;

uses
  System.Threading.Tasks;

type
  EmptyClass = class
  end;

  Class1 = public class
  private

    procedure doSomething( var o);
    begin
      o := nil;
    end ;

  public

    method TestD() : Task<Boolean>;
    begin
      //Result := await Task.Run( -> begin
        var obj := new EmptyClass() ;
        doSomething( var obj ) ; // this causes IL (stackUnderflow)
        await Task.Delay(1);
        exit true ; // also IE if i kleep the "await Task.Run( -> begin" anfd remove this line
                      //Internal error: System.Exception: Exception of type 'System.Exception' was thrown.
                      //at RemObjects.Elements.Code.Compiler.CodeSimplifier.AllocateLocalVar (RemObjects.Elements.Code.BaseType aType, RemObjects.Elements.Code.VarDefinition aOrg, System.Boolean aPinned, System.Boolean aUnique, System.String aName) [0x00004] in <7055b29548ba41f3ba27fb690363ccd7>:0
                      //at RemObjects.Elements.Code.Compiler.CodeSimplifier.VisitBeginStatement (RemObjects.Elements.Code.BeginStatement beginStatement) [0x001db] in <7055b29548ba41f3ba27fb690363ccd7>:0
                      //at RemObjects.Elements.Code.BaseVisitor.VisitStatement (RemObjects.Elements.Code.Statement element) [0x001de] in <7df09fcb122f4e7ca47224ceb31b11c8>:0
                      //at RemObjects.Elements.Code.Compiler.CodeSimplifier.VisitStatement (RemObjects.Elements.Code.Statement element) [0x0001e] in <7055b29548ba41f3ba27fb690363ccd7>:0
                      //at RemObjects.Elements.Code.Compiler.CodeSimplifier.VisitBeginStatement (RemObjects.Elements.Code.BeginStatement beginStatement) [0x002f…
      //end);
    end;

  end;

  Program = class
  public

    class method Main(args: array of String): Int32;
    begin
      // add your own code here
      writeLn("The magic happens here.");
      var cl := new Class1();
      cl.TestD;
    end;

  end;

end.

Logged as bugs://E27489.

Yes, off course. Wider case was just to show how much the error is specific. It took a quite bit if time no narrow this :slight_smile:

1 Like