mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-01 13:30:47 +02:00
* also check elementtype of arraydef for forwarddef
This commit is contained in:
parent
768200b8d0
commit
903ac0f0dc
@ -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
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user