浏览代码

--- Merging r31437 into '.':
U compiler/ptype.pas
A tests/webtbs/tw28530.pp
--- Recording mergeinfo for merge of r31437 into '.':
U .

# revisions: 31437

git-svn-id: branches/fixes_3_0@31598 -

marco 10 年之前
父节点
当前提交
ad53375398
共有 3 个文件被更改,包括 29 次插入4 次删除
  1. 1 0
      .gitattributes
  2. 3 4
      compiler/ptype.pas
  3. 25 0
      tests/webtbs/tw28530.pp

+ 1 - 0
.gitattributes

@@ -14273,6 +14273,7 @@ tests/webtbs/tw2832.pp svneol=native#text/plain
 tests/webtbs/tw2834.pp svneol=native#text/plain
 tests/webtbs/tw2841.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

+ 3 - 4
compiler/ptype.pas

@@ -900,10 +900,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
@@ -911,6 +908,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 - 0
tests/webtbs/tw28530.pp

@@ -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.