--- 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:
florian 2011-10-03 20:43:19 +00:00
parent 94adf3992d
commit df75368d0b
8 changed files with 48 additions and 22 deletions

1
.gitattributes vendored
View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -245,7 +245,7 @@ implementation
storepos : tfileposinfo;
vs : tparavarsym;
hdef : tdef;
selfdef : tabstractrecorddef;
selfdef : tdef;
vsp : tvarspez;
aliasvs : tabsolutevarsym;
sl : tpropaccesslist;

View File

@ -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]);

View File

@ -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
View 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.