Fix for Mantis #28530.

ptype.pas:
  * record_dec: if parse_generic is given set current_genericdef

+ added test

git-svn-id: trunk@31437 -
This commit is contained in:
svenbarth 2015-08-28 15:46:18 +00:00
parent 90a31bef49
commit 66781b5526
3 changed files with 29 additions and 4 deletions

1
.gitattributes vendored
View File

@ -14694,6 +14694,7 @@ tests/webtbs/tw28442.pp svneol=native#text/pascal
tests/webtbs/tw28454.pp svneol=native#text/plain
tests/webtbs/tw28475.pp svneol=native#text/plain
tests/webtbs/tw2853.pp svneol=native#text/plain
tests/webtbs/tw28530.pp svneol=native#text/pascal
tests/webtbs/tw2853a.pp svneol=native#text/plain
tests/webtbs/tw2853b.pp svneol=native#text/plain
tests/webtbs/tw2853c.pp svneol=native#text/plain

View File

@ -928,10 +928,7 @@ implementation
include(current_structdef.defoptions,df_specialization);
if assigned(old_current_structdef) and
(df_generic in old_current_structdef.defoptions) then
begin
include(current_structdef.defoptions,df_generic);
current_genericdef:=current_structdef;
end;
include(current_structdef.defoptions,df_generic);
insert_generic_parameter_types(current_structdef,genericdef,genericlist);
{ when we are parsing a generic already then this is a generic as
@ -939,6 +936,8 @@ implementation
if old_parse_generic then
include(current_structdef.defoptions, df_generic);
parse_generic:=(df_generic in current_structdef.defoptions);
if parse_generic and not assigned(current_genericdef) then
current_genericdef:=current_structdef;
{ in non-Delphi modes we need a strict private symbol without type
count and type parameters in the name to simply resolving }
maybe_insert_generic_rename_symbol(n,genericlist);

25
tests/webtbs/tw28530.pp Normal file
View File

@ -0,0 +1,25 @@
{ %NORUN }
program tw28530;
{$mode objfpc}
type
generic TDistanceFunction<t> = function (x,y : t) : Extended;
generic PlanarCoordinate<t> = record
x,y : t;
d : specialize TDistanceFunction<t>;
end;
TScreenCoordinate = specialize PLanarCoordinate<word>;
TDiscreteCoordinate = specialize PlanarCoordinate<integer>;
TRealCoordinate = specialize PlanarCoordinate<extended>;
TScreenDistance = specialize TDistanceFunction<word>;
TDiscreteDistance = specialize TDistanceFunction<integer>;
TRealDistance = specialize TDistanceFunction<Extended>;
generic TPointSet<t> = array of specialize PlanarCoordinate<t>;
begin
end.