Tuple is fun, but Island Compiler go bananas with Internal Errors ..... Element/Island/Windows 10.0.0.2477

The test project is here, to replicate, please try building TensorFlow.Island.Class project.
@ck, @mh
https://www.sugarsync.com/pf/D6147121_09656321_048589

The problem first appears after I added the following method, which heavily uses Tuple:

method InternalCreateOp(const aOpType: not nullable String; aOpName: not nullable String;
  aInputs: array of not nullable Output = [];
  aAttrs: array of Tuple of (not nullable String, not nullable Object) = [])
  : Tuple of (Operation, Output);
begin
  var lOpDesc := new OperationDescription withGraph(self) OpType(aOpType)
    OpName(MakeName(aOpType, aOpName));

  for each x in aInputs do lOpDesc.AddInput(x);
  for each a in aAttrs  do lOpDesc.SetAttr(a[0], a[1]);

  using lStatus := new Status do begin
    var (success, result_op) := lOpDesc.FinishOperation(lStatus);
    if success then begin
      var result_output := new Output withOp(result_op);
      result := (result_op, result_output);
    end else begin
      raise new OpCreateException withOpType(aOpType) Message(lStatus.Message);
    end;
  end;
end;

1>------ Rebuild All started: Project: TensorFlow.Island.Classes, Configuration: Debug ------
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\RemObjects Software\Elements\RemObjects.Elements.Island.Windows.targets(70,3): error E0: Internal error: LPUSHV->D202
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\RemObjects Software\Elements\RemObjects.Elements.Island.Windows.targets(70,3): error E0: Internal error: System.AggregateException: One or more errors occurred. —> System.NullReferenceException: Object reference not set to an instance of an object.

The TensorFlow.Island project from GitHub:

Thanks, logged as bugs://83840

bugs://83840 got closed with status fixed.

Curiously it wasn’t the tuples that did it. It’s the default array parameter:

method InternalCreateOp(const aOpType: not nullable String; aOpName: not nullable String; 
      aInputs: array of not nullable Output = [];
      aAttrs: array of Tuple of (not nullable String, not nullable Object) = [])
      : Tuple of (Operation, Output);
1 Like