diff --git a/.gitattributes b/.gitattributes index c6e3c6b902..513f963cf1 100644 --- a/.gitattributes +++ b/.gitattributes @@ -6881,6 +6881,8 @@ tests/test/tgeneric11.pp svneol=native#text/plain tests/test/tgeneric12.pp svneol=native#text/plain tests/test/tgeneric13.pp svneol=native#text/plain tests/test/tgeneric14.pp svneol=native#text/plain +tests/test/tgeneric15.pp svneol=native#text/plain +tests/test/tgeneric16.pp svneol=native#text/plain tests/test/tgeneric2.pp svneol=native#text/plain tests/test/tgeneric3.pp svneol=native#text/plain tests/test/tgeneric4.pp svneol=native#text/plain diff --git a/tests/test/tgeneric15.pp b/tests/test/tgeneric15.pp new file mode 100644 index 0000000000..a11701d792 --- /dev/null +++ b/tests/test/tgeneric15.pp @@ -0,0 +1,78 @@ +program Project1; + +{$mode objfpc}{$H+} + +type + + { TStack } + + generic TStack = class(TObject) + public + procedure Clear; virtual; + destructor Destroy; override; + end; + + { TIntegerStack } + + TIntegerStack = class(specialize TStack) + public + procedure Clear; override; + end; + + { TIntegerStack2 } + + TIntegerStack2 = class(specialize TStack) + public + procedure Clear; override; + end; + +var + Idx : Longint; + +{ TIntegerStack } + +procedure TIntegerStack.Clear; +begin + Writeln('new clear'); + Idx:=Idx or 1; +end; + +{ TIntegerStack2 } + +procedure TIntegerStack2.Clear; +begin + Writeln('new clear2'); + Idx:=Idx or 2; +end; + +{ TStack } + +procedure TStack.Clear; +begin + Writeln('old clear'); +end; + +destructor TStack.Destroy; +begin + Writeln('old destroy'); + Clear; +end; + + +var + s: TIntegerStack; + s2: TIntegerStack2; +begin + Idx:=0; + + s := TIntegerStack.Create; + Writeln(s.ClassName); + s.Free; + + s2 := TIntegerStack2.Create; + Writeln(s2.ClassName); + s2.Free; + + if Idx<>3 then + halt(1); +end. diff --git a/tests/test/tgeneric16.pp b/tests/test/tgeneric16.pp new file mode 100644 index 0000000000..1e3c601bfe --- /dev/null +++ b/tests/test/tgeneric16.pp @@ -0,0 +1,82 @@ +program Project1; + +{$mode objfpc}{$H+} + +type + + { TStack } + + generic TStack = class(TObject) + public + procedure Clear; virtual; + destructor Destroy; override; + end; + + { TIntegerStack } + + TAdvStack = class(specialize TStack) + public + procedure Clear; override; + end; + + { TIntegerStack } + + TIntegerStack = specialize TAdvStack; + + { TIntegerStack2 } + + TIntegerStack2 = class(specialize TAdvStack); + public + procedure Clear; override; + end; + +var + Idx : Longint; + +{ TAdvStack } + +procedure TAdvStack.Clear; +begin + Writeln('new clear'); + Idx:=Idx or 1; +end; + +{ TIntegerStack2 } + +procedure TIntegerStack2.Clear; +begin + Writeln('new clear2'); + Idx:=Idx or 2; +end; + +{ TStack } + +procedure TStack.Clear; +begin + Writeln('old clear'); +end; + +destructor TStack.Destroy; +begin + Writeln('old destroy'); + Clear; +end; + + +var + s : TIntegerStack; + s2 : TIntegerStack2; +begin + Idx:=0; + + s := TIntegerStack.Create; + Writeln(s.ClassName); + s.Free; + + s2 := TIntegerStack2.Create; + Writeln(s2.ClassName); + s2.Free; + + if Idx<>3 then + halt(1); +end.