From 9e3483fbeb8743afdb32df31c859753adfc96039 Mon Sep 17 00:00:00 2001 From: Sven/Sarah Barth Date: Sun, 6 Nov 2022 21:59:44 +0100 Subject: [PATCH] * 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 --- compiler/symtable.pas | 9 ++++++++ tests/webtbs/tw39977.pp | 49 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 tests/webtbs/tw39977.pp diff --git a/compiler/symtable.pas b/compiler/symtable.pas index e3a7b9ad1d..ecce4d2911 100644 --- a/compiler/symtable.pas +++ b/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; diff --git a/tests/webtbs/tw39977.pp b/tests/webtbs/tw39977.pp new file mode 100644 index 0000000000..a671b2d04a --- /dev/null +++ b/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. +