mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-15 19:19:24 +02:00
--- Merging r19281 into '.':
U compiler\pdecsub.pas U compiler\symdef.pas U compiler\pdecobj.pas U compiler\htypechk.pas U compiler\ncal.pas U compiler\symtable.pas --- Recording mergeinfo for merge of r19281 into '.': U . --- Merging r19282 into '.': A tests\webtbf\tw19975.pp --- Recording mergeinfo for merge of r19282 into '.': G . git-svn-id: trunk@19343 -
This commit is contained in:
parent
94adf3992d
commit
df75368d0b
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -11000,6 +11000,7 @@ tests/webtbf/tw1949.pp svneol=native#text/plain
|
||||
tests/webtbf/tw19591.pp svneol=native#text/plain
|
||||
tests/webtbf/tw1969.pp svneol=native#text/plain
|
||||
tests/webtbf/tw1995.pp svneol=native#text/plain
|
||||
tests/webtbf/tw19975.pp svneol=native#text/pascal
|
||||
tests/webtbf/tw20095.pp svneol=native#text/plain
|
||||
tests/webtbf/tw2018.pp svneol=native#text/plain
|
||||
tests/webtbf/tw2037.pp svneol=native#text/plain
|
||||
|
@ -1887,12 +1887,11 @@ implementation
|
||||
not hasoverload then
|
||||
break;
|
||||
end;
|
||||
if is_objectpascal_helper(structdef) then
|
||||
if is_objectpascal_helper(structdef) and
|
||||
(tobjectdef(structdef).typ in [recorddef,objectdef]) then
|
||||
begin
|
||||
if not assigned(tobjectdef(structdef).extendeddef) then
|
||||
Internalerror(2011062601);
|
||||
{ search methods in the extended type as well }
|
||||
srsym:=tprocsym(tobjectdef(structdef).extendeddef.symtable.FindWithHash(hashedid));
|
||||
srsym:=tprocsym(tabstractrecorddef(tobjectdef(structdef).extendeddef).symtable.FindWithHash(hashedid));
|
||||
if assigned(srsym) and
|
||||
{ Delphi allows hiding a property by a procedure with the same name }
|
||||
(srsym.typ=procsym) then
|
||||
|
@ -1638,7 +1638,7 @@ implementation
|
||||
function tcallnode.gen_self_tree:tnode;
|
||||
var
|
||||
selftree : tnode;
|
||||
selfdef : tabstractrecorddef;
|
||||
selfdef : tdef;
|
||||
begin
|
||||
selftree:=nil;
|
||||
|
||||
@ -1692,7 +1692,8 @@ implementation
|
||||
selfdef:=tobjectdef(tprocdef(procdefinition).struct).extendeddef
|
||||
else
|
||||
selfdef:=tprocdef(procdefinition).struct;
|
||||
if (oo_has_vmt in selfdef.objectoptions) then
|
||||
if (selfdef.typ in [recorddef,objectdef]) and
|
||||
(oo_has_vmt in tabstractrecorddef(selfdef).objectoptions) then
|
||||
begin
|
||||
{ we only need the vmt, loading self is not required and there is no
|
||||
need to check for typen, because that will always get the
|
||||
|
@ -634,10 +634,15 @@ implementation
|
||||
Message1(type_e_record_helper_must_extend_same_record,current_objectdef.childof.extendeddef.typename);
|
||||
end;
|
||||
end;
|
||||
else
|
||||
hdef:=nil;
|
||||
end;
|
||||
|
||||
current_objectdef.extendeddef:=tabstractrecorddef(hdef);
|
||||
end;
|
||||
|
||||
if assigned(hdef) then
|
||||
current_objectdef.extendeddef:=hdef
|
||||
else
|
||||
current_objectdef.extendeddef:=generrordef;
|
||||
end;
|
||||
|
||||
procedure parse_guid;
|
||||
@ -1233,7 +1238,8 @@ implementation
|
||||
{ if this helper is defined in the implementation section of the unit
|
||||
or inside the main project file, the extendeddefs list of the current
|
||||
module must be updated (it will be removed when poping the symtable) }
|
||||
if is_objectpascal_helper(current_structdef) then
|
||||
if is_objectpascal_helper(current_structdef) and
|
||||
(current_objectdef.extendeddef.typ in [recorddef,objectdef]) then
|
||||
begin
|
||||
{ the topmost symtable must be a static symtable }
|
||||
st:=current_structdef.owner;
|
||||
@ -1241,7 +1247,7 @@ implementation
|
||||
st:=st.defowner.owner;
|
||||
if st.symtabletype=staticsymtable then
|
||||
begin
|
||||
s:=make_mangledname('',current_objectdef.extendeddef.symtable,'');
|
||||
s:=make_mangledname('',tabstractrecorddef(current_objectdef.extendeddef).symtable,'');
|
||||
list:=TFPObjectList(current_module.extendeddefs.Find(s));
|
||||
if not assigned(list) then
|
||||
begin
|
||||
|
@ -245,7 +245,7 @@ implementation
|
||||
storepos : tfileposinfo;
|
||||
vs : tparavarsym;
|
||||
hdef : tdef;
|
||||
selfdef : tabstractrecorddef;
|
||||
selfdef : tdef;
|
||||
vsp : tvarspez;
|
||||
aliasvs : tabsolutevarsym;
|
||||
sl : tpropaccesslist;
|
||||
|
@ -264,7 +264,7 @@ interface
|
||||
childofderef : tderef;
|
||||
|
||||
{ for Object Pascal helpers }
|
||||
extendeddef : tabstractrecorddef;
|
||||
extendeddef : tdef;
|
||||
extendeddefderef: tderef;
|
||||
{ for C++ classes: name of the library this class is imported from }
|
||||
import_lib,
|
||||
@ -1037,9 +1037,10 @@ implementation
|
||||
if not (st.symlist[i] is ttypesym) then
|
||||
continue;
|
||||
def:=ttypesym(st.SymList[i]).typedef;
|
||||
if is_objectpascal_helper(def) then
|
||||
if is_objectpascal_helper(def) and
|
||||
(tobjectdef(def).extendeddef.typ in [recorddef,objectdef]) then
|
||||
begin
|
||||
s:=make_mangledname('',tobjectdef(def).extendeddef.symtable,'');
|
||||
s:=make_mangledname('',tabstractrecorddef(tobjectdef(def).extendeddef).symtable,'');
|
||||
list:=TFPObjectList(current_module.extendeddefs.Find(s));
|
||||
if not assigned(list) then
|
||||
begin
|
||||
@ -4691,7 +4692,7 @@ implementation
|
||||
else
|
||||
tstoredsymtable(symtable).deref;
|
||||
if objecttype=odt_helper then
|
||||
extendeddef:=tobjectdef(extendeddefderef.resolve);
|
||||
extendeddef:=tdef(extendeddefderef.resolve);
|
||||
for i:=0 to vmtentries.count-1 do
|
||||
begin
|
||||
vmtentry:=pvmtentry(vmtentries[i]);
|
||||
|
@ -2428,14 +2428,17 @@ implementation
|
||||
end;
|
||||
end;
|
||||
{ now search in the extended type itself }
|
||||
srsymtable:=classh.extendeddef.symtable;
|
||||
srsym:=tsym(srsymtable.FindWithHash(hashedid));
|
||||
if assigned(srsym) and
|
||||
is_visible_for_object(srsym,contextclassh) then
|
||||
if classh.extendeddef.typ in [recorddef,objectdef] then
|
||||
begin
|
||||
addsymref(srsym);
|
||||
result:=true;
|
||||
exit;
|
||||
srsymtable:=tabstractrecorddef(classh.extendeddef).symtable;
|
||||
srsym:=tsym(srsymtable.FindWithHash(hashedid));
|
||||
if assigned(srsym) and
|
||||
is_visible_for_object(srsym,contextclassh) then
|
||||
begin
|
||||
addsymref(srsym);
|
||||
result:=true;
|
||||
exit;
|
||||
end;
|
||||
end;
|
||||
{ now search in the parent helpers }
|
||||
parentclassh:=classh.childof;
|
||||
|
15
tests/webtbf/tw19975.pp
Normal file
15
tests/webtbf/tw19975.pp
Normal file
@ -0,0 +1,15 @@
|
||||
{ %FAIL }
|
||||
|
||||
program uGenHelper;
|
||||
|
||||
{$mode objfpc}{$H+}
|
||||
|
||||
type
|
||||
generic TGeneric<T> = class
|
||||
end;
|
||||
|
||||
THelper = class helper for TGeneric
|
||||
end;
|
||||
|
||||
begin
|
||||
end.
|
Loading…
Reference in New Issue
Block a user