mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-07 17:47:56 +02:00

- store type parameter in parasymtable, push it to the symtablestack before parsing arguments and return type - move procedure/function declaration parsing to procvar_dec subroutine - don't skip parasymtable while searching types because they store type parameters now - add TParaSymTable.ReadOnly field to prevent adding defs into symtable. Add defs to the parent symtable in this case (we are adding this symtable to stack to read type parameters only, add defs should go to parent in this case as it was before) git-svn-id: trunk@16719 -
38 lines
665 B
ObjectPascal
38 lines
665 B
ObjectPascal
program tgeneric33;
|
|
|
|
{$mode objfpc}{$H+}
|
|
type
|
|
// regular procdef
|
|
generic TProc1<T> = function(Value: T): T;
|
|
// object procdef
|
|
generic TProc2<T> = function(Value: T): T of object;
|
|
|
|
TFoo = class
|
|
function Test2(Value: Integer): Integer;
|
|
end;
|
|
|
|
function Test1(Value: Integer): Integer;
|
|
begin
|
|
Result := Value + 1;
|
|
end;
|
|
|
|
function TFoo.Test2(Value: Integer): Integer;
|
|
begin
|
|
Result := Value - 1;
|
|
end;
|
|
|
|
var
|
|
Foo: TFoo;
|
|
Proc1: specialize TProc1<Integer>;
|
|
Proc2: specialize TProc2<Integer>;
|
|
begin
|
|
Proc1 := @Test1;
|
|
if Proc1(1) <> 2 then
|
|
halt(1);
|
|
Foo := TFoo.Create;
|
|
Proc2 := @Foo.Test2;
|
|
if Proc2(2) <> 1 then
|
|
halt(2);
|
|
Foo.Free;
|
|
end.
|