Browse Source

* error for illegal type reference, instead of 10998

peter 26 years ago
parent
commit
f380e3bd68
3 changed files with 118 additions and 90 deletions
  1. 95 87
      compiler/pexpr.pas
  2. 9 1
      compiler/pmodules.pas
  3. 14 2
      compiler/symtable.pas

+ 95 - 87
compiler/pexpr.pas

@@ -977,107 +977,112 @@ unit pexpr;
                                  again:=false;
                                end
                               else
-                              { if we read a type declaration  }
-                              { we have to return the type and }
-                              { nothing else               }
-                               if block_type=bt_type then
-                                begin
-                                  p1:=gentypenode(pd);
-                                  { here we can also set resulttype !! }
-                                  p1^.resulttype:=pd;
-                                  pd:=voiddef;
-                                end
-                              else { not type block }
                                begin
-                                 if token=LKLAMMER then
+                                 { illegal reference ? }
+                                 if pd^.owner^.unitid=-1 then
+                                  Comment(V_Error,'illegal type reference, unit '+pd^.owner^.name^+' is not in uses');
+                                 { if we read a type declaration  }
+                                 { we have to return the type and }
+                                 { nothing else               }
+                                  if block_type=bt_type then
+                                   begin
+                                     p1:=gentypenode(pd);
+                                     { here we can also set resulttype !! }
+                                     p1^.resulttype:=pd;
+                                     pd:=voiddef;
+                                   end
+                                 else { not type block }
                                   begin
-                                    consume(LKLAMMER);
-                                    p1:=comp_expr(true);
-                                    consume(RKLAMMER);
-                                    p1:=gentypeconvnode(p1,pd);
-                                    p1^.explizit:=true;
-                                  end
-                                 else { not LKLAMMER}
-                                  if (token=POINT) and
-                                     (pd^.deftype=objectdef) and
-                                     not(pobjectdef(pd)^.isclass) then
-                                    begin
-                                      consume(POINT);
-                                      if assigned(procinfo._class) then
+                                    if token=LKLAMMER then
+                                     begin
+                                       consume(LKLAMMER);
+                                       p1:=comp_expr(true);
+                                       consume(RKLAMMER);
+                                       p1:=gentypeconvnode(p1,pd);
+                                       p1^.explizit:=true;
+                                     end
+                                    else { not LKLAMMER}
+                                     if (token=POINT) and
+                                        (pd^.deftype=objectdef) and
+                                        not(pobjectdef(pd)^.isclass) then
                                        begin
-                                         if procinfo._class^.isrelated(pobjectdef(pd)) then
+                                         consume(POINT);
+                                         if assigned(procinfo._class) then
                                           begin
-                                            p1:=gentypenode(pd);
-                                            p1^.resulttype:=pd;
-                                            srsymtable:=pobjectdef(pd)^.publicsyms;
-                                            sym:=pvarsym(srsymtable^.search(pattern));
-                                            { search also in inherited methods }
-                                            while sym=nil do
+                                            if procinfo._class^.isrelated(pobjectdef(pd)) then
                                              begin
-                                               pd:=pobjectdef(pd)^.childof;
+                                               p1:=gentypenode(pd);
+                                               p1^.resulttype:=pd;
                                                srsymtable:=pobjectdef(pd)^.publicsyms;
                                                sym:=pvarsym(srsymtable^.search(pattern));
+                                               { search also in inherited methods }
+                                               while sym=nil do
+                                                begin
+                                                  pd:=pobjectdef(pd)^.childof;
+                                                  srsymtable:=pobjectdef(pd)^.publicsyms;
+                                                  sym:=pvarsym(srsymtable^.search(pattern));
+                                                end;
+                                               consume(ID);
+                                               do_member_read(false,sym,p1,pd,again);
+                                             end
+                                            else
+                                             begin
+                                               Message(parser_e_no_super_class);
+                                               pd:=generrordef;
+                                               again:=false;
                                              end;
-                                            consume(ID);
-                                            do_member_read(false,sym,p1,pd,again);
                                           end
                                          else
                                           begin
-                                            Message(parser_e_no_super_class);
-                                            pd:=generrordef;
-                                            again:=false;
+                                            { allows @TObject.Load }
+                                            { also allows static methods and variables }
+                                            p1:=genzeronode(typen);
+                                            p1^.resulttype:=pd;
+                                            { srsymtable:=pobjectdef(pd)^.publicsyms;
+                                              sym:=pvarsym(srsymtable^.search(pattern)); }
+
+                                            { TP allows also @TMenu.Load if Load is only }
+                                            { defined in an anchestor class              }
+                                            sym:=pvarsym(search_class_member(pobjectdef(pd),pattern));
+                                            if not assigned(sym) then
+                                              Message1(sym_e_id_no_member,pattern)
+                                            else if not(getaddr) and ((sym^.properties and sp_static)=0) then
+                                              Message(sym_e_only_static_in_static)
+                                            else
+                                             begin
+                                               consume(ID);
+                                               do_member_read(getaddr,sym,p1,pd,again);
+                                             end;
                                           end;
                                        end
-                                      else
+                                     else
                                        begin
-                                         { allows @TObject.Load }
-                                         { also allows static methods and variables }
-                                         p1:=genzeronode(typen);
-                                         p1^.resulttype:=pd;
-                                         { srsymtable:=pobjectdef(pd)^.publicsyms;
-                                           sym:=pvarsym(srsymtable^.search(pattern)); }
-
-                                         { TP allows also @TMenu.Load if Load is only }
-                                         { defined in an anchestor class              }
-                                         sym:=pvarsym(search_class_member(pobjectdef(pd),pattern));
-                                         if not assigned(sym) then
-                                           Message1(sym_e_id_no_member,pattern)
-                                         else if not(getaddr) and ((sym^.properties and sp_static)=0) then
-                                           Message(sym_e_only_static_in_static)
-                                         else
-                                          begin
-                                            consume(ID);
-                                            do_member_read(getaddr,sym,p1,pd,again);
-                                          end;
+                                          { class reference ? }
+                                          if (pd^.deftype=objectdef)
+                                            and pobjectdef(pd)^.isclass then
+                                            begin
+                                               p1:=gentypenode(pd);
+                                               p1^.resulttype:=pd;
+                                               pd:=new(pclassrefdef,init(pd));
+                                               p1:=gensinglenode(loadvmtn,p1);
+                                               p1^.resulttype:=pd;
+                                            end
+                                          else
+                                            begin
+                                               { generate a type node }
+                                               { (for typeof etc)     }
+                                               if allow_type then
+                                                 begin
+                                                    p1:=gentypenode(pd);
+                                                    { here we must use typenodetype explicitly !! PM
+                                                    p1^.resulttype:=pd; }
+                                                    pd:=voiddef;
+                                                 end
+                                               else
+                                                 Message(parser_e_no_type_not_allowed_here);
+                                            end;
                                        end;
-                                    end
-                                  else
-                                    begin
-                                       { class reference ? }
-                                       if (pd^.deftype=objectdef)
-                                         and pobjectdef(pd)^.isclass then
-                                         begin
-                                            p1:=gentypenode(pd);
-                                            p1^.resulttype:=pd;
-                                            pd:=new(pclassrefdef,init(pd));
-                                            p1:=gensinglenode(loadvmtn,p1);
-                                            p1^.resulttype:=pd;
-                                         end
-                                       else
-                                         begin
-                                            { generate a type node }
-                                            { (for typeof etc)     }
-                                            if allow_type then
-                                              begin
-                                                 p1:=gentypenode(pd);
-                                                 { here we must use typenodetype explicitly !! PM
-                                                 p1^.resulttype:=pd; }
-                                                 pd:=voiddef;
-                                              end
-                                            else
-                                              Message(parser_e_no_type_not_allowed_here);
-                                         end;
-                                    end;
+                                  end;
                                end;
                             end;
                   enumsym : begin
@@ -2051,7 +2056,10 @@ unit pexpr;
 end.
 {
   $Log$
-  Revision 1.122  1999-07-22 09:37:52  florian
+  Revision 1.123  1999-07-23 11:37:46  peter
+    * error for illegal type reference, instead of 10998
+
+  Revision 1.122  1999/07/22 09:37:52  florian
     + resourcestring implemented
     + start of longstring support
 

+ 9 - 1
compiler/pmodules.pas

@@ -940,6 +940,11 @@ unit pmodules;
          current_module^.localsymtable:=nil;
 
          reset_global_defs;
+
+         { number all units, so we know if a unit is used by this unit or
+           needs to be added implicitly }
+         numberunits;
+
          { ... parse the declarations }
          read_interface_declarations;
 
@@ -1344,7 +1349,10 @@ unit pmodules;
 end.
 {
   $Log$
-  Revision 1.131  1999-07-22 09:37:54  florian
+  Revision 1.132  1999-07-23 11:37:48  peter
+    * error for illegal type reference, instead of 10998
+
+  Revision 1.131  1999/07/22 09:37:54  florian
     + resourcestring implemented
     + start of longstring support
 

+ 14 - 2
compiler/symtable.pas

@@ -144,7 +144,7 @@ unit symtable;
 
        tsymtable = object
           symtabletype : tsymtabletype;
-          unitid    : word;        { each symtable gets a number }
+          unitid    : integer;     { each symtable gets a number }
           name      : pstring;
           datasize  : longint;
           symindex,
@@ -515,7 +515,16 @@ implementation
       var
         counter : longint;
         hp      : pused_unit;
+        hp1     : pmodule;
       begin
+        { Reset all numbers to -1 }
+        hp1:=pmodule(loaded_units.first);
+        while assigned(hp1) do
+         begin
+           psymtable(hp1^.globalsymtable)^.unitid:=-1;
+           hp1:=pmodule(hp1^.next);
+         end;
+        { number units }
         counter:=1;
         psymtable(current_module^.globalsymtable)^.unitid:=0;
         hp:=pused_unit(current_module^.used_units.first);
@@ -2324,7 +2333,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.26  1999-07-22 09:37:58  florian
+  Revision 1.27  1999-07-23 11:37:50  peter
+    * error for illegal type reference, instead of 10998
+
+  Revision 1.26  1999/07/22 09:37:58  florian
     + resourcestring implemented
     + start of longstring support