* set_varstate cleanup

This commit is contained in:
peter 2003-10-08 19:19:45 +00:00
parent f187323816
commit 95f132db3d
17 changed files with 182 additions and 189 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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