{$MODE OBJFPC} { -*- text -*- } program tests; type generic THashTable = class type THashTableEnumerator = class private FOwner: THashTable; function GetCurrent(): TValue; public constructor Create(Owner: THashTable); function MoveNext(): Boolean; property Current: TValue read GetCurrent; end; function GetEnumerator(): THashTableEnumerator; // note that this works: var Foo: THashTable; procedure Bar(Arg: THashTable); end; function THashTable.THashTableEnumerator.GetCurrent(): TValue; begin Result := TValue(nil); end; constructor THashTable.THashTableEnumerator.Create(Owner: THashTable); begin FOwner := Owner; end; function THashTable.THashTableEnumerator.MoveNext(): Boolean; begin Result := False; end; function THashTable.GetEnumerator(): THashTableEnumerator; begin Result := THashTableEnumerator.Create(Self); end; procedure THashTable.Bar(Arg: THashTable); var Quux: THashTable; // this works also begin end; type TIntegerToStringHashTable = specialize THashTable; var Test: TIntegerToStringHashTable; S: AnsiString; begin Test.Create(); try for S in Test do Writeln(S); finally Test.Destroy(); end; Writeln('PASS'); end.