2
0
Эх сурвалжийг харах

WPO: don't crash on TP-style objects with only abstract virtual methods

Jonas Maebe 7 сар өмнө
parent
commit
540807c5c8

+ 4 - 1
compiler/optvirt.pas

@@ -706,7 +706,10 @@ unit optvirt;
         defunitclassname(node.def,unitid,classid,classprefix);
         unitdevirtinfo:=addunitifnew(unitid^);
         classdevirtinfo:=unitdevirtinfo.addclass(classprefix+classid^,node.instantiated);
-        if (node.def.vmtentries.count=0) then
+        { node.def.vmcallstaticinfo can be nil if the object only has abstract
+          virtual methods }
+        if (node.def.vmtentries.count=0) or
+            not assigned(node.def.vmcallstaticinfo) then
           exit;
         for i:=0 to node.def.vmtentries.count-1 do
           if (po_virtualmethod in pvmtentry(node.def.vmtentries[i])^.procdef.procoptions) then

+ 21 - 0
tests/webtbs/tw41077.pp

@@ -0,0 +1,21 @@
+{ %wpoparas=optvmts }
+{ %wpopasses=1 }
+
+
+program test;
+
+type
+  PMyObj=^TMyObj;
+  TMyObj = object
+    constructor init;
+    procedure dummy;virtual;abstract;
+  end;
+
+constructor TMyObj.init;
+begin
+end;
+
+begin
+  PMyObj(nil)^.init;
+end.
+