mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-22 04:29:29 +02:00
* set_varstate cleanup
This commit is contained in:
parent
f187323816
commit
95f132db3d
@ -29,7 +29,7 @@ interface
|
||||
uses
|
||||
tokens,
|
||||
node,
|
||||
symtype,symdef;
|
||||
symconst,symtype,symdef;
|
||||
|
||||
type
|
||||
Ttok2nodeRec=record
|
||||
@ -94,14 +94,8 @@ interface
|
||||
function is_procsym_load(p:tnode):boolean;
|
||||
procedure test_local_to_procvar(from_def:tprocvardef;to_def:tdef);
|
||||
|
||||
{
|
||||
type
|
||||
tvarstaterequire = (vsr_can_be_undefined,vsr_must_be_valid,
|
||||
vsr_is_used_after,vsr_must_be_valid_and_is_used_after); }
|
||||
|
||||
{ sets varsym varstate field correctly }
|
||||
procedure unset_varstate(p : tnode);
|
||||
procedure set_varstate(p : tnode;must_be_valid : boolean);
|
||||
procedure set_varstate(p:tnode;newstate:tvarstate;must_be_valid:boolean);
|
||||
|
||||
{ sets the callunique flag, if the node is a vecn, }
|
||||
{ takes care of type casts etc. }
|
||||
@ -118,8 +112,8 @@ implementation
|
||||
uses
|
||||
globtype,systems,
|
||||
cutils,verbose,globals,
|
||||
symconst,symsym,symtable,
|
||||
defutil,defcmp,cpubase,
|
||||
symsym,symtable,
|
||||
defutil,defcmp,
|
||||
ncnv,nld,
|
||||
nmem,ncal,nmat,
|
||||
cgbase,procinfo
|
||||
@ -580,7 +574,7 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
procedure set_varstate(p : tnode;must_be_valid : boolean);
|
||||
procedure set_varstate(p:tnode;newstate:tvarstate;must_be_valid:boolean);
|
||||
var
|
||||
hsym : tvarsym;
|
||||
begin
|
||||
@ -607,72 +601,44 @@ implementation
|
||||
p:=tunarynode(p).left;
|
||||
vecn:
|
||||
begin
|
||||
set_varstate(tbinarynode(p).right,true);
|
||||
set_varstate(tbinarynode(p).right,vs_used,true);
|
||||
if not(tunarynode(p).left.resulttype.def.deftype in [stringdef,arraydef]) then
|
||||
must_be_valid:=true;
|
||||
must_be_valid:=true;
|
||||
p:=tunarynode(p).left;
|
||||
end;
|
||||
{ do not parse calln }
|
||||
calln :
|
||||
break;
|
||||
callparan :
|
||||
begin
|
||||
set_varstate(tbinarynode(p).right,must_be_valid);
|
||||
p:=tunarynode(p).left;
|
||||
end;
|
||||
loadn :
|
||||
begin
|
||||
if (tloadnode(p).symtableentry.typ=varsym) then
|
||||
begin
|
||||
hsym:=tvarsym(tloadnode(p).symtableentry);
|
||||
if must_be_valid and (nf_first_use in p.flags) then
|
||||
begin
|
||||
if (hsym.varstate=vs_declared_and_first_found) or
|
||||
(hsym.varstate=vs_set_but_first_not_passed) then
|
||||
begin
|
||||
if (assigned(hsym.owner) and
|
||||
assigned(current_procinfo) and
|
||||
(hsym.owner=current_procinfo.procdef.localst)) then
|
||||
begin
|
||||
if (vo_is_funcret in hsym.varoptions) then
|
||||
CGMessage(sym_w_function_result_not_set)
|
||||
else
|
||||
if tloadnode(p).symtable.symtabletype=localsymtable then
|
||||
CGMessage1(sym_n_uninitialized_local_variable,hsym.realname)
|
||||
else
|
||||
CGMessage1(sym_n_uninitialized_variable,hsym.realname);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
if (nf_first_use in p.flags) then
|
||||
begin
|
||||
if hsym.varstate=vs_declared_and_first_found then
|
||||
begin
|
||||
{ this can only happen at left of an assignment, no ? PM }
|
||||
if (parsing_para_level=0) and not must_be_valid then
|
||||
hsym.varstate:=vs_assigned
|
||||
else
|
||||
hsym.varstate:=vs_used;
|
||||
end
|
||||
else
|
||||
if hsym.varstate=vs_set_but_first_not_passed then
|
||||
hsym.varstate:=vs_used;
|
||||
exclude(p.flags,nf_first_use);
|
||||
end
|
||||
else
|
||||
if must_be_valid and (hsym.varstate=vs_declared) then
|
||||
begin
|
||||
if (hsym.varstate=vs_assigned) and
|
||||
(must_be_valid or (parsing_para_level>0) or
|
||||
(p.resulttype.def.deftype=procvardef)) then
|
||||
hsym.varstate:=vs_used;
|
||||
if (hsym.varstate=vs_declared_and_first_found) and
|
||||
(must_be_valid or (parsing_para_level>0) or
|
||||
(p.resulttype.def.deftype=procvardef)) then
|
||||
hsym.varstate:=vs_set_but_first_not_passed;
|
||||
{ Give warning/note for uninitialized locals }
|
||||
if assigned(hsym.owner) and
|
||||
not(vo_is_external in hsym.varoptions) and
|
||||
(hsym.owner.symtabletype=localsymtable) and
|
||||
(hsym.owner=current_procinfo.procdef.localst) then
|
||||
begin
|
||||
if (vo_is_funcret in hsym.varoptions) then
|
||||
CGMessage(sym_w_function_result_not_set)
|
||||
else
|
||||
if tloadnode(p).symtable.symtabletype=localsymtable then
|
||||
CGMessage1(sym_n_uninitialized_local_variable,hsym.realname)
|
||||
else
|
||||
CGMessage1(sym_n_uninitialized_variable,hsym.realname);
|
||||
end;
|
||||
end;
|
||||
{ don't override vs_used with vs_assigned }
|
||||
if hsym.varstate<>vs_used then
|
||||
hsym.varstate:=newstate;
|
||||
end;
|
||||
break;
|
||||
end;
|
||||
callparan :
|
||||
internalerror(200310081);
|
||||
else
|
||||
break;
|
||||
end;{case }
|
||||
@ -680,23 +646,6 @@ implementation
|
||||
end;
|
||||
|
||||
|
||||
procedure unset_varstate(p : tnode);
|
||||
begin
|
||||
while assigned(p) do
|
||||
begin
|
||||
exclude(p.flags,nf_varstateset);
|
||||
case p.nodetype of
|
||||
typeconvn,
|
||||
subscriptn,
|
||||
vecn :
|
||||
p:=tunarynode(p).left;
|
||||
else
|
||||
break;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
||||
procedure set_unique(p : tnode);
|
||||
begin
|
||||
while assigned(p) do
|
||||
@ -918,9 +867,6 @@ implementation
|
||||
end
|
||||
else
|
||||
begin
|
||||
{ set the assigned flag for varsyms }
|
||||
if (tvarsym(tloadnode(hp).symtableentry).varstate=vs_declared) then
|
||||
tvarsym(tloadnode(hp).symtableentry).varstate:=vs_assigned;
|
||||
valid_for_assign:=true;
|
||||
exit;
|
||||
end;
|
||||
@ -995,7 +941,10 @@ implementation
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.68 2003-10-05 21:21:52 peter
|
||||
Revision 1.69 2003-10-08 19:19:45 peter
|
||||
* set_varstate cleanup
|
||||
|
||||
Revision 1.68 2003/10/05 21:21:52 peter
|
||||
* c style array of const generates callparanodes
|
||||
* varargs paraloc fixes
|
||||
|
||||
|
@ -78,7 +78,7 @@ implementation
|
||||
{$ifdef state_tracking}
|
||||
nstate,
|
||||
{$endif}
|
||||
cpubase,cpuinfo,procinfo;
|
||||
cpuinfo,procinfo;
|
||||
|
||||
|
||||
{*****************************************************************************
|
||||
@ -124,8 +124,8 @@ implementation
|
||||
resulttypepass(left);
|
||||
resulttypepass(right);
|
||||
{ both left and right need to be valid }
|
||||
set_varstate(left,true);
|
||||
set_varstate(right,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
set_varstate(right,vs_used,true);
|
||||
if codegenerror then
|
||||
exit;
|
||||
|
||||
@ -1526,7 +1526,9 @@ implementation
|
||||
|
||||
function taddnode.pass_1 : tnode;
|
||||
var
|
||||
{$ifdef addstringopt}
|
||||
hp : tnode;
|
||||
{$endif addstringopt}
|
||||
lt,rt : tnodetype;
|
||||
rd,ld : tdef;
|
||||
begin
|
||||
@ -1873,7 +1875,10 @@ begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.96 2003-10-01 20:34:48 peter
|
||||
Revision 1.97 2003-10-08 19:19:45 peter
|
||||
* set_varstate cleanup
|
||||
|
||||
Revision 1.96 2003/10/01 20:34:48 peter
|
||||
* procinfo unit contains tprocinfo
|
||||
* cginfo renamed to cgbase
|
||||
* moved cgmessage to verbose
|
||||
|
@ -640,13 +640,13 @@ type
|
||||
floatdef :
|
||||
inserttypeconv(left,s64floattype);
|
||||
end;
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
resulttype:=left.resulttype;
|
||||
end
|
||||
else
|
||||
if (paraitem.is_hidden) then
|
||||
begin
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
resulttype:=left.resulttype;
|
||||
end
|
||||
else
|
||||
@ -776,10 +776,10 @@ type
|
||||
|
||||
if do_count then
|
||||
begin
|
||||
{ not completly proper, but avoids some warnings }
|
||||
{if (paraitem.paratyp in [vs_var,vs_out]) then
|
||||
set_funcret_is_valid(left); }
|
||||
set_varstate(left,not(paraitem.paratyp in [vs_var,vs_out]));
|
||||
if paraitem.paratyp in [vs_var,vs_out] then
|
||||
set_varstate(left,vs_used,false)
|
||||
else
|
||||
set_varstate(left,vs_used,true);
|
||||
end;
|
||||
{ must only be done after typeconv PM }
|
||||
resulttype:=paraitem.paratype;
|
||||
@ -1995,7 +1995,7 @@ type
|
||||
{ procedure variable ? }
|
||||
if assigned(right) then
|
||||
begin
|
||||
set_varstate(right,true);
|
||||
set_varstate(right,vs_used,true);
|
||||
resulttypepass(right);
|
||||
if codegenerror then
|
||||
exit;
|
||||
@ -2271,7 +2271,7 @@ type
|
||||
method_must_be_valid:=false
|
||||
else
|
||||
method_must_be_valid:=true;
|
||||
set_varstate(methodpointer,method_must_be_valid);
|
||||
set_varstate(methodpointer,vs_used,method_must_be_valid);
|
||||
|
||||
{ The object is already used if it is called once }
|
||||
if (hpt.nodetype=loadn) and
|
||||
@ -2609,7 +2609,10 @@ begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.192 2003-10-07 21:14:32 peter
|
||||
Revision 1.193 2003-10-08 19:19:45 peter
|
||||
* set_varstate cleanup
|
||||
|
||||
Revision 1.192 2003/10/07 21:14:32 peter
|
||||
* compare_paras() has a parameter to ignore hidden parameters
|
||||
* cross unit overload searching ignores hidden parameters when
|
||||
comparing parameter lists. Now function(string):string is
|
||||
|
@ -448,7 +448,7 @@ implementation
|
||||
begin
|
||||
location_reset(location,LOC_REGISTER,OS_ADDR);
|
||||
location.register:=rg.getaddressregister(exprasmlist);
|
||||
reference_reset_symbol(href,tstoreddef(ttypenode(tcallparanode(left).left).resulttype.def).get_rtti_label(fullrtti),0);
|
||||
reference_reset_symbol(href,tstoreddef(left.resulttype.def).get_rtti_label(fullrtti),0);
|
||||
cg.a_loadaddr_ref_reg(exprasmlist,href,location.register);
|
||||
end;
|
||||
|
||||
@ -656,7 +656,10 @@ end.
|
||||
|
||||
{
|
||||
$Log$
|
||||
Revision 1.44 2003-10-05 21:21:52 peter
|
||||
Revision 1.45 2003-10-08 19:19:45 peter
|
||||
* set_varstate cleanup
|
||||
|
||||
Revision 1.44 2003/10/05 21:21:52 peter
|
||||
* c style array of const generates callparanodes
|
||||
* varargs paraloc fixes
|
||||
|
||||
|
@ -1858,8 +1858,8 @@ implementation
|
||||
resulttypepass(left);
|
||||
resulttypepass(right);
|
||||
|
||||
set_varstate(left,true);
|
||||
set_varstate(right,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
set_varstate(right,vs_used,true);
|
||||
|
||||
if codegenerror then
|
||||
exit;
|
||||
@ -1967,8 +1967,8 @@ implementation
|
||||
resulttypepass(right);
|
||||
resulttypepass(left);
|
||||
|
||||
set_varstate(right,true);
|
||||
set_varstate(left,true);
|
||||
set_varstate(right,vs_used,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
|
||||
if codegenerror then
|
||||
exit;
|
||||
@ -2104,7 +2104,10 @@ begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.121 2003-10-07 14:30:27 peter
|
||||
Revision 1.122 2003-10-08 19:19:45 peter
|
||||
* set_varstate cleanup
|
||||
|
||||
Revision 1.121 2003/10/07 14:30:27 peter
|
||||
* fix 2720
|
||||
|
||||
Revision 1.120 2003/10/01 20:34:48 peter
|
||||
|
@ -380,7 +380,7 @@ implementation
|
||||
{ loop instruction }
|
||||
if assigned(right) then
|
||||
resulttypepass(right);
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
if codegenerror then
|
||||
exit;
|
||||
if not is_boolean(left.resulttype.def) then
|
||||
@ -543,7 +543,7 @@ implementation
|
||||
{ else path }
|
||||
if assigned(t1) then
|
||||
resulttypepass(t1);
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
if codegenerror then
|
||||
exit;
|
||||
|
||||
@ -699,7 +699,7 @@ implementation
|
||||
t2:=tassignmentnode(left).left.getcopy;
|
||||
|
||||
resulttypepass(left);
|
||||
set_varstate(left,false);
|
||||
set_varstate(left,vs_used,true);
|
||||
|
||||
if assigned(t1) then
|
||||
begin
|
||||
@ -710,7 +710,7 @@ implementation
|
||||
|
||||
{ process count var }
|
||||
resulttypepass(t2);
|
||||
set_varstate(t2,true);
|
||||
set_varstate(t2,vs_used,false);
|
||||
if codegenerror then
|
||||
exit;
|
||||
|
||||
@ -749,7 +749,7 @@ implementation
|
||||
CGMessagePos(hp.fileinfo,cg_e_illegal_count_var);
|
||||
|
||||
resulttypepass(right);
|
||||
set_varstate(right,true);
|
||||
set_varstate(right,vs_used,true);
|
||||
inserttypeconv(right,t2.resulttype);
|
||||
end;
|
||||
|
||||
@ -864,7 +864,7 @@ implementation
|
||||
cloadnode.create(current_procinfo.procdef.funcretsym,current_procinfo.procdef.funcretsym.owner),
|
||||
left);
|
||||
resulttypepass(left);
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
end;
|
||||
resulttype:=voidtype;
|
||||
end;
|
||||
@ -1166,7 +1166,7 @@ implementation
|
||||
begin
|
||||
{ first para must be a _class_ }
|
||||
resulttypepass(left);
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
if codegenerror then
|
||||
exit;
|
||||
if not(is_class(left.resulttype.def)) then
|
||||
@ -1293,16 +1293,16 @@ implementation
|
||||
resulttype:=voidtype;
|
||||
|
||||
resulttypepass(left);
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
|
||||
resulttypepass(right);
|
||||
set_varstate(right,true);
|
||||
set_varstate(right,vs_used,true);
|
||||
|
||||
{ special finally block only executed when there was an exception }
|
||||
if assigned(t1) then
|
||||
begin
|
||||
resulttypepass(t1);
|
||||
set_varstate(t1,true);
|
||||
set_varstate(t1,vs_used,true);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -1431,7 +1431,10 @@ begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.81 2003-10-05 11:53:57 florian
|
||||
Revision 1.82 2003-10-08 19:19:45 peter
|
||||
* set_varstate cleanup
|
||||
|
||||
Revision 1.81 2003/10/05 11:53:57 florian
|
||||
* writing of loop nodes fixed
|
||||
|
||||
Revision 1.80 2003/10/01 20:34:48 peter
|
||||
|
@ -75,7 +75,7 @@ implementation
|
||||
symbase,symconst,symtype,symdef,symsym,symtable,paramgr,defutil,defcmp,
|
||||
pass_1,
|
||||
ncal,ncon,ncnv,nadd,nld,nbas,nflw,nmem,nmat,
|
||||
cpubase,cgbase,procinfo
|
||||
cgbase,procinfo
|
||||
;
|
||||
|
||||
function geninlinenode(number : byte;is_const:boolean;l : tnode) : tinlinenode;
|
||||
@ -397,7 +397,7 @@ implementation
|
||||
left := filepara.right;
|
||||
filepara.right := nil;
|
||||
{ the file para is a var parameter, but it must be valid already }
|
||||
set_varstate(filepara,true);
|
||||
set_varstate(filepara.left,vs_used,true);
|
||||
{ check if we should make a temp to store the result of a complex }
|
||||
{ expression (better heuristics, anyone?) (JM) }
|
||||
if (filepara.left.nodetype <> loadn) then
|
||||
@ -1380,7 +1380,7 @@ implementation
|
||||
result:=hp;
|
||||
goto myexit;
|
||||
end;
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
if not is_integer(left.resulttype.def) then
|
||||
CGMessage(type_e_mismatch);
|
||||
case inlinenumber of
|
||||
@ -1399,7 +1399,7 @@ implementation
|
||||
|
||||
in_sizeof_x:
|
||||
begin
|
||||
set_varstate(left,false);
|
||||
set_varstate(left,vs_used,false);
|
||||
if paramanager.push_high_param(vs_value,left.resulttype.def,current_procinfo.procdef.proccalloption) then
|
||||
begin
|
||||
hightree:=load_high_value_node(tvarsym(tloadnode(left).symtableentry));
|
||||
@ -1420,7 +1420,7 @@ implementation
|
||||
|
||||
in_typeof_x:
|
||||
begin
|
||||
set_varstate(left,false);
|
||||
set_varstate(left,vs_used,false);
|
||||
resulttype:=voidpointertype;
|
||||
end;
|
||||
|
||||
@ -1433,7 +1433,7 @@ implementation
|
||||
result:=hp;
|
||||
goto myexit;
|
||||
end;
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
case left.resulttype.def.deftype of
|
||||
orddef :
|
||||
begin
|
||||
@ -1486,7 +1486,7 @@ implementation
|
||||
in_chr_byte:
|
||||
begin
|
||||
{ convert to explicit char() }
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
hp:=ctypeconvnode.create_explicit(left,cchartype);
|
||||
left:=nil;
|
||||
result:=hp;
|
||||
@ -1494,7 +1494,7 @@ implementation
|
||||
|
||||
in_length_x:
|
||||
begin
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
|
||||
case left.resulttype.def.deftype of
|
||||
stringdef :
|
||||
@ -1601,7 +1601,7 @@ implementation
|
||||
|
||||
in_typeinfo_x:
|
||||
begin
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
resulttype:=voidpointertype;
|
||||
end;
|
||||
|
||||
@ -1622,7 +1622,7 @@ implementation
|
||||
|
||||
in_seg_x :
|
||||
begin
|
||||
set_varstate(left,false);
|
||||
set_varstate(left,vs_used,false);
|
||||
hp:=cordconstnode.create(0,s32bittype,false);
|
||||
result:=hp;
|
||||
goto myexit;
|
||||
@ -1631,7 +1631,7 @@ implementation
|
||||
in_pred_x,
|
||||
in_succ_x:
|
||||
begin
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
resulttype:=left.resulttype;
|
||||
if not is_ordinal(resulttype.def) then
|
||||
CGMessage(type_e_ordinal_expr_expected)
|
||||
@ -1672,11 +1672,9 @@ implementation
|
||||
resulttype:=voidtype;
|
||||
if assigned(left) then
|
||||
begin
|
||||
set_varstate(left,true);
|
||||
if codegenerror then
|
||||
exit;
|
||||
{ first param must be var }
|
||||
valid_for_var(tcallparanode(left).left);
|
||||
set_varstate(tcallparanode(left).left,vs_used,true);
|
||||
|
||||
if (left.resulttype.def.deftype in [enumdef,pointerdef]) or
|
||||
is_ordinal(left.resulttype.def) or
|
||||
@ -1687,6 +1685,7 @@ implementation
|
||||
{ two paras ? }
|
||||
if assigned(tcallparanode(left).right) then
|
||||
begin
|
||||
set_varstate(tcallparanode(tcallparanode(left).right).left,vs_used,true);
|
||||
if (aktlocalswitches *
|
||||
[cs_check_overflow,cs_check_range] = []) then
|
||||
begin
|
||||
@ -1761,14 +1760,15 @@ implementation
|
||||
resulttype:=voidtype;
|
||||
{ the parser already checks whether we have two (and exectly two) }
|
||||
{ parameters (JM) }
|
||||
set_varstate(left,true);
|
||||
{ first param must be var }
|
||||
valid_for_var(tcallparanode(left).left);
|
||||
set_varstate(tcallparanode(left).left,vs_used,true);
|
||||
{ check type }
|
||||
if (left.resulttype.def.deftype=setdef) then
|
||||
begin
|
||||
{ insert a type conversion }
|
||||
{ to the type of the set elements }
|
||||
set_varstate(tcallparanode(tcallparanode(left).right).left,vs_used,true);
|
||||
inserttypeconv(tcallparanode(tcallparanode(left).right).left,
|
||||
tsetdef(left.resulttype.def).elementtype);
|
||||
end
|
||||
@ -1779,7 +1779,7 @@ implementation
|
||||
in_low_x,
|
||||
in_high_x:
|
||||
begin
|
||||
set_varstate(left,false);
|
||||
set_varstate(left,vs_used,false);
|
||||
case left.resulttype.def.deftype of
|
||||
orddef,
|
||||
enumdef:
|
||||
@ -1854,7 +1854,7 @@ implementation
|
||||
setconstrealvalue(cos(getconstrealvalue))
|
||||
else
|
||||
begin
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
inserttypeconv(left,pbestrealtype^);
|
||||
resulttype:=pbestrealtype^;
|
||||
end;
|
||||
@ -1866,7 +1866,7 @@ implementation
|
||||
setconstrealvalue(sin(getconstrealvalue))
|
||||
else
|
||||
begin
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
inserttypeconv(left,pbestrealtype^);
|
||||
resulttype:=pbestrealtype^;
|
||||
end;
|
||||
@ -1878,7 +1878,7 @@ implementation
|
||||
setconstrealvalue(arctan(getconstrealvalue))
|
||||
else
|
||||
begin
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
inserttypeconv(left,pbestrealtype^);
|
||||
resulttype:=pbestrealtype^;
|
||||
end;
|
||||
@ -1890,7 +1890,7 @@ implementation
|
||||
setconstrealvalue(abs(getconstrealvalue))
|
||||
else
|
||||
begin
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
inserttypeconv(left,pbestrealtype^);
|
||||
resulttype:=pbestrealtype^;
|
||||
end;
|
||||
@ -1902,7 +1902,7 @@ implementation
|
||||
setconstrealvalue(sqr(getconstrealvalue))
|
||||
else
|
||||
begin
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
inserttypeconv(left,pbestrealtype^);
|
||||
resulttype:=pbestrealtype^;
|
||||
end;
|
||||
@ -1920,7 +1920,7 @@ implementation
|
||||
end
|
||||
else
|
||||
begin
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
inserttypeconv(left,pbestrealtype^);
|
||||
resulttype:=pbestrealtype^;
|
||||
end;
|
||||
@ -1938,7 +1938,7 @@ implementation
|
||||
end
|
||||
else
|
||||
begin
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
inserttypeconv(left,pbestrealtype^);
|
||||
resulttype:=pbestrealtype^;
|
||||
end;
|
||||
@ -1955,10 +1955,11 @@ implementation
|
||||
resulttype:=voidtype;
|
||||
if assigned(left) then
|
||||
begin
|
||||
set_varstate(left,true);
|
||||
set_varstate(tcallparanode(left).left,vs_used,true);
|
||||
{ check type }
|
||||
if is_boolean(left.resulttype.def) then
|
||||
begin
|
||||
set_varstate(tcallparanode(tcallparanode(left).right).left,vs_used,true);
|
||||
{ must always be a string }
|
||||
inserttypeconv(tcallparanode(tcallparanode(left).right).left,cshortstringtype);
|
||||
end
|
||||
@ -2357,7 +2358,10 @@ begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.119 2003-10-01 20:34:48 peter
|
||||
Revision 1.120 2003-10-08 19:19:45 peter
|
||||
* set_varstate cleanup
|
||||
|
||||
Revision 1.119 2003/10/01 20:34:48 peter
|
||||
* procinfo unit contains tprocinfo
|
||||
* cginfo renamed to cgbase
|
||||
* moved cgmessage to verbose
|
||||
|
@ -657,9 +657,8 @@ implementation
|
||||
end;
|
||||
|
||||
resulttypepass(right);
|
||||
set_varstate(left,false);
|
||||
set_varstate(right,true);
|
||||
{ set_funcret_is_valid(left); }
|
||||
set_varstate(left,vs_assigned,false);
|
||||
set_varstate(right,vs_used,true);
|
||||
if codegenerror then
|
||||
exit;
|
||||
|
||||
@ -894,8 +893,8 @@ implementation
|
||||
result:=nil;
|
||||
resulttypepass(left);
|
||||
resulttypepass(right);
|
||||
set_varstate(left,true);
|
||||
set_varstate(right,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
set_varstate(right,vs_used,true);
|
||||
if codegenerror then
|
||||
exit;
|
||||
resulttype:=left.resulttype;
|
||||
@ -959,7 +958,7 @@ implementation
|
||||
while assigned(hp) do
|
||||
begin
|
||||
resulttypepass(hp.left);
|
||||
set_varstate(hp.left,true);
|
||||
set_varstate(hp.left,vs_used,true);
|
||||
if (htype.def=nil) then
|
||||
htype:=hp.left.resulttype
|
||||
else
|
||||
@ -1247,7 +1246,10 @@ begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.109 2003-10-05 21:21:52 peter
|
||||
Revision 1.110 2003-10-08 19:19:45 peter
|
||||
* set_varstate cleanup
|
||||
|
||||
Revision 1.109 2003/10/05 21:21:52 peter
|
||||
* c style array of const generates callparanodes
|
||||
* varargs paraloc fixes
|
||||
|
||||
|
@ -102,8 +102,8 @@ implementation
|
||||
result:=nil;
|
||||
resulttypepass(left);
|
||||
resulttypepass(right);
|
||||
set_varstate(left,true);
|
||||
set_varstate(right,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
set_varstate(right,vs_used,true);
|
||||
if codegenerror then
|
||||
exit;
|
||||
|
||||
@ -431,8 +431,8 @@ implementation
|
||||
result:=nil;
|
||||
resulttypepass(left);
|
||||
resulttypepass(right);
|
||||
set_varstate(right,true);
|
||||
set_varstate(left,true);
|
||||
set_varstate(right,vs_used,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
if codegenerror then
|
||||
exit;
|
||||
|
||||
@ -516,7 +516,7 @@ implementation
|
||||
begin
|
||||
result:=nil;
|
||||
resulttypepass(left);
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
if codegenerror then
|
||||
exit;
|
||||
|
||||
@ -649,7 +649,7 @@ implementation
|
||||
begin
|
||||
result:=nil;
|
||||
resulttypepass(left);
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
if codegenerror then
|
||||
exit;
|
||||
|
||||
@ -831,7 +831,10 @@ begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.52 2003-10-01 20:34:49 peter
|
||||
Revision 1.53 2003-10-08 19:19:45 peter
|
||||
* set_varstate cleanup
|
||||
|
||||
Revision 1.52 2003/10/01 20:34:49 peter
|
||||
* procinfo unit contains tprocinfo
|
||||
* cginfo renamed to cgbase
|
||||
* moved cgmessage to verbose
|
||||
|
@ -401,7 +401,7 @@ implementation
|
||||
|
||||
{ this is like the function addr }
|
||||
inc(parsing_para_level);
|
||||
set_varstate(left,false);
|
||||
set_varstate(left,vs_used,false);
|
||||
dec(parsing_para_level);
|
||||
|
||||
end;
|
||||
@ -462,7 +462,7 @@ implementation
|
||||
begin
|
||||
result:=nil;
|
||||
resulttypepass(left);
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
if codegenerror then
|
||||
exit;
|
||||
|
||||
@ -842,8 +842,8 @@ implementation
|
||||
resulttype:=voidtype;
|
||||
|
||||
resulttypepass(withrefnode);
|
||||
unset_varstate(withrefnode);
|
||||
set_varstate(withrefnode,true);
|
||||
//unset_varstate(withrefnode);
|
||||
set_varstate(withrefnode,vs_used,true);
|
||||
if codegenerror then
|
||||
exit;
|
||||
|
||||
@ -904,7 +904,10 @@ begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.64 2003-10-01 20:34:49 peter
|
||||
Revision 1.65 2003-10-08 19:19:45 peter
|
||||
* set_varstate cleanup
|
||||
|
||||
Revision 1.64 2003/10/01 20:34:49 peter
|
||||
* procinfo unit contains tprocinfo
|
||||
* cginfo renamed to cgbase
|
||||
* moved cgmessage to verbose
|
||||
|
@ -201,7 +201,6 @@ interface
|
||||
|
||||
{ general }
|
||||
nf_write, { Node is written to }
|
||||
nf_first_use, { First node that uses a variable after declared }
|
||||
nf_varstateset,
|
||||
nf_isproperty,
|
||||
|
||||
@ -977,7 +976,10 @@ implementation
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.68 2003-10-01 20:34:49 peter
|
||||
Revision 1.69 2003-10-08 19:19:45 peter
|
||||
* set_varstate cleanup
|
||||
|
||||
Revision 1.68 2003/10/01 20:34:49 peter
|
||||
* procinfo unit contains tprocinfo
|
||||
* cginfo renamed to cgbase
|
||||
* moved cgmessage to verbose
|
||||
|
@ -118,7 +118,7 @@ implementation
|
||||
verbose,
|
||||
symconst,symdef,symsym,defutil,defcmp,
|
||||
htypechk,pass_1,
|
||||
nbas,ncnv,ncon,cpubase,nld,rgobj,cgbase;
|
||||
nbas,ncnv,ncon,nld,rgobj,cgbase;
|
||||
|
||||
function gencasenode(l,r : tnode;nodes : pcaserecord) : tnode;
|
||||
|
||||
@ -147,7 +147,7 @@ implementation
|
||||
resulttypepass(left);
|
||||
if assigned(right) then
|
||||
resulttypepass(right);
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
if codegenerror then
|
||||
exit;
|
||||
|
||||
@ -216,7 +216,7 @@ implementation
|
||||
result:=nil;
|
||||
resulttype:=booltype;
|
||||
resulttypepass(right);
|
||||
set_varstate(right,true);
|
||||
set_varstate(right,vs_used,true);
|
||||
if codegenerror then
|
||||
exit;
|
||||
|
||||
@ -243,7 +243,7 @@ implementation
|
||||
end;
|
||||
|
||||
resulttypepass(left);
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
if codegenerror then
|
||||
exit;
|
||||
|
||||
@ -341,8 +341,8 @@ implementation
|
||||
result:=nil;
|
||||
resulttypepass(left);
|
||||
resulttypepass(right);
|
||||
set_varstate(left,true);
|
||||
set_varstate(right,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
set_varstate(right,vs_used,true);
|
||||
if codegenerror then
|
||||
exit;
|
||||
{ both types must be compatible }
|
||||
@ -572,7 +572,7 @@ implementation
|
||||
expectloc:=LOC_VOID;
|
||||
{ evalutes the case expression }
|
||||
firstpass(left);
|
||||
set_varstate(left,true);
|
||||
set_varstate(left,vs_used,true);
|
||||
if codegenerror then
|
||||
exit;
|
||||
registers32:=left.registers32;
|
||||
@ -686,7 +686,10 @@ begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.45 2003-10-01 20:34:49 peter
|
||||
Revision 1.46 2003-10-08 19:19:45 peter
|
||||
* set_varstate cleanup
|
||||
|
||||
Revision 1.45 2003/10/01 20:34:49 peter
|
||||
* procinfo unit contains tprocinfo
|
||||
* cginfo renamed to cgbase
|
||||
* moved cgmessage to verbose
|
||||
|
@ -366,8 +366,7 @@ implementation
|
||||
Message(parser_e_illegal_parameter_list);
|
||||
end;
|
||||
consume(_RKLAMMER);
|
||||
p2:=ccallparanode.create(p1,nil);
|
||||
p2:=geninlinenode(in_typeinfo_x,false,p2);
|
||||
p2:=geninlinenode(in_typeinfo_x,false,p1);
|
||||
statement_syssym:=p2;
|
||||
end;
|
||||
|
||||
@ -511,7 +510,7 @@ implementation
|
||||
while true do
|
||||
begin
|
||||
p1:=comp_expr(true);
|
||||
set_varstate(p1,true);
|
||||
set_varstate(p1,vs_used,true);
|
||||
if not((p1.resulttype.def.deftype=stringdef) or
|
||||
((p1.resulttype.def.deftype=orddef) and
|
||||
(torddef(p1.resulttype.def).typ=uchar))) then
|
||||
@ -1194,13 +1193,6 @@ implementation
|
||||
else
|
||||
p1:=cloadnode.create(srsym,srsymtable);
|
||||
end;
|
||||
|
||||
if tvarsym(srsym).varstate=vs_declared then
|
||||
begin
|
||||
include(p1.flags,nf_first_use);
|
||||
{ set special between first loaded until checked in resulttypepass }
|
||||
tvarsym(srsym).varstate:=vs_declared_and_first_found;
|
||||
end;
|
||||
end;
|
||||
|
||||
typedconstsym :
|
||||
@ -2425,7 +2417,10 @@ implementation
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.132 2003-10-05 12:56:04 peter
|
||||
Revision 1.133 2003-10-08 19:19:45 peter
|
||||
* set_varstate cleanup
|
||||
|
||||
Revision 1.132 2003/10/05 12:56:04 peter
|
||||
* fix assigned(property)
|
||||
|
||||
Revision 1.131 2003/10/02 21:15:31 peter
|
||||
|
@ -81,7 +81,10 @@ implementation
|
||||
consume(_LKLAMMER);
|
||||
p:=comp_expr(true);
|
||||
{ calc return type }
|
||||
set_varstate(p,(not is_new));
|
||||
if is_new then
|
||||
set_varstate(p,vs_assigned,false)
|
||||
else
|
||||
set_varstate(p,vs_used,true);
|
||||
{ constructor,destructor specified }
|
||||
if try_to_consume(_COMMA) then
|
||||
begin
|
||||
@ -415,7 +418,7 @@ implementation
|
||||
ppn:=tcallparanode(paras);
|
||||
while assigned(ppn.right) do
|
||||
begin
|
||||
set_varstate(ppn.left,true);
|
||||
set_varstate(ppn.left,vs_used,true);
|
||||
inserttypeconv(ppn.left,s32bittype);
|
||||
inc(counter);
|
||||
ppn:=tcallparanode(ppn.right);
|
||||
@ -431,7 +434,7 @@ implementation
|
||||
destppn:=ppn.left;
|
||||
inc(parsing_para_level);
|
||||
valid_for_var(destppn);
|
||||
set_varstate(destppn,false);
|
||||
set_varstate(destppn,vs_assigned,false);
|
||||
dec(parsing_para_level);
|
||||
{ first param must be a string or dynamic array ...}
|
||||
isarray:=is_dynamic_array(destppn.resulttype.def);
|
||||
@ -685,7 +688,10 @@ implementation
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.20 2003-10-02 21:15:31 peter
|
||||
Revision 1.21 2003-10-08 19:19:45 peter
|
||||
* set_varstate cleanup
|
||||
|
||||
Revision 1.20 2003/10/02 21:15:31 peter
|
||||
* protected visibility fixes
|
||||
|
||||
Revision 1.19 2003/10/01 20:34:49 peter
|
||||
|
@ -188,6 +188,7 @@ implementation
|
||||
caseexpr:=comp_expr(true);
|
||||
{ determines result type }
|
||||
do_resulttypepass(caseexpr);
|
||||
set_varstate(caseexpr,vs_used,true);
|
||||
casedeferror:=false;
|
||||
casedef:=caseexpr.resulttype.def;
|
||||
if (not assigned(casedef)) or
|
||||
@ -392,7 +393,7 @@ implementation
|
||||
begin
|
||||
p:=comp_expr(true);
|
||||
do_resulttypepass(p);
|
||||
set_varstate(p,false);
|
||||
set_varstate(p,vs_used,false);
|
||||
right:=nil;
|
||||
if (not codegenerror) and
|
||||
(p.resulttype.def.deftype in [objectdef,recorddef]) then
|
||||
@ -1128,7 +1129,10 @@ implementation
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.113 2003-10-07 20:06:37 peter
|
||||
Revision 1.114 2003-10-08 19:19:45 peter
|
||||
* set_varstate cleanup
|
||||
|
||||
Revision 1.113 2003/10/07 20:06:37 peter
|
||||
* set calling convention before assembler block is parsed
|
||||
|
||||
Revision 1.112 2003/10/02 21:15:59 peter
|
||||
|
@ -288,8 +288,7 @@ type
|
||||
|
||||
{ State of the variable, if it's declared, assigned or used }
|
||||
tvarstate=(vs_none,
|
||||
vs_declared,vs_declared_and_first_found,
|
||||
vs_set_but_first_not_passed,vs_assigned,vs_used
|
||||
vs_declared,vs_assigned,vs_used
|
||||
);
|
||||
|
||||
tvarspez = (vs_value,vs_const,vs_var,vs_out);
|
||||
@ -377,7 +376,10 @@ implementation
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.67 2003-10-07 15:17:07 peter
|
||||
Revision 1.68 2003-10-08 19:19:45 peter
|
||||
* set_varstate cleanup
|
||||
|
||||
Revision 1.67 2003/10/07 15:17:07 peter
|
||||
* inline supported again, LOC_REFERENCEs are used to pass the
|
||||
parameters
|
||||
* inlineparasymtable,inlinelocalsymtable removed
|
||||
|
@ -1643,7 +1643,7 @@ implementation
|
||||
highvarsym:=nil;
|
||||
defaultconstsym:=nil;
|
||||
refs:=0;
|
||||
varstate:=vs_used;
|
||||
varstate:=vs_declared;
|
||||
varoptions:=[];
|
||||
end;
|
||||
|
||||
@ -2676,7 +2676,10 @@ implementation
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.124 2003-10-07 21:14:33 peter
|
||||
Revision 1.125 2003-10-08 19:19:45 peter
|
||||
* set_varstate cleanup
|
||||
|
||||
Revision 1.124 2003/10/07 21:14:33 peter
|
||||
* compare_paras() has a parameter to ignore hidden parameters
|
||||
* cross unit overload searching ignores hidden parameters when
|
||||
comparing parameter lists. Now function(string):string is
|
||||
|
Loading…
Reference in New Issue
Block a user