Quellcode durchsuchen

* fix for Mantis #34206: when specializing nested routines of a generic routine we don't need access to their genericdef (which isn't available anyway in other units when loading from PPU) as their definition is completely contained in the token stream
+ added simplified test for the problem

git-svn-id: trunk@39692 -

svenbarth vor 7 Jahren
Ursprung
Commit
10886d8cef
4 geänderte Dateien mit 64 neuen und 0 gelöschten Zeilen
  1. 2 0
      .gitattributes
  2. 5 0
      compiler/psub.pas
  3. 16 0
      tests/test/tgeneric104.pp
  4. 41 0
      tests/test/ugeneric104.pp

+ 2 - 0
.gitattributes

@@ -13074,6 +13074,7 @@ tests/test/tgeneric100.pp svneol=native#text/pascal
 tests/test/tgeneric101.pp svneol=native#text/pascal
 tests/test/tgeneric102.pp svneol=native#text/pascal
 tests/test/tgeneric103.pp svneol=native#text/pascal
+tests/test/tgeneric104.pp -text svneol=native#text/pascal
 tests/test/tgeneric11.pp svneol=native#text/plain
 tests/test/tgeneric12.pp svneol=native#text/plain
 tests/test/tgeneric13.pp svneol=native#text/plain
@@ -13889,6 +13890,7 @@ tests/test/ugenconstraints.pas svneol=native#text/pascal
 tests/test/ugeneric.test75.pp svneol=native#text/pascal
 tests/test/ugeneric10.pp svneol=native#text/plain
 tests/test/ugeneric102.pp svneol=native#text/pascal
+tests/test/ugeneric104.pp -text svneol=native#text/pascal
 tests/test/ugeneric14.pp svneol=native#text/plain
 tests/test/ugeneric3.pp svneol=native#text/plain
 tests/test/ugeneric4.pp svneol=native#text/plain

+ 5 - 0
compiler/psub.pas

@@ -2242,6 +2242,10 @@ implementation
              if df_specialization in old_current_procinfo.procdef.defoptions then
                begin
                  include(pd.defoptions,df_specialization);
+                 { the procdefs encountered here are nested procdefs of which
+                   their complete definition also resides inside the current token
+                   stream, thus access to their genericdef is not required }
+                 {$ifdef genericdef_for_nested}
                  { find the corresponding routine in the generic routine }
                  if not assigned(old_current_procinfo.procdef.genericdef) then
                    internalerror(2016121701);
@@ -2265,6 +2269,7 @@ implementation
                    end;
                  if not assigned(pd.genericdef) then
                    internalerror(2016121703);
+                 {$endif}
                end;
            end;
 

+ 16 - 0
tests/test/tgeneric104.pp

@@ -0,0 +1,16 @@
+{ %RECOMPILE }
+{ %NORUN }
+
+{ ensure that nested routines inside generics are handled correctly }
+
+program tgeneric104;
+
+uses
+  ugeneric104;
+
+type
+  TTest = specialize TGeneric<LongInt>;
+
+begin
+  specialize TestProc<LongInt>;
+end.

+ 41 - 0
tests/test/ugeneric104.pp

@@ -0,0 +1,41 @@
+unit ugeneric104;
+
+{$mode objfpc}{$H+}
+
+interface
+
+type
+  generic TGeneric<T> = class
+    procedure Test;
+  end;
+
+generic procedure TestProc<T>;
+
+implementation
+
+{ TGeneric }
+
+procedure TGeneric.Test;
+
+  procedure SubTest;
+  begin
+
+  end;
+
+begin
+  SubTest;
+end;
+
+generic procedure TestProc<T>;
+
+  procedure SubTest;
+  begin
+
+  end;
+
+begin
+  SubTest;
+end;
+
+end.
+