Browse Source

* ignore vecn,subscriptn when checking for a procvar loadn

peter 23 years ago
parent
commit
f29c79b533
2 changed files with 50 additions and 18 deletions
  1. 15 1
      compiler/htypechk.pas
  2. 35 17
      compiler/pexpr.pas

+ 15 - 1
compiler/htypechk.pas

@@ -470,6 +470,17 @@ implementation
 
 
     function is_procsym_load(p:tnode):boolean;
     function is_procsym_load(p:tnode):boolean;
       begin
       begin
+         { ignore vecn,subscriptn }
+         repeat
+           case p.nodetype of
+             vecn :
+               p:=tvecnode(p).left;
+             subscriptn :
+               p:=tsubscriptnode(p).left;
+             else
+               break;
+           end;
+         until false;
          is_procsym_load:=((p.nodetype=loadn) and (tloadnode(p).symtableentry.typ=procsym)) or
          is_procsym_load:=((p.nodetype=loadn) and (tloadnode(p).symtableentry.typ=procsym)) or
                           ((p.nodetype=addrn) and (taddrnode(p).left.nodetype=loadn)
                           ((p.nodetype=addrn) and (taddrnode(p).left.nodetype=loadn)
                           and (tloadnode(taddrnode(p).left).symtableentry.typ=procsym)) ;
                           and (tloadnode(taddrnode(p).left).symtableentry.typ=procsym)) ;
@@ -939,7 +950,10 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.47  2002-09-16 18:09:34  peter
+  Revision 1.48  2002-10-04 21:13:59  peter
+    * ignore vecn,subscriptn when checking for a procvar loadn
+
+  Revision 1.47  2002/09/16 18:09:34  peter
     * set_funcret_valid fixed when result was already used in a nested
     * set_funcret_valid fixed when result was already used in a nested
       procedure
       procedure
 
 

+ 35 - 17
compiler/pexpr.pas

@@ -203,26 +203,41 @@ implementation
 
 
     procedure check_tp_procvar(var p : tnode);
     procedure check_tp_procvar(var p : tnode);
       var
       var
+         hp,
          p1 : tnode;
          p1 : tnode;
       begin
       begin
          if (m_tp_procvar in aktmodeswitches) and
          if (m_tp_procvar in aktmodeswitches) and
             (not got_addrn) and
             (not got_addrn) and
-            (not in_args) and
-            (p.nodetype=loadn) then
-            begin
-               { support if procvar then for tp7 and many other expression like this }
-               do_resulttypepass(p);
-               set_varstate(p,false);
-               { reset varstateset to maybe set used state later web bug769 PM }
-               unset_varstate(p);
-               if (getprocvardef=nil) and (p.resulttype.def.deftype=procvardef) then
-                 begin
-                    p1:=ccallnode.create(nil,nil,nil,nil);
-                    tcallnode(p1).set_procvar(p);
-                    resulttypepass(p1);
-                    p:=p1;
-                 end;
-            end;
+            (not in_args) then
+          begin
+            { ignore vecn,subscriptn }
+            hp:=p;
+            repeat
+              case hp.nodetype of
+                vecn :
+                  hp:=tvecnode(hp).left;
+                subscriptn :
+                  hp:=tsubscriptnode(hp).left;
+                else
+                  break;
+              end;
+            until false;
+            if (hp.nodetype=loadn) then
+               begin
+                  { support if procvar then for tp7 and many other expression like this }
+                  do_resulttypepass(p);
+                  set_varstate(p,false);
+                  { reset varstateset to maybe set used state later web bug769 PM }
+                  unset_varstate(p);
+                  if (getprocvardef=nil) and (p.resulttype.def.deftype=procvardef) then
+                    begin
+                       p1:=ccallnode.create(nil,nil,nil,nil);
+                       tcallnode(p1).set_procvar(p);
+                       resulttypepass(p1);
+                       p:=p1;
+                    end;
+               end;
+          end;
       end;
       end;
 
 
 
 
@@ -2246,7 +2261,10 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.84  2002-10-02 20:51:22  peter
+  Revision 1.85  2002-10-04 21:13:59  peter
+    * ignore vecn,subscriptn when checking for a procvar loadn
+
+  Revision 1.84  2002/10/02 20:51:22  peter
     * don't check interfaces for class methods
     * don't check interfaces for class methods
 
 
   Revision 1.83  2002/10/02 18:20:52  peter
   Revision 1.83  2002/10/02 18:20:52  peter