* also check elementtype of arraydef for forwarddef

This commit is contained in:
peter 1999-12-10 10:04:21 +00:00
parent 768200b8d0
commit 903ac0f0dc

View File

@ -862,7 +862,8 @@ unit pdecl;
procedure resolve_type_forward(p : pnamedindexobject);{$ifndef FPC}far;{$endif} procedure resolve_type_forward(p : pnamedindexobject);{$ifndef FPC}far;{$endif}
var var
hpd,pd : pdef; hpd,pd : pdef;
stpos : tfileposinfo; stpos : tfileposinfo;
again : boolean;
begin begin
{ Check only typesyms or record/object fields } { Check only typesyms or record/object fields }
case psym(p)^.typ of case psym(p)^.typ of
@ -876,60 +877,69 @@ unit pdecl;
else else
exit; exit;
end; end;
case pd^.deftype of repeat
pointerdef, again:=false;
classrefdef : case pd^.deftype of
begin arraydef :
{ classrefdef inherits from pointerdef } begin
hpd:=ppointerdef(pd)^.pointertype.def; { elementtype could also be defined using a forwarddef }
{ still a forward def ? } pd:=parraydef(pd)^.elementtype.def;
if hpd^.deftype=forwarddef then again:=true;
begin end;
{ try to resolve the forward } pointerdef,
{ get the correct position for it } classrefdef :
stpos:=tokenpos; begin
tokenpos:=pforwarddef(hpd)^.forwardpos; { classrefdef inherits from pointerdef }
resolving_forward:=true; hpd:=ppointerdef(pd)^.pointertype.def;
getsym(pforwarddef(hpd)^.tosymname,false); { still a forward def ? }
resolving_forward:=false; if hpd^.deftype=forwarddef then
tokenpos:=stpos; begin
{ we don't need the forwarddef anymore, dispose it } { try to resolve the forward }
dispose(hpd,done); { get the correct position for it }
{ was a type sym found ? } stpos:=tokenpos;
if assigned(srsym) and tokenpos:=pforwarddef(hpd)^.forwardpos;
(srsym^.typ=typesym) then resolving_forward:=true;
begin getsym(pforwarddef(hpd)^.tosymname,false);
ppointerdef(pd)^.pointertype.def:=ptypesym(srsym)^.restype.def; resolving_forward:=false;
tokenpos:=stpos;
{ we don't need the forwarddef anymore, dispose it }
dispose(hpd,done);
{ was a type sym found ? }
if assigned(srsym) and
(srsym^.typ=typesym) then
begin
ppointerdef(pd)^.pointertype:=ptypesym(srsym)^.restype;
{$ifdef GDB} {$ifdef GDB}
if (cs_debuginfo in aktmoduleswitches) and assigned(debuglist) and if (cs_debuginfo in aktmoduleswitches) and assigned(debuglist) and
(psym(p)^.owner^.symtabletype in [globalsymtable,staticsymtable]) then (psym(p)^.owner^.symtabletype in [globalsymtable,staticsymtable]) then
begin begin
ptypesym(p)^.isusedinstab := true; ptypesym(p)^.isusedinstab := true;
psym(p)^.concatstabto(debuglist); psym(p)^.concatstabto(debuglist);
end; end;
{$endif GDB} {$endif GDB}
{ we need a class type for classrefdef } { we need a class type for classrefdef }
if (pd^.deftype=classrefdef) and if (pd^.deftype=classrefdef) and
not((ptypesym(srsym)^.restype.def^.deftype=objectdef) and not((ptypesym(srsym)^.restype.def^.deftype=objectdef) and
pobjectdef(ptypesym(srsym)^.restype.def)^.is_class) then pobjectdef(ptypesym(srsym)^.restype.def)^.is_class) then
Message1(type_e_class_type_expected,ptypesym(srsym)^.restype.def^.typename); Message1(type_e_class_type_expected,ptypesym(srsym)^.restype.def^.typename);
end end
else else
begin begin
MessagePos1(psym(p)^.fileinfo,sym_e_forward_type_not_resolved,p^.name); MessagePos1(psym(p)^.fileinfo,sym_e_forward_type_not_resolved,p^.name);
{ try to recover } { try to recover }
ppointerdef(pd)^.pointertype.def:=generrordef; ppointerdef(pd)^.pointertype.def:=generrordef;
end; end;
end; end;
end; end;
recorddef : recorddef :
precorddef(pd)^.symtable^.foreach({$ifndef TP}@{$endif}resolve_type_forward); precorddef(pd)^.symtable^.foreach({$ifndef TP}@{$endif}resolve_type_forward);
objectdef : objectdef :
{ Don't check objectdefs in objects/records, because these can't { Don't check objectdefs in objects/records, because these can't
exist (anonymous objects aren't allowed) } exist (anonymous objects aren't allowed) }
if not(psym(p)^.owner^.symtabletype in [objectsymtable,recordsymtable]) then if not(psym(p)^.owner^.symtabletype in [objectsymtable,recordsymtable]) then
pobjectdef(pd)^.symtable^.foreach({$ifndef TP}@{$endif}resolve_type_forward); pobjectdef(pd)^.symtable^.foreach({$ifndef TP}@{$endif}resolve_type_forward);
end; end;
until not again;
end; end;
{ reads a type declaration to the symbol table } { reads a type declaration to the symbol table }
@ -1170,7 +1180,10 @@ unit pdecl;
end. end.
{ {
$Log$ $Log$
Revision 1.174 1999-12-01 12:42:32 peter Revision 1.175 1999-12-10 10:04:21 peter
* also check elementtype of arraydef for forwarddef
Revision 1.174 1999/12/01 12:42:32 peter
* fixed bug 698 * fixed bug 698
* removed some notes about unused vars * removed some notes about unused vars