Преглед на файлове

Merged revisions 7648,7653-7655,7663,7675,7677,7681-7683,7689,7697,7702,7704-7712,7716,7719,7725,7736,7738,7740,7744-7746,7751,7753,7764,7767,7769-7770,7772,7776-7778,7788,7793,7797,7811,7814,7817,7830,7836-7839,7846,7849,7862,7864-7865,7869,7872,7877,7882,7884,7886-7887,7905,7907-7908,7910,7916,7925-7929,7931-7932,7936,7941,7944,7953,7961,7967,7971,7976 via svnmerge from
http://svn.freepascal.org/svn/fpc/trunk

........
r7648 | florian | 2007-06-13 22:21:33 +0200 (Wed, 13 Jun 2007) | 2 lines

+ classrefdef is assignment compatible to pointers in delphi mode
........
r7653 | florian | 2007-06-13 22:49:09 +0200 (Wed, 13 Jun 2007) | 2 lines

* typos corrected
........
r7654 | daniel | 2007-06-13 22:49:13 +0200 (Wed, 13 Jun 2007) | 2 lines

* Fix overload selection code.
........
r7655 | florian | 2007-06-13 23:04:51 +0200 (Wed, 13 Jun 2007) | 2 lines

* allow in delphi mode member classes in published sections which aren't compiled with $M+
........
r7675 | florian | 2007-06-15 23:41:55 +0200 (Fri, 15 Jun 2007) | 2 lines

+ local symbols can hide class members in delphi mode
........
r7702 | florian | 2007-06-17 15:17:44 +0200 (Sun, 17 Jun 2007) | 2 lines

* reverted r7675
........
r7716 | marco | 2007-06-17 22:28:06 +0200 (Sun, 17 Jun 2007) | 2 lines

* fixed deprecated
........
r7719 | marco | 2007-06-17 22:40:47 +0200 (Sun, 17 Jun 2007) | 2 lines

* fixed deprecated
........
r7772 | jonas | 2007-06-22 19:10:15 +0200 (Fri, 22 Jun 2007) | 3 lines

* fixed public/export support for initialised variables/typed
constants (mantis #9113)
........
r7778 | florian | 2007-06-22 20:51:58 +0200 (Fri, 22 Jun 2007) | 2 lines

* return proper vardef value for wordbool, resolves #9125
........
r7793 | florian | 2007-06-24 17:14:47 +0200 (Sun, 24 Jun 2007) | 2 lines

+ allow local const symbols to override class members in delphi mode
........
r7797 | florian | 2007-06-24 21:27:22 +0200 (Sun, 24 Jun 2007) | 2 lines

* don't try to range check ordconst nodes being actually classes
........
r7811 | florian | 2007-06-25 22:08:34 +0200 (Mon, 25 Jun 2007) | 2 lines

* allow <any ordinal>(class/interface) type casts likewise it is allowed for class references and pointers
........
r7814 | daniel | 2007-06-25 22:57:21 +0200 (Mon, 25 Jun 2007) | 7 lines

* Consider conversion from integer to integer te_equal, if the base types
are equal and the range of the from type fits in the to type. I.e.
conversion from -10..10 to shortint is considered equal. This is correct
because in this case, the from type can be used wherever the to type is
used, i.e. the compiler never needs to do conversion at compile or run
time.
........
r7817 | daniel | 2007-06-26 09:52:04 +0200 (Tue, 26 Jun 2007) | 3 lines

+ New hint; for exmaple int64:=longint+longint says "Converting the operands to
int64 before addition could prevent an overflow error."
........
r7884 | daniel | 2007-07-01 11:05:11 +0200 (Sun, 01 Jul 2007) | 2 lines

+ Warn when converting pointers to signed types.
........
r7886 | daniel | 2007-07-01 11:25:24 +0200 (Sun, 01 Jul 2007) | 2 lines

* Make pointer to array conversion 64-bit safe.
........
r7887 | daniel | 2007-07-01 11:34:13 +0200 (Sun, 01 Jul 2007) | 2 lines

* Limit warning to orddefs to reduce false positives.
........
r7905 | florian | 2007-07-01 16:43:46 +0200 (Sun, 01 Jul 2007) | 2 lines

* allow enum => pointer type casts in delphi mode, resolves #8465
........
r7907 | jonas | 2007-07-01 17:27:21 +0200 (Sun, 01 Jul 2007) | 2 lines

* clarified pointer->integer warning
........
r7908 | florian | 2007-07-01 17:37:36 +0200 (Sun, 01 Jul 2007) | 2 lines

* pass only a pointer to a result when the result is used when invoking idispatch, resolves #9162
........
r7910 | daniel | 2007-07-01 20:26:28 +0200 (Sun, 01 Jul 2007) | 2 lines

- Remove unused variable.
........
r7916 | florian | 2007-07-01 23:04:33 +0200 (Sun, 01 Jul 2007) | 1 line

* updates from Karl-Michael Schindler
........
r7925 | florian | 2007-07-02 23:24:29 +0200 (Mon, 02 Jul 2007) | 2 lines

* check left and right loc for 64 bit when assigning a constant, resolves #9145
........
r7926 | daniel | 2007-07-02 23:32:27 +0200 (Mon, 02 Jul 2007) | 2 lines

* Fix tbs/tb0540.
........
r7931 | daniel | 2007-07-03 13:31:46 +0200 (Tue, 03 Jul 2007) | 2 lines

* Fix most test suite regressions.
........
r7932 | daniel | 2007-07-03 15:35:15 +0200 (Tue, 03 Jul 2007) | 3 lines

* Fix tarray7
* Use is_special_array.
........
r7936 | daniel | 2007-07-03 21:58:47 +0200 (Tue, 03 Jul 2007) | 2 lines

+ Internalerror on encountering a variant array in a vecn.
........
r7941 | daniel | 2007-07-04 00:06:23 +0200 (Wed, 04 Jul 2007) | 2 lines

* Make elecount aword to handle u32bit typeconversions of array indexes.
........
r7944 | jonas | 2007-07-04 10:09:45 +0200 (Wed, 04 Jul 2007) | 2 lines

* fixed wrong range check warnings/errors for open strings
........
r7976 | florian | 2007-07-07 21:16:49 +0200 (Sat, 07 Jul 2007) | 2 lines

* make cycle OPT=-gwl -Co -Cr on x86-64 fixed
........

git-svn-id: branches/fixes_2_2@8581 -

peter преди 18 години
родител
ревизия
eba8cf37a6

+ 7 - 0
.gitattributes

@@ -6376,6 +6376,7 @@ tests/tbs/tb0534.pp svneol=native#text/plain
 tests/tbs/tb0535.pp svneol=native#text/plain
 tests/tbs/tb0536.pp svneol=native#text/plain
 tests/tbs/tb0537.pp svneol=native#text/plain
+tests/tbs/tb0539.pp svneol=native#text/plain
 tests/tbs/tb0540.pp svneol=native#text/x-pascal
 tests/tbs/tb0541.pp svneol=native#text/plain
 tests/tbs/ub0060.pp svneol=native#text/plain
@@ -7392,6 +7393,7 @@ tests/webtbf/tw8150f.pp svneol=native#text/plain
 tests/webtbf/tw8150g.pp svneol=native#text/plain
 tests/webtbf/tw8264a.pp svneol=native#text/plain
 tests/webtbf/tw8398.pp svneol=native#text/plain
+tests/webtbf/tw8465a.pp svneol=native#text/plain
 tests/webtbf/tw8528.pp svneol=native#text/plain
 tests/webtbf/tw8583.pp svneol=native#text/plain
 tests/webtbf/tw8588.pp svneol=native#text/plain
@@ -8328,10 +8330,13 @@ tests/webtbs/tw9076a.pp svneol=native#text/plain
 tests/webtbs/tw9085.pp svneol=native#text/plain
 tests/webtbs/tw9098.pp svneol=native#text/plain
 tests/webtbs/tw9107.pp svneol=native#text/plain
+tests/webtbs/tw9113.pp svneol=native#text/plain
 tests/webtbs/tw9128.pp svneol=native#text/plain
 tests/webtbs/tw9139.pp svneol=native#text/plain
 tests/webtbs/tw9139a.pp svneol=native#text/plain
+tests/webtbs/tw9145.pp svneol=native#text/plain
 tests/webtbs/tw9161.pp svneol=native#text/plain
+tests/webtbs/tw9162.pp svneol=native#text/plain
 tests/webtbs/tw9174.pp svneol=native#text/plain
 tests/webtbs/tw9179.pp svneol=native#text/plain
 tests/webtbs/tw9187.pp svneol=native#text/plain
@@ -8393,6 +8398,8 @@ tests/webtbs/uw6767.pp svneol=native#text/plain
 tests/webtbs/uw7381.pp svneol=native#text/plain
 tests/webtbs/uw8180.pp svneol=native#text/plain
 tests/webtbs/uw8372.pp svneol=native#text/plain
+tests/webtbs/uw9113a.pp svneol=native#text/plain
+tests/webtbs/uw9113b.pp svneol=native#text/plain
 utils/Makefile svneol=native#text/plain
 utils/Makefile.fpc svneol=native#text/plain
 utils/README -text

+ 1 - 1
compiler/aasmtai.pas

@@ -1315,7 +1315,7 @@ implementation
             else
               result:=sizeof(aint);
           aitconst_uleb128bit :
-            result:=LengthUleb128(value);
+            result:=LengthUleb128(qword(value));
           aitconst_sleb128bit :
             result:=LengthSleb128(value);
           else

+ 1 - 1
compiler/assemble.pas

@@ -1173,7 +1173,7 @@ Implementation
                        else
                          v:=Tai_const(hp).value;
                        if tai_const(hp).consttype=aitconst_uleb128bit then
-                         leblen:=EncodeUleb128(v,lebbuf)
+                         leblen:=EncodeUleb128(qword(v),lebbuf)
                        else
                          leblen:=EncodeSleb128(v,lebbuf);
                        ObjData.writebytes(lebbuf,leblen);

+ 107 - 0
compiler/cutils.pas

@@ -138,6 +138,7 @@ interface
     function minilzw_encode(const s:string):string;
     function minilzw_decode(const s:string):string;
 
+    Function nextafter(x,y:double):double;
 
 implementation
 
@@ -1254,6 +1255,112 @@ implementation
         runerror(255);
       end;
 
+    Function Nextafter(x,y:double):double;
+    // Returns the double precision number closest to x in
+    // the direction toward y.
+
+    // Initial direct translation by Soeren Haastrup from
+    // www.netlib.org/fdlibm/s_nextafter.c according to
+    // ====================================================
+    // Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+    // Developed at SunSoft, a Sun Microsystems, Inc. business.
+    // Permission to use, copy, modify, and distribute this
+    // software is freely granted, provided that this notice
+    // is preserved.
+    // ====================================================
+    // and with all signaling policies preserved as is.
+
+    type
+      {$ifdef ENDIAN_LITTLE}
+        twoword=record
+                  lo,hi:longword; // Little Endian split of a double.
+                end;
+      {$else}
+        twoword=record
+                  hi,lo:longword; // Little Endian split of a double.
+                end;
+      {$endif}
+
+    var
+        hx,hy,ix,iy:longint;
+        lx,ly:longword;
+
+    Begin
+    hx:=twoword(x).hi;    // high and low words of x and y
+    lx:=twoword(x).lo;
+    hy:=twoword(y).hi;
+    ly:=twoword(y).lo;
+    ix:=hx and $7fffffff;  // absolute values
+    iy:=hy and $7fffffff;
+
+    // Case x=NAN or y=NAN
+
+    if ( (ix>=$7ff00000) and (((ix-$7ff00000) or lx) <> 0) )
+        or ( (iy>=$7ff00000) and (((iy-$7ff00000) OR ly) <> 0) )
+    then exit(x+y);
+
+    // Case x=y
+
+    if x=y then exit(x); // (implies Nextafter(0,-0) is 0 and not -0...)
+
+    // Case x=0
+
+    if (ix or lx)=0
+    then begin
+          twoword(x).hi:=hy and $80000000;  // return +-minimalSubnormal
+          twoword(x).lo:=1;
+          y:=x*x;    // set underflow flag (ignored in FPC as default)
+          if y=x
+          then exit(y)
+          else exit(x);
+        end;
+
+    // all other cases
+
+    if hx>=0  // x>0
+    then begin
+          if (hx>hy) or ( (hx=hy) and (lx>ly) ) // x>y , return x-ulp
+          then begin
+                if (lx=0) then hx:=hx-1;
+                lx:=lx-1;
+              end
+          else begin                      // x<y, return x+ulp
+                lx:=lx+1;
+                if lx=0 then hx:=hx+1;
+              end
+        end
+    else begin // x<0
+          if (hy>=0) or (hx>=hy) or ( (hx=hy) and (lx>ly)) // x<y, return x-ulp
+          then begin
+                if (lx=0) then hx:=hx-1;
+                lx:=lx-1;
+              end
+          else begin            // x>y , return x+ulp
+                lx:=lx+1;
+                if lx=0 then hx:=hx+1;
+              end
+        end;
+
+    // finally check if overflow or underflow just happend
+
+    hy:=hx and $7ff00000;
+    if (hy>= $7ff00000) then exit(x+x); // overflow and signal
+    if (hy<$0010000)                    // underflow
+    then begin
+          y:=x*x;              // raise underflow flag
+          if y<>x
+          then begin
+                twoword(y).hi:=hx;
+                twoword(y).lo:=lx;
+                exit(y);
+              end
+        end;
+
+    twoword(x).hi:=hx;
+    twoword(x).lo:=lx;
+    nextafter:=x;
+
+    end;
 
 initialization
   internalerrorproc:=@defaulterror;

+ 1 - 1
compiler/dbgdwarf.pas

@@ -1901,7 +1901,7 @@ implementation
               begin
 {$ifdef cpu64bit}
                 current_asmdata.asmlists[al_dwarf_abbrev].concat(tai_const.create_uleb128bit(ord(DW_FORM_data8)));
-                current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_64bit(sym.value.valueordptr));
+                current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_64bit(int64(sym.value.valueordptr)));
 {$else cpu64bit}
                 current_asmdata.asmlists[al_dwarf_abbrev].concat(tai_const.create_uleb128bit(ord(DW_FORM_data4)));
                 current_asmdata.asmlists[al_dwarf_info].concat(tai_const.create_32bit(sym.value.valueordptr));

+ 24 - 4
compiler/defcmp.pas

@@ -226,8 +226,8 @@ implementation
                           u8bit,u16bit,u32bit,u64bit,
                           s8bit,s16bit,s32bit,s64bit:
                             begin
-                              if (torddef(def_from).low=torddef(def_to).low) and
-                                 (torddef(def_from).high=torddef(def_to).high) then
+                              if (torddef(def_from).low>=torddef(def_to).low) and
+                                 (torddef(def_from).high<=torddef(def_to).high) then
                                 eq:=te_equal
                               else
                                 begin
@@ -276,6 +276,20 @@ implementation
                         eq:=te_convert_l2;
                       end;
                    end;
+                 objectdef:
+                   begin
+                     if is_class_or_interface_or_dispinterface(def_from) and (cdo_explicit in cdoptions) then
+                      begin
+                        eq:=te_convert_l1;
+                        if (fromtreetype=niln) then
+                         begin
+                           { will be handled by the constant folding }
+                           doconv:=tc_equal;
+                         end
+                        else
+                         doconv:=tc_int_2_int;
+                      end;
+                   end;
                  classrefdef,
                  procvardef,
                  pointerdef :
@@ -920,7 +934,6 @@ implementation
                          eq:=te_convert_l1;
                        end;
                    end;
-{
                  enumdef :
                    begin
                      { allow explicit typecasts from enums to pointer.
@@ -937,7 +950,6 @@ implementation
                          eq:=te_convert_l1;
                        end;
                    end;
-}
                  arraydef :
                    begin
                      { string constant (which can be part of array constructor)
@@ -1266,6 +1278,14 @@ implementation
                     end;
                  end
                else
+                 if (m_delphi in current_settings.modeswitches) and
+                    is_voidpointer(def_from) then
+                  begin
+                    doconv:=tc_equal;
+                    { prefer pointer-pointer assignments }
+                    eq:=te_convert_l2;
+                  end
+                 else
                 { nil is compatible with class references }
                 if (fromtreetype=niln) then
                  begin

+ 1 - 1
compiler/globals.pas

@@ -682,7 +682,7 @@ implementation
         expansion under linux }
 {$ifdef hasunix}
       begin
-        result := Unix.Shell(command);
+        result := Unix.fpsystem(command);
       end;
 {$else hasunix}
   {$ifdef amigashell}

+ 19 - 15
compiler/htypechk.pas

@@ -49,7 +49,7 @@ interface
          cl2_count,
          cl3_count,
          coper_count : integer; { should be signed }
-         ordinal_distance : bestreal;
+         ordinal_distance : double;
          invalid     : boolean;
          wrongparanr : byte;
       end;
@@ -1900,7 +1900,7 @@ implementation
         currpara : tparavarsym;
         paraidx  : integer;
         currparanr : byte;
-        rfh,rth  : bestreal;
+        rfh,rth  : double;
         objdef   : tobjectdef;
         def_from,
         def_to   : tdef;
@@ -1912,6 +1912,12 @@ implementation
         pdoper   : tprocdef;
         releasecurrpt : boolean;
         cdoptions : tcompare_defs_options;
+
+    {$ifopt r+}{$define ena_rq}{$q-}{$r-}{$endif}
+      const
+        inf=1.0/0.0;
+    {$ifdef ena_rq}{$q+}{$r+}{$endif}
+
       begin
         cdoptions:=[cdo_check_operator];
         if FAllowVariant then
@@ -1989,15 +1995,11 @@ implementation
                  (currparanr>hp^.data.minparacount) and
                  not is_array_of_const(def_from) and
                  not is_array_constructor(def_from) then
-               begin
-                 eq:=te_equal;
-               end
+                eq:=te_equal
               else
               { same definition -> exact }
                if (def_from=def_to) then
-                begin
-                  eq:=te_exact;
-                end
+                 eq:=te_exact
               else
               { for value and const parameters check if a integer is constant or
                 included in other integer -> equal and calc ordinal_distance }
@@ -2021,7 +2023,9 @@ implementation
                    { Give wrong sign a small penalty, this is need to get a diffrence
                      from word->[longword,longint] }
                    if is_signed(def_from)<>is_signed(def_to) then
-                     hp^.ordinal_distance:=hp^.ordinal_distance+1.0;
+                   {$ifopt r+}{$define ena_rq}{$q-}{$r-}{$endif}
+                     hp^.ordinal_distance:=nextafter(hp^.ordinal_distance,inf);
+                   {$ifdef ena_rq}{$r+}{$q+}{$endif}
                  end
               else
               { for value and const parameters check precision of real, give
@@ -2032,19 +2036,19 @@ implementation
                  begin
                    eq:=te_equal;
                    if is_extended(def_to) then
-                     rth:=bestreal(4)
+                     rth:=4
                    else
                      if is_double (def_to) then
-                       rth:=bestreal(2)
+                       rth:=2
                    else
-                     rth:=bestreal(1);
+                     rth:=1;
                    if is_extended(def_from) then
-                     rfh:=bestreal(4)
+                     rfh:=4
                    else
                      if is_double (def_from) then
-                       rfh:=bestreal(2)
+                       rfh:=2
                    else
-                     rfh:=bestreal(1);
+                     rfh:=1;
                    { penalty for shrinking of precision }
                    if rth<rfh then
                      rfh:=(rfh-rth)*16

+ 26 - 5
compiler/msg/errord.msg

@@ -3,7 +3,7 @@
 #   Latest updates contributed by Karl-Michael Schindler aka mischi
 #   <karl-michael.schindler at physik.uni-halle.de>
 #
-#   Based on errore.msg of SVN revision 7501
+#   Based on errore.msg of SVN revision 7907
 #
 #   This file is part of the Free Pascal Compiler
 #   Copyright (c) 1998-2000 by the Free Pascal Development team
@@ -351,11 +351,13 @@ scan_e_only_packset=02080_E_Ung
 scan_w_pic_ignored=02081_W_PIC Direktive wird ignoriert
 % Several targets like windows do not support the PIC directive and need it to be
 % ignored.
+scan_w_unsupported_switch_by_target=02082_W_Der Schalter "$1" wird vom derzeit ausgew„hlten Zielbetriebssystem nicht unterst�tzt
+% Some compiler switches like $E are not supported by all targets.
 % \end{description}
 #
 # Parser
 #
-# 03192 is the last used one
+# 03235 is the last used one
 #
 % \section{Parser messages}
 % This section lists all parser messages. The parser takes care of the
@@ -1064,7 +1066,7 @@ parser_w_implicit_uses_of_variants_unit=03211_W_Implizite Verwendung einer Varia
 parser_e_no_static_method_in_interfaces=03212_E_Class und statische Methoden k”nnen nicht in INTERFACES verwendet werden
 % The specifier \var{class} and directive \var{static} can't be used in interfaces
 % because all methods of an interfaces must be public.
-parser_e_arithmetic_operation_overflow=03213_E_Overflow in arithmetischer Operation
+parser_e_arithmetic_operation_overflow=03213_E_šberlauf in arithmetischer Operation
 % An operation on two integers values produced an overflow
 parser_e_protected_or_private_expected=03214_E_Protected oder private erwartet
 % \var{strict} can be only used together with \var{protected} or \var{private}.
@@ -1135,11 +1137,17 @@ parser_e_initialized_not_for_external=03233_E_Extern deklarierte Variablen k
 % Variables declared as external can not be initialized with a default value.
 parser_e_illegal_function_result=03234_E_Ung�ltiger Funktionsergebnistyp
 % Some types like file types can not be used as function result.
+parser_e_no_common_type=03235_E_"$1" und "$2" haben keinen gemeinsamen Typ
+% To perform an operation beween integers, the compiler converts both operands
+% to their common type, which appears to be an invalid type. To determine the
+% common type of the operands, the compiler takes the minimum of the minimal values
+% of both types, and the maximum of the maximal values of both types. The common
+% type is then minimum..maximum.
 % \end{description}
 #
 # Type Checking
 #
-# 04049 is the last used one
+# 04082 is the last used one
 #
 % \section{Type checking errors}
 % This section lists all errors that can occur when type checking is
@@ -1400,6 +1408,20 @@ type_e_cant_export_local=04077_E_Eine Subroutine, die aus einer Unit als local m
 type_e_not_automatable=04078_E_Typ "$1" ist nicht "automatable"
 % Only byte, integer, longint, smallint, currency, single, double, ansistring,
 % widestring, tdatetime, variant, olevariant, wordbool and all interfaces are automatable.
+type_h_convert_add_operands_to_prevent_overflow=04079_H_Konvertierung des Operanden "$1" vor der Addition k”nnte šberlauf Fehler verhindern
+% Adding two types can cause overflow errors. Since you are converting the result to a larger type, you
+% could prevent such errors by converting the operands to this type before doing the addition.
+type_h_convert_sub_operands_to_prevent_overflow=04080_H_Konvertierung des Operanden "$1" vor der Subtraktion k”nnte šberlauf Fehler verhindern
+% Subtracting two types can cause overflow errors. Since you are converting the result to a larger type, you
+% could prevent such errors by converting the operands to this type before doing the subtraction.
+type_h_convert_mul_operands_to_prevent_overflow=04081_H_Konvertierung des Operanden "$1" vor der Multiplikation k”nnte šberlauf Fehler verhindern
+% Multiplying two types can cause overflow errors. Since you are converting the result to a larger type, you
+% could prevent such errors by converting the operands to this type before doing the multiplication.
+type_w_pointer_to_signed=04082_W_Die Konvertierung von Pointern in einen Integertyp mit Vorzeichen kann zu falschen Ergebnissen bei Vergleichen und zu Bereichs�berschreitungen f�hren; verwenden sie statt dessen besser einen Typ ohne Vorzeichen
+% The virtual address space on 32-bit machines runs from $00000000 to $ffffffff. Many operating systems allow you to
+% allocate memory above $80000000, for example both Windows and Linux allow pointers in the range $0000000 to $bfffffff.
+% If you convert pointers to signed types, this can cause overflow and range check errors, but also $80000000 < $7fffffff.
+% This can cause random errors in code like "if p>q".
 % \end{description}
 #
 # Symtable
@@ -2535,7 +2557,6 @@ S*2Aas_assembliere mit Hilfe von GNU AS
 **2Mobjfpc_schalte einige Delphi 2 Erweiterungen ein
 **2Mdelphi_versuche zu Delphi kompatibel zu sein
 **2Mtp_versuche zu TP/BP 7.0 kompatibel zu sein
-**2Mgpc_versuche zu gpc kompatibel zu sein
 **2Mmacpas_versuche zu den MacIntosh Pascal-Dialekten kompatibel zu sein
 **1n_Standard-Konfigurationsdatei ignorieren
 **1N<x>_node tree Optimierung

+ 26 - 5
compiler/msg/errordu.msg

@@ -3,7 +3,7 @@
 #   Latest updates contributed by Karl-Michael Schindler aka mischi
 #   <karl-michael.schindler at physik.uni-halle.de>
 #
-#   Based on errore.msg of SVN revision 7501
+#   Based on errore.msg of SVN revision 7907
 #
 #   This file is part of the Free Pascal Compiler
 #   Copyright (c) 1998-2000 by the Free Pascal Development team
@@ -351,11 +351,13 @@ scan_e_only_packset=02080_E_Ungültiger Wert für das set packing
 scan_w_pic_ignored=02081_W_PIC Direktive wird ignoriert
 % Several targets like windows do not support the PIC directive and need it to be
 % ignored.
+scan_w_unsupported_switch_by_target=02082_W_Der Schalter "$1" wird vom derzeit ausgewählten Zielbetriebssystem nicht unterstützt
+% Some compiler switches like $E are not supported by all targets.
 % \end{description}
 #
 # Parser
 #
-# 03192 is the last used one
+# 03235 is the last used one
 #
 % \section{Parser messages}
 % This section lists all parser messages. The parser takes care of the
@@ -1064,7 +1066,7 @@ parser_w_implicit_uses_of_variants_unit=03211_W_Implizite Verwendung einer Varia
 parser_e_no_static_method_in_interfaces=03212_E_Class und statische Methoden können nicht in INTERFACES verwendet werden
 % The specifier \var{class} and directive \var{static} can't be used in interfaces
 % because all methods of an interfaces must be public.
-parser_e_arithmetic_operation_overflow=03213_E_Overflow in arithmetischer Operation
+parser_e_arithmetic_operation_overflow=03213_E_Überlauf in arithmetischer Operation
 % An operation on two integers values produced an overflow
 parser_e_protected_or_private_expected=03214_E_Protected oder private erwartet
 % \var{strict} can be only used together with \var{protected} or \var{private}.
@@ -1135,11 +1137,17 @@ parser_e_initialized_not_for_external=03233_E_Extern deklarierte Variablen könn
 % Variables declared as external can not be initialized with a default value.
 parser_e_illegal_function_result=03234_E_Ungültiger Funktionsergebnistyp
 % Some types like file types can not be used as function result.
+parser_e_no_common_type=03235_E_"$1" und "$2" haben keinen gemeinsamen Typ
+% To perform an operation beween integers, the compiler converts both operands
+% to their common type, which appears to be an invalid type. To determine the
+% common type of the operands, the compiler takes the minimum of the minimal values
+% of both types, and the maximum of the maximal values of both types. The common
+% type is then minimum..maximum.
 % \end{description}
 #
 # Type Checking
 #
-# 04049 is the last used one
+# 04082 is the last used one
 #
 % \section{Type checking errors}
 % This section lists all errors that can occur when type checking is
@@ -1400,6 +1408,20 @@ type_e_cant_export_local=04077_E_Eine Subroutine, die aus einer Unit als local m
 type_e_not_automatable=04078_E_Typ "$1" ist nicht "automatable"
 % Only byte, integer, longint, smallint, currency, single, double, ansistring,
 % widestring, tdatetime, variant, olevariant, wordbool and all interfaces are automatable.
+type_h_convert_add_operands_to_prevent_overflow=04079_H_Konvertierung des Operanden "$1" vor der Addition könnte Überlauf Fehler verhindern
+% Adding two types can cause overflow errors. Since you are converting the result to a larger type, you
+% could prevent such errors by converting the operands to this type before doing the addition.
+type_h_convert_sub_operands_to_prevent_overflow=04080_H_Konvertierung des Operanden "$1" vor der Subtraktion könnte Überlauf Fehler verhindern
+% Subtracting two types can cause overflow errors. Since you are converting the result to a larger type, you
+% could prevent such errors by converting the operands to this type before doing the subtraction.
+type_h_convert_mul_operands_to_prevent_overflow=04081_H_Konvertierung des Operanden "$1" vor der Multiplikation könnte Überlauf Fehler verhindern
+% Multiplying two types can cause overflow errors. Since you are converting the result to a larger type, you
+% could prevent such errors by converting the operands to this type before doing the multiplication.
+type_w_pointer_to_signed=04082_W_Die Konvertierung von Pointern in einen Integertyp mit Vorzeichen kann zu falschen Ergebnissen bei Vergleichen und zu Bereichsüberschreitungen führen; verwenden sie statt dessen besser einen Typ ohne Vorzeichen
+% The virtual address space on 32-bit machines runs from $00000000 to $ffffffff. Many operating systems allow you to
+% allocate memory above $80000000, for example both Windows and Linux allow pointers in the range $0000000 to $bfffffff.
+% If you convert pointers to signed types, this can cause overflow and range check errors, but also $80000000 < $7fffffff.
+% This can cause random errors in code like "if p>q".
 % \end{description}
 #
 # Symtable
@@ -2535,7 +2557,6 @@ S*2Aas_assembliere mit Hilfe von GNU AS
 **2Mobjfpc_schalte einige Delphi 2 Erweiterungen ein
 **2Mdelphi_versuche zu Delphi kompatibel zu sein
 **2Mtp_versuche zu TP/BP 7.0 kompatibel zu sein
-**2Mgpc_versuche zu gpc kompatibel zu sein
 **2Mmacpas_versuche zu den MacIntosh Pascal-Dialekten kompatibel zu sein
 **1n_Standard-Konfigurationsdatei ignorieren
 **1N<x>_node tree Optimierung

+ 23 - 3
compiler/msg/errore.msg

@@ -354,7 +354,7 @@ scan_w_unsupported_switch_by_target=02082_W_The switch "$1" is not supported by
 #
 # Parser
 #
-# 03192 is the last used one
+# 03235 is the last used one
 #
 % \section{Parser messages}
 % This section lists all parser messages. The parser takes care of the
@@ -850,7 +850,7 @@ parser_e_ill_property_storage_sym=03155_E_This symbol isn't allowed as storage s
 % You can't use this type of symbol as storage specifier in property
 % declaration. You can use only methods with the result type boolean,
 % boolean class fields or boolean constants
-parser_e_only_publishable_classes_can__be_published=03156_E_Only class which are compiled in $M+ mode can be published
+parser_e_only_publishable_classes_can_be_published=03156_E_Only classes which are compiled in $M+ mode can be published
 % In the published section of a class can be only class as fields used which
 % are compiled in \var{\{\$M+\}} or which are derived from such a class. Normally
 % such a class should be derived from TPersitent
@@ -1134,13 +1134,19 @@ parser_e_initialized_not_for_external=03233_E_Cannot initialize variables declar
 % Variables declared as external can not be initialized with a default value.
 parser_e_illegal_function_result=03234_E_Illegal function result type
 % Some types like file types can not be used as function result.
+parser_e_no_common_type=03235_E_No common type possible between "$1" and "$2"
+% To perform an operation beween integers, the compiler converts both operands
+% to their common type, which appears to be an invalid type. To determine the
+% common type of the operands, the compiler takes the minimum of the minimal values
+% of both types, and the maximum of the maximal values of both types. The common
+% type is then minimum..maximum.
 parser_e_no_generics_as_types=03236_E_Generics without specialization can not be used as a type for a variable
 % Generics must be always specialized before being used as variable type
 % \end{description}
 #
 # Type Checking
 #
-# 04049 is the last used one
+# 04082 is the last used one
 #
 % \section{Type checking errors}
 % This section lists all errors that can occur when type checking is
@@ -1400,6 +1406,20 @@ type_e_cant_export_local=04077_E_Can't export subroutine marked as local from a
 type_e_not_automatable=04078_E_Type is not automatable: "$1"
 % Only byte, integer, longint, smallint, currency, single, double, ansistring,
 % widestring, tdatetime, variant, olevariant, wordbool and all interfaces are automatable.
+type_h_convert_add_operands_to_prevent_overflow=04079_H_Converting the operands to "$1" before doing the add could prevent overflow errors.
+% Adding two types can cause overflow errors. Since you are converting the result to a larger type, you
+% could prevent such errors by converting the operands to this type before doing the addition.
+type_h_convert_sub_operands_to_prevent_overflow=04080_H_Converting the operands to "$1" before doing the subtract could prevent overflow errors.
+% Subtracting two types can cause overflow errors. Since you are converting the result to a larger type, you
+% could prevent such errors by converting the operands to this type before doing the subtraction.
+type_h_convert_mul_operands_to_prevent_overflow=04081_H_Converting the operands to "$1" before doing the multiply could prevent overflow errors.
+% Multiplying two types can cause overflow errors. Since you are converting the result to a larger type, you
+% could prevent such errors by converting the operands to this type before doing the multiplication.
+type_w_pointer_to_signed=04082_W_Converting pointers to signed integers may result in wrong comparison results and range errors, use an unsigned type instead.
+% The virtual address space on 32-bit machines runs from $00000000 to $ffffffff. Many operating systems allow you to
+% allocate memory above $80000000, for example both Windows and Linux allow pointers in the range $0000000 to $bfffffff.
+% If you convert pointers to signed types, this can cause overflow and range check errors, but also $80000000 < $7fffffff.
+% This can cause random errors in code like "if p>q".
 % \end{description}
 #
 # Symtable

+ 8 - 3
compiler/msgidx.inc

@@ -243,7 +243,7 @@ const
   parser_e_exit_with_argument_not__possible=03153;
   parser_e_stored_property_must_be_boolean=03154;
   parser_e_ill_property_storage_sym=03155;
-  parser_e_only_publishable_classes_can__be_published=03156;
+  parser_e_only_publishable_classes_can_be_published=03156;
   parser_e_proc_directive_expected=03157;
   parser_e_invalid_property_index_value=03158;
   parser_e_procname_to_short_for_export=03159;
@@ -320,6 +320,7 @@ const
   parser_f_no_anonymous_specializations=03232;
   parser_e_initialized_not_for_external=03233;
   parser_e_illegal_function_result=03234;
+  parser_e_no_common_type=03235;
   parser_e_no_generics_as_types=03236;
   type_e_mismatch=04000;
   type_e_incompatible_types=04001;
@@ -390,6 +391,10 @@ const
   type_e_cant_take_address_of_local_subroutine=04076;
   type_e_cant_export_local=04077;
   type_e_not_automatable=04078;
+  type_h_convert_add_operands_to_prevent_overflow=04079;
+  type_h_convert_sub_operands_to_prevent_overflow=04080;
+  type_h_convert_mul_operands_to_prevent_overflow=04081;
+  type_w_pointer_to_signed=04082;
   sym_e_id_not_found=05000;
   sym_f_internal_error_in_symtablestack=05001;
   sym_e_duplicate_id=05002;
@@ -724,9 +729,9 @@ const
   option_info=11024;
   option_help_pages=11025;
 
-  MsgTxtSize = 43240;
+  MsgTxtSize = 43716;
 
   MsgIdxMax : array[1..20] of longint=(
-    24,83,237,79,63,49,107,22,135,60,
+    24,83,237,83,63,49,107,22,135,60,
     42,1,1,1,1,1,1,1,1,1
   );

+ 176 - 166
compiler/msgtxt.inc

@@ -1,7 +1,7 @@
 {$ifdef Delphi}
-const msgtxt : array[0..000180] of string[240]=(
+const msgtxt : array[0..000182] of string[240]=(
 {$else Delphi}
-const msgtxt : array[0..000180,1..240] of char=(
+const msgtxt : array[0..000182,1..240] of char=(
 {$endif Delphi}
   '01000_T_Compiler: $1'#000+
   '01001_D_Compiler OS: $1'#000+
@@ -271,430 +271,440 @@ const msgtxt : array[0..000180,1..240] of char=(
   '03153_E_Exit with argument can'#039't be used here'#000+
   '03154_E_The type of the storage symbol must be boolean'#000+
   '03155_E_This symbol isn'#039't allowed as storage symbol'#000+
-  '03156_E_Only class which are compiled in $M+ mode can be published'#000+
-  '03157','_E_Procedure directive expected'#000+
+  '03156_E_Only classes which are compiled in $M+ mode can be published'#000+
+  '031','57_E_Procedure directive expected'#000+
   '03158_E_The value for a property index must be of an ordinal type'#000+
   '03159_E_Procedure name too short to be exported'#000+
   '03160_E_No DEFFILE entry can be generated for unit global vars'#000+
-  '03161_E_Compile without -WD opt','ion'#000+
+  '03161_E_Compile without -WD o','ption'#000+
   '03162_F_You need ObjFpc (-S2) or Delphi (-Sd) mode to compile this mod'+
   'ule'#000+
   '03163_E_Can'#039't export with index under $1'#000+
   '03164_E_Exporting of variables is not supported under $1'#000+
   '03165_E_Improper GUID syntax'#000+
-  '03168_W_Procedure named "$1" not fo','und that is suitable for implemen'+
+  '03168_W_Procedure named "$1" not ','found that is suitable for implemen'+
   'ting the $2.$3'#000+
   '03169_E_interface identifier expected'#000+
   '03170_E_Type "$1" can'#039't be used as array index type'#000+
   '03171_E_Con- and destructors aren'#039't allowed in interfaces'#000+
-  '03172_E_Access specifiers can'#039't be used in I','NTERFACES'#000+
+  '03172_E_Access specifiers can'#039't be used in',' INTERFACES'#000+
   '03173_E_An interface can'#039't contain fields'#000+
   '03174_E_Can'#039't declare local procedure as EXTERNAL'#000+
   '03175_W_Some fields coming before "$1" weren'#039't initialized'#000+
   '03176_E_Some fields coming before "$1" weren'#039't initialized'#000+
-  '03177_W_Some fields ','coming after "$1" weren'#039't initialized'#000+
+  '03177_W_Some field','s coming after "$1" weren'#039't initialized'#000+
   '03178_E_VarArgs directive (or '#039'...'#039' in MacPas) without CDecl/C'+
   'PPDecl/MWPascal and External'#000+
   '03179_E_Self must be a normal (call-by-value) parameter'#000+
-  '03180_E_Interface "$1" has no interface identification'#000,
+  '03180_E_Interface "$1" has no interface identificatio','n'#000+
   '03181_E_Unknown class field or method identifier "$1"'#000+
   '03182_W_Overriding calling convention "$1" with "$2"'#000+
   '03183_E_Typed constants of the type "procedure of object" can only be '+
   'initialized with NIL'#000+
-  '03184_E_Default value can only be assigned',' to one parameter'#000+
+  '03184_E_Default value can only be assign','ed to one parameter'#000+
   '03185_E_Default parameter required for "$1"'#000+
   '03186_W_Use of unsupported feature!'#000+
   '03187_H_C arrays are passed by reference'#000+
   '03188_E_C array of const must be the last argument'#000+
   '03189_H_Type "$1" redefinition'#000+
-  '03190_W_cdecl'#039'ared ','functions have no high parameter'#000+
+  '03190_W_cdecl'#039'are','d functions have no high parameter'#000+
   '03191_W_cdecl'#039'ared functions do not support open strings'#000+
   '03192_E_Cannot initialize variables declared as threadvar'#000+
   '03193_E_Message directive is only allowed in Classes'#000+
-  '03194_E_Procedure or Function expected'#000,
+  '03194_E_Procedure or Function expecte','d'#000+
   '03195_W_Calling convention directive ignored: "$1"'#000+
   '03196_E_REINTRODUCE can'#039't be used in objects'#000+
   '03197_E_Each argument must have its own location'#000+
   '03198_E_Each argument must have an explicit location'#000+
   '03199_E_Unknown argument location'#000+
-  '03200_E_','32 Bit-Integer or pointer variable expected'#000+
+  '03200_','E_32 Bit-Integer or pointer variable expected'#000+
   '03201_E_Goto statements aren'#039't allowed between different procedure'+
   's'#000+
   '03202_F_Procedure too complex, it requires too many registers'#000+
   '03203_E_Illegal expression'#000+
   '03204_E_Invalid integer expression'#000+
-  '0320','5_E_Illegal qualifier'#000+
+  '03','205_E_Illegal qualifier'#000+
   '03206_E_High range limit < low range limit'#000+
   '03207_E_Exit'#039's parameter must be the name of the procedure it is u'+
   'sed in'#000+
   '03208_E_Illegal assignment to for-loop variable "$1"'#000+
-  '03209_E_Can'#039't declare local variable as EXTERNAL'#000,
+  '03209_E_Can'#039't declare local variable as EXTERNA','L'#000+
   '03210_E_Procedure is already declared EXTERNAL'#000+
   '03211_W_Implicit uses of Variants unit'#000+
   '03212_E_Class and static methods can'#039't be used in INTERFACES'#000+
   '03213_E_Overflow in arithmetic operation'#000+
   '03214_E_Protected or private expected'#000+
-  '03215_E_SLICE ','can'#039't be used outside of parameter list'#000+
+  '03215_E_SLIC','E can'#039't be used outside of parameter list'#000+
   '03216_E_A DISPINTERFACE can'#039't have a parent class'#000+
   '03217_E_A DISPINTERFACE needs a guid'#000+
   '03218_W_Overridden methods must have a related return type. This code '+
-  'may crash, it depends on a Delphi parser bu','g ("$2" is overridden by '+
+  'may crash, it depends on a Delphi parser ','bug ("$2" is overridden by '+
   '"$1" which has another return type)'#000+
   '03219_E_Dispatch IDs must be ordinal constants'#000+
   '03220_E_The range of the array is too large'#000+
   '03221_E_The address cannot be taken of bit packed array elements and r'+
   'ecord fields'#000+
-  '03222','_E_Dynamic arrays cannot be packed'#000+
+  '032','22_E_Dynamic arrays cannot be packed'#000+
   '03223_E_Bit packed array elements and record fields cannot be used as '+
   'loop variables'#000+
   '03224_E_VAR and TYPE are allowed only in generics'#000+
   '03225_E_This type can'#039't be a generic'#000+
-  '03226_W_Don'#039't load LINEINFO unit ','manually, Use the -gl compiler '+
+  '03226_W_Don'#039't load LINEINFO uni','t manually, Use the -gl compiler '+
   'switch instead'#000+
   '03227_E_No function result type specified for function "$1"'#000+
   '03228_E_Specialization is only supported for generic types'#000+
   '03229_E_Generics can'#039't be used as parameters when spezializing gen'+
   'erics'#000+
-  '032','30_E_Constants of objects containing a VMT aren'#039't allowed'#000+
+  '0','3230_E_Constants of objects containing a VMT aren'#039't allowed'#000+
   '03231_E_Taking the address of labels defined outside the current scope'+
   ' isn'#039't allowed'#000+
   '03232_F_Anonymous generic specializations are not allowed'#000+
-  '03233_E_Cannot initialize variables dec','lared as external'#000+
+  '03233_E_Cannot initialize variables d','eclared as external'#000+
   '03234_E_Illegal function result type'#000+
+  '03235_E_No common type possible between "$1" and "$2"'#000+
   '03236_E_Generics without specialization can not be used as a type for '+
   'a variable'#000+
   '04000_E_Type mismatch'#000+
-  '04001_E_Incompatible types: got "$1" expected "$2"'#000+
-  '04002_E_Type mismatch between "','$1" and "$2"'#000+
+  '04001_E_Incompatible types',': got "$1" expected "$2"'#000+
+  '04002_E_Type mismatch between "$1" and "$2"'#000+
   '04003_E_Type identifier expected'#000+
   '04004_E_Variable identifier expected'#000+
   '04005_E_Integer expression expected, but got "$1"'#000+
   '04006_E_Boolean expression expected, but got "$1"'#000+
-  '04007_E_Ordinal expression expected'#000+
-  '04008_E_pointer type ','expected, but got "$1"'#000+
+  '0','4007_E_Ordinal expression expected'#000+
+  '04008_E_pointer type expected, but got "$1"'#000+
   '04009_E_class type expected, but got "$1"'#000+
   '04011_E_Can'#039't evaluate constant expression'#000+
   '04012_E_Set elements are not compatible'#000+
-  '04013_E_Operation not implemented for sets'#000+
-  '04014_W_Automatic type conversion from floating t','ype to COMP which i'+
-  's an integer type'#000+
+  '04013_E_Operation not implemented fo','r sets'#000+
+  '04014_W_Automatic type conversion from floating type to COMP which is '+
+  'an integer type'#000+
   '04015_H_use DIV instead to get an integer result'#000+
   '04016_E_string types doesn'#039't match, because of $V+ mode'#000+
-  '04017_E_succ or pred on enums with assignments not possible'#000+
-  '04018_E_Can'#039't read or write variables ','of this type'#000+
+  '04017_E_succ or pred on enums with assignm','ents not possible'#000+
+  '04018_E_Can'#039't read or write variables of this type'#000+
   '04019_E_Can'#039't use readln or writeln on typed file'#000+
   '04020_E_Can'#039't use read or write on untyped file.'#000+
   '04021_E_Type conflict between set elements'#000+
-  '04022_W_lo/hi(dword/qword) returns the upper/lower word/dword'#000+
-  '04023_E_Integer or real',' expression expected'#000+
+  '04022_W_lo/hi(dword/qword) re','turns the upper/lower word/dword'#000+
+  '04023_E_Integer or real expression expected'#000+
   '04024_E_Wrong type "$1" in array constructor'#000+
   '04025_E_Incompatible type for arg no. $1: Got "$2", expected "$3"'#000+
-  '04026_E_Method (variable) and Procedure (variable) are not compatible'#000+
-  '04027_E_Illegal constant passed to int','ernal math function'#000+
+  '04026_E_Method (variable) and Procedure (variable) a','re not compatibl'+
+  'e'#000+
+  '04027_E_Illegal constant passed to internal math function'#000+
   '04028_E_Can'#039't get the address of constants'#000+
   '04029_E_Argument can'#039't be assigned to'#000+
   '04030_E_Can'#039't assign local procedure/function to procedure variabl'+
   'e'#000+
-  '04031_E_Can'#039't assign values to an address'#000+
-  '04032_E_Can'#039't assign values t','o const variable'#000+
+  '04031_E_Can'#039't a','ssign values to an address'#000+
+  '04032_E_Can'#039't assign values to const variable'#000+
   '04033_E_Array type required'#000+
   '04034_E_interface type expected, but got "$1"'#000+
   '04035_W_Mixing signed expressions and longwords gives a 64bit result'#000+
-  '04036_W_Mixing signed expressions and cardinals here may cause a range'+
-  ' check err','or'#000+
+  '04036_W_Mixing signed ex','pressions and cardinals here may cause a ran'+
+  'ge check error'#000+
   '04037_E_Typecast has different size ($1 -> $2) in assignment'#000+
   '04038_E_enums with assignments can'#039't be used as array index'#000+
-  '04039_E_Class or Object types "$1" and "$2" are not related'#000+
+  '04039_E_Class or Object types "$1" and "$2" are not related'#000,
   '04040_W_Class types "$1" and "$2" are not related'#000+
-  '04041_','E_Class or interface type expected, but got "$1"'#000+
+  '04041_E_Class or interface type expected, but got "$1"'#000+
   '04042_E_Type "$1" is not completely defined'#000+
   '04043_W_String literal has more characters than short string length'#000+
-  '04044_W_Comparison is always false due to range of values'#000+
-  '04045_W_Comparison is',' always true due to range of values'#000+
+  '04044_W_Comparison is a','lways false due to range of values'#000+
+  '04045_W_Comparison is always true due to range of values'#000+
   '04046_W_Constructing a class "$1" with abstract methods'#000+
   '04047_H_The left operand of the IN operator should be byte sized'#000+
-  '04048_W_Type size mismatch, possible loss of data / range check error'#000+
-  '04049_H_Type ','size mismatch, possible loss of data / range check erro'+
+  '04048_W_Type size mismatch,',' possible loss of data / range check erro'+
   'r'#000+
+  '04049_H_Type size mismatch, possible loss of data / range check error'#000+
   '04050_E_The address of an abstract method can'#039't be taken'#000+
-  '04051_E_Assignments to formal parameters and open arrays are not possi'+
+  '04051_E_Assignments to formal parameters and open arrays are not possi',
   'ble'#000+
   '04052_E_Constant Expression expected'#000+
-  '04053_E_Operati','on "$1" not supported for types "$2" and "$3"'#000+
+  '04053_E_Operation "$1" not supported for types "$2" and "$3"'#000+
   '04054_E_Illegal type conversion: "$1" to "$2"'#000+
   '04055_H_Conversion between ordinals and pointers is not portable'#000+
-  '04056_W_Conversion between ordinals and pointers is not portable'#000+
-  '04057_E_Can'#039't dete','rmine which overloaded function to call'#000+
+  '04056_W_Conversion between ','ordinals and pointers is not portable'#000+
+  '04057_E_Can'#039't determine which overloaded function to call'#000+
   '04058_E_Illegal counter variable'#000+
   '04059_W_Converting constant real value to double for C variable argume'+
-  'nt, add explicit typecast to prevent this.'#000+
-  '04060_E_Class or COM interface type expected, but got ','"$1"'#000+
+  'nt, add explicit typecast to prevent this','.'#000+
+  '04060_E_Class or COM interface type expected, but got "$1"'#000+
   '04061_E_Constant packed arrays are not yet supported'#000+
   '04062_E_Incompatible type for arg no. $1: Got "$2" expected "(Bit)Pack'+
   'ed Array"'#000+
-  '04063_E_Incompatible type for arg no. $1: Got "$2" expected "(not pack'+
-  'ed) Array"'#000+
-  '04064_E_Elements of p','acked arrays cannot be of a type which need to '+
-  'be initialised'#000+
+  '04063_E_Incompatible type for arg no. $1: Got ','"$2" expected "(not pa'+
+  'cked) Array"'#000+
+  '04064_E_Elements of packed arrays cannot be of a type which need to be'+
+  ' initialised'#000+
   '04065_E_Constant packed records and objects are not yet supported'#000+
-  '04066_W_Arithmetic "$1" on untyped pointer is unportable to {$T+}, sug'+
-  'gest typecast'#000+
-  '04076_E_Can'#039't take address o','f a subroutine marked as local'#000+
+  '04066_W_Arithmetic "$1" on untyped pointer is unportable',' to {$T+}, s'+
+  'uggest typecast'#000+
+  '04076_E_Can'#039't take address of a subroutine marked as local'#000+
   '04077_E_Can'#039't export subroutine marked as local from a unit'#000+
   '04078_E_Type is not automatable: "$1"'#000+
+  '04079_H_Converting the operands to "$1" before doing th','e add could p'+
+  'revent overflow errors.'#000+
+  '04080_H_Converting the operands to "$1" before doing the subtract coul'+
+  'd prevent overflow errors.'#000+
+  '04081_H_Converting the operands to "$1" before doing the multiply coul'+
+  'd prevent overflow errors.'#000+
+  '04082_W_C','onverting pointers to signed integers may result in wrong c'+
+  'omparison results and range errors, use an unsigned type instead.'#000+
   '05000_E_Identifier not found "$1"'#000+
   '05001_F_Internal Error in SymTableStack()'#000+
   '05002_E_Duplicate identifier "$1"'#000+
-  '0','5003_H_Identifier already defined in $1 at line $2'#000+
+  '05003','_H_Identifier already defined in $1 at line $2'#000+
   '05004_E_Unknown identifier "$1"'#000+
   '05005_E_Forward declaration not solved "$1"'#000+
   '05007_E_Error in type definition'#000+
   '05009_E_Forward type not resolved "$1"'#000+
-  '05010_E_Only static variables can be used',' in static methods or outsi'+
+  '05010_E_Only static variables can be used in ','static methods or outsi'+
   'de methods'#000+
   '05012_F_record or class type expected'#000+
   '05013_E_Instances of classes or objects with an abstract method are no'+
   't allowed'#000+
   '05014_W_Label not defined "$1"'#000+
   '05015_E_Label used but not defined "$1"'#000+
-  '05016_E_Illeg','al label declaration'#000+
+  '05016_E_Illegal l','abel declaration'#000+
   '05017_E_GOTO and LABEL are not supported (use switch -Sg)'#000+
   '05018_E_Label not found'#000+
   '05019_E_identifier isn'#039't a label'#000+
   '05020_E_label already defined'#000+
   '05021_E_illegal type declaration of set elements'#000+
-  '05022_E_Forward class def','inition not resolved "$1"'#000+
+  '05022_E_Forward class definit','ion not resolved "$1"'#000+
   '05023_H_Unit "$1" not used in $2'#000+
   '05024_H_Parameter "$1" not used'#000+
   '05025_N_Local variable "$1" not used'#000+
   '05026_H_Value parameter "$1" is assigned but never used'#000+
   '05027_N_Local variable "$1" is assigned but never used'#000+
-  '0','5028_H_Local $1 "$2" is not used'#000+
+  '05028','_H_Local $1 "$2" is not used'#000+
   '05029_N_Private field "$1.$2" is never used'#000+
   '05030_N_Private field "$1.$2" is assigned but never used'#000+
   '05031_N_Private method "$1.$2" never used'#000+
   '05032_E_Set type expected'#000+
-  '05033_W_Function result does not seem ','to be set'#000+
+  '05033_W_Function result does not seem to b','e set'#000+
   '05034_W_Type "$1" is not aligned correctly in current record for C'#000+
   '05035_E_Unknown record field identifier "$1"'#000+
   '05036_W_Local variable "$1" does not seem to be initialized'#000+
   '05037_W_Variable "$1" does not seem to be initialized'#000+
-  '0503','8_E_identifier idents no member "$1"'#000+
+  '05038_E_','identifier idents no member "$1"'#000+
   '05039_H_Found declaration: $1'#000+
   '05040_E_Data element too large'#000+
   '05042_E_No matching implementation for interface method "$1" found'#000+
   '05043_W_Symbol "$1" is deprecated'#000+
   '05044_W_Symbol "$1" is not portable'#000+
-  '05055','_W_Symbol "$1" is not implemented'#000+
+  '05055_W_S','ymbol "$1" is not implemented'#000+
   '05056_E_Can'#039't create unique type from this type'#000+
   '05057_H_Local variable "$1" does not seem to be initialized'#000+
   '05058_H_Variable "$1" does not seem to be initialized'#000+
-  '05059_W_Function result variable does not se','em to initialized'#000+
+  '05059_W_Function result variable does not seem t','o initialized'#000+
   '05060_H_Function result variable does not seem to be initialized'#000+
   '05061_W_Variable "$1" read but nowhere assigned'#000+
   '05062_H_Found abstract method: $1'#000+
   '06009_E_Parameter list size exceeds 65535 bytes'#000+
-  '06012_E_File types must be ','var parameters'#000+
+  '06012_E_File types must be var ','parameters'#000+
   '06013_E_The use of a far pointer isn'#039't allowed there'#000+
   '06015_E_EXPORT declared functions can'#039't be called'#000+
   '06016_W_Possible illegal call of constructor or destructor'#000+
   '06017_N_Inefficient code'#000+
   '06018_W_unreachable code'#000+
-  '06020_E_Abstr','act methods can'#039't be called directly'#000+
+  '06020_E_Abstract ','methods can'#039't be called directly'#000+
   '06027_DL_Register $1 weight $2 $3'#000+
   '06029_DL_Stack frame is omitted'#000+
   '06031_E_Object or class methods can'#039't be inline.'#000+
   '06032_E_Procvar calls cannot be inline.'#000+
   '06033_E_No code for inline procedure stored'#000+
-  '0603','5_E_Element zero of an ansi/wide- or longstring can'#039't be acc'+
+  '06035_E_','Element zero of an ansi/wide- or longstring can'#039't be acc'+
   'essed, use (set)length instead'#000+
   '06037_E_Constructors or destructors can not be called inside a '#039'wi'+
   'th'#039' clause'#000+
   '06038_E_Cannot call message handler methods directly'#000+
-  '06039_E_Jump in or ','outside of an exception block'#000+
+  '06039_E_Jump in or outs','ide of an exception block'#000+
   '06040_E_Control flow statements aren'#039't allowed in a finally block'#000+
   '06041_W_Parameters size exceeds limit for certain cpu'#039's'#000+
   '06042_W_Local variable size exceed limit for certain cpu'#039's'#000+
-  '06043_E_Local variables size ','exceeds supported limit'#000+
+  '06043_E_Local variables size exce','eds supported limit'#000+
   '06044_E_BREAK not allowed'#000+
   '06045_E_CONTINUE not allowed'#000+
   '06046_F_Unknown compilerproc "$1". Check if you use the correct run ti'+
   'me library.'#000+
   '06047_F_Cannot find system type "$1". Check if you use the correct run'+
-  ' time lib','rary.'#000+
+  ' time library','.'#000+
   '06048_H_Inherited call to abstract method ignored'#000+
   '07000_DL_Starting $1 styled assembler parsing'#000+
   '07001_DL_Finished $1 styled assembler parsing'#000+
   '07002_E_Non-label pattern contains @'#000+
   '07004_E_Error building record offset'#000+
-  '07005_E_OFFSET use','d without identifier'#000+
+  '07005_E_OFFSET used wi','thout identifier'#000+
   '07006_E_TYPE used without identifier'#000+
   '07007_E_Cannot use local variable or parameters here'#000+
   '07008_E_need to use OFFSET here'#000+
   '07009_E_need to use $ here'#000+
   '07010_E_Cannot use multiple relocatable symbols'#000+
-  '07011_E_Relocatable sy','mbol can only be added'#000+
+  '07011_E_Relocatable symbol',' can only be added'#000+
   '07012_E_Invalid constant expression'#000+
   '07013_E_Relocatable symbol is not allowed'#000+
   '07014_E_Invalid reference syntax'#000+
   '07015_E_You can not reach $1 from that code'#000+
   '07016_E_Local symbols/labels aren'#039't allowed as references'#000+
-  '0701','7_E_Invalid base and index register usage'#000+
+  '07017_E_','Invalid base and index register usage'#000+
   '07018_W_Possible error in object field handling'#000+
   '07019_E_Wrong scale factor specified'#000+
   '07020_E_Multiple index register usage'#000+
   '07021_E_Invalid operand type'#000+
   '07022_E_Invalid string as opcode operand: $1'#000+
-  '0','7023_W_@CODE and @DATA not supported'#000+
+  '07023','_W_@CODE and @DATA not supported'#000+
   '07024_E_Null label references are not allowed'#000+
   '07025_E_Divide by zero in asm evaluator'#000+
   '07026_E_Illegal expression'#000+
   '07027_E_escape sequence ignored: $1'#000+
   '07028_E_Invalid symbol reference'#000+
-  '07029_W_Fwait can cau','se emulation problems with emu387'#000+
+  '07029_W_Fwait can cause e','mulation problems with emu387'#000+
   '07030_W_$1 without operand translated into $1P'#000+
   '07031_W_ENTER instruction is not supported by Linux kernel'#000+
   '07032_W_Calling an overload function in assembler'#000+
   '07033_E_Unsupported symbol type for operand'#000+
-  '07034_','E_Constant value out of bounds'#000+
+  '07034_E_Co','nstant value out of bounds'#000+
   '07035_E_Error converting decimal $1'#000+
   '07036_E_Error converting octal $1'#000+
   '07037_E_Error converting binary $1'#000+
   '07038_E_Error converting hexadecimal $1'#000+
   '07039_H_$1 translated to $2'#000+
-  '07040_W_$1 is associated to an overl','oaded function'#000+
+  '07040_W_$1 is associated to an overloade','d function'#000+
   '07041_E_Cannot use SELF outside a method'#000+
   '07042_E_Cannot use OLDEBP outside a nested procedure'#000+
   '07043_W_Procedures can'#039't return any value in asm code'#000+
   '07044_E_SEG not supported'#000+
-  '07045_E_Size suffix and destination or source size ','do not match'#000+
+  '07045_E_Size suffix and destination or source size do n','ot match'#000+
   '07046_W_Size suffix and destination or source size do not match'#000+
   '07047_E_Assembler syntax error'#000+
   '07048_E_Invalid combination of opcode and operands'#000+
   '07049_E_Assembler syntax error in operand'#000+
-  '07050_E_Assembler syntax error in const','ant'#000+
+  '07050_E_Assembler syntax error in constant'#000,
   '07051_E_Invalid String expression'#000+
   '07052_W_constant with symbol $1 for address which is not on a pointer'#000+
   '07053_E_Unrecognized opcode $1'#000+
   '07054_E_Invalid or missing opcode'#000+
   '07055_E_Invalid combination of prefix and opcode: $1'#000+
-  '07056_E_Invali','d combination of override and opcode: $1'#000+
+  '07056_E_Invalid co','mbination of override and opcode: $1'#000+
   '07057_E_Too many operands on line'#000+
   '07058_W_NEAR ignored'#000+
   '07059_W_FAR ignored'#000+
   '07060_E_Duplicate local symbol $1'#000+
   '07061_E_Undefined local symbol $1'#000+
   '07062_E_Unknown label identifier $1'#000+
-  '07063_E_Invalid regi','ster name'#000+
+  '07063_E_Invalid register',' name'#000+
   '07064_E_Invalid floating point register name'#000+
   '07066_W_Modulo not supported'#000+
   '07067_E_Invalid floating point constant $1'#000+
   '07068_E_Invalid floating point expression'#000+
   '07069_E_Wrong symbol type'#000+
-  '07070_E_Cannot index a local var or parameter',' with a register'#000+
+  '07070_E_Cannot index a local var or parameter wit','h a register'#000+
   '07071_E_Invalid segment override expression'#000+
   '07072_W_Identifier $1 supposed external'#000+
   '07073_E_Strings not allowed as constants'#000+
   '07074_No type of variable specified'#000+
   '07075_E_assembler code not returned to text section'#000+
-  '07076_E_No','t a directive or local symbol $1'#000+
+  '07076_E_Not a ','directive or local symbol $1'#000+
   '07077_E_Using a defined name as a local label'#000+
   '07078_E_Dollar token is used without an identifier'#000+
   '07079_W_32bit constant created for address'#000+
   '07080_N_.align is target specific, use .balign or .p2align'#000+
-  '07081_E_','Can'#039't access fields directly for parameters'#000+
+  '07081_E_Can'#039,'t access fields directly for parameters'#000+
   '07082_E_Can'#039't access fields of objects/classes directly'#000+
   '07083_E_No size specified and unable to determine the size of the oper'+
   'ands'#000+
   '07084_E_Cannot use RESULT in this function'#000+
-  '07086_W_"$1" without o','perand translated into "$1 %st,%st(1)"'#000+
+  '07086_W_"$1" without opera','nd translated into "$1 %st,%st(1)"'#000+
   '07087_W_"$1 %st(n)" translated into "$1 %st,%st(n)"'#000+
   '07088_W_"$1 %st(n)" translated into "$1 %st(n),%st"'#000+
   '07089_E_Char < not allowed here'#000+
   '07090_E_Char > not allowed here'#000+
   '07093_W_ALIGN not supported'#000+
-  '07094','_E_Inc and Dec cannot be together'#000+
+  '07094_E_I','nc and Dec cannot be together'#000+
   '07095_E_Invalid reglist for movem'#000+
   '07096_E_Reglist invalid for opcode'#000+
   '07097_E_Higher cpu mode required ($1)'#000+
   '07098_W_No size specified and unable to determine the size of the oper'+
-  'ands, using DWORD as default'#000,
-  '07099_E_Syntax error while trying to parse a shifter operand'#000+
+  'ands, using DWORD as default'#000+
+  '0709','9_E_Syntax error while trying to parse a shifter operand'#000+
   '07100_E_Address of packed component is not at a byte boundary'#000+
   '07101_W_No size specified and unable to determine the size of the oper'+
   'ands, using BYTE as default'#000+
-  '07102_W_Use of +off','set(%ebp) for parameters invalid here'#000+
+  '07102_W_Use of +offset(','%ebp) for parameters invalid here'#000+
   '07103_W_Use of +offset(%ebp) is not compatible with regcall convention'+
   #000+
   '07104_W_Use of -offset(%ebp) is not recommended for local variable acc'+
   'ess'#000+
-  '07105_W_Use of -offset(%esp), access may cause a crash or',' value may '+
+  '07105_W_Use of -offset(%esp), access may cause a crash or val','ue may '+
   'be lost'#000+
   '07106_E_VMTOffset must be used in combination with a virtual method, a'+
   'nd "$1" is not virtual'#000+
   '08000_F_Too many assembler files'#000+
   '08001_F_Selected assembler output not supported'#000+
   '08002_F_Comp not supported'#000+
-  '08003_F_Direct not s','upport for binary writers'#000+
+  '08003_F_Direct not suppo','rt for binary writers'#000+
   '08004_E_Allocating of data is only allowed in bss section'#000+
   '08005_F_No binary writer selected'#000+
   '08006_E_Asm: Opcode $1 not in table'#000+
   '08007_E_Asm: $1 invalid combination of opcode and operands'#000+
-  '08008_E_Asm: 16 Bit referen','ces not supported'#000+
+  '08008_E_Asm: 16 Bit references ','not supported'#000+
   '08009_E_Asm: Invalid effective address'#000+
   '08010_E_Asm: Immediate or reference expected'#000+
   '08011_E_Asm: $1 value exceeds bounds $2'#000+
   '08012_E_Asm: Short jump is out of range $1'#000+
   '08013_E_Asm: Undefined label $1'#000+
-  '08014_E_Asm: Comp type ','not supported for this target'#000+
+  '08014_E_Asm: Comp type not ','supported for this target'#000+
   '08015_E_Asm: Extended type not supported for this target'#000+
   '08016_E_Asm: Duplicate label $1'#000+
   '08017_E_Asm: Redefined label $1'#000+
   '08018_E_Asm: First defined here'#000+
   '08019_E_Asm: Invalid register $1'#000+
-  '08020_E_Asm: 16 or 32 Bi','t references not supported'#000+
+  '08020_E_Asm: 16 or 32 Bit re','ferences not supported'#000+
   '08021_E_Asm: 64 Bit operands not supported'#000+
   '09000_W_Source operating system redefined'#000+
   '09001_I_Assembling (pipe) $1'#000+
   '09002_E_Can'#039't create assembler file: $1'#000+
   '09003_E_Can'#039't create object file: $1'#000+
-  '09004_E_Can'#039't create a','rchive file: $1'#000+
+  '09004_E_Can'#039't create archi','ve file: $1'#000+
   '09005_E_Assembler $1 not found, switching to external assembling'#000+
   '09006_T_Using assembler: $1'#000+
   '09007_E_Error while assembling exitcode $1'#000+
   '09008_E_Can'#039't call the assembler, error $1 switching to external a'+
   'ssembling'#000+
-  '09009_I_Asse','mbling $1'#000+
+  '09009_I_Assembli','ng $1'#000+
   '09010_I_Assembling with smartlinking $1'#000+
   '09011_W_Object $1 not found, Linking may fail !'#000+
   '09012_W_Library $1 not found, Linking may fail !'#000+
   '09013_E_Error while linking'#000+
   '09014_E_Can'#039't call the linker, switching to external linking'#000+
-  '0901','5_I_Linking $1'#000+
+  '09015_I_','Linking $1'#000+
   '09016_E_Util $1 not found, switching to external linking'#000+
   '09017_T_Using util $1'#000+
   '09018_E_Creation of Executables not supported'#000+
   '09019_E_Creation of Dynamic/Shared Libraries not supported'#000+
   '09020_I_Closing script $1'#000+
-  '09021_E_resourc','e compiler not found, switching to external mode'#000+
+  '09021_E_resource co','mpiler not found, switching to external mode'#000+
   '09022_I_Compiling resource $1'#000+
   '09023_T_unit $1 can'#039't be statically linked, switching to smart lin'+
   'king'#000+
   '09024_T_unit $1 can'#039't be smart linked, switching to static linking'+
   #000+
-  '09025_T_unit $1 can'#039't b','e shared linked, switching to static link'+
+  '09025_T_unit $1 can'#039't be sh','ared linked, switching to static link'+
   'ing'#000+
   '09026_E_unit $1 can'#039't be smart or static linked'#000+
   '09027_E_unit $1 can'#039't be shared or static linked'#000+
   '09028_D_Calling resource compiler "$1" with "$2" as command line'#000+
-  '09128_F_Can'#039't post process execut','able $1'#000+
+  '09128_F_Can'#039't post process executable',' $1'#000+
   '09129_F_Can'#039't open executable $1'#000+
   '09130_X_Size of Code: $1 bytes'#000+
   '09131_X_Size of initialized data: $1 bytes'#000+
   '09132_X_Size of uninitialized data: $1 bytes'#000+
   '09133_X_Stack space reserved: $1 bytes'#000+
   '09134_X_Stack space committed: $1 bytes'#000+
-  '1','0000_T_Unitsearch: $1'#000+
+  '10000','_T_Unitsearch: $1'#000+
   '10001_T_PPU Loading $1'#000+
   '10002_U_PPU Name: $1'#000+
   '10003_U_PPU Flags: $1'#000+
@@ -703,98 +713,98 @@ const msgtxt : array[0..000180,1..240] of char=(
   '10006_U_PPU File too short'#000+
   '10007_U_PPU Invalid Header (no PPU at the begin)'#000+
   '10008_U_PPU Invalid Version $1'#000+
-  '1000','9_U_PPU is compiled for another processor'#000+
+  '10009_U_','PPU is compiled for another processor'#000+
   '10010_U_PPU is compiled for an other target'#000+
   '10011_U_PPU Source: $1'#000+
   '10012_U_Writing $1'#000+
   '10013_F_Can'#039't Write PPU-File'#000+
   '10014_F_Error reading PPU-File'#000+
   '10015_F_unexpected end of PPU-File'#000+
-  '10016_F_Invalid P','PU-File entry: $1'#000+
+  '10016_F_Invalid PPU-F','ile entry: $1'#000+
   '10017_F_PPU Dbx count problem'#000+
   '10018_E_Illegal unit name: $1'#000+
   '10019_F_Too much units'#000+
   '10020_F_Circular unit reference between $1 and $2'#000+
   '10021_F_Can'#039't compile unit $1, no sources available'#000+
-  '10022_F_Can'#039't find unit $1 used by $2',#000+
-  '10023_W_Unit $1 was not found but $2 exists'#000+
+  '10022_F_Can'#039't find unit $1 used by $2'#000+
+  '100','23_W_Unit $1 was not found but $2 exists'#000+
   '10024_F_Unit $1 searched but $2 found'#000+
   '10025_W_Compiling the system unit requires the -Us switch'#000+
   '10026_F_There were $1 errors compiling module, stopping'#000+
   '10027_U_Load from $1 ($2) unit $3'#000+
-  '10028_U_R','ecompiling $1, checksum changed for $2'#000+
+  '10028_U_Recom','piling $1, checksum changed for $2'#000+
   '10029_U_Recompiling $1, source found only'#000+
   '10030_U_Recompiling unit, static lib is older than ppufile'#000+
   '10031_U_Recompiling unit, shared lib is older than ppufile'#000+
-  '10032_U_Recompiling unit, obj and asm are',' older than ppufile'#000+
+  '10032_U_Recompiling unit, obj and asm are old','er than ppufile'#000+
   '10033_U_Recompiling unit, obj is older than asm'#000+
   '10034_U_Parsing interface of $1'#000+
   '10035_U_Parsing implementation of $1'#000+
   '10036_U_Second load for unit $1'#000+
   '10037_U_PPU Check file $1 time $2'#000+
-  '10040_W_Can'#039't recompile unit $1, but ','found modifed include files'+
+  '10040_W_Can'#039't recompile unit $1, but foun','d modifed include files'+
   #000+
   '10041_U_File $1 is newer than PPU file $2'#000+
   '10042_U_Trying to use a unit which was compiled with a different FPU m'+
   'ode'#000+
   '10043_U_Loading interface units from $1'#000+
   '10044_U_Loading implementation units from $1'#000+
-  '10045_U_Int','erface CRC changed for unit $1'#000+
+  '10045_U_Interfa','ce CRC changed for unit $1'#000+
   '10046_U_Implementation CRC changed for unit $1'#000+
   '10047_U_Finished compiling unit $1'#000+
   '10048_U_Add dependency of $1 to $2'#000+
   '10049_U_No reload, is caller: $1'#000+
   '10050_U_No reload, already in second compile: $1'#000+
-  '10051_U_Fl','ag for reload: $1'#000+
+  '10051_U_Flag f','or reload: $1'#000+
   '10052_U_Forced reloading'#000+
   '10053_U_Previous state of $1: $2'#000+
   '10054_U_Already compiling $1, setting second compile'#000+
   '10055_U_Loading unit $1'#000+
   '10056_U_Finished loading unit $1'#000+
   '10057_U_Registering new unit $1'#000+
-  '10058_U_Re-resolving u','nit $1'#000+
+  '10058_U_Re-resolving unit ','$1'#000+
   '10059_U_Skipping re-resolving unit $1, still loading used units'#000+
   '11000_O_$1 [options] <inputfile> [options]'#000+
   '11001_W_Only one source file supported'#000+
   '11002_W_DEF file can be created only for OS/2'#000+
-  '11003_E_nested response files are not sup','ported'#000+
+  '11003_E_nested response files are not support','ed'#000+
   '11004_F_No source file name in command line'#000+
   '11005_N_No option inside $1 config file'#000+
   '11006_E_Illegal parameter: $1'#000+
   '11007_H_-? writes help pages'#000+
   '11008_F_Too many config files nested'#000+
   '11009_F_Unable to open file $1'#000+
-  '11010_D_Reading furthe','r options from $1'#000+
+  '11010_D_Reading further op','tions from $1'#000+
   '11011_W_Target is already set to: $1'#000+
   '11012_W_Shared libs not supported on DOS platform, reverting to static'+
   #000+
   '11013_F_too many IF(N)DEFs'#000+
   '11014_F_too many ENDIFs'#000+
   '11015_F_open conditional at the end of the file'#000+
-  '11016_W_Debug i','nformation generation is not supported by this execut'+
+  '11016_W_Debug infor','mation generation is not supported by this execut'+
   'able'#000+
   '11017_H_Try recompiling with -dGDB'#000+
   '11018_W_You are using the obsolete switch $1'#000+
   '11019_W_You are using the obsolete switch $1, please use $2'#000+
-  '11020_N_Switching assembler to default sou','rce writing assembler'#000+
+  '11020_N_Switching assembler to default source ','writing assembler'#000+
   '11021_W_Assembler output selected "$1" is not compatible with "$2"'#000+
   '11022_W_"$1" assembler use forced'#000+
   '11026_T_Reading options from file $1'#000+
   '11027_T_Reading options from environment $1'#000+
   '11028_D_Handling option "$1"'#000+
-  '11029__','*** press enter ***'#000+
+  '11029__*** ','press enter ***'#000+
   '11030_H_Start of reading config file $1'#000+
   '11031_H_End of reading config file $1'#000+
   '11032_D_interpreting option "$1"'#000+
   '11036_D_interpreting firstpass option "$1"'#000+
   '11033_D_interpreting file option "$1"'#000+
-  '11034_D_Reading config file ','"$1"'#000+
+  '11034_D_Reading config file "$1"',#000+
   '11035_D_found source file name "$1"'#000+
   '11039_E_Unknown code page'#000+
   '11040_F_Config file $1 is a directory'#000+
   '11041_W_Assembler output selected "$1" cannot generate debug info, deb'+
   'ugging disabled'#000+
-  '11023_Free Pascal Compiler version $FPCFULLVERSIO','N [$FPCDATE] for $F'+
+  '11023_Free Pascal Compiler version $FPCFULLVERSION [$','FPCDATE] for $F'+
   'PCCPU'#010+
   'Copyright (c) 1993-2007 by Florian Klaempfl'#000+
   '11024_Free Pascal Compiler version $FPCVERSION'#010+
@@ -805,8 +815,8 @@ const msgtxt : array[0..000180,1..240] of char=(
   'Supported targets:'#010+
   '  $OSTARGETS'#010+
   #010+
-  'Supported CPU instruction sets',':'#010+
-  '  $INSTRUCTIONSETS'#010+
+  'Supported CPU instruction sets:'#010+
+  '  ','$INSTRUCTIONSETS'#010+
   #010+
   'Supported FPU instruction sets:'#010+
   '  $FPUINSTRUCTIONSETS'#010+
@@ -817,65 +827,65 @@ const msgtxt : array[0..000180,1..240] of char=(
   'This program comes under the GNU General Public Licence'#010+
   'For more information read COPYING.FPC'#010+
   #010+
-  'Report bugs,suggestions e','tc to:'#010+
+  'Report bugs,suggestions etc t','o:'#010+
   '                 [email protected]'#000+
   '11025_**0*_put + after a boolean switch option to enable it, - to disa'+
   'ble it'#010+
   '**1a_the compiler doesn'#039't delete the generated assembler file'#010+
   '**2al_list sourcecode lines in assembler file'#010+
-  '**2an_list ','node info in assembler file'#010+
+  '**2an_list node',' info in assembler file'#010+
   '*L2ap_use pipes instead of creating temporary assembler files'#010+
   '**2ar_list register allocation/release info in assembler file'#010+
   '**2at_list temp allocation/release info in assembler file'#010+
   '**1A<x>_output format:'#010+
-  '**2Adef','ault_use default assembler'#010+
+  '**2Adefault','_use default assembler'#010+
   '3*2Aas_assemble using GNU AS'#010+
   '3*2Anasmcoff_coff (Go32v2) file using Nasm'#010+
   '3*2Anasmelf_elf32 (Linux) file using Nasm'#010+
   '3*2Anasmwin32_Win32 object file using Nasm'#010+
   '3*2Anasmwdosx_Win32/WDOSX object file using Nasm'#010+
-  '3*2Awas','m_obj file using Wasm (Watcom)'#010+
+  '3*2Awasm_ob','j file using Wasm (Watcom)'#010+
   '3*2Anasmobj_obj file using Nasm'#010+
   '3*2Amasm_obj file using Masm (Microsoft)'#010+
   '3*2Atasm_obj file using Tasm (Borland)'#010+
   '3*2Aelf_elf32 (Linux) using internal writer'#010+
   '3*2Acoff_coff (Go32v2) using internal writer'#010+
-  '3*2Apeco','ff_pecoff (Win32) using internal writer'#010+
+  '3*2Apecoff_p','ecoff (Win32) using internal writer'#010+
   '4*2Aas_assemble using GNU AS'#010+
   '6*2Aas_Unix o-file using GNU AS'#010+
   '6*2Agas_GNU Motorola assembler'#010+
   '6*2Amit_MIT Syntax (old GAS)'#010+
   '6*2Amot_Standard Motorola assembler'#010+
   'A*2Aas_assemble using GNU AS'#010+
-  'P*2Aas_assembl','e using GNU AS'#010+
+  'P*2Aas_assemble us','ing GNU AS'#010+
   'S*2Aas_assemble using GNU AS'#010+
   '**1b_generate browser info'#010+
   '**2bl_generate local symbol info'#010+
   '**1B_build all modules'#010+
   '**1C<x>_code generation options:'#010+
   '**2Cc<x>_set default calling convention to <x>'#010+
-  '**2CD_create also dynamic library',' (not supported)'#010+
+  '**2CD_create also dynamic library (no','t supported)'#010+
   '**2Ce_Compilation with emulated floating point opcodes'#010+
   '**2Cf<x>_Select fpu instruction set to use, see fpc -i for possible va'+
   'lues'#010+
   '**2Cg_Generate PIC code'#010+
   '**2Ch<n>_<n> bytes heap (between 1023 and 67107840)'#010+
-  '**2Ci_IO-checking',#010+
-  '**2Cn_omit linking stage'#010+
+  '**2Ci_IO-checking'#010+
+  '**2','Cn_omit linking stage'#010+
   '**2Co_check overflow of integer operations'#010+
   '**2Cp<x>_select instruction set, see fpc -i for possible values'#010+
   '**2CP<x>=<y>_ packing settings'#010+
   '**3CPPACKSET=<y>_ <y> set allocation: 0, 1 or DEFAULT or NORMAL, 2, 4 '+
-  'and 8'#010,
-  '**2Cr_range checking'#010+
+  'and 8'#010+
+  '**2C','r_range checking'#010+
   '**2CR_verify object method call validity'#010+
   '**2Cs<n>_set stack size to <n>'#010+
   '**2Ct_stack checking'#010+
   '**2CX_create also smartlinked library'#010+
   '**1d<x>_defines the symbol <x>'#010+
   '**1D_generate a DEF file'#010+
-  '**2Dd<x>_set description to <x>'#010,
-  '**2Dv<x>_set DLL version to <x>'#010+
+  '**2Dd<x>_set description to <x>'#010+
+  '**2D','v<x>_set DLL version to <x>'#010+
   '*O2Dw_PM application'#010+
   '**1e<x>_set path to executable'#010+
   '**1E_same as -Cn'#010+
@@ -883,32 +893,32 @@ const msgtxt : array[0..000180,1..240] of char=(
   '**1F<x>_set file names and paths:'#010+
   '**2Fa<x>[,y]_for a program load first units <x> and [y] before uses is'+
   ' parsed'#010+
-  '**2Fc<x','>_sets input codepage to <x>'#010+
+  '**2Fc<x>_se','ts input codepage to <x>'#010+
   '**2FD<x>_sets the directory where to search for compiler utilities'#010+
   '**2Fe<x>_redirect error output to <x>'#010+
   '**2FE<x>_set exe/unit output path to <x>'#010+
   '**2Fi<x>_adds <x> to include path'#010+
-  '**2Fl<x>_adds <x> to library pa','th'#010+
-  '**2FL<x>_uses <x> as dynamic linker'#010+
+  '**2Fl<x>_adds <x> to library path'#010+
+  '*','*2FL<x>_uses <x> as dynamic linker'#010+
   '**2Fm<x>_load unicode conversion table from <x>.txt in the compiler di'+
   'r'#010+
   '**2Fo<x>_adds <x> to object path'#010+
   '**2Fr<x>_load error message file <x>'#010+
   '**2Fu<x>_adds <x> to unit path'#010+
-  '**2FU<x>_set unit output pat','h to <x>, overrides -FE'#010+
+  '**2FU<x>_set unit output path to',' <x>, overrides -FE'#010+
   '*g1g_generate debugger information:'#010+
   '*g2gc_generate checks for pointers'#010+
   '*g2gd_use dbx'#010+
   '*g2gg_use gsym'#010+
   '*g2gh_use heap trace unit (for memory leak debugging)'#010+
   '*g2gl_use line info unit to show more info for backtraces'#010+
-  '*g2g','p_preserve case in stabs symbol names'#010+
+  '*g2gp_pr','eserve case in stabs symbol names'#010+
   '*g2gt_trash local variables (to detect uninitialized uses)'#010+
   '*g2gv_generates programs traceable with valgrind'#010+
   '*g2gw_generate dwarf debugging info'#010+
   '**1i_information'#010+
   '**2iD_return compiler date'#010+
-  '**2iV_return c','ompiler version'#010+
+  '**2iV_return compi','ler version'#010+
   '**2iW_return full compiler version'#010+
   '**2iSO_return compiler OS'#010+
   '**2iSP_return compiler processor'#010+
@@ -916,63 +926,63 @@ const msgtxt : array[0..000180,1..240] of char=(
   '**2iTP_return target processor'#010+
   '**1I<x>_adds <x> to include path'#010+
   '**1k<x>_Pass <x> to the linker'#010+
-  '**1l_write ','logo'#010+
+  '**1l_write logo',#010+
   '**1M<x>_set language mode to <x>'#010+
   '**2Mfpc_free pascal dialect (default)'#010+
   '**2Mobjfpc_switch some Delphi 2 extensions on'#010+
   '**2Mdelphi_tries to be Delphi compatible'#010+
   '**2Mtp_tries to be TP/BP 7.0 compatible'#010+
-  '**2Mmacpas_tries to be compatible to ','the macintosh pascal dialects'#010+
+  '**2Mmacpas_tries to be compatible to the ','macintosh pascal dialects'#010+
   '**1n_don'#039't read the default config file'#010+
   '**1N<x>_node tree optimizations'#010+
   '**2Nu_unroll loops'#010+
   '**1o<x>_change the name of the executable produced to <x>'#010+
   '**1O<x>_optimizations:'#010+
   '**2O-_disable optimizations'#010+
-  '**2O1_leve','l 1 optimizations (quick and debugger friendly)'#010+
+  '**2O1_level 1 ','optimizations (quick and debugger friendly)'#010+
   '**2O2_level 2 optimizations (-O1 + quick optimizations)'#010+
   '**2O3_level 3 optimizations (-O2 + slow optimizations)'#010+
   '**2Oa<x>=<y>_set alignment'#010+
-  '**2Oo[NO]<x>_enable or disable optimizations, see fpc ','-i for possibl'+
+  '**2Oo[NO]<x>_enable or disable optimizations, see fpc -i f','or possibl'+
   'e values'#010+
   '**2Op<x>_set target cpu for optimizing, see fpc -i for possible values'+
   #010+
   '**2Os_generate smaller code'#010+
   '**1pg_generate profile code for gprof (defines FPC_PROFILE)'#010+
   '**1R<x>_assembler reading style:'#010+
-  '**2Rdefault_use default a','ssembler'#010+
+  '**2Rdefault_use default assem','bler'#010+
   '3*2Ratt_read AT&T style assembler'#010+
   '3*2Rintel_read Intel style assembler'#010+
   '6*2RMOT_read motorola style assembler'#010+
   '**1S<x>_syntax options:'#010+
   '**2S2_same as -Mobjfpc'#010+
   '**2Sc_supports operators like C (*=,+=,/= and -=)'#010+
-  '**2Sa_include assertion c','ode.'#010+
+  '**2Sa_include assertion code.',#010+
   '**2Sd_same as -Mdelphi'#010+
   '**2Se<x>_error options. <x> is a combination of the following:'#010+
   '**3*_<n> : compiler stops after the <n> errors (default is 1)'#010+
   '**3*_w : compiler stops also after warnings'#010+
   '**3*_n : compiler stops also after notes'#010+
-  '**','3*_h : compiler stops also after hints'#010+
+  '**3*_h',' : compiler stops also after hints'#010+
   '**2Sg_allow LABEL and GOTO'#010+
   '**2Sh_Use ansistrings'#010+
   '**2Si_support C++ styled INLINE'#010+
   '**2Sk_load fpcylix unit'#010+
   '**2SI<x>_set interface style to <x>'#010+
   '**3SIcom_COM compatible interface (default)'#010+
-  '**3SIcorba_CORBA',' compatible interface'#010+
+  '**3SIcorba_CORBA com','patible interface'#010+
   '**2Sm_support macros like C (global)'#010+
   '**2So_same as -Mtp'#010+
   '**2Sp_same as -Mgpc'#010+
   '**2Ss_constructor name must be init (destructor must be done)'#010+
   '**2St_allow static keyword in objects'#010+
-  '**2Sx_enable exception keywords (default i','n Delphi/ObjFPC modes)'#010+
+  '**2Sx_enable exception keywords (default in De','lphi/ObjFPC modes)'#010+
   '**1s_don'#039't call assembler and linker'#010+
   '**2sh_Generate script to link on host'#010+
   '**2st_Generate script to link on target'#010+
   '**2sr_Skip register allocation phase (use with -alr)'#010+
   '**1T<x>_Target operating system:'#010+
-  '3*2Temx_OS/2 via',' EMX (including EMX/RSX extender)'#010+
+  '3*2Temx_OS/2 via EMX',' (including EMX/RSX extender)'#010+
   '3*2Tfreebsd_FreeBSD'#010+
   '3*2Tgo32v2_Version 2 of DJ Delorie DOS extender'#010+
   '3*2Tlinux_Linux'#010+
@@ -980,7 +990,7 @@ const msgtxt : array[0..000180,1..240] of char=(
   '3*2Tnetware_Novell Netware Module (clib)'#010+
   '3*2Tnetwlibc_Novell Netware Module (libc)'#010+
   '3*2Topenbsd_OpenBSD'#010+
-  '3','*2Tos2_OS/2 / eComStation'#010+
+  '3*2To','s2_OS/2 / eComStation'#010+
   '3*2Tsunos_SunOS/Solaris'#010+
   '3*2Twatcom_Watcom compatible DOS extender'#010+
   '3*2Twdosx_WDOSX DOS extender'#010+
@@ -989,7 +999,7 @@ const msgtxt : array[0..000180,1..240] of char=(
   '4*2Tlinux_Linux'#010+
   '6*2Tamiga_Commodore Amiga'#010+
   '6*2Tatari_Atari ST/STe/TT'#010+
-  '6*2Tl','inux_Linux/m68k'#010+
+  '6*2Tlinux','_Linux/m68k'#010+
   '6*2Tmacos_Macintosh m68k (not supported)'#010+
   '6*2Tpalmos_PalmOS'#010+
   'A*2Tlinux_Linux'#010+
@@ -997,7 +1007,7 @@ const msgtxt : array[0..000180,1..240] of char=(
   'P*2Tamiga_AmigaOS on PowerPC'#010+
   'P*2Tdarwin_Darwin and Mac OS X on PowerPC'#010+
   'P*2Tlinux_Linux on PowerPC'#010+
-  'P*2Tmacos_Mac OS (classic) on ','PowerPC'#010+
+  'P*2Tmacos_Mac OS (classic) on Powe','rPC'#010+
   'P*2Tmorphos_MorphOS'#010+
   'S*2Tlinux_Linux'#010+
   '**1u<x>_undefines the symbol <x>'#010+
@@ -1005,47 +1015,47 @@ const msgtxt : array[0..000180,1..240] of char=(
   '**2Un_don'#039't check the unit name'#010+
   '**2Ur_generate release unit files'#010+
   '**2Us_compile a system unit'#010+
-  '**1v<x>_Be verbose. <x> is a combination of the fo','llowing letters:'#010+
+  '**1v<x>_Be verbose. <x> is a combination of the follow','ing letters:'#010+
   '**2*_e : Show errors (default)       0 : Show nothing (except errors)'#010+
   '**2*_w : Show warnings               u : Show unit info'#010+
   '**2*_n : Show notes                  t : Show tried/used files'#010+
-  '**2*_h : Show hints               ','   c : Show conditionals'#010+
+  '**2*_h : Show hints                  c',' : Show conditionals'#010+
   '**2*_i : Show general info           d : Show debug info'#010+
   '**2*_l : Show linenumbers            r : Rhide/GCC compatibility mode'#010+
   '**2*_a : Show everything             x : Executable info (Win32 only)'#010+
-  '**2*_b : Write fil','e names messages with full path'#010+
+  '**2*_b : Write file na','mes messages with full path'#010+
   '**2*_v : write fpcdebug.txt with     p : Write tree.log with parse tre'+
   'e'#010+
   '**2*_    lots of debugging info'#010+
   '3*1W<x>_Win32-like target options'#010+
   '3*2WB_Create a relocatable image'#010+
-  '3*2WB<x>_Set Image base to Hexadecima','l <x> value'#010+
+  '3*2WB<x>_Set Image base to Hexadecimal <x','> value'#010+
   '3*2WC_Specify console type application'#010+
   '3*2WD_Use DEFFILE to export functions of DLL or EXE'#010+
   '3*2WF_Specify full-screen type application (OS/2 only)'#010+
   '3*2WG_Specify graphic type application'#010+
-  '3*2WN_Do not generate relocation code (nece','ssary for debugging)'#010+
+  '3*2WN_Do not generate relocation code (necessar','y for debugging)'#010+
   '3*2WR_Generate relocation code'#010+
   'P*2WC_Specify console type application (Mac OS only)'#010+
   'P*2WG_Specify graphic type application (Mac OS only)'#010+
   'P*2WT_Specify tool type application (MPW tool, Mac OS only)'#010+
-  '**1X_executable option','s:'#010+
-  '**2Xc_pass --shared to the linker (Unix only)'#010+
+  '**1X_executable options:'#010+
+  '*','*2Xc_pass --shared to the linker (Unix only)'#010+
   '**2Xd_don'#039't use standard library search path (needed for cross com'+
   'pile)'#010+
   '**2Xe_use external linker'#010+
   '**2XD_try to link units dynamic          (defines FPC_LINK_DYNAMIC)'#010+
-  '**2Xi_use internal linker',#010+
-  '**2Xm_generate link map'#010+
+  '**2Xi_use internal linker'#010+
+  '**2','Xm_generate link map'#010+
   '**2XM<x>_set the name of the '#039'main'#039' program routine (default i'+
   's '#039'main'#039')'#010+
   '**2XP<x>_prepend the binutils names with the prefix <x>'#010+
   '**2Xr<x>_set library search path to <x> (needed for cross compile)'#010+
-  '**2Xs_strip all symb','ols from executable'#010+
+  '**2Xs_strip all symbols ','from executable'#010+
   '**2XS_try to link units static (default) (defines FPC_LINK_STATIC)'#010+
   '**2Xt_link with static libraries (-static is passed to linker)'#010+
   '**2XX_try to link units smart            (defines FPC_LINK_SMART)'#010+
   '**1*_'#010+
-  '**1?_shows this he','lp'#010+
-  '**1h_shows this help without waiting'#000
+  '**1?_shows this help'#010+
+  '*','*1h_shows this help without waiting'#000
 );

+ 25 - 17
compiler/ncal.pas

@@ -177,7 +177,7 @@ interface
        tcallparanodeclass = class of tcallparanode;
 
     function reverseparameters(p: tcallparanode): tcallparanode;
-    function translate_disp_call(selfnode,parametersnode : tnode;methodname : ansistring = '';dispid : longint = 0) : tnode;
+    function translate_disp_call(selfnode,parametersnode : tnode;methodname : ansistring = '';dispid : longint = 0;useresult : boolean = false) : tnode;
 
     var
       ccallnode : tcallnodeclass;
@@ -229,7 +229,7 @@ implementation
       end;
 
 
-    function translate_disp_call(selfnode,parametersnode : tnode;methodname : ansistring = '';dispid : longint = 0) : tnode;
+    function translate_disp_call(selfnode,parametersnode : tnode;methodname : ansistring = '';dispid : longint = 0;useresult : boolean = false) : tnode;
       const
         DISPATCH_METHOD = $1;
         DISPATCH_PROPERTYGET = $2;
@@ -242,6 +242,7 @@ implementation
         params : ttempcreatenode;
         paramssize : longint;
         calldescnode : tdataconstnode;
+        resultvalue : tnode;
         para : tcallparanode;
         currargpos,
         namedparacount,
@@ -286,10 +287,12 @@ implementation
         result:=internalstatements(statements);
         fillchar(calldesc,sizeof(calldesc),0);
 
-        { get temp for the result }
-        result_data:=ctempcreatenode.create(colevarianttype,colevarianttype.size,tt_persistent,true);
-        addstatement(statements,result_data);
-
+        if useresult then
+          begin
+            { get temp for the result }
+            result_data:=ctempcreatenode.create(colevarianttype,colevarianttype.size,tt_persistent,true);
+            addstatement(statements,result_data);
+          end;
         { build parameters }
 
         { first, count and check parameters }
@@ -424,6 +427,12 @@ implementation
         calldescnode.append(calldesc,3+calldesc.argcount);
 
         pvardatadef:=tpointerdef(search_system_type('PVARDATA').typedef);
+
+        if useresult then
+          resultvalue:=caddrnode.create(ctemprefnode.create(result_data))
+        else
+          resultvalue:=cpointerconstnode.create(0,voidpointertype);
+
         if variantdispatch then
           begin
             methodname:=methodname+#0;
@@ -438,9 +447,7 @@ implementation
               ccallparanode.create(caddrnode.create(ctemprefnode.create(params)),
               ccallparanode.create(caddrnode.create(calldescnode),
               ccallparanode.create(ctypeconvnode.create_internal(selfnode,vardatadef),
-              ccallparanode.create(ctypeconvnode.create_internal(caddrnode.create(
-                  ctemprefnode.create(result_data)
-                ),pvardatadef),nil)))))
+              ccallparanode.create(ctypeconvnode.create_internal(resultvalue,pvardatadef),nil)))))
             );
           end
         else
@@ -450,14 +457,15 @@ implementation
               ccallparanode.create(caddrnode.create(ctemprefnode.create(params)),
               ccallparanode.create(caddrnode.create(calldescnode),
               ccallparanode.create(ctypeconvnode.create_internal(selfnode,voidpointertype),
-              ccallparanode.create(ctypeconvnode.create_internal(caddrnode.create(
-                  ctemprefnode.create(result_data)
-                ),pvardatadef),nil)))))
+              ccallparanode.create(ctypeconvnode.create_internal(resultvalue,pvardatadef),nil)))))
             );
           end;
-        { clean up }
-        addstatement(statements,ctempdeletenode.create_normal_temp(result_data));
-        addstatement(statements,ctemprefnode.create(result_data));
+        if useresult then
+          begin
+            { clean up }
+            addstatement(statements,ctempdeletenode.create_normal_temp(result_data));
+            addstatement(statements,ctemprefnode.create(result_data));
+          end;
       end;
 
 
@@ -2276,13 +2284,13 @@ implementation
                  converted_result_data:=ctempcreatenode.create(procdefinition.returndef,sizeof(procdefinition.returndef),tt_persistent,true);
                  addstatement(statements,converted_result_data);
                  addstatement(statements,cassignmentnode.create(ctemprefnode.create(converted_result_data),
-                   ctypeconvnode.create_internal(translate_disp_call(methodpointer,parameters,'',tprocdef(procdefinition).dispid),
+                   ctypeconvnode.create_internal(translate_disp_call(methodpointer,parameters,'',tprocdef(procdefinition).dispid,true),
                    procdefinition.returndef)));
                  addstatement(statements,ctempdeletenode.create_normal_temp(converted_result_data));
                  addstatement(statements,ctemprefnode.create(converted_result_data));
                end
              else
-               result:=translate_disp_call(methodpointer,parameters,'',tprocdef(procdefinition).dispid);
+               result:=translate_disp_call(methodpointer,parameters,'',tprocdef(procdefinition).dispid,false);
 
              { don't free reused nodes }
              methodpointer:=nil;

+ 3 - 3
compiler/ncgld.pas

@@ -541,11 +541,11 @@ implementation
               LOC_CONSTANT :
                 begin
 {$ifndef cpu64bit}
-                  if right.location.size in [OS_64,OS_S64] then
-                   cg64.a_load64_const_loc(current_asmdata.CurrAsmList,right.location.value64,left.location)
+                  if (left.location.size in [OS_64,OS_S64]) or (right.location.size in [OS_64,OS_S64]) then
+                    cg64.a_load64_const_loc(current_asmdata.CurrAsmList,right.location.value64,left.location)
                   else
 {$endif cpu64bit}
-                   cg.a_load_const_loc(current_asmdata.CurrAsmList,right.location.value,left.location);
+                    cg.a_load_const_loc(current_asmdata.CurrAsmList,right.location.value,left.location);
                 end;
               LOC_REFERENCE,
               LOC_CREFERENCE :

+ 1 - 1
compiler/ncgrtti.pas

@@ -541,7 +541,7 @@ implementation
            { size of elements }
            current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_aint(def.elesize));
            if not(ado_IsDynamicArray in def.arrayoptions) then
-             current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_aint(def.elecount));
+             current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_aint(aint(def.elecount)));
            { element type }
            current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_sym(ref_rtti(def.elementdef,rt)));
            { variant type }

+ 18 - 0
compiler/ncnv.pas

@@ -617,6 +617,24 @@ implementation
           to use the div operator.}
          if (node.nodetype=slashn) and (def.typ=orddef) then
            cgmessage(type_h_use_div_for_int);
+         {In expressions like int64:=longint+longint, an integer overflow could be avoided
+          by simply converting the operands to int64 first. Give a hint to do this.}
+         if (node.nodetype in [addn,subn,muln]) and
+            (def.typ=orddef) and (node.resultdef<>nil) and (node.resultdef.typ=orddef) and
+            ((Torddef(node.resultdef).low>=Torddef(def).low) and (Torddef(node.resultdef).high<=Torddef(def).high)) and
+            ((Torddef(node.resultdef).low>Torddef(def).low) or (Torddef(node.resultdef).high<Torddef(def).high)) then
+           case node.nodetype of
+             addn:
+               cgmessage1(type_h_convert_add_operands_to_prevent_overflow,def.gettypename);
+             subn:
+               cgmessage1(type_h_convert_sub_operands_to_prevent_overflow,def.gettypename);
+             muln:
+               cgmessage1(type_h_convert_mul_operands_to_prevent_overflow,def.gettypename);
+           end;
+         {Converting pointers to signed integers is a bad idea. Warn.}
+         if (node.resultdef<>nil) and (node.resultdef.typ=pointerdef) and
+           (def.typ=orddef) and (Torddef(def).ordtype in [s8bit,s16bit,s32bit,s64bit]) then
+           cgmessage(type_w_pointer_to_signed);
       end;
 
 

+ 3 - 2
compiler/ncon.pas

@@ -621,8 +621,9 @@ implementation
       begin
         result:=nil;
         resultdef:=typedef;
-        { only do range checking when explicitly asked for it }
-        if rangecheck then
+        { only do range checking when explicitly asked for it
+          and if the type can be range checked, see tests/tbs/tb0539.pp }
+        if rangecheck and (resultdef.typ in [orddef,enumdef]) then
            testrange(resultdef,resultdef,value,false);
       end;
 

+ 31 - 9
compiler/nmem.pas

@@ -719,15 +719,37 @@ implementation
          { maybe type conversion for the index value, but
            do not convert enums,booleans,char
            and do not convert range nodes }
-         if (right.nodetype<>rangen) and (
-             ((right.resultdef.typ<>enumdef) and
-               not(is_char(right.resultdef) or is_widechar(right.resultdef)) and
-               not(is_boolean(right.resultdef))
-             ) or
-             (left.resultdef.typ <> arraydef) 
-            ) then
-           begin
-             inserttypeconv(right,sinttype);
+         if (right.nodetype<>rangen) and (is_integer(right.resultdef) or (left.resultdef.typ<>arraydef)) then
+           case left.resultdef.typ of
+             arraydef:
+               if ado_isvariant in Tarraydef(left.resultdef).arrayoptions then
+                 {Variant arrays are a special array, can have negative indexes and would therefore
+                  need s32bit. However, they should not appear in a vecn, as they are handled in
+                  handle_variantarray in pexpr.pas. Therefore, encountering a variant array is an
+                  internal error... }
+                 internalerror(200707031)
+               else if is_special_array(left.resultdef) then
+                 {Arrays without a high bound (dynamic arrays, open arrays) are zero based,
+                  convert indexes into these arrays to aword.}
+                 inserttypeconv(right,uinttype)
+               else
+                 {Convert array indexes to low_bound..high_bound.}
+                 inserttypeconv(right,Torddef.create(Torddef(sinttype).ordtype,
+                                                     int64(Tarraydef(left.resultdef).lowrange),
+                                                     int64(Tarraydef(left.resultdef).highrange)
+                                                    ));
+             stringdef:
+               if is_open_string(left.resultdef) then
+                 inserttypeconv(right,u8inttype)
+               else if is_shortstring(left.resultdef) then
+                 {Convert shortstring indexes to 0..length.}
+                 inserttypeconv(right,Torddef.create(u8bit,0,int64(Tstringdef(left.resultdef).len)))
+               else
+                 {Convert indexes into dynamically allocated strings to aword.}
+                 inserttypeconv(right,uinttype);
+             else
+               {Others, i.e. pointer indexes to aint.}
+               inserttypeconv(right,sinttype);
            end;
 
          case left.resultdef.typ of

+ 0 - 1
compiler/pdecl.pas

@@ -242,7 +242,6 @@ implementation
                       else
                         tclist:=current_asmdata.asmlists[al_typedconsts];
                       read_typed_const(tclist,tstaticvarsym(sym));
-                      consume(_SEMICOLON);
                     end;
                 end;
 

+ 137 - 6
compiler/pdecvar.pas

@@ -39,6 +39,7 @@ interface
 
     procedure read_record_fields(options:Tvar_dec_options);
 
+    procedure read_public_and_external(vs: tabstractvarsym);
 
 implementation
 
@@ -693,6 +694,137 @@ implementation
     const
        variantrecordlevel : longint = 0;
 
+
+    procedure read_public_and_external_sc(sc:TFPObjectList);
+    var
+      vs: tabstractvarsym;
+    begin
+      { only allowed for one var }
+      vs:=tabstractvarsym(sc[0]);
+      if sc.count>1 then
+        Message(parser_e_absolute_only_one_var);
+      read_public_and_external(vs);
+    end;
+
+
+    procedure read_public_and_external(vs: tabstractvarsym);
+    var
+      is_dll,
+      is_cdecl,
+      is_external_var,
+      is_public_var  : boolean;
+      dll_name,
+      C_name      : string;
+    begin
+      { only allowed for one var }
+      { only allow external and public on global symbols }
+      if vs.typ<>staticvarsym then
+        begin
+          Message(parser_e_no_local_var_external);
+          exit;
+        end;
+      { defaults }
+      is_dll:=false;
+      is_cdecl:=false;
+      is_external_var:=false;
+      is_public_var:=false;
+      C_name:=vs.realname;
+
+      { macpas specific handling due to some switches}
+      if (m_mac in current_settings.modeswitches) then
+        begin
+          if (cs_external_var in current_settings.localswitches) then
+            begin {The effect of this is the same as if cvar; external; has been given as directives.}
+              is_cdecl:=true;
+              is_external_var:=true;
+            end
+          else if (cs_externally_visible in current_settings.localswitches) then
+            begin {The effect of this is the same as if cvar has been given as directives and it's made public.}
+              is_cdecl:=true;
+              is_public_var:=true;
+            end;
+        end;
+
+      { cdecl }
+      if try_to_consume(_CVAR) then
+        begin
+          consume(_SEMICOLON);
+          is_cdecl:=true;
+        end;
+
+      { external }
+      if try_to_consume(_EXTERNAL) then
+        begin
+          is_external_var:=true;
+          if not is_cdecl then
+            begin
+              if idtoken<>_NAME then
+                begin
+                  is_dll:=true;
+                  dll_name:=get_stringconst;
+                  if ExtractFileExt(dll_name)='' then
+                    dll_name:=ChangeFileExt(dll_name,target_info.sharedlibext);
+                end;
+              if try_to_consume(_NAME) then
+                C_name:=get_stringconst;
+            end;
+          consume(_SEMICOLON);
+        end;
+
+      { export or public }
+      if idtoken in [_EXPORT,_PUBLIC] then
+        begin
+          consume(_ID);
+          if is_external_var then
+            Message(parser_e_not_external_and_export)
+          else
+            is_public_var:=true;
+          if try_to_consume(_NAME) then
+            C_name:=get_stringconst;
+          consume(_SEMICOLON);
+        end;
+
+      { Windows uses an indirect reference using import tables }
+      if is_dll and
+         (target_info.system in system_all_windows) then
+        include(vs.varoptions,vo_is_dll_var);
+
+      { Add C _ prefix }
+      if is_cdecl or
+         (
+          is_dll and
+          (target_info.system in systems_darwin)
+         ) then
+        C_Name := target_info.Cprefix+C_Name;
+
+      if is_public_var then
+        begin
+          include(vs.varoptions,vo_is_public);
+          vs.varregable := vr_none;
+          { mark as referenced }
+          inc(vs.refs);
+        end;
+
+      { now we can insert it in the import lib if its a dll, or
+        add it to the externals }
+      if is_external_var then
+        begin
+          if vo_is_typed_const in vs.varoptions then
+            Message(parser_e_initialized_not_for_external);
+          include(vs.varoptions,vo_is_external);
+          vs.varregable := vr_none;
+          if is_dll then
+            current_module.AddExternalImport(dll_name,C_Name,0,true)
+          else
+            if tf_has_dllscanner in target_info.flags then
+              current_module.dllscannerinputlist.Add(vs.mangledname,vs);
+        end;
+
+      { Set the assembler name }
+      tstaticvarsym(vs).set_mangledname(C_Name);
+    end;
+
+
     procedure read_var_decls(options:Tvar_dec_options);
 
         procedure read_default_value(sc : TFPObjectList);
@@ -1043,7 +1175,7 @@ implementation
              { Check for EXTERNAL etc directives before a semicolon }
              if (idtoken in [_EXPORT,_EXTERNAL,_PUBLIC,_CVAR]) then
                begin
-                 read_public_and_external(sc);
+                 read_public_and_external_sc(sc);
                  allowdefaultvalue:=false;
                  semicoloneaten:=true;
                end;
@@ -1068,7 +1200,6 @@ implementation
                     (hdef.typesym=nil) then
                    handle_calling_convention(tprocvardef(hdef));
                  read_default_value(sc);
-                 consume(_SEMICOLON);
                  hasdefaultvalue:=true;
                end
              else
@@ -1092,7 +1223,6 @@ implementation
                     (symtablestack.top.symtabletype<>parasymtable) then
                    begin
                      read_default_value(sc);
-                     consume(_SEMICOLON);
                      hasdefaultvalue:=true;
                    end;
                end;
@@ -1111,7 +1241,7 @@ implementation
                   )
                  )
                 ) then
-               read_public_and_external(sc);
+               read_public_and_external_sc(sc);
 
              { allocate normal variable (non-external and non-typed-const) staticvarsyms }
              for i:=0 to sc.count-1 do
@@ -1301,9 +1431,10 @@ implementation
                end
              else
               if (sp_published in current_object_option) and
-                 not(oo_can_have_published in tobjectdef(hdef).objectoptions) then
+                 not(oo_can_have_published in tobjectdef(hdef).objectoptions) and
+                 not(m_delphi in current_settings.modeswitches) then
                begin
-                 Message(parser_e_only_publishable_classes_can__be_published);
+                 Message(parser_e_only_publishable_classes_can_be_published);
                  exclude(current_object_option,sp_published);
                end;
 

+ 1 - 1
compiler/pexpr.pas

@@ -2079,7 +2079,7 @@ implementation
                                  end
                                else
                                  p2:=nil;
-                               p1:=translate_disp_call(p1,p2,dispatchstring);
+                               p1:=translate_disp_call(p1,p2,dispatchstring,0,afterassignment);
                              end
                            else { Error }
                              Consume(_ID);

+ 33 - 17
compiler/ptconst.pas

@@ -42,7 +42,7 @@ implementation
        node,htypechk,procinfo,
        nmat,nadd,ncal,nmem,nset,ncnv,ninl,ncon,nld,nflw,
        { parser specific stuff }
-       pbase,pexpr,
+       pbase,pexpr,pdecvar,
        { codegen }
        cpuinfo,cgbase,dbgbase
        ;
@@ -1291,7 +1291,7 @@ implementation
       var
         storefilepos : tfileposinfo;
         cursectype   : TAsmSectionType;
-        C_name       : string;
+        valuelist    : tasmlist;
       begin
         { mark the staticvarsym as typedconst }
         include(sym.varoptions,vo_is_typed_const);
@@ -1308,6 +1308,33 @@ implementation
         else
           cursectype:=sec_data;
         maybe_new_object_file(list);
+        valuelist:=tasmlist.create;
+        read_typed_const_data(valuelist,sym.vardef);
+
+        { Parse hints }
+        try_consume_hintdirective(sym.symoptions);
+
+        consume(_SEMICOLON);
+
+        { parse public/external/export/... }
+        if (
+            (
+             (token = _ID) and
+             (idtoken in [_EXPORT,_EXTERNAL,_PUBLIC,_CVAR]) and
+             (m_cvar_support in current_settings.modeswitches)
+            ) or
+            (
+             (m_mac in current_settings.modeswitches) and
+             (
+              (cs_external_var in current_settings.localswitches) or
+              (cs_externally_visible in current_settings.localswitches)
+             )
+            )
+           ) then
+          read_public_and_external(sym);
+
+        { only now add items based on the symbolname, because it may }
+        { have been modified by the directives parsed above          }
         new_section(list,cursectype,lower(sym.mangledname),const_align(sym.vardef.alignment));
         if (sym.owner.symtabletype=globalsymtable) or
            maybe_smartlink_symbol or
@@ -1317,23 +1344,12 @@ implementation
           list.concat(Tai_symbol.Createname_global(sym.mangledname,AT_DATA,0))
         else
           list.concat(Tai_symbol.Createname(sym.mangledname,AT_DATA,0));
-        read_typed_const_data(list,sym.vardef);
+
+        { add the parsed value }
+        list.concatlist(valuelist);
+        valuelist.free;
         list.concat(tai_symbol_end.Createname(sym.mangledname));
         current_filepos:=storefilepos;
-
-        { Parse hints }
-        try_consume_hintdirective(sym.symoptions);
-
-        { Support public name directive }
-        if try_to_consume(_PUBLIC) then
-          begin
-            include(sym.varoptions,vo_is_public);
-            if try_to_consume(_NAME) then
-              C_name:=get_stringconst
-            else
-              C_name:=sym.realname;
-            sym.set_mangledname(C_Name);
-          end;
       end;
 
 end.

+ 11 - 11
compiler/symdef.pas

@@ -288,7 +288,7 @@ interface
        public
           function elesize : aint;
           function elepackedbitsize : aint;
-          function elecount : aint;
+          function elecount : aword;
           constructor create_from_pointer(def:tdef);
           constructor create(l,h : aint;def:tdef);
           constructor ppuload(ppufile:tcompilerppufile);
@@ -1534,7 +1534,7 @@ implementation
           varUndefined,
           varbyte,varqword,varlongword,varqword,
           varshortint,varsmallint,varinteger,varint64,
-          varboolean,varUndefined,varUndefined,varUndefined,
+          varboolean,varboolean,varUndefined,varUndefined,
           varUndefined,varUndefined,varCurrency);
       begin
         result:=basetype2vardef[ordtype];
@@ -2157,7 +2157,7 @@ implementation
     constructor tarraydef.create_from_pointer(def:tdef);
       begin
          { use -1 so that the elecount will not overflow }
-         self.create(0,$7fffffff-1,s32inttype);
+         self.create(0,high(aint-1),s32inttype);
          arrayoptions:=[ado_IsConvertedPointer];
          setelementdef(def);
       end;
@@ -2215,10 +2215,10 @@ implementation
       begin
         if (ado_IsBitPacked in arrayoptions) then
           internalerror(2006080101);
-	if assigned(_elementdef) then
+        if assigned(_elementdef) then
           result:=_elementdef.size
-	else
-	  result:=0;
+        else
+          result:=0;
       end;
 
 
@@ -2233,7 +2233,7 @@ implementation
       end;
 
 
-    function tarraydef.elecount : aint;
+    function tarraydef.elecount : aword;
       var
         qhigh,qlow : qword;
       begin
@@ -2246,9 +2246,9 @@ implementation
           begin
             qhigh:=highrange;
             qlow:=qword(-lowrange);
-            { prevent overflow, return -1 to indicate overflow }
+            { prevent overflow, return 0 to indicate overflow }
             if qhigh+qlow>qword(high(aint)-1) then
-              result:=-1
+              result:=0
             else
               result:=qhigh+qlow+1;
           end
@@ -2259,7 +2259,7 @@ implementation
 
     function tarraydef.size : aint;
       var
-        cachedelecount,
+        cachedelecount : aword;
         cachedelesize : aint;
       begin
         if ado_IsDynamicArray in arrayoptions then
@@ -2283,7 +2283,7 @@ implementation
             exit;
           end;
 
-        if (cachedelecount = -1) then
+        if (cachedelecount = 0) then
           begin
             size := -1;
             exit;

+ 4 - 1
compiler/symtable.pas

@@ -1168,7 +1168,10 @@ implementation
         if not is_funcret_sym(sym) and
            (defowner.typ=procdef) and
            assigned(tprocdef(defowner)._class) and
-           (tprocdef(defowner).owner.defowner=tprocdef(defowner)._class) then
+           (tprocdef(defowner).owner.defowner=tprocdef(defowner)._class) and
+           { delphi allows local typed consts. having the same name as class members, probably
+             a delphi bug, but some delphi code depends on it }
+           not((m_duplicate_names in current_settings.modeswitches) and (sym.typ=staticvarsym)) then
           result:=tprocdef(defowner)._class.symtable.checkduplicate(hashedid,sym);
       end;
 

+ 5 - 1
compiler/systems.pas

@@ -139,7 +139,8 @@ interface
              system_arm_embedded,       { 57 }
              system_powerpc64_embedded, { 58 }
              system_i386_symbian,       { 59 }
-             system_arm_symbian         { 60 }
+             system_arm_symbian,        { 60 }
+             system_x86_64_darwin       { 61 }
        );
 
        tasm = (as_none
@@ -375,6 +376,9 @@ interface
        system_all_windows = [system_i386_win32,system_x86_64_win64,system_ia64_win64,
                              system_arm_wince,system_i386_wince];
 
+       systems_darwin = [system_powerpc_darwin,system_i386_darwin,
+                         system_powerpc64_darwin,system_x86_64_darwin];
+				     
        { all systems supporting exports from programs or units }
        system_unit_program_exports = [system_i386_win32,
                                          system_i386_wdosx,

+ 1 - 1
compiler/utils/ppumove.pp

@@ -119,7 +119,7 @@ begin
      exit;
    end;
 {$ifdef unix}
-  Shell:=unix.shell(s);
+  Shell:=unix.fpsystem(s);
 {$else}
   exec(getenv('COMSPEC'),'/C '+s);
   Shell:=DosExitCode;

+ 11 - 0
tests/tbs/tb0539.pp

@@ -0,0 +1,11 @@
+{$mode delphi}
+const
+  o = TObject(0);
+
+var
+  o2 : TObject;
+
+{$r+}
+begin
+  o2:=o;
+end.

+ 18 - 0
tests/webtbf/tw8465a.pp

@@ -0,0 +1,18 @@
+{ %fail }
+program EnumPtrConvTest;
+
+{$APPTYPE CONSOLE}
+
+{$packenum 1}
+type
+  TEnum = (a, b);
+
+var
+  e: TEnum;
+  p: Pointer;
+
+begin
+  e := b;
+  p := Pointer(e);
+  WriteLn(Integer(p)); // produces "1" in Delphi
+end.

+ 3 - 1
tests/webtbs/tw8465.pp

@@ -5,6 +5,7 @@ program EnumPtrConvTest;
 {$IFDEF FPC}
   {$MODE DELPHI}
 {$ENDIF}
+{$packenum 1}
 
 type
   TEnum = (a, b);
@@ -16,5 +17,6 @@ var
 begin
   e := b;
   p := Pointer(e);
-  WriteLn(Integer(p)); // produces "1" in Delphi
+  if Integer(p)<>1 then
+    halt(1); // produces "1" in Delphi
 end.

+ 20 - 0
tests/webtbs/tw9113.pp

@@ -0,0 +1,20 @@
+uses uw9113a, uw9113b;
+
+var
+  v1: smallint; cvar; external;
+  myv2: smallint; external name '_v2';
+  myv3: smallint; external name '_v3';
+  v4: smallint; cvar; external;
+  myv5: smallint; external name '_v5';
+  myv6: smallint; external name '_v6';
+
+begin
+  if (v1 <> 1) or
+     (myv2 <> 2) or
+     (myv3 <> 3) or
+     (v4 <> 4) or
+     (myv5 <> 5) or
+     (myv6 <> 6) then
+    halt(1);
+end.
+

+ 29 - 0
tests/webtbs/tw9145.pp

@@ -0,0 +1,29 @@
+program main;
+{$mode objfpc}
+uses
+  ctypes;
+
+const
+  // CoProcessor registers
+  DIV_CR				    : pcuint16 = pointer($04000280);
+  DIV_NUMERATOR64		: pcint64  = pointer($04000290);
+  DIV_DENOMINATOR32	: pcint32  = pointer($04000298);
+  DIV_RESULT32		  : pcint32  = pointer($040002A0);
+  DIV_64_32 = 1;
+  DIV_BUSY	= (1 shl 15);
+
+function mydivf32(num: cint32; den: cint32): cint32; inline;
+begin
+	DIV_CR^ := DIV_64_32;
+	while (DIV_CR^ and DIV_BUSY) <> 0 do;
+	DIV_NUMERATOR64^ := cint64(num) shl 12;
+  DIV_DENOMINATOR32^ := den;
+	while (DIV_CR^ and DIV_BUSY) <> 0 do;
+	mydivf32 := DIV_RESULT32^;
+end;
+
+var
+  a: cint32;
+begin
+  a := mydivf32(10, 2);
+end.

+ 53 - 0
tests/webtbs/tw9162.pp

@@ -0,0 +1,53 @@
+program DestBug;
+
+{$APPTYPE CONSOLE}
+{$MODE Delphi}
+
+uses
+  Variants, SysUtils;
+
+type
+  TSampleVariant = class(TCustomVariantType)
+  protected
+    procedure Clear(var V: TVarData); override;
+    procedure Copy(var Dest: TVarData; const Source: TVarData; const Indirect: Boolean ); override;
+    procedure DispInvoke(Dest: PVarData; const Source: TVarData; CallDesc: PCallDesc; Params: Pointer); override;
+  end;
+
+procedure TSampleVariant.Clear(var V: TVarData);
+begin
+  V.VType:=varEmpty;
+end;
+
+procedure TSampleVariant.Copy(var Dest: TVarData; const Source: TVarData; const Indirect: Boolean);
+begin
+  if Indirect and VarDataIsByRef(Source) then
+    VarDataCopyNoInd(Dest, Source)
+  else with Dest do
+    VType:=Source.VType;
+end;
+
+var
+  p : pointer;
+
+procedure TSampleVariant.DispInvoke(Dest: PVarData; const Source: TVarData; CallDesc: PCallDesc; Params: Pointer);
+begin
+  Writeln('Dest is 0x', IntToStr(Cardinal(Dest)));
+  p:=Dest;
+end;
+
+var
+  SampleVariant: TSampleVariant;
+  v, v1: Variant;
+
+begin
+  SampleVariant:=TSampleVariant.Create;
+  TVarData(v).VType:=SampleVariant.VarType;
+  v.SomeProc;
+  if assigned(p) then
+    halt(1);
+  v1:=v.SomeFunc;
+  if not(assigned(p)) then
+    halt(1);
+  writeln('ok');
+end.

+ 8 - 0
tests/webtbs/uw9113a.pp

@@ -0,0 +1,8 @@
+unit uw9113a;
+interface
+var
+    v1: integer = 1; cvar;
+    v2: integer = 2; export name '_v2';
+    v3: integer = 3; public name '_v3';
+implementation
+end.

+ 8 - 0
tests/webtbs/uw9113b.pp

@@ -0,0 +1,8 @@
+{$mode macpas}
+unit uw9113b;
+interface
+var
+    v4: integer = 4; cvar;
+    v5: integer = 5; export name '_v5';
+    v6: integer = 6; public name '_v6';
+end.