From a4e8f00399862fbdcf9f62c5ed84d64145013e7a Mon Sep 17 00:00:00 2001 From: svenbarth Date: Fri, 16 Jan 2015 16:38:51 +0000 Subject: [PATCH] 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 - --- .gitattributes | 1 + compiler/ptype.pas | 6 ++++- tests/test/tgeneric98.pp | 50 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 tests/test/tgeneric98.pp diff --git a/.gitattributes b/.gitattributes index 0072288c09..9f7b369f78 100644 --- a/.gitattributes +++ b/.gitattributes @@ -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 diff --git a/compiler/ptype.pas b/compiler/ptype.pas index 2d4a999790..f751cf42c0 100644 --- a/compiler/ptype.pas +++ b/compiler/ptype.pas @@ -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; diff --git a/tests/test/tgeneric98.pp b/tests/test/tgeneric98.pp new file mode 100644 index 0000000000..272ba9c1d5 --- /dev/null +++ b/tests/test/tgeneric98.pp @@ -0,0 +1,50 @@ +{ %NORUN } + +program tgeneric98; + +{$mode objfpc} + +type + generic TTest = 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 = class + public type + TTestT = specialize TTest; + 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.