Просмотр исходного кода

Fix for Mantis #28442. Do not generate the VMT record definition for generic classes. It isn't used anyway.

nobj.pas, TVMTBuilder:
  * generate_vmt_def: check for df_generic (not is_generic!) and abort if set

+ added test

git-svn-id: trunk@31301 -
svenbarth 10 лет назад
Родитель
Сommit
39016c032e
4 измененных файлов с 53 добавлено и 0 удалено
  1. 2 0
      .gitattributes
  2. 6 0
      compiler/nobj.pas
  3. 12 0
      tests/webtbs/tw28442.pp
  4. 33 0
      tests/webtbs/uw28442.pp

+ 2 - 0
.gitattributes

@@ -14678,6 +14678,7 @@ tests/webtbs/tw2832.pp svneol=native#text/plain
 tests/webtbs/tw2834.pp svneol=native#text/plain
 tests/webtbs/tw28372.pp svneol=native#text/plain
 tests/webtbs/tw2841.pp svneol=native#text/plain
+tests/webtbs/tw28442.pp svneol=native#text/pascal
 tests/webtbs/tw28475.pp svneol=native#text/plain
 tests/webtbs/tw2853.pp svneol=native#text/plain
 tests/webtbs/tw2853a.pp svneol=native#text/plain
@@ -15397,6 +15398,7 @@ tests/webtbs/uw2731.pp svneol=native#text/plain
 tests/webtbs/uw27320.defaults.pp svneol=native#text/pascal
 tests/webtbs/uw2738.pp svneol=native#text/plain
 tests/webtbs/uw2834.pp svneol=native#text/plain
+tests/webtbs/uw28442.pp svneol=native#text/pascal
 tests/webtbs/uw2920.pp svneol=native#text/plain
 tests/webtbs/uw2956.pp svneol=native#text/plain
 tests/webtbs/uw2984.pp svneol=native#text/plain

+ 6 - 0
compiler/nobj.pas

@@ -808,6 +808,12 @@ implementation
            odt_interfacejava] then
          exit;
 
+        { don't generate VMT for generics (only use duplicates/overrides detection) }
+        { Note: don't use is_generic here as we also need to check nested non-
+                generic classes }
+        if df_generic in _class.defoptions then
+          exit;
+
         { todo in the future }
         if _class.objecttype = odt_cppclass then
           exit;

+ 12 - 0
tests/webtbs/tw28442.pp

@@ -0,0 +1,12 @@
+{ %RECOMPILE }
+
+unit tw28442;
+
+interface
+
+uses
+  uw28442;
+
+implementation
+
+end.

+ 33 - 0
tests/webtbs/uw28442.pp

@@ -0,0 +1,33 @@
+unit uw28442;
+
+{$MODE DELPHI}{$H+}
+
+interface
+
+type
+  TEqualityComparer<T> = class
+  public
+    class function Construct: TEqualityComparer<T>;
+
+    function Test: Boolean; virtual; abstract;
+  end;
+
+  TDelegatedEqualityComparerEvents<T> = class(TEqualityComparer<T>)
+  public
+    function Test: Boolean; override;
+  end;
+
+implementation
+
+class function TEqualityComparer<T>.Construct: TEqualityComparer<T>;
+begin
+  Result := TDelegatedEqualityComparerEvents<T>.Create;
+end;
+
+function TDelegatedEqualityComparerEvents<T>.Test: Boolean;
+begin
+  Result := False;
+end;
+
+end.
+