Forráskód Böngészése

* fixes to valid_for_assign for properties

peter 24 éve
szülő
commit
25d360a011
1 módosított fájl, 33 hozzáadás és 11 törlés
  1. 33 11
      compiler/htypechk.pas

+ 33 - 11
compiler/htypechk.pas

@@ -731,11 +731,30 @@ implementation
         while assigned(hp) do
          begin
            { property allowed? calln has a property check itself }
-           if not(valid_property in opts) and
-              (nf_isproperty in hp.flags) and
-              (hp.nodetype<>calln) then
+           if (nf_isproperty in hp.flags) then
             begin
-              CGMessagePos(hp.fileinfo,type_e_argument_cant_be_assigned);
+              if (valid_property in opts) then
+               valid_for_assign:=true
+              else
+               begin
+                 { check return type }
+                 case hp.resulttype.def.deftype of
+                   pointerdef :
+                     gotpointer:=true;
+                   objectdef :
+                     gotclass:=is_class_or_interface(hp.resulttype.def);
+                   recorddef, { handle record like class it needs a subscription }
+                   classrefdef :
+                     gotclass:=true;
+                 end;
+                 { 1. if it returns a pointer and we've found a deref,
+                   2. if it returns a class or record and a subscription or with is found }
+                 if (gotpointer and gotderef) or
+                    (gotclass and (gotsubscript or gotwith)) then
+                   valid_for_assign:=true
+                 else
+                   CGMessagePos(hp.fileinfo,type_e_argument_cant_be_assigned);
+               end;
               exit;
             end;
            case hp.nodetype of
@@ -789,8 +808,10 @@ implementation
                end;
              addrn :
                begin
-                 if not(gotderef) and
-                    not(nf_procvarload in hp.flags) then
+                 if gotderef or
+                    (nf_procvarload in hp.flags) then
+                  valid_for_assign:=true
+                 else
                   CGMessagePos(hp.fileinfo,type_e_no_assign_to_addr);
                  exit;
                end;
@@ -813,11 +834,9 @@ implementation
                      gotclass:=true;
                  end;
                  { 1. if it returns a pointer and we've found a deref,
-                   2. if it returns a class or record and a subscription or with is found,
-                   3. property is allowed }
+                   2. if it returns a class or record and a subscription or with is found }
                  if (gotpointer and gotderef) or
-                    (gotclass and (gotsubscript or gotwith)) or
-                    ((nf_isproperty in hp.flags) and (valid_property in opts)) then
+                    (gotclass and (gotsubscript or gotwith)) then
                   valid_for_assign:=true
                  else
                   CGMessagePos(hp.fileinfo,type_e_argument_cant_be_assigned);
@@ -918,7 +937,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.28  2001-06-04 11:48:02  peter
+  Revision 1.29  2001-06-04 18:04:36  peter
+    * fixes to valid_for_assign for properties
+
+  Revision 1.28  2001/06/04 11:48:02  peter
     * better const to var checking
 
   Revision 1.27  2001/05/18 22:57:08  peter