[fpc-pascal] generic/enumerator: Internal error 200301231

Victor Matuzenko vitek03 at gmail.com
Wed Nov 13 12:08:56 CET 2013


Hi,

I have internal error when I compile the unit (see source below):

[doj at korica ~/proj/trunk/core/collection]$ fpc dlist.pas4
dlist.pas4(36,1) Fatal: Internal error 200301231
Fatal: Compilation aborted
Error: /usr/local/bin/ppc386 returned an error exitcode (normal if you 
did not specify a source file to be compiled)

fpc version and system:

[doj at korica ~/proj/trunk/core/collection]$ fpc -h | head -2
Free Pascal Compiler version 2.6.1 [2012/11/08] for i386
Copyright (c) 1993-2012 by Florian Klaempfl and others
[doj at korica ~/proj/trunk/core/collection]$ uname -a
FreeBSD korica 8.3-RELEASE FreeBSD 8.3-RELEASE #0: Mon Apr  9 21:47:23 
UTC 2012 root at almeida.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  i386

If I comment out all enumerator code it compiles success.
How should I rewrite this code to make it works?

=============================
{$MODESWITCH RESULT}
unit dlist;

interface

type
generic TList<TValue> = object
public type
   PNode = ^TNode;
   TNode = record
     Next: PNode;
     Value: TValue;
   end;
private type
   TEnumerator = object
   private
     FNode: PNode;
     function GetCurrent: TValue;
   public
     function MoveNext: Boolean;
     property Current: TValue read GetCurrent;
   end;
private
   FFirst: TNode;
   FLast: PNode;
public
   constructor Init;
   destructor Destroy;
   procedure Insert(const Value: TValue);
   function GetEnumerator: TEnumerator;
end;

implementation

function TList.TEnumerator.GetCurrent: TValue;
begin
   Result := FNode^.Value;
end;

function TList.TEnumerator.MoveNext: Boolean;
begin
   FNode := FNode^.Next;
   Result := FNode <> nil;
end;

constructor TList.Init;
begin
   FFirst.Next := nil;
   FLast := @FFirst;
end;

destructor TList.Destroy;
begin
end;

procedure TList.Insert(const Value: TValue);
var
   Node: PNode;
begin
   New(Node);
   Node^.Value := Value;
   Node^.Next := nil;
   FLast^.Next := Node;
   FLast := Node;
end;

function TList.GetEnumerator: TEnumerator;
begin
   Result.FNode := FFirst;
end;

end.
=============================

-- 
Victor Matuzenko (Виктор Матузенко)




More information about the fpc-pascal mailing list