Browse Source

* a lot bug fixes:
- po_external isn't any longer necessary for procedure compatibility
- m_tp_procvar is in -Sd now available
- error messages of procedure variables improved
- return values with init./finalization fixed
- data types with init./finalization aren't any longer allowed in variant
record

florian 26 years ago
parent
commit
62cb5453d3
10 changed files with 261 additions and 191 deletions
  1. 11 2
      compiler/cg386cal.pas
  2. 33 45
      compiler/cgai386.pas
  3. 11 2
      compiler/globals.pas
  4. 1 0
      compiler/msgidx.inc
  5. 135 133
      compiler/msgtxt.inc
  6. 17 1
      compiler/pdecl.pas
  7. 13 2
      compiler/pmodules.pas
  8. 11 2
      compiler/symconst.inc
  9. 14 2
      compiler/symdef.inc
  10. 15 2
      compiler/types.pas

+ 11 - 2
compiler/cg386cal.pas

@@ -1078,7 +1078,7 @@ implementation
                    if (p^.resulttype^.needs_inittable) and
                    if (p^.resulttype^.needs_inittable) and
                      ( (p^.resulttype^.deftype<>objectdef) or
                      ( (p^.resulttype^.deftype<>objectdef) or
                        not(pobjectdef(p^.resulttype)^.isclass)) then
                        not(pobjectdef(p^.resulttype)^.isclass)) then
-                      finalize(p^.resulttype,p^.location.reference);
+                      finalize(p^.resulttype,p^.location.reference,ret_in_param(p^.resulttype));
                    { release unused temp }
                    { release unused temp }
                    ungetiftemp(p^.location.reference)
                    ungetiftemp(p^.location.reference)
                 end
                 end
@@ -1166,7 +1166,16 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.93  1999-06-22 13:31:24  peter
+  Revision 1.94  1999-07-06 21:48:09  florian
+    * a lot bug fixes:
+       - po_external isn't any longer necessary for procedure compatibility
+       - m_tp_procvar is in -Sd now available
+       - error messages of procedure variables improved
+       - return values with init./finalization fixed
+       - data types with init./finalization aren't any longer allowed in variant
+         record
+
+  Revision 1.93  1999/06/22 13:31:24  peter
     * merged
     * merged
 
 
   Revision 1.92  1999/06/16 09:32:45  peter
   Revision 1.92  1999/06/16 09:32:45  peter

+ 33 - 45
compiler/cgai386.pas

@@ -71,7 +71,7 @@ unit cgai386;
     procedure loadansistring(p : ptree);
     procedure loadansistring(p : ptree);
     procedure loadshort2ansi(source,dest : ptree);
     procedure loadshort2ansi(source,dest : ptree);
 
 
-    procedure finalize(t : pdef;const ref : treference);
+    procedure finalize(t : pdef;const ref : treference;is_already_ref : boolean);
     procedure decrstringref(t : pdef;const ref : treference);
     procedure decrstringref(t : pdef;const ref : treference);
 
 
     function maybe_push(needed : byte;p : ptree;isint64 : boolean) : boolean;
     function maybe_push(needed : byte;p : ptree;isint64 : boolean) : boolean;
@@ -2186,7 +2186,10 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
          end;
          end;
     end;
     end;
 
 
-    procedure initialize(t : pdef;const ref : treference);
+    { initilizes data of type t                           }
+    { if is_already_ref is true then the routines assumes }
+    { that r points to the data to initialize             }
+    procedure initialize(t : pdef;const ref : treference;is_already_ref : boolean);
 
 
       var
       var
          hr : treference;
          hr : treference;
@@ -2203,13 +2206,20 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
               reset_reference(hr);
               reset_reference(hr);
               hr.symbol:=t^.get_inittable_label;
               hr.symbol:=t^.get_inittable_label;
               emitpushreferenceaddr(hr);
               emitpushreferenceaddr(hr);
-              emitpushreferenceaddr(ref);
+              if is_already_ref then
+                exprasmlist^.concat(new(pai386,op_ref(A_PUSH,S_L,
+                  newreference(ref))))
+              else
+                emitpushreferenceaddr(ref);
               exprasmlist^.concat(new(pai386,
               exprasmlist^.concat(new(pai386,
                 op_sym(A_CALL,S_NO,newasmsymbol('FPC_INITIALIZE'))));
                 op_sym(A_CALL,S_NO,newasmsymbol('FPC_INITIALIZE'))));
            end;
            end;
       end;
       end;
 
 
-    procedure finalize(t : pdef;const ref : treference);
+    { finalizes data of type t                            }
+    { if is_already_ref is true then the routines assumes }
+    { that r points to the data to finalizes              }
+    procedure finalize(t : pdef;const ref : treference;is_already_ref : boolean);
 
 
       var
       var
          r : treference;
          r : treference;
@@ -2225,7 +2235,11 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
               reset_reference(r);
               reset_reference(r);
               r.symbol:=t^.get_inittable_label;
               r.symbol:=t^.get_inittable_label;
               emitpushreferenceaddr(r);
               emitpushreferenceaddr(r);
-              emitpushreferenceaddr(ref);
+              if is_already_ref then
+                exprasmlist^.concat(new(pai386,op_ref(A_PUSH,S_L,
+                  newreference(ref))))
+              else
+                emitpushreferenceaddr(ref);
               emitcall('FPC_FINALIZE');
               emitcall('FPC_FINALIZE');
            end;
            end;
       end;
       end;
@@ -2255,7 +2269,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
               begin
               begin
                  hr.symbol:=newasmsymbol(pvarsym(p)^.mangledname);
                  hr.symbol:=newasmsymbol(pvarsym(p)^.mangledname);
               end;
               end;
-            initialize(pvarsym(p)^.definition,hr);
+            initialize(pvarsym(p)^.definition,hr,false);
          end;
          end;
     end;
     end;
 
 
@@ -2325,7 +2339,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                else
                else
                  hr.symbol:=newasmsymbol(pvarsym(p)^.mangledname);
                  hr.symbol:=newasmsymbol(pvarsym(p)^.mangledname);
             end;
             end;
-            finalize(pvarsym(p)^.definition,hr);
+            finalize(pvarsym(p)^.definition,hr,false);
          end;
          end;
     end;
     end;
 
 
@@ -2665,7 +2679,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
            reset_reference(r);
            reset_reference(r);
            r.offset:=procinfo.retoffset;
            r.offset:=procinfo.retoffset;
            r.base:=procinfo.framepointer;
            r.base:=procinfo.framepointer;
-           initialize(procinfo.retdef,r);
+           initialize(procinfo.retdef,r,ret_in_param(procinfo.retdef));
         end;
         end;
 
 
       { generate copies of call by value parameters }
       { generate copies of call by value parameters }
@@ -2871,7 +2885,7 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
                 reset_reference(hr);
                 reset_reference(hr);
                 hr.offset:=procinfo.retoffset;
                 hr.offset:=procinfo.retoffset;
                 hr.base:=procinfo.framepointer;
                 hr.base:=procinfo.framepointer;
-                finalize(procinfo.retdef,hr);
+                finalize(procinfo.retdef,hr,ret_in_param(procinfo.retdef));
              end;
              end;
 
 
            exprasmlist^.concat(new(pai386,
            exprasmlist^.concat(new(pai386,
@@ -3015,46 +3029,20 @@ procedure mov_reg_to_dest(p : ptree; s : topsize; reg : tregister);
          end;
          end;
 
 
 {$endif test_dest_loc}
 {$endif test_dest_loc}
-{
-    procedure removetemps(list : paasmoutput;p : plinkedlist);
-
-      var
-         hp : ptemptodestroy;
-         pushedregs : tpushed;
-
-      begin
-         hp:=ptemptodestroy(p^.first);
-         if not(assigned(hp)) then
-           exit;
-         pushusedregisters(pushedregs,$ff);
-         while assigned(hp) do
-           begin
-              if is_ansistring(hp^.typ) then
-                begin
-                   emitpushreferenceaddr(list,hp^.address);
-                   exprasmlist^.concat(new(pai386,
-                     op_sym(A_CALL,S_NO,newasmsymbol('FPC_ANSISTR_DECR_REF'))));
-                   if not (cs_compilesystem in aktmoduleswitches) then
-                     concat_external('FPC_ANSISTR_DECR_REF',EXT_NEAR);
-                   ungetiftempansi(hp^.address);
-                end
-              else
-                ungetiftemp(hp^.address);
-              hp:=ptemptodestroy(hp^.next);
-           end;
-         popusedregisters(pushedregs);
-     end;
-
-    procedure addtemptodestroy(t : pdef;const addr : treference);
 
 
-      begin
-         temptoremove^.concat(new(ptemptodestroy,init(addr,t)));
-      end;
-}
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.13  1999-07-05 20:25:22  peter
+  Revision 1.14  1999-07-06 21:48:11  florian
+    * a lot bug fixes:
+       - po_external isn't any longer necessary for procedure compatibility
+       - m_tp_procvar is in -Sd now available
+       - error messages of procedure variables improved
+       - return values with init./finalization fixed
+       - data types with init./finalization aren't any longer allowed in variant
+         record
+
+  Revision 1.13  1999/07/05 20:25:22  peter
     * merged
     * merged
 
 
   Revision 1.12  1999/07/05 20:13:13  peter
   Revision 1.12  1999/07/05 20:13:13  peter

+ 11 - 2
compiler/globals.pas

@@ -60,7 +60,7 @@ unit globals;
 
 
        delphimodeswitches : tmodeswitches=
        delphimodeswitches : tmodeswitches=
          [m_delphi,m_tp,m_all,m_class,m_objpas,m_result,m_string_pchar,
          [m_delphi,m_tp,m_all,m_class,m_objpas,m_result,m_string_pchar,
-          m_pointer_2_procedure,m_autoderef];
+          m_pointer_2_procedure,m_autoderef,m_tp_procvar];
        fpcmodeswitches    : tmodeswitches=
        fpcmodeswitches    : tmodeswitches=
          [m_fpc,m_all,m_string_pchar,m_nested_comment,m_repeat_forward,
          [m_fpc,m_all,m_string_pchar,m_nested_comment,m_repeat_forward,
           m_cvar_support];
           m_cvar_support];
@@ -1162,7 +1162,16 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.9  1999-07-03 00:29:48  peter
+  Revision 1.10  1999-07-06 21:48:16  florian
+    * a lot bug fixes:
+       - po_external isn't any longer necessary for procedure compatibility
+       - m_tp_procvar is in -Sd now available
+       - error messages of procedure variables improved
+       - return values with init./finalization fixed
+       - data types with init./finalization aren't any longer allowed in variant
+         record
+
+  Revision 1.9  1999/07/03 00:29:48  peter
     * new link writing to the ppu, one .ppu is needed for all link types,
     * new link writing to the ppu, one .ppu is needed for all link types,
       static (.o) is now always created also when smartlinking is used
       static (.o) is now always created also when smartlinking is used
 
 

+ 1 - 0
compiler/msgidx.inc

@@ -200,6 +200,7 @@ type tmsgconst=(
   parser_f_direct_assembler_not_allowed,
   parser_f_direct_assembler_not_allowed,
   parser_w_no_objpas_use_mode,
   parser_w_no_objpas_use_mode,
   parser_e_no_object_override,
   parser_e_no_object_override,
+  parser_e_cant_use_inittable_here,
   type_e_mismatch,
   type_e_mismatch,
   type_e_incompatible_types,
   type_e_incompatible_types,
   type_e_not_equal_types,
   type_e_not_equal_types,

+ 135 - 133
compiler/msgtxt.inc

@@ -213,433 +213,435 @@ const msgtxt : array[0..000097,1..240] of char=(
   'W_Don'#039't load OBJPAS unit manual, use {$mode objfpc} or {$mode delp'+
   'W_Don'#039't load OBJPAS unit manual, use {$mode objfpc} or {$mode delp'+
   'hi} instead'#000+
   'hi} instead'#000+
   'E_OVERRIDE can'#039't be used in objects'#000+
   'E_OVERRIDE can'#039't be used in objects'#000+
+  'E_Data types which requ','ires initialization/finalization can'#039't be'+
+  ' used in variant records'#000+
   'E_Type mismatch'#000+
   'E_Type mismatch'#000+
-  'E_Incom','patible types: got "$1" expected "$2"'#000+
+  'E_Incompatible types: got "$1" expected "$2"'#000+
   'E_Type mismatch between $1 and $2'#000+
   'E_Type mismatch between $1 and $2'#000+
   'E_Integer expression expected'#000+
   'E_Integer expression expected'#000+
   'E_Ordinal expression expected'#000+
   'E_Ordinal expression expected'#000+
-  'E_Type identifier expected'#000+
+  'E_Type identifier e','xpected'#000+
   'E_Variable identifier expected'#000+
   'E_Variable identifier expected'#000+
   'E_pointer type expected'#000+
   'E_pointer type expected'#000+
   'E_class type expected'#000+
   'E_class type expected'#000+
-  'E_Va','riable or type indentifier expected'#000+
+  'E_Variable or type indentifier expected'#000+
   'E_Can'#039't evaluate constant expression'#000+
   'E_Can'#039't evaluate constant expression'#000+
   'E_Set elements are not compatible'#000+
   'E_Set elements are not compatible'#000+
   'E_Operation not implemented for sets'#000+
   'E_Operation not implemented for sets'#000+
-  'W_Automatic type conversion from floating type to COMP which is an int'+
-  'eger type'#000+
-  'H_use DIV instea','d to get an integer result'#000+
+  'W_Autom','atic type conversion from floating type to COMP which is an i'+
+  'nteger type'#000+
+  'H_use DIV instead to get an integer result'#000+
   'E_string types doesn'#039't match, because of $V+ mode'#000+
   'E_string types doesn'#039't match, because of $V+ mode'#000+
   'E_succ or pred on enums with assignments not possible'#000+
   'E_succ or pred on enums with assignments not possible'#000+
-  'E_Can'#039't read or write variables of this type'#000+
+  'E_Can'#039't read or writ','e variables of this type'#000+
   'E_Type conflict between set elements'#000+
   'E_Type conflict between set elements'#000+
-  'W_lo/hi(dword/qword) return','s the upper/lower word/dword'#000+
+  'W_lo/hi(dword/qword) returns the upper/lower word/dword'#000+
   'E_Integer or real expression expected'#000+
   'E_Integer or real expression expected'#000+
   'E_Wrong type in array constructor'#000+
   'E_Wrong type in array constructor'#000+
-  'E_Incompatible type for arg no. $1: Got $2, expected $3'#000+
+  'E_Incompatible type for arg no. $1: Got $2, expect','ed $3'#000+
   'E_Method (variable) and Procedure (variable) are not compatible'#000+
   'E_Method (variable) and Procedure (variable) are not compatible'#000+
-  'E_Illegal constant ','passed to internal math function'#000+
+  'E_Illegal constant passed to internal math function'#000+
   'E_Can'#039't get the address of constants'#000+
   'E_Can'#039't get the address of constants'#000+
   'E_Identifier not found $1'#000+
   'E_Identifier not found $1'#000+
   'F_Internal Error in SymTableStack()'#000+
   'F_Internal Error in SymTableStack()'#000+
-  'E_Duplicate identifier $1'#000+
+  'E_Duplicate identif','ier $1'#000+
   'H_Identifier already defined in $1 at line $2'#000+
   'H_Identifier already defined in $1 at line $2'#000+
   'E_Unknown identifier $1'#000+
   'E_Unknown identifier $1'#000+
-  'E_Forward de','claration not solved $1'#000+
+  'E_Forward declaration not solved $1'#000+
   'F_Identifier type already defined as type'#000+
   'F_Identifier type already defined as type'#000+
   'E_Error in type definition'#000+
   'E_Error in type definition'#000+
   'E_Type identifier not defined'#000+
   'E_Type identifier not defined'#000+
-  'E_Forward type not resolved $1'#000+
+  'E_Forward type not resolved ','$1'#000+
   'E_Only static variables can be used in static methods or outside metho'+
   'E_Only static variables can be used in static methods or outside metho'+
   'ds'#000+
   'ds'#000+
-  'E_Invalid cal','l to tvarsym.mangledname()'#000+
+  'E_Invalid call to tvarsym.mangledname()'#000+
   'F_record or class type expected'#000+
   'F_record or class type expected'#000+
   'E_Instances of classes or objects with an abstract method are not allo'+
   'E_Instances of classes or objects with an abstract method are not allo'+
   'wed'#000+
   'wed'#000+
-  'W_Label not defined $1'#000+
+  'W_Label not define','d $1'#000+
   'E_Illegal label declaration'#000+
   'E_Illegal label declaration'#000+
   'E_GOTO and LABEL are not supported (use switch -Sg)'#000+
   'E_GOTO and LABEL are not supported (use switch -Sg)'#000+
-  'E_La','bel not found'#000+
+  'E_Label not found'#000+
   'E_identifier isn'#039't a label'#000+
   'E_identifier isn'#039't a label'#000+
   'E_label already defined'#000+
   'E_label already defined'#000+
   'E_illegal type declaration of set elements'#000+
   'E_illegal type declaration of set elements'#000+
-  'E_Forward class definition not resolved $1'#000+
+  'E_Forward class definition not resolved $1'#000,
   'H_Parameter not used $1'#000+
   'H_Parameter not used $1'#000+
   'N_Local variable not used $1'#000+
   'N_Local variable not used $1'#000+
   'E_Set type expected'#000+
   'E_Set type expected'#000+
-  'W_Function resul','t does not seem to be set'#000+
+  'W_Function result does not seem to be set'#000+
   'E_Unknown record field identifier $1'#000+
   'E_Unknown record field identifier $1'#000+
   'W_Local variable $1 does not seem to be initialized'#000+
   'W_Local variable $1 does not seem to be initialized'#000+
-  'W_Variable $1 does not seem to be initialized'#000+
+  'W_Variable $1 does not seem to be in','itialized'#000+
   'E_identifier idents no member $1'#000+
   'E_identifier idents no member $1'#000+
   'B_Found declaration: $1'#000+
   'B_Found declaration: $1'#000+
   'E_BREAK not allowed'#000+
   'E_BREAK not allowed'#000+
-  'E_','CONTINUE not allowed'#000+
+  'E_CONTINUE not allowed'#000+
   'E_Expression too complicated - FPU stack overflow'#000+
   'E_Expression too complicated - FPU stack overflow'#000+
   'E_Illegal expression'#000+
   'E_Illegal expression'#000+
   'E_Invalid integer expression'#000+
   'E_Invalid integer expression'#000+
   'E_Illegal qualifier'#000+
   'E_Illegal qualifier'#000+
-  'E_High range limit < low range limit'#000+
+  'E_High ran','ge limit < low range limit'#000+
   'E_Illegal counter variable'#000+
   'E_Illegal counter variable'#000+
-  'E_Can'#039't determine which overloaded ','function to call'#000+
+  'E_Can'#039't determine which overloaded function to call'#000+
   'E_Parameter list size exceeds 65535 bytes'#000+
   'E_Parameter list size exceeds 65535 bytes'#000+
   'E_Illegal type conversion'#000+
   'E_Illegal type conversion'#000+
-  'D_Conversion between ordinals and pointers is not portable across plat'+
-  'forms'#000+
+  'D_Conversion between ordinals and pointers is not portable across ','pl'+
+  'atforms'#000+
   'E_File types must be var parameters'#000+
   'E_File types must be var parameters'#000+
-  'E_The use of a far pointer isn'#039't allowed th','ere'#000+
+  'E_The use of a far pointer isn'#039't allowed there'#000+
   'E_illegal call by reference parameters'#000+
   'E_illegal call by reference parameters'#000+
   'E_EXPORT declared functions can'#039't be called'#000+
   'E_EXPORT declared functions can'#039't be called'#000+
-  'W_Possible illegal call of constructor or destructor (doesn'#039't matc'+
-  'h to this context)'#000+
+  'W_Possible illegal call of constructor or destructor (doesn'#039't ma','t'+
+  'ch to this context)'#000+
   'N_Inefficient code'#000+
   'N_Inefficient code'#000+
   'W_unreachable code'#000+
   'W_unreachable code'#000+
-  'E_procedure call with stackfra','me ESP/SP'#000+
+  'E_procedure call with stackframe ESP/SP'#000+
   'E_Abstract methods can'#039't be called directly'#000+
   'E_Abstract methods can'#039't be called directly'#000+
   'F_Internal Error in getfloatreg(), allocation failure'#000+
   'F_Internal Error in getfloatreg(), allocation failure'#000+
   'F_Unknown float type'#000+
   'F_Unknown float type'#000+
-  'F_SecondVecn() base defined twice'#000+
+  'F_SecondVecn() base de','fined twice'#000+
   'F_Extended cg68k not supported'#000+
   'F_Extended cg68k not supported'#000+
-  'F_32-bit unsigned not supported in MC68000 mod','e'#000+
+  'F_32-bit unsigned not supported in MC68000 mode'#000+
   'F_Internal Error in secondinline()'#000+
   'F_Internal Error in secondinline()'#000+
   'D_Register $1 weight $2 $3'#000+
   'D_Register $1 weight $2 $3'#000+
   'E_Stack limit excedeed in local routine'#000+
   'E_Stack limit excedeed in local routine'#000+
   'D_Stack frame is omitted'#000+
   'D_Stack frame is omitted'#000+
-  'E_Object or class methods can'#039't be inline.'#000+
+  'E_Object or class meth','ods can'#039't be inline.'#000+
   'E_Procvar calls can'#039't be inline.'#000+
   'E_Procvar calls can'#039't be inline.'#000+
-  'E_No code for inline procedure stor','ed'#000+
+  'E_No code for inline procedure stored'#000+
   'E_Element zero of an ansi/wide- or longstring can'#039't be accessed, u'+
   'E_Element zero of an ansi/wide- or longstring can'#039't be accessed, u'+
   'se (set)length instead'#000+
   'se (set)length instead'#000+
   'E_Include and exclude not implemented in this case'#000+
   'E_Include and exclude not implemented in this case'#000+
-  'E_Constructors or destructors can not be called inside a '#039'with'#039+
+  'E_Constr','uctors or destructors can not be called inside a '#039'with'#039+
   ' clause'#000+
   ' clause'#000+
-  'E_Cannot call message hand','ler method directly'#000+
+  'E_Cannot call message handler method directly'#000+
   'D_Starting $1 styled assembler parsing'#000+
   'D_Starting $1 styled assembler parsing'#000+
   'D_Finished $1 styled assembler parsing'#000+
   'D_Finished $1 styled assembler parsing'#000+
   'E_Non-label pattern contains @'#000+
   'E_Non-label pattern contains @'#000+
-  'W_Override operator not supported'#000+
+  'W_Override operator no','t supported'#000+
   'E_Error building record offset'#000+
   'E_Error building record offset'#000+
   'E_OFFSET used without identifier'#000+
   'E_OFFSET used without identifier'#000+
-  'E_Cannot use ','local variable or parameters here'#000+
+  'E_Cannot use local variable or parameters here'#000+
   'E_need to use OFFSET here'#000+
   'E_need to use OFFSET here'#000+
   'E_Cannot use multiple relocatable symbols'#000+
   'E_Cannot use multiple relocatable symbols'#000+
   'E_Relocatable symbol can only be added'#000+
   'E_Relocatable symbol can only be added'#000+
-  'E_Invalid constant expression'#000+
+  'E_Invalid ','constant expression'#000+
   'E_Relocatable symbol is not allowed'#000+
   'E_Relocatable symbol is not allowed'#000+
   'E_Invalid reference syntax'#000+
   'E_Invalid reference syntax'#000+
-  'E_Loca','l symbols not allowed as references'#000+
+  'E_Local symbols not allowed as references'#000+
   'E_Invalid base and index register usage'#000+
   'E_Invalid base and index register usage'#000+
   'E_Wrong scale factor specified'#000+
   'E_Wrong scale factor specified'#000+
   'E_Multiple index register usage'#000+
   'E_Multiple index register usage'#000+
-  'E_Invalid operand type'#000+
+  'E_Invalid op','erand type'#000+
   'E_Invalid string as opcode operand: $1'#000+
   'E_Invalid string as opcode operand: $1'#000+
   'W_@CODE and @DATA not supported'#000+
   'W_@CODE and @DATA not supported'#000+
-  'E_Null ','label references are not allowed'#000+
+  'E_Null label references are not allowed'#000+
   'F_Divide by zero in asm evaluator'#000+
   'F_Divide by zero in asm evaluator'#000+
   'F_Evaluator stack overflow'#000+
   'F_Evaluator stack overflow'#000+
   'F_Evaluator stack underflow'#000+
   'F_Evaluator stack underflow'#000+
-  'F_Invalid numeric format in asm evaluator'#000+
+  'F_Invalid numeric format in a','sm evaluator'#000+
   'F_Invalid Operator in asm evaluator'#000+
   'F_Invalid Operator in asm evaluator'#000+
   'E_escape sequence ignored: $1'#000+
   'E_escape sequence ignored: $1'#000+
-  'E_Invalid ','symbol reference'#000+
+  'E_Invalid symbol reference'#000+
   'W_Fwait can cause emulation problems with emu387'#000+
   'W_Fwait can cause emulation problems with emu387'#000+
   'W_Calling an overload function in assembler'#000+
   'W_Calling an overload function in assembler'#000+
   'E_Unsupported symbol type for operand'#000+
   'E_Unsupported symbol type for operand'#000+
-  'E_Constant value out of bounds'#000+
+  'E_C','onstant value out of bounds'#000+
   'E_Error converting decimal $1'#000+
   'E_Error converting decimal $1'#000+
   'E_Error converting octal $1'#000+
   'E_Error converting octal $1'#000+
-  'E_E','rror converting binary $1'#000+
+  'E_Error converting binary $1'#000+
   'E_Error converting hexadecimal $1'#000+
   'E_Error converting hexadecimal $1'#000+
   'H_$1 translated to $2'#000+
   'H_$1 translated to $2'#000+
   'W_$1 is associated to an overloaded function'#000+
   'W_$1 is associated to an overloaded function'#000+
-  'E_Cannot use SELF outside a method'#000+
+  'E_Cannot use SELF outsid','e a method'#000+
   'E_Cannot use OLDEBP outside a nested procedure'#000+
   'E_Cannot use OLDEBP outside a nested procedure'#000+
-  'W_Functions with void return va','lue can'#039't return any value in asm'+
-  ' code'#000+
+  'W_Functions with void return value can'#039't return any value in asm c'+
+  'ode'#000+
   'E_SEG not supported'#000+
   'E_SEG not supported'#000+
   'E_Size suffix and destination or source size do not match'#000+
   'E_Size suffix and destination or source size do not match'#000+
-  'W_Size suffix and destination or source size do not match'#000+
+  'W_Size suffix and destination or s','ource size do not match'#000+
   'E_Assembler syntax error'#000+
   'E_Assembler syntax error'#000+
-  'E_Invalid combination of opcode and oper','ands'#000+
+  'E_Invalid combination of opcode and operands'#000+
   'E_Assemler syntax error in operand'#000+
   'E_Assemler syntax error in operand'#000+
   'E_Assemler syntax error in constant'#000+
   'E_Assemler syntax error in constant'#000+
   'E_Invalid String expression'#000+
   'E_Invalid String expression'#000+
   '32bit constant created for address'#000+
   '32bit constant created for address'#000+
-  'E_Invalid or missing opcode'#000+
+  'E_Invalid or',' missing opcode'#000+
   'E_Invalid combination of prefix and opcode: $1'#000+
   'E_Invalid combination of prefix and opcode: $1'#000+
-  'E_Invalid combination of o','verride and opcode: $1'#000+
+  'E_Invalid combination of override and opcode: $1'#000+
   'E_Too many operands on line'#000+
   'E_Too many operands on line'#000+
   'W_NEAR ignored'#000+
   'W_NEAR ignored'#000+
   'W_FAR ignored'#000+
   'W_FAR ignored'#000+
   'E_Duplicate local symbol $1'#000+
   'E_Duplicate local symbol $1'#000+
   'E_Undefined local symbol $1'#000+
   'E_Undefined local symbol $1'#000+
-  'E_Unknown label identifier $1'#000+
+  'E_Unknown label',' identifier $1'#000+
   'E_Invalid floating point register name'#000+
   'E_Invalid floating point register name'#000+
   'E_NOR not supported'#000+
   'E_NOR not supported'#000+
-  'W_Modulo not su','pported'#000+
+  'W_Modulo not supported'#000+
   'E_Invalid floating point constant $1'#000+
   'E_Invalid floating point constant $1'#000+
   'E_Invalid floating point expression'#000+
   'E_Invalid floating point expression'#000+
   'E_Wrong symbol type'#000+
   'E_Wrong symbol type'#000+
-  'E_Cannot index a local var or parameter with a register'#000+
+  'E_Cannot index a local var or parameter with a reg','ister'#000+
   'E_Invalid segment override expression'#000+
   'E_Invalid segment override expression'#000+
   'W_Identifier $1 supposed external'#000+
   'W_Identifier $1 supposed external'#000+
-  'E_Strings n','ot allowed as constants'#000+
+  'E_Strings not allowed as constants'#000+
   'No type of variable specified'#000+
   'No type of variable specified'#000+
   'E_assembler code not returned to text section'#000+
   'E_assembler code not returned to text section'#000+
   'E_Not a directive or local symbol $1'#000+
   'E_Not a directive or local symbol $1'#000+
-  'E_Using a defined name as a local label'#000+
+  'E_Using a defi','ned name as a local label'#000+
   'F_Too many assembler files'#000+
   'F_Too many assembler files'#000+
-  'F_Selected assembler output not supp','orted'#000+
+  'F_Selected assembler output not supported'#000+
   'F_Comp not supported'#000+
   'F_Comp not supported'#000+
   'F_Direct not support for binary writers'#000+
   'F_Direct not support for binary writers'#000+
   'E_Allocating of data is only allowed in bss section'#000+
   'E_Allocating of data is only allowed in bss section'#000+
   'F_No binary writer selected'#000+
   'F_No binary writer selected'#000+
-  'E_Asm: Opcode $1 not in table'#000+
+  'E_As','m: Opcode $1 not in table'#000+
   'E_Asm: $1 invalid combination of opcode and operands'#000+
   'E_Asm: $1 invalid combination of opcode and operands'#000+
-  'E_Asm: 16 ','Bit references not supported'#000+
+  'E_Asm: 16 Bit references not supported'#000+
   'E_Asm: Invalid effective address'#000+
   'E_Asm: Invalid effective address'#000+
   'E_Asm: Immediate or reference expected'#000+
   'E_Asm: Immediate or reference expected'#000+
   'E_Asm: $1 value exceeds bounds $2'#000+
   'E_Asm: $1 value exceeds bounds $2'#000+
-  'E_Asm: Short jump is out of range $1'#000+
+  'E_Asm: Short jum','p is out of range $1'#000+
   'W_Source operating system redefined'#000+
   'W_Source operating system redefined'#000+
   'I_Assembling (pipe) $1'#000+
   'I_Assembling (pipe) $1'#000+
-  'E_Can'#039't c','reate assember file $1'#000+
+  'E_Can'#039't create assember file $1'#000+
   'W_Assembler $1 not found, switching to external assembling'#000+
   'W_Assembler $1 not found, switching to external assembling'#000+
   'T_Using assembler: $1'#000+
   'T_Using assembler: $1'#000+
   'W_Error while assembling exitcode $1'#000+
   'W_Error while assembling exitcode $1'#000+
-  'W_Can'#039't call the assembler, error $1 switching to external assembl'+
-  'ing'#000+
+  'W_Can'#039't ca','ll the assembler, error $1 switching to external assem'+
+  'bling'#000+
   'I_Assembling $1'#000+
   'I_Assembling $1'#000+
-  'W_Linker $1 n','ot found, switching to external linking'#000+
+  'W_Linker $1 not found, switching to external linking'#000+
   'T_Using linker: $1'#000+
   'T_Using linker: $1'#000+
   'W_Object $1 not found, Linking may fail !'#000+
   'W_Object $1 not found, Linking may fail !'#000+
   'W_Library $1 not found, Linking may fail !'#000+
   'W_Library $1 not found, Linking may fail !'#000+
-  'W_Error while linking'#000+
+  'W_Error',' while linking'#000+
   'W_Can'#039't call the linker, switching to external linking'#000+
   'W_Can'#039't call the linker, switching to external linking'#000+
   'I_Linking $1'#000+
   'I_Linking $1'#000+
-  'W_bind','er not found, switching to external binding'#000+
+  'W_binder not found, switching to external binding'#000+
   'W_ar not found, switching to external ar'#000+
   'W_ar not found, switching to external ar'#000+
   'E_Dynamic Libraries not supported'#000+
   'E_Dynamic Libraries not supported'#000+
   'I_Closing script $1'#000+
   'I_Closing script $1'#000+
-  'W_resource compiler not found, switching to external mode'#000+
+  'W_resource c','ompiler not found, switching to external mode'#000+
   'I_Compiling resource $1'#000+
   'I_Compiling resource $1'#000+
-  'F_Can'#039't post proces','s executable $1'#000+
+  'F_Can'#039't post process executable $1'#000+
   'F_Can'#039't open executable $1'#000+
   'F_Can'#039't open executable $1'#000+
   'X_Size of Code: $1 bytes'#000+
   'X_Size of Code: $1 bytes'#000+
   'X_Size of initialized data: $1 bytes'#000+
   'X_Size of initialized data: $1 bytes'#000+
   'X_Size of uninitialized data: $1 bytes'#000+
   'X_Size of uninitialized data: $1 bytes'#000+
-  'X_Stack space reserved: $1 bytes'#000+
+  'X_Stack',' space reserved: $1 bytes'#000+
   'X_Stack space commited: $1 bytes'#000+
   'X_Stack space commited: $1 bytes'#000+
   'T_Unitsearch: $1'#000+
   'T_Unitsearch: $1'#000+
-  'T_PPU Loading',' $1'#000+
+  'T_PPU Loading $1'#000+
   'U_PPU Name: $1'#000+
   'U_PPU Name: $1'#000+
   'U_PPU Flags: $1'#000+
   'U_PPU Flags: $1'#000+
   'U_PPU Crc: $1'#000+
   'U_PPU Crc: $1'#000+
   'U_PPU Time: $1'#000+
   'U_PPU Time: $1'#000+
   'U_PPU File too short'#000+
   'U_PPU File too short'#000+
   'U_PPU Invalid Header (no PPU at the begin)'#000+
   'U_PPU Invalid Header (no PPU at the begin)'#000+
-  'U_PPU Invalid Version $1'#000+
+  'U_PPU Invalid Version $','1'#000+
   'U_PPU is compiled for an other processor'#000+
   'U_PPU is compiled for an other processor'#000+
   'U_PPU is compiled for an other target'#000+
   'U_PPU is compiled for an other target'#000+
-  'U_PPU So','urce: $1'#000+
+  'U_PPU Source: $1'#000+
   'U_Writing $1'#000+
   'U_Writing $1'#000+
   'F_Can'#039't Write PPU-File'#000+
   'F_Can'#039't Write PPU-File'#000+
   'F_reading PPU-File'#000+
   'F_reading PPU-File'#000+
   'F_unexpected end of PPU-File'#000+
   'F_unexpected end of PPU-File'#000+
   'F_Invalid PPU-File entry: $1'#000+
   'F_Invalid PPU-File entry: $1'#000+
   'F_PPU Dbx count problem'#000+
   'F_PPU Dbx count problem'#000+
-  'E_Illegal unit name: $1'#000+
+  'E_Ill','egal unit name: $1'#000+
   'F_Too much units'#000+
   'F_Too much units'#000+
   'F_Circular unit reference between $1 and $2'#000+
   'F_Circular unit reference between $1 and $2'#000+
-  'F_Can'#039't c','ompile unit $1, no sources available'#000+
+  'F_Can'#039't compile unit $1, no sources available'#000+
   'W_Compiling the system unit requires the -Us switch'#000+
   'W_Compiling the system unit requires the -Us switch'#000+
   'F_There were $1 errors compiling module, stopping'#000+
   'F_There were $1 errors compiling module, stopping'#000+
-  'U_Load from $1 ($2) unit $3'#000+
+  'U_Load from ','$1 ($2) unit $3'#000+
   'U_Recompiling $1, checksum changed for $2'#000+
   'U_Recompiling $1, checksum changed for $2'#000+
-  'U_Recompiling $1, source found ','only'#000+
+  'U_Recompiling $1, source found only'#000+
   'U_Recompiling unit, static lib is older than ppufile'#000+
   'U_Recompiling unit, static lib is older than ppufile'#000+
   'U_Recompiling unit, shared lib is older than ppufile'#000+
   'U_Recompiling unit, shared lib is older than ppufile'#000+
-  'U_Recompiling unit, obj and asm are older than ppufile'#000+
+  'U_Recompiling unit, obj and asm are olde','r than ppufile'#000+
   'U_Recompiling unit, obj is older than asm'#000+
   'U_Recompiling unit, obj is older than asm'#000+
   'U_Parsing interface of $1'#000+
   'U_Parsing interface of $1'#000+
-  'U_Pars','ing implementation of $1'#000+
+  'U_Parsing implementation of $1'#000+
   'U_Second load for unit $1'#000+
   'U_Second load for unit $1'#000+
   'U_PPU Check file $1 time $2'#000+
   'U_PPU Check file $1 time $2'#000+
   '$1 [options] <inputfile> [options]'#000+
   '$1 [options] <inputfile> [options]'#000+
   'W_Only one source file supported'#000+
   'W_Only one source file supported'#000+
-  'W_DEF file can be created only for OS/2'#000+
+  'W_DE','F file can be created only for OS/2'#000+
   'E_nested response files are not supported'#000+
   'E_nested response files are not supported'#000+
-  'F_No source',' file name in command line'#000+
+  'F_No source file name in command line'#000+
   'E_Illegal parameter: $1'#000+
   'E_Illegal parameter: $1'#000+
   'H_-? writes help pages'#000+
   'H_-? writes help pages'#000+
   'F_Too many config files nested'#000+
   'F_Too many config files nested'#000+
   'F_Unable to open file $1'#000+
   'F_Unable to open file $1'#000+
-  'N_Reading further options from $1'#000+
+  'N_Reading further opt','ions from $1'#000+
   'W_Target is already set to: $1'#000+
   'W_Target is already set to: $1'#000+
-  'W_Shared libs not supported on DOS platform, ','reverting to static'#000+
+  'W_Shared libs not supported on DOS platform, reverting to static'#000+
   'F_too many IF(N)DEFs'#000+
   'F_too many IF(N)DEFs'#000+
   'F_too many ENDIFs'#000+
   'F_too many ENDIFs'#000+
   'F_open conditional at the end of the file'#000+
   'F_open conditional at the end of the file'#000+
-  'W_Debug information generation is not supported by this executable'#000+
+  'W_Debug information generation is not supported by',' this executable'#000+
   'H_Try recompiling with -dGDB'#000+
   'H_Try recompiling with -dGDB'#000+
   'E_You are using the obsolete switch $1'#000+
   'E_You are using the obsolete switch $1'#000+
-  'E_Yo','u are using the obsolete switch $1, please use $2'#000+
+  'E_You are using the obsolete switch $1, please use $2'#000+
   'N_Switching assembler to default source writing assembler'#000+
   'N_Switching assembler to default source writing assembler'#000+
-  'Free Pascal Compiler version $FPCVER [$FPCDATE] for $FPCTARGET'#000+
+  'Free Pascal Compiler version $FPCVER [$FPCD','ATE] for $FPCTARGET'#000+
   'Copyright (c) 1993-98 by Florian Klaempfl'#000+
   'Copyright (c) 1993-98 by Florian Klaempfl'#000+
-  'Free Pascal Compiler versio','n $FPCVER'#000+
+  'Free Pascal Compiler version $FPCVER'#000+
   #000+
   #000+
   'Compiler Date  : $FPCDATE'#000+
   'Compiler Date  : $FPCDATE'#000+
   'Compiler Target: $FPCTARGET'#000+
   'Compiler Target: $FPCTARGET'#000+
   #000+
   #000+
   'This program comes under the GNU General Public Licence'#000+
   'This program comes under the GNU General Public Licence'#000+
-  'For more information read COPYING.FPC'#000+
+  'For more information read COP','YING.FPC'#000+
   #000+
   #000+
   'Report bugs,suggestions etc to:'#000+
   'Report bugs,suggestions etc to:'#000+
-  '                 [email protected]','.hu'#000+
+  '                 [email protected]'#000+
   '**0*_put + after a boolean switch option to enable it, - to disable it'+
   '**0*_put + after a boolean switch option to enable it, - to disable it'+
   #000+
   #000+
   '**1a_the compiler doesn'#039't delete the generated assembler file'#000+
   '**1a_the compiler doesn'#039't delete the generated assembler file'#000+
-  '**2al_list sourcecode lines in assembler file'#000+
-  '**2ar_list register allocation/release info in assembler ','file'#000+
+  '**2al_list sou','rcecode lines in assembler file'#000+
+  '**2ar_list register allocation/release info in assembler file'#000+
   '**2at_list temp allocation/release info in assembler file'#000+
   '**2at_list temp allocation/release info in assembler file'#000+
   '**1b_generate browser info'#000+
   '**1b_generate browser info'#000+
   '**2bl_generate local symbol info'#000+
   '**2bl_generate local symbol info'#000+
   '**1B_build all modules'#000+
   '**1B_build all modules'#000+
-  '**1C<x>_code generation options:'#000+
+  '**1C<','x>_code generation options:'#000+
   '3*2CD_create dynamic library'#000+
   '3*2CD_create dynamic library'#000+
-  '**2Ch<n>_<n> bytes heap (between',' 1023 and 67107840)'#000+
+  '**2Ch<n>_<n> bytes heap (between 1023 and 67107840)'#000+
   '**2Ci_IO-checking'#000+
   '**2Ci_IO-checking'#000+
   '**2Cn_omit linking stage'#000+
   '**2Cn_omit linking stage'#000+
   '**2Co_check overflow of integer operations'#000+
   '**2Co_check overflow of integer operations'#000+
   '**2Cr_range checking'#000+
   '**2Cr_range checking'#000+
-  '**2Cs<n>_set stack size to <n>'#000+
+  '**2Cs<n>_set stack size ','to <n>'#000+
   '**2Ct_stack checking'#000+
   '**2Ct_stack checking'#000+
   '3*2CS_create static library'#000+
   '3*2CS_create static library'#000+
   '3*2Cx_use smartlinking'#000+
   '3*2Cx_use smartlinking'#000+
-  '**1d<x>_de','fines the symbol <x>'#000+
+  '**1d<x>_defines the symbol <x>'#000+
   '*O1D_generate a DEF file'#000+
   '*O1D_generate a DEF file'#000+
   '*O2Dd<x>_set description to <x>'#000+
   '*O2Dd<x>_set description to <x>'#000+
   '*O2Dw_PM application'#000+
   '*O2Dw_PM application'#000+
   '**1e<x>_set path to executable'#000+
   '**1e<x>_set path to executable'#000+
   '**1E_same as -Cn'#000+
   '**1E_same as -Cn'#000+
-  '**1F<x>_set file names and paths:'#000+
-  '**2FD<x>_sets the directory where to search for compiler ut','ilities'#000+
+  '**1F','<x>_set file names and paths:'#000+
+  '**2FD<x>_sets the directory where to search for compiler utilities'#000+
   '**2Fe<x>_redirect error output to <x>'#000+
   '**2Fe<x>_redirect error output to <x>'#000+
   '**2FE<x>_set exe/unit output path to <x>'#000+
   '**2FE<x>_set exe/unit output path to <x>'#000+
   '**2Fi<x>_adds <x> to include path'#000+
   '**2Fi<x>_adds <x> to include path'#000+
-  '**2Fl<x>_adds <x> to library path'#000+
+  '**2Fl<x>_adds <x> to library p','ath'#000+
   '*L2FL<x>_uses <x> as dynamic linker'#000+
   '*L2FL<x>_uses <x> as dynamic linker'#000+
   '**2Fo<x>_adds <x> to object path'#000+
   '**2Fo<x>_adds <x> to object path'#000+
-  '**2Fr<x>_load er','ror message file <x>'#000+
+  '**2Fr<x>_load error message file <x>'#000+
   '**2Fu<x>_adds <x> to unit path'#000+
   '**2Fu<x>_adds <x> to unit path'#000+
   '**2FU<x>_set unit output path to <x>, overrides -FE'#000+
   '**2FU<x>_set unit output path to <x>, overrides -FE'#000+
   '*g1g<x>_generate debugger information:'#000+
   '*g1g<x>_generate debugger information:'#000+
-  '*g2gg_use gsym'#000+
+  '*g2gg_us','e gsym'#000+
   '*g2gd_use dbx'#000+
   '*g2gd_use dbx'#000+
   '*g2gh_use heap trace unit'#000+
   '*g2gh_use heap trace unit'#000+
   '*g2gc_generate checks for pointers'#000+
   '*g2gc_generate checks for pointers'#000+
-  '**1i_in','formation'#000+
+  '**1i_information'#000+
   '**2iD_return compiler date'#000+
   '**2iD_return compiler date'#000+
   '**2iV_return compiler version'#000+
   '**2iV_return compiler version'#000+
   '**2iSO_return compiler OS'#000+
   '**2iSO_return compiler OS'#000+
   '**2iSP_return compiler processor'#000+
   '**2iSP_return compiler processor'#000+
   '**2iTO_return target OS'#000+
   '**2iTO_return target OS'#000+
-  '**2iTP_return target processor'#000+
+  '*','*2iTP_return target processor'#000+
   '**1I<x>_adds <x> to include path'#000+
   '**1I<x>_adds <x> to include path'#000+
-  '**1k<x>_Pass <x> to the li','nker'#000+
+  '**1k<x>_Pass <x> to the linker'#000+
   '**1l_write logo'#000+
   '**1l_write logo'#000+
   '**1n_don'#039't read the default config file'#000+
   '**1n_don'#039't read the default config file'#000+
   '**1o<x>_change the name of the executable produced to <x>'#000+
   '**1o<x>_change the name of the executable produced to <x>'#000+
-  '**1pg_generate profile code for gprof'#000+
+  '**1pg_generate profile code for ','gprof'#000+
   '*L1P_use pipes instead of creating temporary assembler files'#000+
   '*L1P_use pipes instead of creating temporary assembler files'#000+
-  '**1S<x>_syntax options',':'#000+
+  '**1S<x>_syntax options:'#000+
   '**2S2_switch some Delphi 2 extensions on'#000+
   '**2S2_switch some Delphi 2 extensions on'#000+
   '**2Sc_supports operators like C (*=,+=,/= and -=)'#000+
   '**2Sc_supports operators like C (*=,+=,/= and -=)'#000+
   '**2Sd_tries to be Delphi compatible'#000+
   '**2Sd_tries to be Delphi compatible'#000+
-  '**2Se<x>_compiler stops after the <x> errors (default is 1)'#000+
+  '**2Se<x>_compiler stop','s after the <x> errors (default is 1)'#000+
   '**2Sg_allow LABEL and GOTO'#000+
   '**2Sg_allow LABEL and GOTO'#000+
   '**2Sh_Use ansistrings'#000+
   '**2Sh_Use ansistrings'#000+
-  '**','2Si_support C++ styled INLINE'#000+
+  '**2Si_support C++ styled INLINE'#000+
   '**2Sm_support macros like C (global)'#000+
   '**2Sm_support macros like C (global)'#000+
   '**2So_tries to be TP/BP 7.0 compatible'#000+
   '**2So_tries to be TP/BP 7.0 compatible'#000+
   '**2Sp_tries to be gpc compatible'#000+
   '**2Sp_tries to be gpc compatible'#000+
-  '**2Ss_constructor name must be init (destructor must be done)'#000+
+  '**2Ss_constr','uctor name must be init (destructor must be done)'#000+
   '**2St_allow static keyword in objects'#000+
   '**2St_allow static keyword in objects'#000+
-  '*','*1s_don'#039't call assembler and linker (only with -a)'#000+
+  '**1s_don'#039't call assembler and linker (only with -a)'#000+
   '**1u<x>_undefines the symbol <x>'#000+
   '**1u<x>_undefines the symbol <x>'#000+
   '**1U_unit options:'#000+
   '**1U_unit options:'#000+
   '**2Un_don'#039't check the unit name'#000+
   '**2Un_don'#039't check the unit name'#000+
-  '**2Us_compile a system unit'#000+
+  '**2Us_compile a ','system unit'#000+
   '**1v<x>_Be verbose. <x> is a combination of the following letters:'#000+
   '**1v<x>_Be verbose. <x> is a combination of the following letters:'#000+
-  '**2*_e : S','how errors (default)       d : Show debug info'#000+
+  '**2*_e : Show errors (default)       d : Show debug info'#000+
   '**2*_w : Show warnings               u : Show unit info'#000+
   '**2*_w : Show warnings               u : Show unit info'#000+
-  '**2*_n : Show notes                  t : Show tried/used files'#000+
+  '**2*_n : Show notes                  t : Show tr','ied/used files'#000+
   '**2*_h : Show hints                  m : Show defined macros'#000+
   '**2*_h : Show hints                  m : Show defined macros'#000+
-  '**2*_i : Show',' general info           p : Show compiled procedures'#000+
+  '**2*_i : Show general info           p : Show compiled procedures'#000+
   '**2*_l : Show linenumbers            c : Show conditionals'#000+
   '**2*_l : Show linenumbers            c : Show conditionals'#000+
-  '**2*_a : Show everything             0 : Show nothing (except errors)'#000+
-  '**2*_b : Show all procedure          r : Rhide/GCC compati','bility mod'+
-  'e'#000+
+  '**2*_a : Show everything             0 ',': Show nothing (except errors'+
+  ')'#000+
+  '**2*_b : Show all procedure          r : Rhide/GCC compatibility mode'#000+
   '**2*_    declarations if an error    x : Executable info (Win32 only)'#000+
   '**2*_    declarations if an error    x : Executable info (Win32 only)'#000+
   '**2*_    occurs'#000+
   '**2*_    occurs'#000+
   '**1X_executable options:'#000+
   '**1X_executable options:'#000+
-  '*L2Xc_link with the c library'#000+
+  '*L2Xc_link with the c librar','y'#000+
   '**2XD_link with dynamic libraries (defines FPC_LINK_DYNAMIC)'#000+
   '**2XD_link with dynamic libraries (defines FPC_LINK_DYNAMIC)'#000+
-  '**2Xs_strip all symbols fr','om executable'#000+
+  '**2Xs_strip all symbols from executable'#000+
   '**2XS_link with static libraries (defines FPC_LINK_STATIC)'#000+
   '**2XS_link with static libraries (defines FPC_LINK_STATIC)'#000+
   '**0*_Processor specific options:'#000+
   '**0*_Processor specific options:'#000+
   '3*1A<x>_output format:'#000+
   '3*1A<x>_output format:'#000+
-  '3*2Aas_assemble using GNU AS'#000+
+  '3*2Aas_assemble using ','GNU AS'#000+
   '3*2Aasaout_assemble using GNU AS for aout (Go32v1)'#000+
   '3*2Aasaout_assemble using GNU AS for aout (Go32v1)'#000+
-  '3*2Anasmcoff_coff (Go32v2) file',' using Nasm'#000+
+  '3*2Anasmcoff_coff (Go32v2) file using Nasm'#000+
   '3*2Anasmelf_elf32 (Linux) file using Nasm'#000+
   '3*2Anasmelf_elf32 (Linux) file using Nasm'#000+
   '3*2Anasmobj_obj file using Nasm'#000+
   '3*2Anasmobj_obj file using Nasm'#000+
   '3*2Amasm_obj file using Masm (Microsoft)'#000+
   '3*2Amasm_obj file using Masm (Microsoft)'#000+
-  '3*2Atasm_obj file using Tasm (Borland)'#000+
+  '3*2Atasm_obj file using ','Tasm (Borland)'#000+
   '3*2Acoff_coff (Go32v2) using internal writer'#000+
   '3*2Acoff_coff (Go32v2) using internal writer'#000+
-  '3*2Apecoff_pecoff (Win32) usi','ng internal writer'#000+
+  '3*2Apecoff_pecoff (Win32) using internal writer'#000+
   '3*1R<x>_assembler reading style:'#000+
   '3*1R<x>_assembler reading style:'#000+
   '3*2Ratt_read AT&T style assembler'#000+
   '3*2Ratt_read AT&T style assembler'#000+
   '3*2Rintel_read Intel style assembler'#000+
   '3*2Rintel_read Intel style assembler'#000+
-  '3*2Rdirect_copy assembler text directly to assembler file'#000+
+  '3*2Rdirect_copy assembler te','xt directly to assembler file'#000+
   '3*1O<x>_optimizations:'#000+
   '3*1O<x>_optimizations:'#000+
   '3*2Og_generate smaller code'#000+
   '3*2Og_generate smaller code'#000+
-  '3*2OG_ge','nerate faster code (default)'#000+
+  '3*2OG_generate faster code (default)'#000+
   '3*2Or_keep certain variables in registers (still BUGGY!!!)'#000+
   '3*2Or_keep certain variables in registers (still BUGGY!!!)'#000+
   '3*2Ou_enable uncertain optimizations (see docs)'#000+
   '3*2Ou_enable uncertain optimizations (see docs)'#000+
-  '3*2O1_level 1 optimizations (quick optimizations)'#000+
-  '3*2O2_level 2 optimizations (-O1 + slower optimization','s)'#000+
+  '3*2O1_level 1 o','ptimizations (quick optimizations)'#000+
+  '3*2O2_level 2 optimizations (-O1 + slower optimizations)'#000+
   '3*2O3_level 3 optimizations (same as -O2u)'#000+
   '3*2O3_level 3 optimizations (same as -O2u)'#000+
   '3*2Op<x>_target processor:'#000+
   '3*2Op<x>_target processor:'#000+
   '3*3Op1_set target processor to 386/486'#000+
   '3*3Op1_set target processor to 386/486'#000+
-  '3*3Op2_set target processor to Pentium/PentiumMMX (tm)'#000+
+  '3*3Op2_set target processor to Pentium/','PentiumMMX (tm)'#000+
   '3*3Op3_set target processor to PPro/PII/c6x86/K6 (tm)'#000+
   '3*3Op3_set target processor to PPro/PII/c6x86/K6 (tm)'#000+
-  '3*1T<x>_Target oper','ating system:'#000+
+  '3*1T<x>_Target operating system:'#000+
   '3*2TGO32V1_version 1 of DJ Delorie DOS extender'#000+
   '3*2TGO32V1_version 1 of DJ Delorie DOS extender'#000+
   '3*2TGO32V2_version 2 of DJ Delorie DOS extender'#000+
   '3*2TGO32V2_version 2 of DJ Delorie DOS extender'#000+
   '3*2TLINUX_Linux'#000+
   '3*2TLINUX_Linux'#000+
   '3*2TOS2_OS/2 2.x'#000+
   '3*2TOS2_OS/2 2.x'#000+
-  '3*2TWin32_Windows 32 Bit'#000+
+  '3*2TWin3','2_Windows 32 Bit'#000+
   '6*1A<x>_output format'#000+
   '6*1A<x>_output format'#000+
   '6*2Aas_Unix o-file using GNU AS'#000+
   '6*2Aas_Unix o-file using GNU AS'#000+
-  '6*2Agas_GNU Motoro','la assembler'#000+
+  '6*2Agas_GNU Motorola assembler'#000+
   '6*2Amit_MIT Syntax (old GAS)'#000+
   '6*2Amit_MIT Syntax (old GAS)'#000+
   '6*2Amot_Standard Motorola assembler'#000+
   '6*2Amot_Standard Motorola assembler'#000+
   '6*1O_optimizations:'#000+
   '6*1O_optimizations:'#000+
   '6*2Oa_turn on the optimizer'#000+
   '6*2Oa_turn on the optimizer'#000+
-  '6*2Og_generate smaller code'#000+
+  '6*2Og_generate smaller co','de'#000+
   '6*2OG_generate faster code (default)'#000+
   '6*2OG_generate faster code (default)'#000+
   '6*2Ox_optimize maximum (still BUGGY!!!)'#000+
   '6*2Ox_optimize maximum (still BUGGY!!!)'#000+
-  '6*2O2_set',' target processor to a MC68020+'#000+
+  '6*2O2_set target processor to a MC68020+'#000+
   '6*1R<x>_assembler reading style:'#000+
   '6*1R<x>_assembler reading style:'#000+
   '6*2RMOT_read motorola style assembler'#000+
   '6*2RMOT_read motorola style assembler'#000+
   '6*1T<x>_Target operating system:'#000+
   '6*1T<x>_Target operating system:'#000+
-  '6*2TAMIGA_Commodore Amiga'#000+
+  '6*2TAMIGA_Commo','dore Amiga'#000+
   '6*2TATARI_Atari ST/STe/TT'#000+
   '6*2TATARI_Atari ST/STe/TT'#000+
   '6*2TMACOS_Macintosh m68k'#000+
   '6*2TMACOS_Macintosh m68k'#000+
   '6*2TLINUX_Linux-68k'#000+
   '6*2TLINUX_Linux-68k'#000+
   '**1*_'#000+
   '**1*_'#000+
-  '*','*1?_shows this help'#000+
+  '**1?_shows this help'#000+
   '**1h_shows this help without waiting'#000
   '**1h_shows this help without waiting'#000
 );
 );

+ 17 - 1
compiler/pdecl.pas

@@ -234,6 +234,9 @@ unit pdecl;
          consume(SEMICOLON);
          consume(SEMICOLON);
       end;
       end;
 
 
+    const
+       variantrecordlevel : longint = 0;
+
 
 
     procedure read_var_decs(is_record,is_object,is_threadvar:boolean);
     procedure read_var_decs(is_record,is_object,is_threadvar:boolean);
     { reads the filed of a record into a        }
     { reads the filed of a record into a        }
@@ -298,6 +301,8 @@ unit pdecl;
                but should be OK for all modes !! (PM) }
                but should be OK for all modes !! (PM) }
              ignore_equal:=true;
              ignore_equal:=true;
              p:=read_type('');
              p:=read_type('');
+             if (variantrecordlevel>0) and p^.needs_inittable then
+               Message(parser_e_cant_use_inittable_here);
              ignore_equal:=false;
              ignore_equal:=false;
              symdone:=false;
              symdone:=false;
              if is_gpc_name then
              if is_gpc_name then
@@ -560,8 +565,10 @@ unit pdecl;
                 consume(COLON);
                 consume(COLON);
                 { read the vars }
                 { read the vars }
                 consume(LKLAMMER);
                 consume(LKLAMMER);
+                inc(variantrecordlevel);
                 if token<>RKLAMMER then
                 if token<>RKLAMMER then
                   read_var_decs(true,false,false);
                   read_var_decs(true,false,false);
+                dec(variantrecordlevel);
                 consume(RKLAMMER);
                 consume(RKLAMMER);
                 { calculates maximal variant size }
                 { calculates maximal variant size }
                 maxsize:=max(maxsize,symtablestack^.datasize);
                 maxsize:=max(maxsize,symtablestack^.datasize);
@@ -2115,7 +2122,16 @@ unit pdecl;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.130  1999-07-05 20:25:39  peter
+  Revision 1.131  1999-07-06 21:48:23  florian
+    * a lot bug fixes:
+       - po_external isn't any longer necessary for procedure compatibility
+       - m_tp_procvar is in -Sd now available
+       - error messages of procedure variables improved
+       - return values with init./finalization fixed
+       - data types with init./finalization aren't any longer allowed in variant
+         record
+
+  Revision 1.130  1999/07/05 20:25:39  peter
     * merged
     * merged
 
 
   Revision 1.129  1999/07/02 13:02:26  peter
   Revision 1.129  1999/07/02 13:02:26  peter

+ 13 - 2
compiler/pmodules.pas

@@ -409,6 +409,8 @@ unit pmodules;
            end;
            end;
         end;
         end;
 
 
+      var
+         dummy : pmodule;
 
 
       begin
       begin
          old_current_module:=current_module;
          old_current_module:=current_module;
@@ -502,7 +504,7 @@ unit pmodules;
                while assigned(hp2) do
                while assigned(hp2) do
                 begin
                 begin
                   if hp2^.do_reload then
                   if hp2^.do_reload then
-                   loadunit(hp2^.modulename^,false);
+                   dummy:=loadunit(hp2^.modulename^,false);
                   hp2:=pmodule(hp2^.next);
                   hp2:=pmodule(hp2^.next);
                 end;
                 end;
              end
              end
@@ -1330,7 +1332,16 @@ unit pmodules;
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.128  1999-07-06 00:53:48  peter
+  Revision 1.129  1999-07-06 21:48:24  florian
+    * a lot bug fixes:
+       - po_external isn't any longer necessary for procedure compatibility
+       - m_tp_procvar is in -Sd now available
+       - error messages of procedure variables improved
+       - return values with init./finalization fixed
+       - data types with init./finalization aren't any longer allowed in variant
+         record
+
+  Revision 1.128  1999/07/06 00:53:48  peter
     * merged
     * merged
 
 
   Revision 1.127  1999/07/05 16:21:27  peter
   Revision 1.127  1999/07/05 16:21:27  peter

+ 11 - 2
compiler/symconst.inc

@@ -76,7 +76,7 @@
        { relevant options for assigning a proc or a procvar to a procvar }
        { relevant options for assigning a proc or a procvar to a procvar }
        po_compatibility_options = $7FFFFFFF-
        po_compatibility_options = $7FFFFFFF-
          (poassembler+pomsgstr+pomsgint+
          (poassembler+pomsgstr+pomsgint+
-          povirtualmethod+pooverridingmethod);
+          povirtualmethod+pooverridingmethod+poexternal);
 
 
        { options for objects and classes }
        { options for objects and classes }
        oo_is_abstract  = $1;         { true, if the object/class has an abstract }
        oo_is_abstract  = $1;         { true, if the object/class has an abstract }
@@ -111,7 +111,16 @@
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.11  1999-06-03 09:34:11  peter
+  Revision 1.12  1999-07-06 21:48:26  florian
+    * a lot bug fixes:
+       - po_external isn't any longer necessary for procedure compatibility
+       - m_tp_procvar is in -Sd now available
+       - error messages of procedure variables improved
+       - return values with init./finalization fixed
+       - data types with init./finalization aren't any longer allowed in variant
+         record
+
+  Revision 1.11  1999/06/03 09:34:11  peter
     * better methodpointer check for proc->procvar
     * better methodpointer check for proc->procvar
 
 
   Revision 1.10  1999/06/01 19:27:56  peter
   Revision 1.10  1999/06/01 19:27:56  peter

+ 14 - 2
compiler/symdef.inc

@@ -2834,7 +2834,10 @@ Const local_symtable_index : longint = $8001;
     function tprocvardef.gettypename : string;
     function tprocvardef.gettypename : string;
 
 
       begin
       begin
-         gettypename:='<procedure variable type>'
+         if assigned(retdef) then
+           gettypename:='<procedure variable type of function'+demangled_paras+':'+retdef^.gettypename+'>'
+         else
+           gettypename:='<procedure variable type of procedure'+demangled_paras+'>';
       end;
       end;
 
 
 
 
@@ -3462,7 +3465,16 @@ Const local_symtable_index : longint = $8001;
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.130  1999-06-22 16:24:44  pierre
+  Revision 1.131  1999-07-06 21:48:27  florian
+    * a lot bug fixes:
+       - po_external isn't any longer necessary for procedure compatibility
+       - m_tp_procvar is in -Sd now available
+       - error messages of procedure variables improved
+       - return values with init./finalization fixed
+       - data types with init./finalization aren't any longer allowed in variant
+         record
+
+  Revision 1.130  1999/06/22 16:24:44  pierre
    * local browser stuff corrected
    * local browser stuff corrected
 
 
   Revision 1.129  1999/06/02 22:44:21  pierre
   Revision 1.129  1999/06/02 22:44:21  pierre

+ 15 - 2
compiler/types.pas

@@ -249,8 +249,12 @@ implementation
         ismethod : boolean;
         ismethod : boolean;
       begin
       begin
          proc_to_procvar_equal:=false;
          proc_to_procvar_equal:=false;
+         if not(assigned(def1)) or not(assigned(def2)) then
+           exit;
          { check for method pointer }
          { check for method pointer }
-         ismethod:=(def1^.owner^.symtabletype=objectsymtable) and
+         ismethod:=assigned(def1^.owner) and
+                   (def1^.owner^.symtabletype=objectsymtable) and
+                   assigned(def1^.owner^.defowner) and
                    (pobjectdef(def1^.owner^.defowner)^.isclass);
                    (pobjectdef(def1^.owner^.defowner)^.isclass);
          if (ismethod and not ((def2^.options and pomethodpointer)<>0)) or
          if (ismethod and not ((def2^.options and pomethodpointer)<>0)) or
             (not(ismethod) and ((def2^.options and pomethodpointer)<>0)) then
             (not(ismethod) and ((def2^.options and pomethodpointer)<>0)) then
@@ -948,7 +952,16 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.74  1999-07-01 15:49:24  florian
+  Revision 1.75  1999-07-06 21:48:29  florian
+    * a lot bug fixes:
+       - po_external isn't any longer necessary for procedure compatibility
+       - m_tp_procvar is in -Sd now available
+       - error messages of procedure variables improved
+       - return values with init./finalization fixed
+       - data types with init./finalization aren't any longer allowed in variant
+         record
+
+  Revision 1.74  1999/07/01 15:49:24  florian
     * int64/qword type release
     * int64/qword type release
     + lo/hi for int64/qword
     + lo/hi for int64/qword