Explorar el Código

* set_varstate cleanup

peter hace 22 años
padre
commit
95f132db3d

+ 30 - 81
compiler/htypechk.pas

@@ -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
+                    if must_be_valid and (hsym.varstate=vs_declared) then
+                      begin
+                        { 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
+                            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
-                      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;
+                            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
 

+ 9 - 4
compiler/nadd.pas

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

+ 12 - 9
compiler/ncal.pas

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

+ 5 - 2
compiler/ncginl.pas

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

+ 8 - 5
compiler/ncnv.pas

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

+ 14 - 11
compiler/nflw.pas

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

+ 29 - 25
compiler/ninl.pas

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

+ 9 - 7
compiler/nld.pas

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

+ 10 - 7
compiler/nmat.pas

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

+ 8 - 5
compiler/nmem.pas

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

+ 4 - 2
compiler/node.pas

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

+ 11 - 8
compiler/nset.pas

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

+ 6 - 11
compiler/pexpr.pas

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

+ 10 - 4
compiler/pinline.pas

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

+ 6 - 2
compiler/pstatmnt.pas

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

+ 5 - 3
compiler/symconst.pas

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

+ 5 - 2
compiler/symsym.pas

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