mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-07 22:47:59 +02:00
Allow the usage of type aliases of generic type parameters outside of the generic. Besides being useful by itself it will also be needed in the future when the visibility of the type parameters is changed from public to strict private.
ptype.pas, id_type: * don't generate an error if the undefineddef typesym is an explicit rename that belongs to a generic + added test git-svn-id: trunk@29485 -
This commit is contained in:
parent
5115c3e680
commit
a4e8f00399
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -11710,6 +11710,7 @@ tests/test/tgeneric94.pp svneol=native#text/pascal
|
||||
tests/test/tgeneric95.pp svneol=native#text/pascal
|
||||
tests/test/tgeneric96.pp svneol=native#text/pascal
|
||||
tests/test/tgeneric97.pp svneol=native#text/pascal
|
||||
tests/test/tgeneric98.pp svneol=native#text/pascal
|
||||
tests/test/tgoto.pp svneol=native#text/plain
|
||||
tests/test/theap.pp svneol=native#text/plain
|
||||
tests/test/theapthread.pp svneol=native#text/plain
|
||||
|
@ -340,7 +340,11 @@ implementation
|
||||
((ttypesym(srsym).typedef.typ=errordef) or
|
||||
(not allowgenericsyms and
|
||||
(ttypesym(srsym).typedef.typ=undefineddef) and
|
||||
not (sp_generic_para in srsym.symoptions))) then
|
||||
not (sp_generic_para in srsym.symoptions) and
|
||||
not (sp_explicitrename in srsym.symoptions) and
|
||||
not assigned(srsym.owner.defowner) and
|
||||
{ use df_generic instead of is_generic to allow aliases in nested types as well }
|
||||
not (df_generic in tstoreddef(srsym.owner.defowner).defoptions))) then
|
||||
begin
|
||||
Message1(type_e_type_is_not_completly_defined,ttypesym(srsym).realname);
|
||||
def:=generrordef;
|
||||
|
50
tests/test/tgeneric98.pp
Normal file
50
tests/test/tgeneric98.pp
Normal file
@ -0,0 +1,50 @@
|
||||
{ %NORUN }
|
||||
|
||||
program tgeneric98;
|
||||
|
||||
{$mode objfpc}
|
||||
|
||||
type
|
||||
generic TTest<T> = class
|
||||
public type
|
||||
TAlias = T;
|
||||
private
|
||||
fField: TAlias;
|
||||
procedure SetField(aValue: TAlias);
|
||||
public
|
||||
property Field: TAlias read fField write SetField;
|
||||
function CalcField: TAlias;
|
||||
end;
|
||||
|
||||
generic TTest2<T> = class
|
||||
public type
|
||||
TTestT = specialize TTest<T>;
|
||||
private
|
||||
fField: TTestT.TAlias;
|
||||
procedure SetField(aValue: TTestT.TAlias);
|
||||
public
|
||||
property Field: TTestT.TAlias read fField write SetField;
|
||||
function CalcField: TTestT.TAlias;
|
||||
end;
|
||||
|
||||
procedure TTest.SetField(aValue: TAlias);
|
||||
begin
|
||||
end;
|
||||
|
||||
function TTest.CalcField: TAlias;
|
||||
begin
|
||||
Result := Default(TAlias);
|
||||
end;
|
||||
|
||||
procedure TTest2.SetField(aValue: TTestT.TAlias);
|
||||
begin
|
||||
end;
|
||||
|
||||
function TTest2.CalcField: TTestT.TAlias;
|
||||
begin
|
||||
Result := Default(TTestT.TAlias);
|
||||
end;
|
||||
|
||||
begin
|
||||
|
||||
end.
|
Loading…
Reference in New Issue
Block a user