Browse Source

* fix #39977: allow a capturer to access any method independant of visibility as the visibility checks are supposed to have been done before the captured symbol was converted
+ added test

Sven/Sarah Barth 2 years ago
parent
commit
9e3483fbeb
2 changed files with 58 additions and 0 deletions
  1. 9 0
      compiler/symtable.pas
  2. 49 0
      tests/webtbs/tw39977.pp

+ 9 - 0
compiler/symtable.pas

@@ -3355,6 +3355,15 @@ implementation
           else
             internalerror(2019050702);
         end;
+
+        if not result then
+          begin
+            { capturers have access to anything as we assume checks were done
+              before the procdef was inserted into the capturer }
+            result:=assigned(current_structdef) and
+                    (current_structdef.typ=objectdef) and
+                    (oo_is_capturer in tobjectdef(current_structdef).objectoptions);
+          end;
       end;
 
 

+ 49 - 0
tests/webtbs/tw39977.pp

@@ -0,0 +1,49 @@
+{ %NORUN }
+
+program tw39977;
+
+{$IFDEF FPC}
+{$mode delphi}
+{$ModeSwitch functionreferences}
+{$ELSE}
+{$APPTYPE CONSOLE}
+{$ENDIF}
+
+type
+  TRefProc = reference to procedure(Sender: TObject);
+
+procedure Test(P: TRefProc);
+begin
+  Writeln('test');
+end;
+
+type
+  TMyObjA = class(TObject)
+  strict protected
+    procedure MyEvent(Sender: TObject);
+  end;
+
+  TMyObjB = class(TMyObjA)
+  public
+    procedure MyTest;
+  end;
+
+{ TMyObjA }
+procedure TMyObjA.MyEvent(Sender: TObject);
+begin
+  Writeln('hello');
+end;
+
+{ TMyObjB }
+procedure TMyObjB.MyTest;
+begin
+  Test(MyEvent); // solved with ObjFpc mode and Test(@MyEvent); using Self.MyEvent or TRefProc(MyEvent) doesn't help
+end;
+
+var
+  O: TMyObjB;
+begin
+  O := TMyObjB.Create;
+  O.MyTest;
+end.
+