diff --git a/.gitattributes b/.gitattributes index 4cdf200bb1..60ae846279 100644 --- a/.gitattributes +++ b/.gitattributes @@ -12807,6 +12807,7 @@ tests/webtbs/tw22669.pp svneol=native#text/plain tests/webtbs/tw2267.pp svneol=native#text/plain tests/webtbs/tw2268.pp svneol=native#text/plain tests/webtbs/tw2269.pp svneol=native#text/plain +tests/webtbs/tw22705.pp svneol=native#text/plain tests/webtbs/tw2274.pp svneol=native#text/plain tests/webtbs/tw2277.pp svneol=native#text/plain tests/webtbs/tw2280.pp svneol=native#text/plain diff --git a/compiler/defcmp.pas b/compiler/defcmp.pas index 495517d076..6c26ed8a1f 100644 --- a/compiler/defcmp.pas +++ b/compiler/defcmp.pas @@ -1220,7 +1220,8 @@ implementation else { the types can be forward type, handle before normal type check !! } if assigned(def_to.typesym) and - (tpointerdef(def_to).pointeddef.typ=forwarddef) then + ((tpointerdef(def_to).pointeddef.typ=forwarddef) or + (tpointerdef(def_from).pointeddef.typ=forwarddef)) then begin if (def_from.typesym=def_to.typesym) or (fromtreetype=niln) then @@ -1559,7 +1560,9 @@ implementation begin { similar to pointerdef wrt forwards } if assigned(def_to.typesym) and - (tclassrefdef(def_to).pointeddef.typ=forwarddef) then + (tclassrefdef(def_to).pointeddef.typ=forwarddef) or + ((def_from.typ=classrefdef) and + (tclassrefdef(def_from).pointeddef.typ=forwarddef)) then begin if (def_from.typesym=def_to.typesym) or (fromtreetype=niln) then diff --git a/tests/webtbs/tw22705.pp b/tests/webtbs/tw22705.pp new file mode 100644 index 0000000000..641887e19d --- /dev/null +++ b/tests/webtbs/tw22705.pp @@ -0,0 +1,69 @@ +{ %norun } + +program badclass; + +{$mode objfpc} + +type + tMyClass=class + end; + tMyFormType= class of tMyClass; + + prec = ^trec; + trec = record + end; + + TForm1 = class + public + procedure myFNC(obj:tMyFormType); overload; + procedure myFNC(obj:tClass); overload; + procedure myFNC2(obj:prec); overload; + procedure myFNC2(obj:pchar); overload; + end; + + TForm2 = class + public + procedure myFNC(obj:tClass); overload; + procedure myFNC(obj:tMyFormType); overload; + procedure myFNC2(obj:pchar); overload; + procedure myFNC2(obj:prec); overload; + end; + +procedure TForm1.myFNC(obj:tClass); +begin +end; + +procedure TForm1.myFNC(obj:tMyFormType); +begin +end; + +procedure TForm1.myFNC2(obj:prec); +begin +end; + +procedure TForm1.myFNC2(obj:pchar); +begin +end; + + +procedure TForm2.myFNC(obj:tClass); +begin +end; + +procedure TForm2.myFNC(obj:tMyFormType); +begin +end; + +procedure TForm2.myFNC2(obj:prec); +begin +end; + +procedure TForm2.myFNC2(obj:pchar); +begin +end; + + +begin +end. + +