Pārlūkot izejas kodu

Added support for type helpers. In non Delphi modes they use "type helper" and in mode Delphi they use "record helper". They can also be used on constants.

symconst.pas:
  + extend "thelpertype" by "ht_type" which tells the code in "pdecobj.parse_extended_type" that a type helper declaration has been parsed
node.pas:
  + add a constant which identifies all constant node types
ptype.pas:
  + read_named_type: add a parameter "hadtypetoken" to tell the code whether a "type" token had been parsed before
  + read_named_type: if an identifier "helper" is parsed we need to check whether "hadtypetoken" is true and the modeswitch "m_class" is set, but the "m_delphi" one is not; in that case we have a "type helper" declaration
pgenutil.pas, generate_specialization:
  * adjust call to read_named_type
pdecl.pas, types_dec:
  * adjust call to read_named_type

pdecobj.pas:
  * parse_extended_type: extend for correct handling of primitive types (includes Delphi compatible handling as well) and reject types that are explicitly not allowed
  * method_dec: require "static" for class methods in type helpers
  * method_doc: allow constructors for type helpers as well
paramgr.pas, tparamanager:
  * set_common_funcretloc_info: handle type helper constructors like record constructors
  * handle_common_ret_in_param: the "self" value of a type helper constructor is also returned in a parameter
pexpr.pas:
  + add a function to postfixoperators which tries to find and apply a type helper for a given type
  * postfixoperators: try to apply type helpers for ordinal constants
  * postfixoperators: use the correct string type for string constants
  * postfixoperators: try to apply type helpers for enum constants
  * postfixoperators: try to apply type helpers for arrays
  * postfixoperators: try to apply type helpers for Variant
  * postfixoperators: try to apply type helpers for pointer types
  * postfixoperators: try to apply type helpers for other types
  * factor: check postfixoperators after _REALNUMBER, _CCHAR, _CWCHAR, _TRUE and _FALSE
  * factor: also check postfixoperators if a _POINT follows a _NIL

symdef.pas, tdefawaresymtablestack.addhelpers:
  * use "generate_objectpascal_helper_key" to generate the key
symtable.pas:
  + add function to generate the key value for the map of extended types using the extended def
  * adjust "search_last_objectpascal_helper" and "search_objectpascal_helper" to handle primitive types as well
  * use the new "generate_objectpascal_helper_key" function to generate the key

pparautl.pas:
  * insert_self_and_vmt_para: don't insert the $vmt symbol for record or type helpers (ToDo: check whether class helpers really need the symbol as well)
  * insert_self_and_vmt_para: pass "self" as var parameter for type helpers as well
psub.pas, generate_bodyentry_block: 
  * also allow type helpers for constructor methods
ncal.pas, tcallnode.gen_self_tree:
  * also use a temp variable for type helper constructors
ncgcal.pas, tcgcallnode.secondcallparan:
  * allow Pointers to be passed as address param if it is the Self value of a type helper extending a pointer type
  * correctly handle the location in case of type helper constructors

+ add tests

git-svn-id: trunk@23580 -
svenbarth 12 gadi atpakaļ
vecāks
revīzija
344571cb4e

+ 20 - 0
.gitattributes

@@ -11546,6 +11546,25 @@ tests/test/tstrutils1.pp svneol=native#text/plain
 tests/test/tstrutils2.pp svneol=native#text/plain
 tests/test/tsubdecl.pp svneol=native#text/plain
 tests/test/tsymlibrary1.pp svneol=native#text/pascal
+tests/test/tthlp1.pp svneol=native#text/pascal
+tests/test/tthlp10.pp svneol=native#text/pascal
+tests/test/tthlp11.pp svneol=native#text/pascal
+tests/test/tthlp12.pp svneol=native#text/pascal
+tests/test/tthlp13.pp svneol=native#text/pascal
+tests/test/tthlp14.pp svneol=native#text/pascal
+tests/test/tthlp15.pp svneol=native#text/pascal
+tests/test/tthlp16.pp svneol=native#text/pascal
+tests/test/tthlp17.pp svneol=native#text/pascal
+tests/test/tthlp18.pp svneol=native#text/pascal
+tests/test/tthlp19.pp svneol=native#text/pascal
+tests/test/tthlp2.pp svneol=native#text/pascal
+tests/test/tthlp3.pp svneol=native#text/pascal
+tests/test/tthlp4.pp svneol=native#text/pascal
+tests/test/tthlp5.pp svneol=native#text/pascal
+tests/test/tthlp6.pp svneol=native#text/pascal
+tests/test/tthlp7.pp svneol=native#text/pascal
+tests/test/tthlp8.pp svneol=native#text/pascal
+tests/test/tthlp9.pp svneol=native#text/pascal
 tests/test/ttpara1.pp svneol=native#text/plain
 tests/test/ttpara2.pp svneol=native#text/plain
 tests/test/ttypeconvtypes.pp svneol=native#text/pascal
@@ -11844,6 +11863,7 @@ tests/test/urhlp17.pp svneol=native#text/pascal
 tests/test/usprot1.pp svneol=native#text/plain
 tests/test/usprot2.pp svneol=native#text/plain
 tests/test/utasout.pp svneol=native#text/plain
+tests/test/uthlp.pp svneol=native#text/pascal
 tests/test/uunit1.pp svneol=native#text/plain
 tests/test/uunit2a.pp svneol=native#text/plain
 tests/test/uunit2b.pp svneol=native#text/plain

+ 9 - 5
compiler/msg/errore.msg

@@ -1385,8 +1385,8 @@ parser_e_no_destructor_in_records=03300_E_Destructors aren't allowed in records
 parser_e_class_methods_only_static_in_records=03301_E_Class methods must be static in records
 % Class methods declarations aren't allowed in records without static modifier.
 % Records have no inheritance and therefore non static class methods have no sence for them.
-parser_e_no_parameterless_constructor_in_records=03302_E_Parameterless constructors aren't allowed in records or record helpers
-% Constructor declarations with no arguments aren't allowed in records or record helpers.
+parser_e_no_parameterless_constructor_in_records=03302_E_Parameterless constructors aren't allowed in records or record/type helpers
+% Constructor declarations with no arguments aren't allowed in records or record/type helpers.
 parser_e_at_least_one_argument_must_be_of_type=03303_E_Either the result or at least one parameter must be of type "$1"
 % It is required that either the result of the routine or at least one of its parameters be of the specified type.
 % For example class operators either take an instance of the structured type in which they are defined, or they return one.
@@ -1488,7 +1488,7 @@ parser_e_no_class_in_local_anonymous_records=03331_E_Class memeber declarations
 %
 # Type Checking
 #
-# 04119 is the last used one
+# 04120 is the last used one
 #
 % \section{Type checking errors}
 % This section lists all errors that can occur when type checking is
@@ -1845,7 +1845,7 @@ type_e_record_type_expected=04100_E_Record type expected
 type_e_class_helper_must_extend_subclass=04101_E_Derived class helper must extend a subclass of "$1" or the class itself
 % If a class helper inherits from another class helper the extended class must
 % extend either the same class as the parent class helper or a subclass of it
-type_e_record_helper_must_extend_same_record=04102_E_Derived record helper must extend "$1"
+type_e_record_helper_must_extend_same_record=04102_E_Derived record or type helper must extend "$1"
 % If a record helper inherits from another record helper it must extend the same
 % record that the parent record helper extended.
 type_e_procedures_return_no_value=04103_E_Invalid assignment, procedures return no value
@@ -1910,11 +1910,13 @@ type_e_typeof_requires_vmt=04118_E_TYPEOF can only be used on object types with
 type_e_invalid_default_value=04119_E_It is not possible to define a default value for a parameter of type "$1"
 % Parameters declared as structured types, such as files, variants, non-dynamic
 % arrays and TP-style objects, cannot have a default value.
+type_e_type_not_allowed_for_type_helper=04120_E_Type "$1" can not be extended by a type helper
+% Types like procedural variables can not be extended by type helpers
 % \end{description}
 #
 # Symtable
 #
-# 05086 is the last used one
+# 05087 is the last used one
 #
 % \section{Symbol handling}
 % This section lists all the messages that concern the handling of symbols.
@@ -2178,6 +2180,8 @@ sym_e_no_matching_inherited_parameterless_constructor=05086_E_Cannot generate de
 % the parameterless constructor from the parent class inside this added constructor.
 % This is however impossible if the parent class does not declare such a constructor.
 % In this case you must add a valid constructor yourself.
+sym_d_adding_helper_for=05087_D_Adding helper for $1
+% A helper for the mentioned type is added to the current scope
 % \end{description}
 #
 # Codegenerator

+ 4 - 2
compiler/msgidx.inc

@@ -537,6 +537,7 @@ const
   type_e_interface_lower_visibility=04117;
   type_e_typeof_requires_vmt=04118;
   type_e_invalid_default_value=04119;
+  type_e_type_not_allowed_for_type_helper=04120;
   sym_e_id_not_found=05000;
   sym_f_internal_error_in_symtablestack=05001;
   sym_e_duplicate_id=05002;
@@ -610,6 +611,7 @@ const
   sym_w_library_overload=05084;
   sym_e_duplicate_id_create_java_constructor=05085;
   sym_e_no_matching_inherited_parameterless_constructor=05086;
+  sym_d_adding_helper_for=05087;
   cg_e_parasize_too_big=06009;
   cg_e_file_must_call_by_reference=06012;
   cg_e_cant_use_far_pointer_there=06013;
@@ -968,9 +970,9 @@ const
   option_info=11024;
   option_help_pages=11025;
 
-  MsgTxtSize = 68592;
+  MsgTxtSize = 68689;
 
   MsgIdxMax : array[1..20] of longint=(
-    26,93,332,120,87,56,126,27,202,63,
+    26,93,332,121,88,56,126,27,202,63,
     54,20,1,1,1,1,1,1,1,1
   );

+ 428 - 430
compiler/msgtxt.inc

@@ -1,7 +1,7 @@
 {$ifdef Delphi}
-const msgtxt : array[0..000285] of string[240]=(
+const msgtxt : array[0..000286] of string[240]=(
 {$else Delphi}
-const msgtxt : array[0..000285,1..240] of char=(
+const msgtxt : array[0..000286,1..240] of char=(
 {$endif Delphi}
   '01000_T_Compiler: $1'#000+
   '01001_D_Compiler OS: $1'#000+
@@ -481,716 +481,715 @@ const msgtxt : array[0..000285,1..240] of char=(
   '03300_E_De','structors aren'#039't allowed in records or helpers'#000+
   '03301_E_Class methods must be static in records'#000+
   '03302_E_Parameterless constructors aren'#039't allowed in records or re'+
-  'cord helpers'#000+
-  '03303_E_Either the result or at least one parameter must be of typ','e '+
+  'cord/type helpers'#000+
+  '03303_E_Either the result or at least one parameter must be o','f type '+
   '"$1"'#000+
   '03304_E_Type parameters may require initialization/finalization - can'#039+
   't be used in variant records'#000+
   '03305_E_Variables being declared as external cannot be in a custom sec'+
   'tion'#000+
-  '03306_E_Non-static and non-global variables cannot have a s','ection di'+
+  '03306_E_Non-static and non-global variables cannot hav','e a section di'+
   'rective'#000+
   '03307_E_"$1" is not allowed in helper types'#000+
   '03308_E_Class constructors aren'#039't allowed in helpers'#000+
   '03309_E_The use of "inherited" is not allowed in a record'#000+
-  '03310_E_Type declarations are not allowed in local or anonymous reco','r'+
-  'ds'#000+
+  '03310_E_Type declarations are not allowed in local or anonymous',' reco'+
+  'rds'#000+
   '03311_E_Duplicate implements clause for interface "$1"'#000+
   '03312_E_Interface "$1" can'#039't be delegated by "$2", it already has '+
   'method resolutions'#000+
   '03313_E_Interface "$1" can'#039't have method resolutions, "$2" already'+
   ' delegates it'#000+
-  '03314_E_Invalid ','codepage'#000+
+  '03314_E_Inv','alid codepage'#000+
   '03315_E_Only fields (var-sections) and constants can be final in objec'+
   't types'#000+
   '03316_E_Final fields are currently only supported for external classes'+
   #000+
   '03317_E_Typed constants are not allowed here, only formal constants ar'+
   'e'#000+
-  '03318_E_Co','nstructors are not automatically inherited in the JVM; exp'+
+  '03318','_E_Constructors are not automatically inherited in the JVM; exp'+
   'licitly add a constructor that calls the inherited one if you need it'#000+
   '03319_D_Parsing internally generated code: $1'#000+
-  '03320_E_This language feature is not supported on managed VM targe','ts'+
+  '03320_E_This language feature is not supported on managed VM ','targets'+
   #000+
   '03321_E_Calling a virtual constructor for the current instance inside '+
   'another constructor is not possible on the JVM target'#000+
   '03322_E_Overriding method "$1" cannot have a lower visibility ($2) tha'+
   'n in parent class $3 ($4)'#000+
-  '03323_W_Procedure','/Function declared with call option NOSTACKFRAME bu'+
+  '03323_W_Proc','edure/Function declared with call option NOSTACKFRAME bu'+
   't without ASSEMBLER'#000+
   '03324_E_Procedure/Function declared with call option NOSTACKFRAME but '+
   'local stack size is $1'#000+
   '03325_E_Cannot generate property getter/setter $1 because its name cla'+
-  'shes w','ith existing identifier $2'#000+
+  's','hes with existing identifier $2'#000+
   '03326_W_Automatically generated property getter/setter $1 overrides th'+
   'e same-named getter/setter in class $2'#000+
   '03327_W_Case mismatch between declared property getter/setter $1 and a'+
-  'utomatically constructed name $2, ','not changing declared name'#000+
+  'utomatically constructed name',' $2, not changing declared name'#000+
   '03328_E_Constants declarations are not allowed in local or anonymous r'+
   'ecords'#000+
   '03329_E_Method declarations are not allowed in local or anonymous reco'+
   'rds'#000+
-  '03330_E_Property declarations are not allowed in local or anon','ymous '+
+  '03330_E_Property declarations are not allowed in local or',' anonymous '+
   'records'#000+
   '03331_E_Class memeber declarations are not allowed in local or anonymo'+
   'us records'#000+
   '04000_E_Type mismatch'#000+
   '04001_E_Incompatible types: got "$1" expected "$2"'#000+
   '04002_E_Type mismatch between "$1" and "$2"'#000+
-  '04003_E_Type identifier expe','cted'#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+
-  '04009_E_class 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 type to COMP which is '+
-  'an integer type'#000+
-  '0401','5_H_use DIV instead to get an integer result'#000+
+  'an integer type',#000+
+  '04015_H_use DIV instead to get an integer result'#000+
   '04016_E_String types have to match exactly in $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+
-  '04019_E_Can'#039't use readln or w','riteln on typed file'#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+
-  '04024_E_Wrong type "$','1" in array constructor'#000+
+  '04024_E_Wrong ty','pe "$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 internal math function'#000+
-  '04028_E_Can'#039't take the',' address of constant expressions'#000+
+  '04028_E_Can'#039't tak','e the address of constant expressions'#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 to const variable'#000+
-  '04033_E_Array',' type required'#000+
+  '04033_E_','Array type required'#000+
   '04034_E_interface type expected, but got "$1"'#000+
   '04035_H_Mixing signed expressions and longwords gives a 64bit result'#000+
   '04036_W_Mixing signed expressions and cardinals here may cause a range'+
   ' check error'#000+
-  '04037_E_Typecast has differ','ent size ($1 -> $2) in assignment'#000+
+  '04037_E_Typecast has d','ifferent 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+
   '04040_W_Class types "$1" and "$2" are not related'#000+
-  '04041_E_Class or interface type expe','cted, 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 might be always false due to range of constant and '+
   'expression'#000+
-  '04045_W_Comparison might be ','always true due to range of constant and'+
+  '04045_W_Comparison migh','t be always true due to range of constant and'+
   ' expression'#000+
   '04046_W_Constructing a class "$1" with abstract method "$2"'#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',' 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'+
   'ble'#000+
-  '04052_E_Constant Expression expe','cted'#000+
+  '04052_E_Constant Expression',' expected'#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 portabl','e'#000+
+  '04056_W_Conversion between ordinals and pointers is not po','rtable'#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 typ','e expected, but got "$1"'#000+
+  '04060_E_Class or COM interfac','e 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+
-  '0','4064_E_Elements of packed arrays cannot be of a type which need to '+
-  'be initialised'#000+
+  'ed) Arr','ay"'#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 of a subroutine marked as local'#000+
+  '040','76_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 the add could pre'+
-  'vent overflow errors.',#000+
+  'vent overflow er','rors.'#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_Converting pointers to signed integer','s may result in wrong c'+
+  '04082_W_Converting pointers to signed in','tegers may result in wrong c'+
   'omparison results and range errors, use an unsigned type instead.'#000+
   '04083_E_Interface type $1 has no valid GUID'#000+
   '04084_E_Invalid selector name "$1"'#000+
   '04085_E_Expected Objective-C method, but got $1'#000+
-  '04086_E_Expected Objecti','ve-C method or constant method name'#000+
+  '04086_E_Expected Ob','jective-C method or constant method name'#000+
   '04087_E_No type info available for this type'#000+
   '04088_E_Ordinal or string expression expected'#000+
   '04089_E_String expression expected'#000+
   '04090_W_Converting 0 to NIL'#000+
-  '04091_E_Objective-C protocol type expected, but go','t "$1"'#000+
+  '04091_E_Objective-C protocol type expected, b','ut got "$1"'#000+
   '04092_E_The type "$1" is not supported for interaction with the Object'+
   'ive-C runtime.'#000+
   '04093_E_Class or objcclass type expected, but got "$1"'#000+
   '04094_E_Objcclass type expected'#000+
-  '04095_W_Coerced univ parameter type in procedural variable ma','y cause'+
+  '04095_W_Coerced univ parameter type in procedural variab','le may cause'+
   ' crash or memory corruption: $1 to $2'#000+
   '04096_E_Type parameters of specializations of generics cannot referenc'+
   'e the currently specialized type'#000+
   '04097_E_Type parameters are not allowed on non-generic class/record/ob'+
-  'ject procedure or func','tion'#000+
+  'ject procedure or',' function'#000+
   '04098_E_Generic declaration of "$1" differs from previous declaration'#000+
   '04099_E_Helper type expected'#000+
   '04100_E_Record type expected'#000+
   '04101_E_Derived class helper must extend a subclass of "$1" or the cla'+
   'ss itself'#000+
-  '04102_E_Derived record help','er must extend "$1"'#000+
+  '04102_E_Derived record',' or type helper must extend "$1"'#000+
   '04103_E_Invalid assignment, procedures return no value'#000+
   '04104_W_Implicit string type conversion from "$1" to "$2"'#000+
   '04105_W_Implicit string type conversion with potential data loss from '+
   '"$1" to "$2"'#000+
-  '04106_-W_Explicit string',' typecast from "$1" to "$2"'#000+
+  '04106_-W_Ex','plicit string typecast from "$1" to "$2"'#000+
   '04107_-W_Explicit string typecast with potential data loss from "$1" t'+
   'o "$2"'#000+
   '04108_W_Unicode constant cast with potential data loss'#000+
-  '04109_E_range check error while evaluating constants ($1 must be betwe'+
-  'en $2 and ','$3)'#000+
+  '04109_E_range check error while evaluating constants ($1 must be be','t'+
+  'ween $2 and $3)'#000+
   '04110_W_range check error while evaluating constants ($1 must be betwe'+
   'en $2 and $3)'#000+
   '04111_E_This type is not supported for the Default() intrinsic'#000+
   '04112_E_JVM virtual class methods cannot be static'#000+
-  '04113_E_Final (class) fields can only ','be assigned in their class'#039+
+  '04113_E_Final (class) fie','lds can only be assigned in their class'#039+
   ' (class) constructor'#000+
   '04114_E_It is not possible to typecast untyped parameters on managed p'+
   'latforms, simply assign a value to them instead.'#000+
-  '04115_E_The assignment side of an expression cannot be typecasted to a'+
-  ' su','pertype on managed platforms'#000+
+  '04115_E_The assignment side of an expression cannot be typec','asted to'+
+  ' a supertype on managed platforms'#000+
   '04116_-W_The interface method "$1" raises the visibility of "$2" to pu'+
   'blic when accessed via an interface instance'#000+
   '04117_E_The interface method "$1" has a higher visibility (public) tha'+
   'n "$2"'#000+
-  '04118_E_TYPEOF can ','only be used on object types with VMT'#000+
+  '04118_','E_TYPEOF can only be used on object types with VMT'#000+
   '04119_E_It is not possible to define a default value for a parameter o'+
   'f type "$1"'#000+
+  '04120_E_Type "$1" can not be extended by a type helper'#000+
   '05000_E_Identifier not found "$1"'#000+
-  '05001_F_Internal Error in SymTableStack()'#000+
+  '05001_F_Internal E','rror in SymTableStack()'#000+
   '05002_E_Duplicate identifier "$1"'#000+
-  '05003_H_Id','entifier 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 stati','c methods or outsi'+
-  'de methods'#000+
+  '05009_E_Forward type ','not resolved "$1"'#000+
+  '05010_E_Only static variables can be used in static methods or outside'+
+  ' 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+
+  '05014_W_Label not defined',' "$1"'#000+
   '05015_E_Label used but not defined "$1"'#000+
-  '05016_E_Illegal label ','declaration'#000+
+  '05016_E_Illegal label 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 definition n','ot resolved "$1"'#000+
+  '05021_E_illegal',' type declaration of set elements'#000+
+  '05022_E_Forward class definition 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+
+  '05026_H_Value parameter "$1" is assigned but never us','ed'#000+
   '05027_N_Local variable "$1" is assigned but never used'#000+
-  '05028_H_Lo','cal $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+
+  '05032','_E_Set type expected'#000+
+  '05033_W_Function result does not seem to be 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+
+  '05036_W_Local variable "$1" does not seem to be initialized',#000+
   '05037_W_Variable "$1" does not seem to be initialized'#000+
-  '05038_E_ident','ifier 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+
+  '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_Symbol "$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 seem to ini','tialized'#000+
+  '05058_H_Variable "$1" does not seem to ','be initialized'#000+
+  '05059_W_Function result variable does not seem to 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+
-  '05063_W_Symbol "$1" is experimental'#000+
-  '05064_W_Forward declaration "$1" not resolved, a','ssumed external'#000+
+  '05063_W_Symbol "','$1" is experimental'#000+
+  '05064_W_Forward declaration "$1" not resolved, assumed external'#000+
   '05065_W_Symbol "$1" is belongs to a library'#000+
   '05066_W_Symbol "$1" is deprecated: "$2"'#000+
   '05067_E_Cannot find an enumerator for the type "$1"'#000+
-  '05068_E_Cannot find a "MoveNext" method in enumerator "$1"'#000+
-  '05069_E_Cannot find a "Curren','t" property in enumerator "$1"'#000+
+  '05068_E_Cannot find ','a "MoveNext" method in enumerator "$1"'#000+
+  '05069_E_Cannot find a "Current" property in enumerator "$1"'#000+
   '05070_E_Mismatch between number of declared parameters and number of c'+
   'olons in message string.'#000+
   '05071_N_Private type "$1.$2" never used'#000+
-  '05072_N_Private const "$1.$2" never used'#000+
-  '05073_N_Private property "$1.$2" ','never used'#000+
+  '05072_','N_Private const "$1.$2" never used'#000+
+  '05073_N_Private property "$1.$2" never used'#000+
   '05074_W_Unit "$1" is deprecated'#000+
   '05075_W_Unit "$1" is deprecated: "$2"'#000+
   '05076_W_Unit "$1" is not portable'#000+
   '05077_W_Unit "$1" is belongs to a library'#000+
-  '05078_W_Unit "$1" is not implemented'#000+
+  '05078_W_Unit "$','1" is not implemented'#000+
   '05079_W_Unit "$1" is experimental'#000+
-  '05080_E_No c','omplete definition of the formally declared class "$1" i'+
-  's in scope'#000+
+  '05080_E_No complete definition of the formally declared class "$1" is '+
+  'in scope'#000+
   '05081_E_Gotos into initialization or finalization blocks of units are '+
   'not allowed'#000+
-  '05082_E_Invalid external name "$1" for formal class "$2"'#000+
-  '05083_E_Complete class definition ','with external name "$1" here'#000+
+  '05082_E_Invalid externa','l name "$1" for formal class "$2"'#000+
+  '05083_E_Complete class definition with external name "$1" here'#000+
   '05084_W_Possible library conflict: symbol "$1" from library "$2" also '+
   'found in library "$3"'#000+
-  '05085_E_Cannot add implicit constructor '#039'Create'#039' because ident'+
-  'ifier already used by "$1"'#000+
-  '05086_E_Cannot generate defaul','t constructor for class, because paren'+
-  't has no parameterless constructor'#000+
+  '05085_E_Cannot add implicit constructor '#039'Create'#039' be','cause ide'+
+  'ntifier already used by "$1"'#000+
+  '05086_E_Cannot generate default constructor for class, because parent '+
+  'has no parameterless constructor'#000+
+  '05087_D_Adding helper for $1'#000+
   '06009_E_Parameter list size exceeds 65535 bytes'#000+
-  '06012_E_File types must be var parameters'#000+
+  '06012_E_File types mus','t 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+
+  '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_Abstract 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+
+  '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+
+  '06033_E_No code for inline procedure stored',#000+
   '06035_E_Element zero of an ansi/wide- or longstring can'#039't be acces'+
   'sed, use (set)length instead'#000+
-  '0','6037_E_Constructors or destructors cannot be called inside a '#039'w'+
-  'ith'#039' clause'#000+
+  '06037_E_Constructors or destructors cannot be called inside a '#039'wit'+
+  'h'#039' clause'#000+
   '06038_E_Cannot call message handler methods directly'#000+
-  '06039_E_Jump in or outside of an exception block'#000+
-  '06040_E_Control flow statements aren'#039't allowed in a finally blo','c'+
-  'k'#000+
+  '06039_E_Jump in',' or outside 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 s','ize exceeds supported limit'#000+
   '06044_E_BREAK not allowed'#000+
   '06045_E_CONTINUE not allowed'#000+
-  '06046_F_Unknow','n compilerproc "$1". Check if you use the correct run '+
-  'time library.'#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 library.'#000+
+  ' time',' library.'#000+
   '06048_H_Inherited call to abstract method ignored'#000+
-  '06049_E_Goto label "$1" not defined o','r optimized away'#000+
+  '06049_E_Goto label "$1" not defined or optimized away'#000+
   '06050_F_Cannot find type "$1" in unit "$2". Check if you use the corre'+
   'ct run time library.'#000+
-  '06051_E_Interprocedural gotos are allowed only to outer subroutines'#000+
-  '06052_E_Label must be defined in the same scope as it is declare','d'#000+
+  '06051_E_Interprocedural gotos are a','llowed only to outer subroutines'#000+
+  '06052_E_Label must be defined in the same scope as it is declared'#000+
   '06053_E_Leaving procedures containing explicit or implicit exceptions '+
   'frames using goto is not allowed'#000+
-  '06054_E_In ISO mode, the mod operator is defined only for positive quo'+
-  'tient'#000+
+  '06054_E_In ISO mode, the mod operator ','is defined only for positive q'+
+  'uotient'#000+
   '06055_DL_Auto inlining: $1'#000+
-  '07000_DL_Starting $1 styled asse','mbler parsing'#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 used without identifier'#000+
+  '07005_E_O','FFSET used without identifier'#000+
   '07006_E_TYPE used without identifier'#000+
-  '07007_E_Cannot use local varia','ble or parameters here'#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 symbol can only be added'#000+
+  '07011_E_Reloc','atable symbol can only be added'#000+
   '07012_E_Invalid constant expression'#000+
-  '07013_E_Relocatable symbol is',' not allowed'#000+
+  '07013_E_Relocatable symbol is not allowed'#000+
   '07014_E_Invalid reference syntax'#000+
   '07015_E_You cannot reach $1 from that code'#000+
-  '07016_E_Local symbols/labels aren'#039't allowed as references'#000+
+  '07016_E_Local symbols/labels aren'#039't allowed as referen','ces'#000+
   '07017_E_Invalid base and index register usage'#000+
-  '07018_W_Possible error in object field handling',#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+
+  '07022_E_Invalid string as opcode opera','nd: $1'#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+
+  '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 cause emulation problems with emu387'#000+
+  '07029_W_Fwait',' can cause emulation problems with emu387'#000+
   '07030_W_$1 without operand translated into $1P'#000+
-  '07031_W_','ENTER instruction is not supported by Linux kernel'#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+
+  '07033_E_Unsupported symbol type for operan','d'#000+
   '07034_E_Constant value out of bounds'#000+
   '07035_E_Error converting decimal $1'#000+
-  '07036_E_Error converti','ng octal $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 overloaded function'#000+
+  '07040_W_$1 is associated to ','an overloaded function'#000+
   '07041_E_Cannot use SELF outside a method'#000+
-  '07042_E_Cannot use OLDEBP outside',' a nested procedure'#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 sour','ce size do not match'#000+
   '07046_W_Size suffix and destination or source size do not match'#000+
-  '07047_E_Asse','mbler syntax error'#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 constant'#000+
+  '07050_E_Assembler syntax error ','in constant'#000+
   '07051_E_Invalid String expression'#000+
-  '07052_W_constant with symbol $1 for address which i','s not on a pointe'+
-  'r'#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_Invalid combination of override and opcode: $1'#000+
+  '07056_','E_Invalid combination of override and opcode: $1'#000+
   '07057_E_Too many operands on line'#000+
-  '07058_W_NEAR i','gnored'#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 register name'#000+
+  '07063_E_Inva','lid 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+
+  '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 p','arameter with a register'#000+
   '07071_E_Invalid segment override expression'#000+
-  '07072_W_Identifier $1 suppos','ed external'#000+
+  '07072_W_Identifier $1 supposed external'#000+
   '07073_E_Strings not allowed as constants'#000+
   '07074_E_No type of variable specified'#000+
-  '07075_E_assembler code not returned to text section'#000+
+  '07075_E_assembler code not returned to text section'#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+
+  '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+
+  '07080_N_.align is target specific, use .balign or .p2alig','n'#000+
   '07081_E_Can'#039't access fields directly for parameters'#000+
-  '07082_E_Can'#039't access fields of objects/clas','ses directly'#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 operand translated into "$1 %st,%st(1)"'#000+
-  '07087_W_"$1 %st(n)" translated into "$1 %st,%st(','n)"'#000+
+  '07086_W_"$1"',' without operand 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+
+  '07093_W_ALIGN not suppo','rted'#000+
   '07094_E_Inc and Dec cannot be together'#000+
   '07095_E_Invalid reglist for movem'#000+
-  '07096_E_Reglist inv','alid for opcode'#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+
+  'ands, using DWORD a','s default'#000+
   '07099_E_Syntax error while trying to parse a shifter operand'#000+
-  '07100_E_Address of packed ','component is not at a byte boundary'#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 +offset(%ebp) for parameters invalid here'#000+
-  '07103_W_Use of +offset(%ebp) is not compatible wi','th regcall conventi'+
-  'on'#000+
+  '07102_W_U','se 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 be'+
-  ' lost'#000+
-  '07106_E_VMTOffset must be used in combination with a virtual method,',' '+
-  'and "$1" is not virtual'#000+
+  '07105_W_Use of -offset(%esp), access may cause ','a crash or value may '+
+  'be lost'#000+
+  '07106_E_VMTOffset must be used in combination with a virtual method, a'+
+  'nd "$1" is not virtual'#000+
   '07107_E_Generating PIC, but reference is not PIC-safe'#000+
-  '07108_E_All registers in a register set must be of the same kind and w'+
-  'idth'#000+
+  '07108_E_All registers in a register set must be of the same kind',' and'+
+  ' width'#000+
   '07109_E_A register set cannot be empty'#000+
-  '07110_W_@GOTPCREL is useless and potentially da','ngereous for local sy'+
-  'mbols'#000+
+  '07110_W_@GOTPCREL is useless and potentially dangereous for local symb'+
+  'ols'#000+
   '07111_W_Constant with general purpose segment register'#000+
   '07112_E_Invalid offset value for $1'#000+
-  '07113_E_Invalid register for $1'#000+
+  '07113_E_Invalid register ','for $1'#000+
   '07114_E_SEH directives are allowed only in pure assembler procedures'#000+
-  '07115_E_Directive "$1','" is not supported for the current target'#000+
+  '07115_E_Directive "$1" is not supported for the current target'#000+
   '07116_E_This function'#039's result location cannot be encoded directly'+
-  ' in a single operand when "nostackframe" is used'#000+
+  ' in a single operand when "nostackf','rame" is used'#000+
   '07117_E_GOTPCREL references in Intel assembler syntax cannot contain a'+
-  ' base or inde','x register, and their offset must 0.'#000+
+  ' base or index register, and their offset must 0.'#000+
   '07118_E_The current target does not support GOTPCREL relocations'#000+
-  '07119_W_Exported/global symbols should accessed via the GOT'#000+
+  '07119_W_Exported/global symbols should ac','cessed via the GOT'#000+
   '07120_W_Check size of memory operand "$1"'#000+
-  '07121_W_Check size of memory operand',' "$1: memory-operand-size is $2 '+
-  'bits, but expected [$3 bits]"'#000+
+  '07121_W_Check size of memory operand "$1: memory-operand-size is $2 bi'+
+  'ts, but expected [$3 bits]"'#000+
   '07122_W_Check size of memory operand "$1: memory-operand-size is $2 bi'+
-  'ts, but expected [$3 bits + $4 byte offset]"'#000+
-  '07123_W_Check "$1: offset of memory operand is negative "$2 byt','e"'#000+
+  'ts, but exp','ected [$3 bits + $4 byte offset]"'#000+
+  '07123_W_Check "$1: offset of memory operand is negative "$2 byte"'#000+
   '07124_W_Check "$1: size of memory operand is empty, but es exists diff'+
-  'erent definitions of the memory size =>> map to $2 (smallest option)"'#000+
+  'erent definitions of the memory size =>> map to $2 (smallest option)"'#000,
   '07125_E_Invalid register used in memory reference expression: "$1"'#000+
-  '08000_F_Too many assembler fil','es'#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 support for binary writers'#000+
-  '08004_E_Allocating of data is only allowed in bss section'#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 n','ot in table'#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 references not supported'#000+
-  '08009_E_Asm: Invalid effective address'#000+
+  '08009_E_Asm: Invalid effect','ive address'#000+
   '08010_E_Asm: Immediate or reference expected'#000+
-  '08011_E_Asm: $1 value exceeds bounds $2'#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+
-  '08015_E_Asm: Extended type not supported for this target'#000+
+  '08015_E_Asm: Ex','tended type not supported for this target'#000+
   '08016_E_Asm: Duplicate label $1'#000+
-  '08017_E_Asm: Redefined ','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 Bit references not supported'#000+
-  '08021_E_Asm: 64 Bit operands not supported'#000+
+  '08021_E_Asm: 64 Bi','t operands not supported'#000+
   '08022_E_Asm: AH,BH,CH or DH cannot be used in an instruction requiring'+
-  ' R','EX prefix'#000+
+  ' REX prefix'#000+
   '08023_E_Missing .seh_endprologue directive'#000+
   '08024_E_Function prologue exceeds 255 bytes'#000+
-  '08025_E_.seh_handlerdata directive without preceding .seh_handler'#000+
+  '08025_E_.seh_handlerdata directive without pre','ceding .seh_handler'#000+
   '08026_F_Relocation count for section $1 exceeds 65535'#000+
-  '09000_W_Source operatin','g system redefined'#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 (error code: $2)'#000+
-  '09004_E_Can'#039't create archive file: $1'#000+
-  '09005_E_Assembler $1 not found, switching to external assemb','ling'#000+
+  '0','9004_E_Can'#039't create archive 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+
+  's','sembling'#000+
   '09009_I_Assembling $1'#000+
   '09010_I_Assembling with smartlinking $1'#000+
-  '09011_W_Object $1 not foun','d, Linking may fail !'#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+
+  '09014_E_Can'#039't call the linker, switching to ','external linking'#000+
   '09015_I_Linking $1'#000+
   '09016_E_Util $1 not found, switching to external linking'#000+
-  '0901','7_T_Using util $1'#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+
+  '09020_I_Closing scri','pt $1'#000+
   '09021_E_resource compiler "$1" not found, switching to external mode'#000+
-  '09022_I_Compiling reso','urce $1'#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+
+  '09024_T_unit $1 can'#039't be smart linked, switching to static linki','n'+
+  'g'#000+
   '09025_T_unit $1 can'#039't be shared linked, switching to static linkin'+
   'g'#000+
-  '09026_E_unit $1 can'#039't be s','mart or static linked'#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+
-  '09029_E_Error while compiling resources'#000+
-  '09030_E_Can'#039't call the resource compiler "$1", switching to exte','r'+
-  'nal mode'#000+
+  '09029_E','_Error while compiling resources'#000+
+  '09030_E_Can'#039't call the resource compiler "$1", switching to extern'+
+  'al mode'#000+
   '09031_E_Can'#039't open resource file "$1"'#000+
   '09032_E_Can'#039't write resource file "$1"'#000+
   '09033_N_File "$1" not found for backquoted cat command'#000+
-  '09128_F_Can'#039't post process executable $1'#000+
+  '0','9128_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+
+  '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+
+  '09134_X_S','tack space committed: $1 bytes'#000+
   '09200_F_Executable image size is too big for $1 target.'#000+
-  '09201_W_Ob','ject file "$1" contains 32-bit absolute relocation to symb'+
-  'ol "$2".'#000+
+  '09201_W_Object file "$1" contains 32-bit absolute relocation to symbol'+
+  ' "$2".'#000+
   '10000_T_Unitsearch: $1'#000+
   '10001_T_PPU Loading $1'#000+
   '10002_U_PPU Name: $1'#000+
-  '10003_U_PPU Flags: $1'#000+
+  '10003_U_P','PU Flags: $1'#000+
   '10004_U_PPU Crc: $1'#000+
   '10005_U_PPU Time: $1'#000+
   '10006_U_PPU File too short'#000+
-  '10007_U_PPU Inva','lid Header (no PPU at the begin)'#000+
+  '10007_U_PPU Invalid Header (no PPU at the begin)'#000+
   '10008_U_PPU Invalid Version $1'#000+
   '10009_U_PPU is compiled for another processor'#000+
-  '10010_U_PPU is compiled for another target'#000+
+  '10010_U_PPU is compiled for anoth','er 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 re','ading PPU-File'#000+
+  '10014_F_Error reading PPU-File'#000+
   '10015_F_unexpected end of PPU-File'#000+
   '10016_F_Invalid PPU-File entry: $1'#000+
   '10017_F_PPU Dbx count problem'#000+
-  '10018_E_Illegal unit name: $1'#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+
+  '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+
-  '10024_F_Unit $1 searched but $2 found'#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 com','piling module, stopping'#000+
+  '10026_F_There were $1 errors compiling module, stopping'#000+
   '10027_U_Load from $1 ($2) unit $3'#000+
   '10028_U_Recompiling $1, checksum changed for $2'#000+
-  '10029_U_Recompiling $1, source found only'#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+
+  '10031_U_Recompiling unit, shared lib is older than ppufile'#000+
   '10032_U_Recompiling unit, obj and asm are older than ppufile'#000+
   '10033_U_Recompiling unit, obj is older than asm'#000+
-  '10034_U_Parsing interface of $1'#000+
+  '10034_U_','Parsing interface of $1'#000+
   '10035_U_Parsing implementation of $1'#000+
   '10036_U_Second load for unit $1'#000+
-  '1003','7_U_PPU Check file $1 time $2'#000+
+  '10037_U_PPU Check file $1 time $2'#000+
   '10040_W_Can'#039't recompile unit $1, but found modifed include files'#000+
-  '10041_U_File $1 is newer than the one used for creating PPU file $2'#000+
+  '10041_U_File $1 is newer than the one used for c','reating PPU file $2'#000+
   '10042_U_Trying to use a unit which was compiled with a different FPU m'+
   'ode'#000+
-  '100','43_U_Loading interface units from $1'#000+
+  '10043_U_Loading interface units from $1'#000+
   '10044_U_Loading implementation units from $1'#000+
   '10045_U_Interface CRC changed for unit $1'#000+
-  '10046_U_Implementation CRC changed for unit $1'#000+
+  '10046_U_Implementat','ion CRC changed for unit $1'#000+
   '10047_U_Finished compiling unit $1'#000+
-  '10048_U_Adding dependency: $1 depe','nds on $2'#000+
+  '10048_U_Adding dependency: $1 depends on $2'#000+
   '10049_U_No reload, is caller: $1'#000+
   '10050_U_No reload, already in second compile: $1'#000+
   '10051_U_Flag for reload: $1'#000+
-  '10052_U_Forced reloading'#000+
+  '10052_U_Forced reloadin','g'#000+
   '10053_U_Previous state of $1: $2'#000+
   '10054_U_Already compiling $1, setting second compile'#000+
-  '10055_U_L','oading unit $1'#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 unit $1'#000+
-  '10059_U_Skipping re-resolving unit $1, still loading used units'#000+
+  '10059_U_Skipping re-resolving unit',' $1, still loading used units'#000+
   '10060_U_Unloading resource unit $1 (not needed)'#000+
-  '10061_E_Unit $1 was',' compiled using a different whole program optimiz'+
-  'ation feedback input ($2, $3); recompile it without wpo or use the sam'+
-  'e wpo feedback input file for this compilation invocation'#000+
-  '10062_U_Indirect interface (objects/classes) CRC changed for un','it $1'+
-  #000+
+  '10061_E_Unit $1 was compiled using a different whole program optimizat'+
+  'ion feedback input ($2, $3); recompile it without wpo or use the same '+
+  'wpo feedback input fil','e for this compilation invocation'#000+
+  '10062_U_Indirect interface (objects/classes) CRC changed for unit $1'#000+
   '11000_O_$1 [options] <inputfile> [options]'#000+
   '11001_W_Only one source file supported, changing source file to compil'+
   'e from "$1" into "$2"'#000+
-  '11002_W_DEF file can be created only for OS/2'#000+
+  '11','002_W_DEF file can be created only for OS/2'#000+
   '11003_E_nested response files are not supported'#000+
-  '11004','_F_No source file name in command line'#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+
+  '11008','_F_Too many config files nested'#000+
   '11009_F_Unable to open file $1'#000+
-  '11010_D_Reading further options fr','om $1'#000+
+  '11010_D_Reading further options 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_In options file $1 at line $2 too many \var{\#IF(N)DEFs} encou'+
-  'ntered'#000+
-  '11014_F_In options file $1 at line $2 unexpected ','\var{\#ENDIFs} enco'+
-  'untered'#000+
+  '11013_F_In options file $1 at',' line $2 too many \var{\#IF(N)DEFs} enc'+
+  'ountered'#000+
+  '11014_F_In options file $1 at line $2 unexpected \var{\#ENDIFs} encoun'+
+  'tered'#000+
   '11015_F_Open conditional at the end of the options file'#000+
-  '11016_W_Debug information generation is not supported by this executab'+
-  'le'#000+
+  '11016_W_Debug information generation is not supported by thi','s execut'+
+  'able'#000+
   '11017_H_Try recompiling with -dGDB'#000+
   '11018_W_You are using the obsolete switch $1'#000+
-  '1101','9_W_You are using the obsolete switch $1, please use $2'#000+
+  '11019_W_You are using the obsolete switch $1, please use $2'#000+
   '11020_N_Switching assembler to default source writing assembler'#000+
-  '11021_W_Assembler output selected "$1" is not compatible with "$2"'#000+
+  '11021_W_Assembler outpu','t selected "$1" is not compatible with "$2"'#000+
   '11022_W_"$1" assembler use forced'#000+
-  '11026_T_Reading opt','ions from file $1'#000+
+  '11026_T_Reading options from file $1'#000+
   '11027_T_Reading options from environment $1'#000+
   '11028_D_Handling option "$1"'#000+
   '11029_O_*** press enter ***'#000+
-  '11030_H_Start of reading config file $1'#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_in','terpreting firstpass option "$1"'#000+
+  '11036_D_interpreting firstpass option "$1"'#000+
   '11033_D_interpreting file option "$1"'#000+
   '11034_D_Reading config file "$1"'#000+
   '11035_D_found source file name "$1"'#000+
-  '11039_E_Unknown codepage "$1"'#000+
+  '110','39_E_Unknown codepage "$1"'#000+
   '11040_F_Config file $1 is a directory'#000+
-  '11041_W_Assembler output selecte','d "$1" cannot generate debug info, d'+
-  'ebugging disabled'#000+
+  '11041_W_Assembler output selected "$1" cannot generate debug info, deb'+
+  'ugging disabled'#000+
   '11042_W_Use of ppc386.cfg is deprecated, please use fpc.cfg instead'#000+
-  '11043_F_In options file $1 at line $2 \var{\#ELSE} directive without \'+
-  'var{\#IF(N)DEF} found'#000+
-  '11044_F_Option "$1" is not',', or not yet, supported on the current tar'+
-  'get platform'#000+
+  '11043_F_In options fi','le $1 at line $2 \var{\#ELSE} directive without'+
+  ' \var{\#IF(N)DEF} found'#000+
+  '11044_F_Option "$1" is not, or not yet, supported on the current targe'+
+  't platform'#000+
   '11045_F_The feature "$1" is not, or not yet, supported on the selected'+
   ' target platform'#000+
-  '11046_N_DWARF debug information cannot be used with smart linking on t'+
-  'his target, switching to sta','tic linking'#000+
+  '1','1046_N_DWARF debug information cannot be used with smart linking on'+
+  ' this target, switching to static linking'#000+
   '11047_W_Option "$1" is ignored for the current target platform.'#000+
-  '11048_W_Disabling external debug information because it is unsupported'+
-  ' for the selected target/debug format combination.'#000+
-  '11049_N_DWARF debug information cannot be u','sed with smart linking wi'+
-  'th external assembler, disabling static library creation.'#000+
-  '11050_E_Invalid value for MACOSX_DEPLOYMENT_TARGET environment variabl'+
-  'e: $1'#000+
+  '11048_W_Disabling external debug information because it is unsuppor','t'+
+  'ed for the selected target/debug format combination.'#000+
+  '11049_N_DWARF debug information cannot be used with smart linking with'+
+  ' external assembler, disabling static library creation.'#000+
+  '11050_E_Invalid value for MACOSX_DEPLOYMENT_TARGET environme','nt varia'+
+  'ble: $1'#000+
   '11051_E_Invalid value for IPHONEOS_DEPLOYMENT_TARGET environment varia'+
   'ble: $1'#000+
-  '110','52_E_You must use a FPU type of VFPV2, VFPV3 or VFPV3_D16 when us'+
-  'ing the EABIHF ABI target'#000+
-  '11053_W_The selected debug format is not supported on the current targ'+
-  'et, not changing the current setting'#000+
-  '12000_F_Cannot open whole program optimiza','tion feedback file "$1"'#000+
+  '11052_E_You must use a FPU type of VFPV2, VFPV3 or VFPV3_D16 when usin'+
+  'g the EABIHF ABI target'#000+
+  '11053_W_The selected debug format is not supported o','n the current ta'+
+  'rget, not changing the current setting'#000+
+  '12000_F_Cannot open whole program optimization feedback file "$1"'#000+
   '12001_D_Processing whole program optimization information in wpo feedb'+
   'ack file "$1"'#000+
-  '12002_D_Finished processing the whole program optimization information'+
-  ' in wpo feedback file "$1"'#000+
-  '12003_E_Expected section header, bu','t got "$2" at line $1 of wpo feed'+
-  'back file'#000+
+  '12002_D_Finished processing the who','le program optimization informati'+
+  'on in wpo feedback file "$1"'#000+
+  '12003_E_Expected section header, but got "$2" at line $1 of wpo feedba'+
+  'ck file'#000+
   '12004_W_No handler registered for whole program optimization section "'+
-  '$2" at line $1 of wpo feedback file, ignoring'#000+
+  '$2" at line $1 of wpo feedback',' file, ignoring'#000+
   '12005_D_Found whole program optimization section "$1" with information'+
-  ' about "$2"',#000+
+  ' about "$2"'#000+
   '12006_F_The selected whole program optimizations require a previously '+
   'generated feedback file (use -Fw to specify)'#000+
-  '12007_E_No collected information necessary to perform "$1" whole progr'+
-  'am optimization found'#000+
-  '12008_F_Specify a whole program ','optimization feedback file to store '+
-  'the generated info in (using -FW)'#000+
+  '12007_E_No collected inform','ation necessary to perform "$1" whole pro'+
+  'gram optimization found'#000+
+  '12008_F_Specify a whole program optimization feedback file to store th'+
+  'e generated info in (using -FW)'#000+
   '12009_E_Not generating any whole program optimization information, yet'+
-  ' a feedback file was specified (using -FW)'#000+
-  '12010_E_Not performing any whole program optimizations, y','et an input'+
-  ' feedback file was specified (using -Fw)'#000+
+  ' a ','feedback file was specified (using -FW)'#000+
+  '12010_E_Not performing any whole program optimizations, yet an input f'+
+  'eedback file was specified (using -Fw)'#000+
   '12011_D_Skipping whole program optimization section "$1", because not '+
-  'needed by the requested optimizations'#000+
+  'needed by the request','ed optimizations'#000+
   '12012_W_Overriding previously read information for "$1" from feedback '+
-  'input file',' using information in section "$2"'#000+
+  'input file using information in section "$2"'#000+
   '12013_E_Cannot extract symbol liveness information from program when s'+
   'tripping symbols, use -Xs-'#000+
-  '12014_E_Cannot extract symbol liveness information from program when w'+
-  'hen not linking'#000+
-  '12015_F_Cannot find "$','1" or "$2" to extract symbol liveness informat'+
-  'ion from linked program'#000+
+  '12014_E_Can','not extract symbol liveness information from program when'+
+  ' when not linking'#000+
+  '12015_F_Cannot find "$1" or "$2" to extract symbol liveness informatio'+
+  'n from linked program'#000+
   '12016_E_Error during reading symbol liveness information produced by "'+
-  '$1"'#000+
+  '$1"',#000+
   '12017_F_Error executing "$1" (exitcode: $2) to extract symbol informat'+
   'ion from linked program'#000+
-  '12','018_E_Collection of symbol liveness information can only help when'+
-  ' using smart linking, use -CX -XX'#000+
-  '12019_E_Cannot create specified whole program optimisation feedback fi'+
-  'le "$1"'#000+
-  '11023_Free Pascal Compiler version $FPCFULLVERSION [$FPCDATE] ','for $F'+
-  'PCCPU'#010+
+  '12018_E_Collection of symbol liveness information can only help when u'+
+  'sing smart linking, use -CX -XX'#000+
+  '12019_E_Cannot create specified whole progr','am optimisation feedback '+
+  'file "$1"'#000+
+  '11023_Free Pascal Compiler version $FPCFULLVERSION [$FPCDATE] for $FPC'+
+  'CPU'#010+
   'Copyright (c) 1993-2013 by Florian Klaempfl and others'#000+
   '11024_Free Pascal Compiler version $FPCVERSION'#010+
   #010+
-  'Compiler Date      : $FPCDATE'#010+
+  'Compiler Date      : $FPCDAT','E'#010+
   'Compiler CPU Target: $FPCCPU'#010+
   #010+
   'Supported targets:'#010+
   '  $OSTARGETS'#010+
   #010+
-  'Supported CPU instruction sets:'#010,
+  'Supported CPU instruction sets:'#010+
   '  $INSTRUCTIONSETS'#010+
   #010+
   'Supported FPU instruction sets:'#010+
@@ -1200,381 +1199,380 @@ const msgtxt : array[0..000285,1..240] of char=(
   '  $ABITARGETS'#010+
   #010+
   'Supported Optimizations:'#010+
-  '  $OPTIMIZATIONS'#010+
+  '  $OP','TIMIZATIONS'#010+
   #010+
   'Supported Whole Program Optimizations:'#010+
   '  All'#010+
   '  $WPOPTIMIZATIONS'#010+
   #010+
-  'Supported Microcont','roller types:'#010+
+  'Supported Microcontroller types:'#010+
   '  $CONTROLLERTYPES'#010+
   #010+
   'This program comes under the GNU General Public Licence'#010+
   'For more information read COPYING.v2'#010+
   #010+
-  'Please report bugs in our bug tracker on:'#010+
+  'Please report b','ugs in our bug tracker on:'#010+
   '                 http://bugs.freepascal.org'#010+
   #010+
-  'More information may be f','ound on our WWW pages (including directions'+
-  #010+
+  'More information may be found on our WWW pages (including directions'#010+
   'for mailing lists useful for asking questions or discussing potential'#010+
   'new features, etc.):'#010+
-  '                 http://www.freepascal.org'#000+
-  '11025_**0*_Put + after a boolean switch option to enable it, -',' to di'+
-  'sable it'#010+
+  '        ','         http://www.freepascal.org'#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 (-dEXTDEBUG compiler)'#010+
-  '*L2ap_Use pipes instead of creating temporary assembler ','files'#010+
+  '**2an_List node info',' in assembler file (-dEXTDEBUG compiler)'#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+
+  '**1A<x>_Output fo','rmat:'#010+
   '**2Adefault_Use default assembler'#010+
   '3*2Aas_Assemble using GNU AS'#010+
-  '3*2Amacho_Mach-O (Darwin, In','tel 32 bit) using internal writer'#010+
+  '3*2Amacho_Mach-O (Darwin, Intel 32 bit) using internal writer'#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*2Anasmwin32_Win32 obje','ct file using Nasm'#010+
   '3*2Anasmwdosx_Win32/WDOSX object file using Nasm'#010+
-  '3*2Awasm_Obj file using Wasm ','(Watcom)'#010+
+  '3*2Awasm_Obj 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_ELF (Linux) using internal writer'#010+
+  '3*2Aelf_ELF (Linux) us','ing internal writer'#010+
   '3*2Acoff_COFF (Go32v2) using internal writer'#010+
-  '3*2Apecoff_PE-COFF (Win32) using',' internal writer'#010+
+  '3*2Apecoff_PE-COFF (Win32) using internal writer'#010+
   '4*2Aas_Assemble using GNU AS'#010+
   '4*2Agas_Assemble using GNU GAS'#010+
   '4*2Agas-darwin_Assemble darwin Mach-O64 using GNU GAS'#010+
-  '4*2Amasm_Win64 object file using ml64 (Microsoft)'#010+
+  '4*2Amasm_Win','64 object file using ml64 (Microsoft)'#010+
   '4*2Apecoff_PE-COFF (Win64) using internal writer'#010+
-  '4*2Aelf_EL','F (Linux-64bit) using internal writer'#010+
+  '4*2Aelf_ELF (Linux-64bit) using internal writer'#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+
+  '6*2Amot_Stand','ard Motorola assembler'#010+
   'A*2Aas_Assemble using GNU AS'#010+
   'P*2Aas_Assemble using GNU AS'#010+
-  'S*2Aas_Assemble ','using 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+
-  '**2C3<x>_Turn on ieee error checking for constants'#010+
+  '**2C3<x>_Turn ','on ieee error checking for constants'#010+
   '**2Ca<x>_Select ABI, see fpc -i for possible values'#010+
-  '**2Cb_Ge','nerate code for a big-endian variant of the target architect'+
-  'ure'#010+
+  '**2Cb_Generate code for a big-endian variant of the target architectur'+
+  'e'#010+
   '**2Cc<x>_Set default calling convention to <x>'#010+
-  '**2CD_Create also dynamic library (not supported)'#010+
+  '**2CD_Create also dynamic librar','y (not supported)'#010+
   '**2Ce_Compilation with emulated floating point opcodes'#010+
-  '**2Cf<x>_Select fpu inst','ruction set to use, see fpc -i for possible '+
-  'values'#010+
+  '**2Cf<x>_Select fpu instruction set to use, see fpc -i for possible va'+
+  'lues'#010+
   '**2CF<x>_Minimal floating point constant precision (default, 32, 64)'#010+
-  '**2Cg_Generate PIC code'#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+
-  'P','*2CN_Generate nil-pointer checks (AIX-only)'#010+
+  'P*2CN_Generate nil-pointer checks (AIX-only)'#010+
   '**2Co_Check overflow of integer operations'#010+
-  '**2CO_Check for possible overflow of integer operations'#010+
+  '**2CO_Check for possible 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+
+  '**3CPPACKSET=<y>_ <y> set allocation: 0, 1 or DEFAULT or NORMAL, 2, 4 '+
+  'and 8'#010+
   '**2Cr_Range checking'#010+
   '**2CR_Verify object method call validity'#010+
-  '**2Cs<n>_Set stack checking size to <n>'#010+
+  '**2Cs<n','>_Set stack checking size to <n>'#010+
   '**2Ct_Stack checking (for testing only, see manual)'#010+
-  'p*2CT<x>_Tar','get-specific code generation options'#010+
+  'p*2CT<x>_Target-specific code generation options'#010+
   'P*2CT<x>_Target-specific code generation options'#010+
   'J*2CT<x>_Target-specific code generation options'#010+
-  'A*2CT<x>_Target-specific code generation options'#010+
-  'p*3CTsmalltoc_ Generate smaller TOCs at the expense of e','xecution spe'+
-  'ed (AIX)'#010+
+  'A*2CT<x>','_Target-specific code generation options'#010+
+  'p*3CTsmalltoc_ Generate smaller TOCs at the expense of execution speed'+
+  ' (AIX)'#010+
   'P*3CTsmalltoc_ Generate smaller TOCs at the expense of execution speed'+
   ' (AIX)'#010+
-  'J*3CTcompactintarrayinit_ Generate smaller (but potentially slower) co'+
-  'de for initializing integer array constants'#010+
-  'J*3CTenumfieldinit_ Initiali','ze enumeration fields in constructors to'+
-  ' enumtype(0), after calling inherited constructors'#010+
-  'J*3CTautogetterprefix=X_ Automatically create getters for properties w'+
-  'ith prefix X (empty string disables)'#010+
-  'J*3CTautosetterprefix=X_ Automatically cre','ate setters for properties'+
+  'J*3CTcompactintarrayinit_ Generate smaller (b','ut potentially slower) '+
+  'code for initializing integer array constants'#010+
+  'J*3CTenumfieldinit_ Initialize enumeration fields in constructors to e'+
+  'numtype(0), after calling inherited constructors'#010+
+  'J*3CTautogetterprefix=X_ Automatically create getter','s for properties'+
   ' with prefix X (empty string disables)'#010+
+  'J*3CTautosetterprefix=X_ Automatically create setters for properties w'+
+  'ith prefix X (empty string disables)'#010+
   'A*3CTthumbinterworking_ Generate Thumb interworking-safe code if possi'+
   'ble'#010+
-  'J*2Cv_Var/out parameter copy-out checking'#010+
+  'J*2C','v_Var/out parameter copy-out checking'#010+
   '**2CX_Create also smartlinked library'#010+
-  '**1d<x>_Defines the s','ymbol <x>'#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+
   '*O2Dw_PM application'#010+
-  '**1e<x>_Set path to executable'#010+
+  '**1e<x>_Set path to exe','cutable'#010+
   '**1E_Same as -Cn'#010+
   '**1fPIC_Same as -Cg'#010+
   '**1F<x>_Set file names and paths:'#010+
-  '**2Fa<x>[,y]_(for ','a program) load units <x> and [y] before uses is p'+
-  'arsed'#010+
+  '**2Fa<x>[,y]_(for a program) load units <x> and [y] before uses is par'+
+  'sed'#010+
   '**2Fc<x>_Set input codepage to <x>'#010+
   '**2FC<x>_Set RC compiler binary name to <x>'#010+
-  '**2Fd_Disable the compiler'#039's internal directory cache'#010+
-  '**2FD<x>_Set the directory where to search for comp','iler utilities'#010+
+  '**2Fd_Di','sable the compiler'#039's internal directory cache'#010+
+  '**2FD<x>_Set the directory where to search for compiler utilities'#010+
   '**2Fe<x>_Redirect error output to <x>'#010+
   '**2Ff<x>_Add <x> to framework path (Darwin only)'#010+
-  '**2FE<x>_Set exe/unit output path to <x>'#010+
+  '**2FE<x>_Set exe/unit output path to <x>'#010,
   '**2Fi<x>_Add <x> to include path'#010+
   '**2Fl<x>_Add <x> to library path'#010+
-  '**2FL<x>_Use <x> as dynamic lin','ker'#010+
+  '**2FL<x>_Use <x> as dynamic linker'#010+
   '**2Fm<x>_Load unicode conversion table from <x>.txt in the compiler di'+
   'r'#010+
   '**2Fo<x>_Add <x> to object path'#010+
-  '**2Fr<x>_Load error message file <x>'#010+
+  '**2Fr<x>_Load error message file <x','>'#010+
   '**2FR<x>_Set resource (.res) linker to <x>'#010+
   '**2Fu<x>_Add <x> to unit path'#010+
-  '**2FU<x>_Set unit outp','ut path to <x>, overrides -FE'#010+
+  '**2FU<x>_Set unit output path to <x>, overrides -FE'#010+
   '**2FW<x>_Store generated whole-program optimization feedback in <x>'#010+
-  '**2Fw<x>_Load previously stored whole-program optimization feedback fr'+
-  'om <x>'#010+
+  '**2Fw<x>_Load previously stored whole-program',' optimization feedback '+
+  'from <x>'#010+
   '*g1g_Generate debug information (default format for target)'#010+
-  '*g2gc','_Generate checks for pointers'#010+
+  '*g2gc_Generate checks for pointers'#010+
   '*g2gh_Use heaptrace unit (for memory leak/corruption debugging)'#010+
-  '*g2gl_Use line info unit (show more info with backtraces)'#010+
+  '*g2gl_Use line info unit (show more info with bac','ktraces)'#010+
   '*g2go<x>_Set debug information options'#010+
-  '*g3godwarfsets_ Enable DWARF '#039'set'#039' type debug inf','ormation (b'+
-  'reaks gdb < 6.5)'#010+
+  '*g3godwarfsets_ Enable DWARF '#039'set'#039' type debug information (bre'+
+  'aks gdb < 6.5)'#010+
   '*g3gostabsabsincludes_ Store absolute/full include file paths in Stabs'+
   #010+
-  '*g3godwarfmethodclassprefix_ Prefix method names in DWARF with class n'+
-  'ame'#010+
+  '*g3godwarfmethodclassprefix_ Prefix method n','ames in DWARF with class'+
+  ' name'#010+
   '*g2gp_Preserve case in stabs symbol names'#010+
-  '*g2gs_Generate Stabs debu','g information'#010+
+  '*g2gs_Generate Stabs debug information'#010+
   '*g2gt_Trash local variables (to detect uninitialized uses)'#010+
   '*g2gv_Generates programs traceable with Valgrind'#010+
-  '*g2gw_Generate DWARFv2 debug information (same as -gw2)'#010+
+  '*g2gw_Generate DWARFv','2 debug information (same as -gw2)'#010+
   '*g2gw2_Generate DWARFv2 debug information'#010+
-  '*g2gw3_Generate DWAR','Fv3 debug information'#010+
+  '*g2gw3_Generate DWARFv3 debug information'#010+
   '*g2gw4_Generate DWARFv4 debug information (experimental)'#010+
   '**1i_Information'#010+
   '**2iD_Return compiler date'#010+
-  '**2iV_Return short compiler version'#010+
+  '**2iV_Return short c','ompiler version'#010+
   '**2iW_Return full compiler version'#010+
   '**2iSO_Return compiler OS'#010+
-  '**2iSP_Return compil','er host processor'#010+
+  '**2iSP_Return compiler host processor'#010+
   '**2iTO_Return target OS'#010+
   '**2iTP_Return target processor'#010+
   '**1I<x>_Add <x> to include path'#010+
   '**1k<x>_Pass <x> to the linker'#010+
-  '**1l_Write logo'#010+
+  '**1l_Wr','ite logo'#010+
   '**1M<x>_Set language mode to <x>'#010+
   '**2Mfpc_Free Pascal dialect (default)'#010+
-  '**2Mobjfpc_FPC mo','de with Object Pascal support'#010+
+  '**2Mobjfpc_FPC mode with Object Pascal support'#010+
   '**2Mdelphi_Delphi 7 compatibility mode'#010+
   '**2Mtp_TP/BP 7.0 compatibility mode'#010+
-  '**2Mmacpas_Macintosh Pascal dialects compatibility mode'#010+
+  '**2Mmacpas_Macintosh Pascal dialects c','ompatibility mode'#010+
   '**1n_Do not read the default config files'#010+
-  '**1o<x>_Change the name of the execut','able produced to <x>'#010+
+  '**1o<x>_Change the name of the executable produced to <x>'#010+
   '**1O<x>_Optimizations:'#010+
   '**2O-_Disable optimizations'#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+
+  '**2O2_Level 2',' optimizations (-O1 + quick optimizations)'#010+
+  '**2O3_Level 3 optimizations (-O2 + slow optimizations)'#010+
   '**2O4_Level 4 optimizations (-O3 + optimizations which might have unex'+
   'pected side effects)'#010+
   '**2Oa<x>=<y>_Set alignment'#010+
-  '**2Oo[NO]<x>_Enable or disable optimizations, see fpc -i for possible '+
-  'values'#010+
-  '**2Op<x>_Set target cpu for optimizing, see ','fpc -i for possible valu'+
-  'es'#010+
+  '**2Oo[NO]<x>_Enable or d','isable optimizations, see fpc -i for possibl'+
+  'e values'#010+
+  '**2Op<x>_Set target cpu for optimizing, see fpc -i for possible values'+
+  #010+
   '**2OW<x>_Generate whole-program optimization feedback for optimization'+
   ' <x>, see fpc -i for possible values'#010+
-  '**2Ow<x>_Perform whole-program optimization <x>, see fpc -i for possib'+
-  'le values'#010+
-  '**2Os_Optimize for size ra','ther than speed'#010+
+  '**2Ow<x>_','Perform whole-program optimization <x>, see fpc -i for poss'+
+  'ible values'#010+
+  '**2Os_Optimize for size rather than speed'#010+
   '**1pg_Generate profile code for gprof (defines FPC_PROFILE)'#010+
   'F*1P<x>_Target CPU / compiler related options:'#010+
-  'F*2PB_Show default compiler binary'#010+
+  'F*2PB_Show default c','ompiler binary'#010+
   'F*2PP_Show default target cpu'#010+
-  'F*2P<x>_Set target CPU (arm,i386,m68k,mips,mipsel,po','werpc,powerpc64,'+
-  'sparc,x86_64'#010+
+  'F*2P<x>_Set target CPU (arm,i386,m68k,mips,mipsel,powerpc,powerpc64,sp'+
+  'arc,x86_64'#010+
   '**1R<x>_Assembler reading style:'#010+
   '**2Rdefault_Use default assembler for target'#010+
   '3*2Ratt_Read AT&T style assembler'#010+
-  '3*2Rintel_Read Intel style assembler'#010+
+  '3*','2Rintel_Read Intel style assembler'#010+
   '6*2RMOT_Read motorola style assembler'#010+
-  '**1S<x>_Syntax options:'#010,
+  '**1S<x>_Syntax options:'#010+
   '**2S2_Same as -Mobjfpc'#010+
   '**2Sc_Support operators like C (*=,+=,/= and -=)'#010+
   '**2Sa_Turn on assertions'#010+
   '**2Sd_Same as -Mdelphi'#010+
-  '**2Se<x>_Error options. <x> is a combination of the following:'#010+
-  '**3*_<n> : Compiler halts after the <n> errors (default i','s 1)'#010+
+  '**2Se<x>_Error options.',' <x> is a combination of the following:'#010+
+  '**3*_<n> : Compiler halts after the <n> errors (default is 1)'#010+
   '**3*_w : Compiler also halts after warnings'#010+
   '**3*_n : Compiler also halts after notes'#010+
   '**3*_h : Compiler also halts after hints'#010+
-  '**2Sg_Enable LABEL and GOTO (default in -Mtp and -Mdelphi)'#010+
-  '**2Sh_Use reference counted strings (ansistring by',' default) instead '+
-  'of shortstrings'#010+
+  '**2Sg_Enable',' LABEL and GOTO (default in -Mtp and -Mdelphi)'#010+
+  '**2Sh_Use reference counted strings (ansistring by default) instead of'+
+  ' shortstrings'#010+
   '**2Si_Turn on inlining of procedures/functions declared as "inline"'#010+
   '**2Sk_Load fpcylix unit'#010+
-  '**2SI<x>_Set interface style to <x>'#010+
+  '**2SI<x>_Set inte','rface style to <x>'#010+
   '**3SIcom_COM compatible interface (default)'#010+
-  '**3SIcorba_CORBA compatible interf','ace'#010+
+  '**3SIcorba_CORBA compatible interface'#010+
   '**2Sm_Support macros like C (global)'#010+
   '**2So_Same as -Mtp'#010+
   '**2Ss_Constructor name must be init (destructor must be done)'#010+
-  '**2Sx_Enable exception keywords (default in Delphi/ObjFPC modes)'#010+
-  '**2Sy_@<pointer> returns a typed pointer, same as $T+',#010+
+  '**2Sx_Enable exceptio','n keywords (default in Delphi/ObjFPC modes)'#010+
+  '**2Sy_@<pointer> returns a typed pointer, same as $T+'#010+
   '**1s_Do not 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+
+  '**2sr_Skip register alloca','tion phase (use with -alr)'#010+
   '**1T<x>_Target operating system:'#010+
   '3*2Tdarwin_Darwin/Mac OS X'#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*2Tiphonesim_ iPhoneSimulator from iOS SDK 3.2+ (older versions: -Tda'+
-  'rwin)'#010+
+  '3*2Tiphonesim_ iPhoneSimulator from',' iOS SDK 3.2+ (older versions: -T'+
+  'darwin)'#010+
   '3*2Tlinux_Linux'#010+
-  '3*2Tnativent_Native NT API (experimental',')'#010+
+  '3*2Tnativent_Native NT API (experimental)'#010+
   '3*2Tnetbsd_NetBSD'#010+
   '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*2Tos2_OS/2 / eComS','tation'#010+
   '3*2Tsunos_SunOS/Solaris'#010+
   '3*2Tsymbian_Symbian OS'#010+
   '3*2Tsolaris_Solaris'#010+
-  '3*2Twatcom_Watcom compa','tible DOS extender'#010+
+  '3*2Twatcom_Watcom compatible DOS extender'#010+
   '3*2Twdosx_WDOSX DOS extender'#010+
   '3*2Twin32_Windows 32 Bit'#010+
   '3*2Twince_Windows CE'#010+
   '4*2Tdarwin_Darwin/Mac OS X'#010+
   '4*2Tlinux_Linux'#010+
-  '4*2Twin64_Win64 (64 bit Windows systems)'#010+
+  '4*2Twi','n64_Win64 (64 bit Windows systems)'#010+
   '6*2Tamiga_Commodore Amiga'#010+
   '6*2Tatari_Atari ST/STe/TT'#010+
-  '6*2Tlinux_','Linux'#010+
+  '6*2Tlinux_Linux'#010+
   '6*2Tpalmos_PalmOS'#010+
   'A*2Tdarwin_Darwin/iPhoneOS/iOS'#010+
   'A*2Tlinux_Linux'#010+
   'A*2Twince_Windows CE'#010+
   'P*2Tamiga_AmigaOS'#010+
   'P*2Tdarwin_Darwin/Mac OS X'#010+
-  'P*2Tlinux_Linux'#010+
+  'P*2Tli','nux_Linux'#010+
   'P*2Tmacos_Mac OS (classic)'#010+
   'P*2Tmorphos_MorphOS'#010+
   'S*2Tsolaris_Solaris'#010+
   'S*2Tlinux_Linux'#010+
-  '**1u','<x>_Undefines the symbol <x>'#010+
+  '**1u<x>_Undefines the symbol <x>'#010+
   '**1U_Unit options:'#010+
   '**2Un_Do not check where the unit name matches the file name'#010+
-  '**2Ur_Generate release unit files (never automatically recompiled)'#010+
+  '**2Ur_Generate release unit files ','(never automatically recompiled)'#010+
   '**2Us_Compile a system unit'#010+
-  '**1v<x>_Be verbose. <x> is a combina','tion of the following letters:'#010+
+  '**1v<x>_Be verbose. <x> is a combination of the following letters:'#010+
   '**2*_e : Show errors (default)       0 : Show nothing (except errors)'#010+
-  '**2*_w : Show warnings               u : Show unit info'#010+
+  '**2*_w : Show warnings               u : S','how 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*_l : Show linenumbers            r : Rhide/','GCC compatibility mod'+
+  'e'#010+
   '**2*_s : Show time stamps            q : Show message numbers'#010+
-  '**2*_a : Sho','w everything             x : Executable info (Win32 only'+
-  ')'#010+
+  '**2*_a : Show everything             x : Executable info (Win32 only)'#010+
   '**2*_b : Write file names messages   p : Write tree.log with parse tre'+
   'e'#010+
-  '**2*_    with full path              v : Write fpcdebug.txt with'#010+
-  '**2*_                                    lots',' of debugging info'#010+
+  '**2*_    with',' full path              v : Write fpcdebug.txt with'#010+
+  '**2*_                                    lots of debugging info'#010+
   '**2*_m<x>,<y> : Don'#039't show messages numbered <x> and <y>'#010+
   'F*1V<x>_Append '#039'-<x>'#039' to the used compiler binary name (e.g. f'+
-  'or version)'#010+
+  'or ve','rsion)'#010+
   '**1W<x>_Target-specific options (targets)'#010+
-  '3*2WA_Specify native type application (Windows)'#010,
+  '3*2WA_Specify native type application (Windows)'#010+
   '4*2WA_Specify native type application (Windows)'#010+
   'A*2WA_Specify native type application (Windows)'#010+
-  '3*2Wb_Create a bundle instead of a library (Darwin)'#010+
+  '3*2Wb_Create a bundle instead of a library (Dar','win)'#010+
   'P*2Wb_Create a bundle instead of a library (Darwin)'#010+
-  'p*2Wb_Create a bundle instead of a libra','ry (Darwin)'#010+
+  'p*2Wb_Create a bundle instead of a library (Darwin)'#010+
   'A*2Wb_Create a bundle instead of a library (Darwin)'#010+
   '4*2Wb_Create a bundle instead of a library (Darwin)'#010+
-  '3*2WB_Create a relocatable image (Windows, Symbian)'#010+
+  '3*2WB_Create a relocatable ','image (Windows, Symbian)'#010+
   '3*2WBxxxx_Set image base to xxxx (Windows, Symbian)'#010+
-  '4*2WB_Create a reloc','atable image (Windows)'#010+
+  '4*2WB_Create a relocatable image (Windows)'#010+
   '4*2WBxxxx_Set image base to xxxx (Windows)'#010+
   'A*2WB_Create a relocatable image (Windows, Symbian)'#010+
-  'A*2WBxxxx_Set image base to xxxx (Windows, Symbian)'#010+
+  'A*2WBxxxx_Set image base ','to xxxx (Windows, Symbian)'#010+
   '3*2WC_Specify console type application (EMX, OS/2, Windows)'#010+
-  '4*2WC_Spec','ify console type application (EMX, OS/2, Windows)'#010+
+  '4*2WC_Specify console type application (EMX, OS/2, Windows)'#010+
   'A*2WC_Specify console type application (Windows)'#010+
-  'P*2WC_Specify console type application (Classic Mac OS)'#010+
+  'P*2WC_Specify console type application (Clas','sic Mac OS)'#010+
   '3*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+
-  '4*2WD_Use DEFFILE to ex','port functions of DLL or EXE (Windows)'#010+
+  '4*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+
   'A*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+
   '3*2We_Use external resources (Darwin)'#010+
-  '4*2We_Use external resources (Darwin)'#010+
+  '4*2W','e_Use external resources (Darwin)'#010+
   'A*2We_Use external resources (Darwin)'#010+
-  'P*2We_Use external resour','ces (Darwin)'#010+
+  'P*2We_Use external resources (Darwin)'#010+
   'p*2We_Use external resources (Darwin)'#010+
   '3*2WF_Specify full-screen type application (EMX, OS/2)'#010+
-  '3*2WG_Specify graphic type application (EMX, OS/2, Windows)'#010+
+  '3*2WG_Specify graphic type applicatio','n (EMX, OS/2, Windows)'#010+
   '4*2WG_Specify graphic type application (EMX, OS/2, Windows)'#010+
-  'A*2WG_Specify ','graphic type application (Windows)'#010+
+  'A*2WG_Specify graphic type application (Windows)'#010+
   'P*2WG_Specify graphic type application (Classic Mac OS)'#010+
   '3*2Wi_Use internal resources (Darwin)'#010+
-  '4*2Wi_Use internal resources (Darwin)'#010+
+  '4*2Wi_Use inte','rnal resources (Darwin)'#010+
   'A*2Wi_Use internal resources (Darwin)'#010+
-  'P*2Wi_Use internal resources (Darwi','n)'#010+
+  'P*2Wi_Use internal resources (Darwin)'#010+
   'p*2Wi_Use internal resources (Darwin)'#010+
   '3*2WI_Turn on/off the usage of import sections (Windows)'#010+
-  '4*2WI_Turn on/off the usage of import sections (Windows)'#010+
+  '4*2WI_Turn on/off the usage of import section','s (Windows)'#010+
   'A*2WI_Turn on/off the usage of import sections (Windows)'#010+
-  '3*2WM<x>_Minimum Mac OS X de','ployment version: 10.4, 10.5.1, ... (Dar'+
-  'win)'#010+
-  '4*2WM<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ... (Darwi'+
+  '3*2WM<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ... (Darwi'+
   'n)'#010+
-  'p*2WM<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ... (Darwi'+
+  '4*2WM<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ... (Darwi'+
   'n)'#010+
-  'P*2WM<x>_Minimum Mac OS X deployment version: 10.','4, 10.5.1, ... (Dar'+
+  'p*2WM<x>_Minimum Mac OS X',' deployment version: 10.4, 10.5.1, ... (Dar'+
   'win)'#010+
+  'P*2WM<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ... (Darwi'+
+  'n)'#010+
   '3*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
-  '4*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
+  '4*2WN_Do not generate relocation code, needed for',' debugging (Windows'+
+  ')'#010+
   'A*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+
-  'A*2Wpx','xxx_Specify the controller type, see fpc -i for possible value'+
-  's'#010+
+  'A*2Wpxxxx_Specify the controller type, see fpc -i for possible values'#010+
   'V*2Wpxxxx_Specify the controller type, see fpc -i for possible values'#010+
-  '3*2WP<x>_Minimum iOS deployment version: 3.0, 5.0.1, ... (iphonesim)'#010+
-  'A*2WP<x>_Minimum iOS deployment versi','on: 3.0, 5.0.1, ... (Darwin)'#010+
+  '3*2WP<x>_','Minimum iOS deployment version: 3.0, 5.0.1, ... (iphonesim)'+
+  #010+
+  'A*2WP<x>_Minimum iOS deployment version: 3.0, 5.0.1, ... (Darwin)'#010+
   '3*2WR_Generate relocation code (Windows)'#010+
   '4*2WR_Generate relocation code (Windows)'#010+
-  'A*2WR_Generate relocation code (Windows)'#010+
+  'A*2WR_Generate relocation code (','Windows)'#010+
   'P*2WT_Specify MPW tool type application (Classic Mac OS)'#010+
-  '**2WX_Enable executable stack (','Linux)'#010+
+  '**2WX_Enable executable stack (Linux)'#010+
   '**1X_Executable options:'#010+
   '**2Xc_Pass --shared/-dynamic to the linker (BeOS, Darwin, FreeBSD, Lin'+
   'ux)'#010+
-  '**2Xd_Do not search default library path (sometimes required for cross'+
-  '-compiling when not using -XR)'#010+
+  '**2Xd_Do not search default library p','ath (sometimes required for cro'+
+  'ss-compiling when not using -XR)'#010+
   '**2Xe_Use external linker'#010+
-  '**2Xg_C','reate debuginfo in a separate file and add a debuglink sectio'+
-  'n to executable'#010+
-  '**2XD_Try to link units dynamically      (defines FPC_LINK_DYNAMIC)'#010+
+  '**2Xg_Create debuginfo in a separate file and add a debuglink section '+
+  'to executable'#010+
+  '**2XD_Try to link units dynamically      (defines FPC_LINK_DYNAMIC',')'#010+
   '**2Xi_Use internal linker'#010+
   '**2Xm_Generate link map'#010+
-  '**2XM<x>_Set the name of the '#039'main'#039' program r','outine (default'+
-  ' is '#039'main'#039')'#010+
+  '**2XM<x>_Set the name of the '#039'main'#039' program routine (default i'+
+  's '#039'main'#039')'#010+
   'F*2Xp<x>_First search for the compiler binary in the directory <x>'#010+
-  '**2XP<x>_Prepend the binutils names with the prefix <x>'#010+
+  '**2XP<x>_Prepend the binutils names with the pref','ix <x>'#010+
   '**2Xr<x>_Set the linker'#039's rlink-path to <x> (needed for cross comp'+
-  'ile, see the ld manual f','or more information) (BeOS, Linux)'#010+
+  'ile, see the ld manual for more information) (BeOS, Linux)'#010+
   '**2XR<x>_Prepend <x> to all linker search paths (BeOS, Darwin, FreeBSD'+
   ', Linux, Mac OS, Solaris)'#010+
-  '**2Xs_Strip all symbols from executable'#010+
-  '**2XS_Try to link units statically (default, defines FPC_LINK_STATIC)',
-  #010+
+  '**2Xs_Strip ','all symbols from executable'#010+
+  '**2XS_Try to link units statically (default, defines FPC_LINK_STATIC)'#010+
   '**2Xt_Link with static libraries (-static is passed to linker)'#010+
   '**2XX_Try to smartlink units             (defines FPC_LINK_SMART)'#010+
   '**1*_'#010+
-  '**1?_Show this help'#010+
+  '**1?_Sh','ow this help'#010+
   '**1h_Shows this help without waiting'
 );

+ 1 - 1
compiler/ncal.pas

@@ -1780,7 +1780,7 @@ implementation
               else
                 begin
                   if methodpointer.nodetype=typen then
-                    if (methodpointer.resultdef.typ=recorddef) then
+                    if (methodpointer.resultdef.typ<>objectdef) then
                       begin
                         if not(target_info.system in systems_jvm) then
                           begin

+ 16 - 4
compiler/ncgcal.pas

@@ -98,7 +98,7 @@ implementation
       systems,
       cutils,verbose,globals,
       cpuinfo,
-      symconst,symtable,defutil,paramgr,
+      symconst,symtable,symtype,defutil,paramgr,
       cgbase,pass_2,
       aasmbase,aasmtai,aasmdata,
       nbas,nmem,nld,ncnv,nutils,
@@ -231,7 +231,19 @@ implementation
                    { pass "this" in C++ classes explicitly as pointer
                      because push_addr_param might not be true for them }
                    (is_cppclass(parasym.vardef) and (vo_is_self in parasym.varoptions)) or
-                    (not(left.resultdef.typ in [pointerdef,classrefdef]) and
+                    (
+                      (
+                        not(left.resultdef.typ in [pointerdef,classrefdef]) or
+                        (
+                          { allow pointerdefs (as self) to be passed as addr
+                            param if the method is part of a type helper which
+                            extends a pointer type }
+                          (vo_is_self in parasym.varoptions) and
+                          (aktcallnode.procdefinition.owner.symtabletype=objectsymtable) and
+                          (is_objectpascal_helper(tdef(aktcallnode.procdefinition.owner.defowner))) and
+                          (tobjectdef(aktcallnode.procdefinition.owner.defowner).extendeddef.typ=pointerdef)
+                        )
+                      ) and
                      paramanager.push_addr_param(parasym.varspez,parasym.vardef,
                          aktcallnode.procdefinition.proccalloption)) then
                    push_addr_para
@@ -289,11 +301,11 @@ implementation
                result }
              if assigned(parasym) and
                 (
-                  { for record constructor check that it is self parameter }
+                  { for type helper/record constructor check that it is self parameter }
                   (
                     (vo_is_self in parasym.varoptions) and
                     (aktcallnode.procdefinition.proctypeoption=potype_constructor) and
-                    is_record(parasym.vardef)
+                    (parasym.vardef.typ<>objectdef)
                   ) or
                   (vo_is_funcret in parasym.varoptions)
                 ) then

+ 8 - 0
compiler/node.pas

@@ -196,6 +196,14 @@ interface
           'objcselectorn',
           'objcprotocoln');
 
+      { a set containing all const nodes }
+      nodetype_const = [ordconstn,
+                        pointerconstn,
+                        stringconstn,
+                        dataconstn,
+                        guidconstn,
+                        realconstn];
+
     type
        { all boolean field of ttree are now collected in flags }
        tnodeflag = (

+ 14 - 2
compiler/paramgr.pas

@@ -546,7 +546,7 @@ implementation
           begin
             retloc.def:=tdef(p.owner.defowner);
             if not (is_implicit_pointer_object_type(retloc.def) or
-               is_record(retloc.def)) then
+               (retloc.def.typ<>objectdef)) then
               retloc.def:=getpointerdef(retloc.def);
           end;
         retcgsize:=def_cgsize(retloc.def);
@@ -564,6 +564,7 @@ implementation
         result:=false;
       end;
 
+
     function tparamanager.handle_common_ret_in_param(def: tdef;
       pd: tabstractprocdef; out retinparam: boolean): boolean;
       begin
@@ -571,7 +572,17 @@ implementation
           is always return in param }
         if (tf_safecall_exceptions in target_info.flags) and
            (pd.proccalloption=pocall_safecall) or
-           ((pd.proctypeoption=potype_constructor)and is_record(def)) then
+           (
+             (pd.proctypeoption=potype_constructor)and
+             (
+               is_record(def) or
+               (
+                 (def.typ<>objectdef) and
+                 (pd.owner.symtabletype=objectsymtable) and
+                 is_objectpascal_helper(tdef(pd.owner.defowner))
+               )
+             )
+           ) then
           begin
             retinparam:=true;
             exit(true);
@@ -584,6 +595,7 @@ implementation
         result:=false;
       end;
 
+
 initialization
   ;
 finalization

+ 1 - 1
compiler/pdecl.pas

@@ -609,7 +609,7 @@ implementation
               current_tokenpos:=defpos;
               current_tokenpos:=storetokenpos;
               { read the type definition }
-              read_named_type(hdef,newtype,gendef,generictypelist,false);
+              read_named_type(hdef,newtype,gendef,generictypelist,false,isunique);
               { update the definition of the type }
               if assigned(hdef) then
                 begin

+ 82 - 38
compiler/pdecobj.pas

@@ -693,6 +693,29 @@ implementation
       end;
 
     procedure parse_extended_type(helpertype:thelpertype);
+
+      procedure validate_extendeddef_typehelper(var def:tdef);
+        begin
+          if def.typ in [undefineddef,procvardef,procdef,objectdef,recorddef,
+              filedef,classrefdef,abstractdef,forwarddef,formaldef] then
+            begin
+              Message1(type_e_type_not_allowed_for_type_helper,def.typename);
+              def:=generrordef;
+            end;
+        end;
+
+      procedure check_inheritance_record_type_helper(var def:tdef);
+        begin
+          if (def.typ<>errordef) and assigned(current_objectdef.childof) then
+            begin
+              if def<>current_objectdef.childof.extendeddef then
+                begin
+                  Message1(type_e_record_helper_must_extend_same_record,current_objectdef.childof.extendeddef.typename);
+                  def:=generrordef;
+                end;
+            end;
+        end;
+
       var
         hdef: tdef;
       begin
@@ -703,48 +726,62 @@ implementation
 
         consume(_FOR);
         single_type(hdef,[stoParseClassParent]);
-        if (not assigned(hdef)) or
-           not (hdef.typ in [objectdef,recorddef]) then
+        if not assigned(hdef) or (hdef.typ=errordef) then
           begin
-            if helpertype=ht_class then
-              Message1(type_e_class_type_expected,hdef.typename)
-            else
-            if helpertype=ht_record then
-              Message1(type_e_record_type_expected,hdef.typename);
+            case helpertype of
+              ht_class:
+                Message1(type_e_class_type_expected,hdef.typename);
+              ht_record:
+                Message(type_e_record_type_expected);
+              ht_type:
+                Message1(type_e_type_id_expected,hdef.typename);
+            end;
           end
         else
           begin
             case helpertype of
               ht_class:
-                begin
-                  if not is_class(hdef) then
-                    Message1(type_e_class_type_expected,hdef.typename);
-                  { a class helper must extend the same class or a subclass
-                    of the class extended by the parent class helper }
-                  if assigned(current_objectdef.childof) then
-                    begin
-                      if not is_class(current_objectdef.childof.extendeddef) then
-                        Internalerror(2011021101);
-                      if not hdef.is_related(current_objectdef.childof.extendeddef) then
-                        Message1(type_e_class_helper_must_extend_subclass,current_objectdef.childof.extendeddef.typename);
-                    end;
-                end;
+                if (hdef.typ<>objectdef) or
+                    not is_class(hdef) then
+                  Message1(type_e_class_type_expected,hdef.typename)
+                else
+                  begin
+                    { a class helper must extend the same class or a subclass
+                      of the class extended by the parent class helper }
+                    if assigned(current_objectdef.childof) then
+                      begin
+                        if not is_class(current_objectdef.childof.extendeddef) then
+                          Internalerror(2011021101);
+                        if not hdef.is_related(current_objectdef.childof.extendeddef) then
+                          Message1(type_e_class_helper_must_extend_subclass,current_objectdef.childof.extendeddef.typename);
+                      end;
+                  end;
               ht_record:
+                if (hdef.typ=objectdef) or
+                    (
+                      { primitive types are allowed for record helpers in mode
+                        delphi }
+                      (hdef.typ<>recorddef) and
+                      not (m_delphi in current_settings.modeswitches)
+                    ) then
+                  Message1(type_e_record_type_expected,hdef.typename)
+                else
+                  begin
+                    if hdef.typ<>recorddef then
+                      { this is a primitive type in mode delphi, so validate
+                        the def }
+                      validate_extendeddef_typehelper(hdef);
+                    { a record helper must extend the same record as the
+                      parent helper }
+                    check_inheritance_record_type_helper(hdef);
+                  end;
+              ht_type:
                 begin
-                  if not is_record(hdef) then
-                    Message1(type_e_record_type_expected,hdef.typename);
-                  { a record helper must extend the same record as the
+                  validate_extendeddef_typehelper(hdef);
+                  { a type helper must extend the same type as the
                     parent helper }
-                  if assigned(current_objectdef.childof) then
-                    begin
-                      if not is_record(current_objectdef.childof.extendeddef) then
-                        Internalerror(2011021102);
-                      if hdef<>current_objectdef.childof.extendeddef then
-                        Message1(type_e_record_helper_must_extend_same_record,current_objectdef.childof.extendeddef.typename);
-                    end;
+                  check_inheritance_record_type_helper(hdef);
                 end;
-              else
-                hdef:=nil;
             end;
           end;
 
@@ -854,9 +891,10 @@ implementation
                   if (m_mac in current_settings.modeswitches) then
                     include(result.procoptions,po_virtualmethod);
 
-                  { for record helpers only static class methods are allowed }
+                  { for record and type helpers only static class methods are
+                    allowed }
                   if is_objectpascal_helper(astruct) and
-                     is_record(tobjectdef(astruct).extendeddef) and
+                     (tobjectdef(astruct).extendeddef.typ<>objectdef) and
                      is_classdef and not (po_staticmethod in result.procoptions) then
                     MessagePos(result.fileinfo,parser_e_class_methods_only_static_in_records);
 
@@ -915,10 +953,10 @@ implementation
                 begin
                   result:=constructor_head;
                   if is_objectpascal_helper(astruct) and
-                     is_record(tobjectdef(astruct).extendeddef) and
+                     (tobjectdef(astruct).extendeddef.typ<>objectdef) and
                      (result.minparacount=0) then
                       { as long as parameterless constructors aren't allowed in records they
-                       aren't allowed in helpers either }
+                       aren't allowed in record/type helpers either }
                     MessagePos(result.procsym.fileinfo,parser_e_no_parameterless_constructor_in_records);
                 end;
 
@@ -1499,6 +1537,8 @@ implementation
         { generate vmt space if needed }
         if not(oo_has_vmt in current_structdef.objectoptions) and
            not(oo_is_forward in current_structdef.objectoptions) and
+           { no vmt for helpers ever }
+           not is_objectpascal_helper(current_structdef) and
            (
             ([oo_has_virtual,oo_has_constructor,oo_has_destructor]*current_structdef.objectoptions<>[]) or
             (current_objectdef.objecttype in [odt_class])
@@ -1524,7 +1564,7 @@ implementation
           or inside the main project file, the extendeddefs list of the current
           module must be updated (it will be removed when poping the symtable) }
         if is_objectpascal_helper(current_structdef) and
-            (current_objectdef.extendeddef.typ in [recorddef,objectdef]) then
+            (current_objectdef.extendeddef.typ<>errordef) then
           begin
             { the topmost symtable must be a static symtable }
             st:=current_structdef.owner;
@@ -1532,7 +1572,11 @@ implementation
               st:=st.defowner.owner;
             if st.symtabletype=staticsymtable then
               begin
-                s:=make_mangledname('',tabstractrecorddef(current_objectdef.extendeddef).symtable,'');
+                if current_objectdef.extendeddef.typ in [recorddef,objectdef] then
+                  s:=make_mangledname('',tabstractrecorddef(current_objectdef.extendeddef).symtable,'')
+                else
+                  s:=make_mangledname('',current_objectdef.extendeddef.owner,current_objectdef.extendeddef.typesym.name);
+                Message1(sym_d_adding_helper_for,s);
                 list:=TFPObjectList(current_module.extendeddefs.Find(s));
                 if not assigned(list) then
                   begin

+ 167 - 49
compiler/pexpr.pas

@@ -1681,6 +1681,52 @@ implementation
           addstatement(newstatement,ctemprefnode.create(arrnode));
         end;
 
+      function try_type_helper(var node:tnode;def:tdef):boolean;
+        var
+          srsym : tsym;
+          srsymtable : tsymtable;
+          n : tnode;
+          newstatement : tstatementnode;
+          temp : ttempcreatenode;
+          extdef : tdef;
+        begin
+          result:=false;
+          if (token=_ID) and (block_type in [bt_body,bt_general,bt_except]) then
+            begin
+              if not assigned(def) then
+                if node.nodetype=addrn then
+                  { always use the pointer type for addr nodes as otherwise
+                    we'll have an anonymous pointertype with no name }
+                  def:=voidpointertype
+                else
+                  def:=node.resultdef;
+              result:=search_objectpascal_helper(def,nil,pattern,srsym,srsymtable);
+              if result then
+                begin
+                  if not (srsymtable.symtabletype=objectsymtable) or
+                      not is_objectpascal_helper(tdef(srsymtable.defowner)) then
+                    internalerror(2013011401);
+                  { convert const node to temp node of the extended type }
+                  if node.nodetype in (nodetype_const+[niln,addrn]) then
+                    begin
+                      extdef:=tobjectdef(srsymtable.defowner).extendeddef;
+                      newstatement:=nil;
+                      n:=internalstatements(newstatement);
+                      temp:=ctempcreatenode.create(extdef,extdef.size,tt_persistent,false);
+                      addstatement(newstatement,temp);
+                      addstatement(newstatement,cassignmentnode.create(ctemprefnode.create(temp),node));
+                      addstatement(newstatement,ctempdeletenode.create_normal_temp(temp));
+                      addstatement(newstatement,ctemprefnode.create(temp));
+                      node:=n;
+                      do_typecheckpass(node)
+                    end;
+                  check_hints(srsym,srsym.symoptions,srsym.deprecatedmsg);
+                  consume(_ID);
+                  do_member_read(nil,getaddr,srsym,node,again,[]);
+                end;
+            end;
+        end;
+
     var
      protsym  : tpropertysym;
      p2,p3  : tnode;
@@ -1690,12 +1736,14 @@ implementation
      { shouldn't be used that often, so the extra overhead is ok to save
        stack space }
      dispatchstring : ansistring;
+     found,
      haderror,
      nodechanged    : boolean;
      calltype: tdispcalltype;
      valstr,expstr : string;
      intval : qword;
      code : integer;
+     strdef : tdef;
     label
      skipreckklammercheck,
      skippointdefcheck;
@@ -1886,6 +1934,9 @@ implementation
                    not is_boolean(p1.resultdef) and
                    not is_enum(p1.resultdef) then
                  begin
+                   { type helpers are checked first }
+                   if (token=_ID) and try_type_helper(p1,nil) then
+                     goto skippointdefcheck;
                    { only an "e" or "E" can follow an intconst with a ".", the
                      other case (another intconst) is handled by the scanner }
                    if (token=_ID) and (pattern[1]='E') then
@@ -1963,6 +2014,35 @@ implementation
                      end;
                  end;
 
+               if (p1.nodetype=stringconstn) and (token=_ID) then
+                 begin
+                   { the def of a string const is an array }
+                   case tstringconstnode(p1).cst_type of
+                     cst_conststring:
+                       if cs_refcountedstrings in current_settings.localswitches then
+                         if m_default_unicodestring in current_settings.modeswitches then
+                           strdef:=cunicodestringtype
+                         else
+                           strdef:=cansistringtype
+                       else
+                         strdef:=cshortstringtype;
+                     cst_shortstring:
+                       strdef:=cshortstringtype;
+                     cst_ansistring:
+                       { use getansistringdef? }
+                       strdef:=cansistringtype;
+                     cst_widestring:
+                       strdef:=cwidestringtype;
+                     cst_unicodestring:
+                       strdef:=cunicodestringtype;
+                     cst_longstring:
+                       { let's see when someone stumbles upon this...}
+                       internalerror(201301111);
+                   end;
+                   if try_type_helper(p1,strdef) then
+                     goto skippointdefcheck;
+                 end;
+
                { this is skipped if label skippointdefcheck is used }
                case p1.resultdef.typ of
                  recorddef:
@@ -1994,25 +2074,28 @@ implementation
                      if token=_ID then
                        begin
                          srsym:=tsym(tenumdef(p1.resultdef).symtable.Find(pattern));
-                         p1.destroy;
                          if assigned(srsym) and (srsym.typ=enumsym) then
                            begin
+                             p1.destroy;
                              check_hints(srsym,srsym.symoptions,srsym.deprecatedmsg);
                              p1:=genenumnode(tenumsym(srsym));
+                             consume(_ID);
                            end
                          else
-                           begin
-                             Message1(sym_e_id_no_member,orgpattern);
-                             p1:=cerrornode.create;
-                           end;
+                           if not try_type_helper(p1,nil) then
+                             begin
+                               p1.destroy;
+                               Message1(sym_e_id_no_member,orgpattern);
+                               p1:=cerrornode.create;
+                               consume(_ID);
+                             end;
                        end;
-                     consume(_ID);
                    end;
                  arraydef:
                    begin
                      if is_dynamic_array(p1.resultdef) then
                        begin
-                         if token=_ID then
+                         if (token=_ID) and not try_type_helper(p1,nil) then
                            begin
                              if pattern='CREATE' then
                                begin
@@ -2047,39 +2130,42 @@ implementation
                         v.ident(parameters) := rhs -> also property put }
                       if token=_ID then
                         begin
-                          dispatchstring:=orgpattern;
-                          consume(_ID);
-                          calltype:=dct_method;
-                          if try_to_consume(_LKLAMMER) then
-                            begin
-                              p2:=parse_paras(false,true,_RKLAMMER);
-                              consume(_RKLAMMER);
-                            end
-                          else if try_to_consume(_LECKKLAMMER) then
-                            begin
-                              p2:=parse_paras(false,true,_RECKKLAMMER);
-                              consume(_RECKKLAMMER);
-                              calltype:=dct_propget;
-                            end
-                          else
-                            p2:=nil;
-                          { property setter? }
-                          if (token=_ASSIGNMENT) and not(afterassignment) then
+                          if not try_type_helper(p1,nil) then
                             begin
-                              consume(_ASSIGNMENT);
-                              { read the expression }
-                              p3:=comp_expr(true,false);
-                              { concat value parameter too }
-                              p2:=ccallparanode.create(p3,p2);
-                              p1:=translate_disp_call(p1,p2,dct_propput,dispatchstring,0,voidtype);
-                            end
-                          else
-                          { this is only an approximation
-                            setting useresult if not necessary is only a waste of time, no more, no less (FK) }
-                          if afterassignment or in_args or (token<>_SEMICOLON) then
-                            p1:=translate_disp_call(p1,p2,calltype,dispatchstring,0,cvarianttype)
-                          else
-                            p1:=translate_disp_call(p1,p2,calltype,dispatchstring,0,voidtype);
+                              dispatchstring:=orgpattern;
+                              consume(_ID);
+                              calltype:=dct_method;
+                              if try_to_consume(_LKLAMMER) then
+                                begin
+                                  p2:=parse_paras(false,true,_RKLAMMER);
+                                  consume(_RKLAMMER);
+                                end
+                              else if try_to_consume(_LECKKLAMMER) then
+                                begin
+                                  p2:=parse_paras(false,true,_RECKKLAMMER);
+                                  consume(_RECKKLAMMER);
+                                  calltype:=dct_propget;
+                                end
+                              else
+                                p2:=nil;
+                              { property setter? }
+                              if (token=_ASSIGNMENT) and not(afterassignment) then
+                                begin
+                                  consume(_ASSIGNMENT);
+                                  { read the expression }
+                                  p3:=comp_expr(true,false);
+                                  { concat value parameter too }
+                                  p2:=ccallparanode.create(p3,p2);
+                                  p1:=translate_disp_call(p1,p2,dct_propput,dispatchstring,0,voidtype);
+                                end
+                              else
+                              { this is only an approximation
+                                setting useresult if not necessary is only a waste of time, no more, no less (FK) }
+                              if afterassignment or in_args or (token<>_SEMICOLON) then
+                                p1:=translate_disp_call(p1,p2,calltype,dispatchstring,0,cvarianttype)
+                              else
+                                p1:=translate_disp_call(p1,p2,calltype,dispatchstring,0,voidtype);
+                            end;
                         end
                       else { Error }
                         Consume(_ID);
@@ -2156,19 +2242,26 @@ implementation
                         end
                       else
                         begin
-                          Message(parser_e_invalid_qualifier);
-                          if tpointerdef(p1.resultdef).pointeddef.typ in [recorddef,objectdef,classrefdef] then
-                            Message(parser_h_maybe_deref_caret_missing);
+                          if not try_type_helper(p1,nil) then
+                            begin
+                              Message(parser_e_invalid_qualifier);
+                              if tpointerdef(p1.resultdef).pointeddef.typ in [recorddef,objectdef,classrefdef] then
+                                Message(parser_h_maybe_deref_caret_missing);
+                            end;
                         end
                     end;
                   else
                     begin
-                      if p1.resultdef.typ<>undefineddef then
-                        Message(parser_e_invalid_qualifier);
-                      p1.destroy;
-                      p1:=cerrornode.create;
-                      { Error }
-                      consume(_ID);
+                      found:=try_type_helper(p1,nil);
+                      if not found then
+                        begin
+                          if p1.resultdef.typ<>undefineddef then
+                            Message(parser_e_invalid_qualifier);
+                          p1.destroy;
+                          p1:=cerrornode.create;
+                          { Error }
+                          consume(_ID);
+                        end;
                     end;
                end;
                { processing an ordconstnode avoids the resultdef check }
@@ -2952,6 +3045,11 @@ implementation
                begin
                  p1:=real_const_node_from_pattern(pattern);
                  consume(_REALNUMBER);
+                 if token=_POINT then
+                   begin
+                     again:=true;
+                     postfixoperators(p1,again,getaddr);
+                   end;
                end;
 
              _STRING :
@@ -3006,6 +3104,11 @@ implementation
                begin
                  p1:=cordconstnode.create(ord(pattern[1]),cansichartype,true);
                  consume(_CCHAR);
+                 if token=_POINT then
+                   begin
+                     again:=true;
+                     postfixoperators(p1,again,getaddr);
+                   end;
                end;
 
              _CWSTRING:
@@ -3023,6 +3126,11 @@ implementation
                begin
                  p1:=cordconstnode.create(ord(getcharwidestring(patternw,0)),cwidechartype,true);
                  consume(_CWCHAR);
+                 if token=_POINT then
+                   begin
+                     again:=true;
+                     postfixoperators(p1,again,getaddr);
+                   end;
                end;
 
              _KLAMMERAFFE :
@@ -3140,12 +3248,22 @@ implementation
                begin
                  consume(_TRUE);
                  p1:=cordconstnode.create(1,pasbool8type,false);
+                 if token=_POINT then
+                   begin
+                     again:=true;
+                     postfixoperators(p1,again,getaddr);
+                   end;
                end;
 
              _FALSE :
                begin
                  consume(_FALSE);
                  p1:=cordconstnode.create(0,pasbool8type,false);
+                 if token=_POINT then
+                   begin
+                     again:=true;
+                     postfixoperators(p1,again,getaddr);
+                   end;
                end;
 
              _NIL :
@@ -3153,7 +3271,7 @@ implementation
                  consume(_NIL);
                  p1:=cnilnode.create;
                  { It's really ugly code nil^, but delphi allows it }
-                 if token in [_CARET] then
+                 if token in [_CARET,_POINT] then
                   begin
                     again:=true;
                     postfixoperators(p1,again,getaddr);

+ 1 - 1
compiler/pgenutil.pas

@@ -754,7 +754,7 @@ uses
                 current_filepos.moduleindex:=hmodule.unit_index;
                 current_tokenpos:=current_filepos;
                 current_scanner.startreplaytokens(genericdef.generictokenbuf);
-                read_named_type(tt,srsym,genericdef,generictypelist,false);
+                read_named_type(tt,srsym,genericdef,generictypelist,false,false);
                 current_filepos:=oldcurrent_filepos;
                 ttypesym(srsym).typedef:=tt;
                 tt.typesym:=srsym;

+ 7 - 2
compiler/pparautl.pas

@@ -193,7 +193,12 @@ implementation
                 if (pd.proctypeoption in [potype_constructor,potype_destructor]) and
                    not(is_cppclass(tprocdef(pd).struct) or
                        is_record(tprocdef(pd).struct) or
-                       is_javaclass(tprocdef(pd).struct)) then
+                       is_javaclass(tprocdef(pd).struct) or
+                       (
+                         { no vmt for record/type helper constructors }
+                         is_objectpascal_helper(tprocdef(pd).struct) and
+                         (tobjectdef(tprocdef(pd).struct).extendeddef.typ<>objectdef)
+                       )) then
                  begin
                    { can't use classrefdef as type because inheriting
                      will then always file because of a type mismatch }
@@ -216,7 +221,7 @@ implementation
                   hdef:=tclassrefdef.create(selfdef)
                 else
                   begin
-                    if is_object(selfdef) or is_record(selfdef) then
+                    if is_object(selfdef) or (selfdef.typ<>objectdef) then
                       vsp:=vs_var;
                     hdef:=selfdef;
                   end;

+ 2 - 2
compiler/psub.pas

@@ -501,8 +501,8 @@ implementation
                   if not is_record(current_structdef) and
                      not (
                             is_objectpascal_helper(current_structdef) and
-                            is_record(tobjectdef(current_structdef).extendeddef)
-                          ) then
+                            (tobjectdef(current_structdef).extendeddef.typ<>objectdef)
+                         ) then
                     internalerror(200305103);
                 { if self=nil then exit
                   calling fail instead of exit is useless because

+ 13 - 4
compiler/ptype.pas

@@ -44,7 +44,7 @@ interface
     procedure single_type(var def:tdef;options:TSingleTypeOptions);
 
     { reads any type declaration, where the resulting type will get name as type identifier }
-    procedure read_named_type(var def:tdef;const newsym:tsym;genericdef:tstoreddef;genericlist:TFPObjectList;parseprocvardir:boolean);
+    procedure read_named_type(var def:tdef;const newsym:tsym;genericdef:tstoreddef;genericlist:TFPObjectList;parseprocvardir:boolean;hadtypetoken:boolean);
 
     { reads any type declaration }
     procedure read_anon_type(var def : tdef;parseprocvardir:boolean);
@@ -865,7 +865,7 @@ implementation
 
 
     { reads a type definition and returns a pointer to it }
-    procedure read_named_type(var def:tdef;const newsym:tsym;genericdef:tstoreddef;genericlist:TFPObjectList;parseprocvardir:boolean);
+    procedure read_named_type(var def:tdef;const newsym:tsym;genericdef:tstoreddef;genericlist:TFPObjectList;parseprocvardir:boolean;hadtypetoken:boolean);
       var
         pt : tnode;
         tt2 : tdef;
@@ -1679,7 +1679,16 @@ implementation
                     current_module.checkforwarddefs.add(def);
                 end
               else
-                expr_type;
+                if hadtypetoken and
+                    { don't allow "type helper" in mode delphi and require modeswitch class }
+                    ([m_delphi,m_class]*current_settings.modeswitches=[m_class]) and
+                    (token=_ID) and (idtoken=_HELPER) then
+                  begin
+                    consume(_HELPER);
+                    def:=object_dec(odt_helper,name,newsym,genericdef,genericlist,nil,ht_type);
+                  end
+                else
+                  expr_type;
          end;
 
          if def=nil then
@@ -1689,7 +1698,7 @@ implementation
 
     procedure read_anon_type(var def : tdef;parseprocvardir:boolean);
       begin
-        read_named_type(def,nil,nil,nil,parseprocvardir);
+        read_named_type(def,nil,nil,nil,parseprocvardir,false);
       end;
 
 

+ 2 - 1
compiler/symconst.pas

@@ -392,7 +392,8 @@ type
   { defines the type of the extended "structure"; only used for parsing }
   thelpertype=(ht_none,
     ht_class,
-    ht_record
+    ht_record,
+    ht_type
   );
 
   { Variations in interfaces implementation }

+ 3 - 3
compiler/symdef.pas

@@ -1245,10 +1245,10 @@ implementation
             if not (st.symlist[i] is ttypesym) then
               continue;
             def:=ttypesym(st.SymList[i]).typedef;
-            if is_objectpascal_helper(def) and
-                (tobjectdef(def).extendeddef.typ in [recorddef,objectdef]) then
+            if is_objectpascal_helper(def) then
               begin
-                s:=make_mangledname('',tabstractrecorddef(tobjectdef(def).extendeddef).symtable,'');
+                s:=generate_objectpascal_helper_key(tobjectdef(def).extendeddef);
+                Message1(sym_d_adding_helper_for,s);
                 list:=TFPObjectList(current_module.extendeddefs.Find(s));
                 if not assigned(list) then
                   begin

+ 24 - 6
compiler/symtable.pas

@@ -214,6 +214,8 @@ interface
 {*** Misc ***}
     function  FullTypeName(def,otherdef:tdef):string;
     function generate_nested_name(symtable:tsymtable;delimiter:string):string;
+    { def is the extended type of a helper }
+    function generate_objectpascal_helper_key(def:tdef):string;
     procedure incompatibletypes(def1,def2:tdef);
     procedure hidesym(sym:TSymEntry);
     procedure duplicatesym(var hashedid:THashedIDString;dupsym,origsym:TSymEntry);
@@ -252,10 +254,10 @@ interface
     function  search_assignment_operator(from_def,to_def:Tdef;explicit:boolean):Tprocdef;
     function  search_enumerator_operator(from_def,to_def:Tdef):Tprocdef;
     { searches for the helper definition that's currently active for pd }
-    function  search_last_objectpascal_helper(pd,contextclassh : tabstractrecorddef;out odef : tobjectdef):boolean;
+    function  search_last_objectpascal_helper(pd : tdef;contextclassh : tabstractrecorddef;out odef : tobjectdef):boolean;
     { searches whether the symbol s is available in the currently active }
     { helper for pd }
-    function  search_objectpascal_helper(pd,contextclassh : tabstractrecorddef;const s : string; out srsym: tsym; out srsymtable: tsymtable):boolean;
+    function  search_objectpascal_helper(pd : tdef;contextclassh : tabstractrecorddef;const s : string; out srsym: tsym; out srsymtable: tsymtable):boolean;
     function  search_objc_helper(pd : tobjectdef;const s : string; out srsym: tsym; out srsymtable: tsymtable):boolean;
     function  search_objc_method(const s : string; out srsym: tsym; out srsymtable: tsymtable):boolean;
     {Looks for macro s (must be given in upper case) in the macrosymbolstack, }
@@ -1967,6 +1969,18 @@ implementation
           end;
       end;
 
+
+    function generate_objectpascal_helper_key(def:tdef):string;
+      begin
+        if not assigned(def) then
+          internalerror(2013020501);
+        if def.typ in [recorddef,objectdef] then
+          result:=make_mangledname('',tabstractrecorddef(def).symtable,'')
+        else
+          result:=make_mangledname('',def.owner,def.typesym.name);
+      end;
+
+
     procedure incompatibletypes(def1,def2:tdef);
       begin
         { When there is an errordef there is already an error message show }
@@ -3022,7 +3036,7 @@ implementation
           end;
       end;
 
-    function search_last_objectpascal_helper(pd,contextclassh : tabstractrecorddef;out odef : tobjectdef):boolean;
+    function search_last_objectpascal_helper(pd : tdef;contextclassh : tabstractrecorddef;out odef : tobjectdef):boolean;
       var
         s: string;
         list: TFPObjectList;
@@ -3036,7 +3050,11 @@ implementation
         if current_module.extendeddefs.count=0 then
           exit;
         { no helpers for anonymous types }
-        if not assigned(pd.objrealname) or (pd.objrealname^='') then
+        if (pd.typ in [recorddef,objectdef]) and
+            (
+              not assigned(tabstractrecorddef(pd).objrealname) or
+              (tabstractrecorddef(pd).objrealname^='')
+            ) then
           exit;
         { if pd is defined inside a procedure we must not use make_mangledname
           (as a helper may not be defined in a procedure this is no problem...)}
@@ -3046,7 +3064,7 @@ implementation
         if st.symtabletype=localsymtable then
           exit;
         { the mangled name is used as the key for tmodule.extendeddefs }
-        s:=make_mangledname('',pd.symtable,'');
+        s:=generate_objectpascal_helper_key(pd);
         list:=TFPObjectList(current_module.extendeddefs.Find(s));
         if assigned(list) and (list.count>0) then
           begin
@@ -3063,7 +3081,7 @@ implementation
           end;
       end;
 
-    function search_objectpascal_helper(pd,contextclassh : tabstractrecorddef;const s: string; out srsym: tsym; out srsymtable: tsymtable):boolean;
+    function search_objectpascal_helper(pd : tdef;contextclassh : tabstractrecorddef;const s: string; out srsym: tsym; out srsymtable: tsymtable):boolean;
 
       var
         hashedid  : THashedIDString;

+ 22 - 0
tests/test/tthlp1.pp

@@ -0,0 +1,22 @@
+{ %NORUN }
+
+{ this checks that the basic type helper syntax is parsed correctly }
+
+program tthlp1;
+
+{$mode objfpc}{$H+}
+
+type
+  TTest = type helper for LongInt
+    procedure Test;
+  end;
+
+procedure TTest.Test;
+begin
+
+end;
+
+begin
+
+end.
+

+ 18 - 0
tests/test/tthlp10.pp

@@ -0,0 +1,18 @@
+{ %FAIL }
+
+{ this tests that procedure variables (among others) can not be extended }
+
+program tthlp10;
+
+{$mode objfpc}
+
+type
+  TProcedure = procedure;
+
+  TProcedureHelper = type helper for TProcedure
+
+  end;
+
+begin
+
+end.

+ 18 - 0
tests/test/tthlp11.pp

@@ -0,0 +1,18 @@
+{ %FAIL }
+
+{ this tests that procedure variables (among others) can not be extended }
+
+program tthlp11;
+
+{$mode delphi}
+
+type
+  TProcedure = procedure;
+
+  TProcedureHelper = record helper for TProcedure
+
+  end;
+
+begin
+
+end.

+ 32 - 0
tests/test/tthlp12.pp

@@ -0,0 +1,32 @@
+{ this checks that inheritance for type helper is working correctly }
+
+program tthlp12;
+
+{$mode objfpc}
+
+type
+  TLongIntHelper = type helper for LongInt
+    function Test: Integer;
+  end;
+
+  TLongIntHelperSub = type helper(TLongIntHelper) for LongInt
+    function Test: Integer;
+  end;
+
+function TLongIntHelper.Test: Integer;
+begin
+  Result := 21;
+end;
+
+function TLongIntHelperSub.Test: Integer;
+begin
+  Result := inherited Test * 2;
+end;
+
+var
+  i: LongInt;
+begin
+  if i.Test <> 42 then
+    Halt(1);
+  Writeln('OK');
+end.

+ 18 - 0
tests/test/tthlp13.pp

@@ -0,0 +1,18 @@
+{ %FAIL }
+
+{ this tests that the same type must be extended by the child helper }
+
+program tthlp13;
+
+{$mode objfpc}
+
+type
+  TLongIntHelper = type helper for LongInt
+  end;
+
+  TByteHelper = type helper(TLongIntHelper) for Byte
+  end;
+
+begin
+
+end.

+ 154 - 0
tests/test/tthlp14.pp

@@ -0,0 +1,154 @@
+{ this tests that constructors in helpers are working correctly }
+
+program tthlp14;
+
+{$mode objfpc}
+{$apptype console}
+
+uses
+  uthlp, math;
+
+var
+  ui8: UInt8;
+  ui16: UInt16;
+  ui32: UInt32;
+  ui64: UInt64;
+  i8: Int8;
+  i16: Int16;
+  i32: Int32;
+  i64: Int64;
+  s: Single;
+  d: Double;
+  e: Extended;
+  ss: ShortString;
+  _as: AnsiString;
+  ws: WideString;
+  us: UnicodeString;
+  ac: AnsiChar;
+  wc: WideChar;
+  pb8: Boolean;
+  pb16: Boolean16;
+  pb32: Boolean32;
+  pb64: Boolean64;
+  b8: ByteBool;
+  b16: WordBool;
+  b32: LongBool;
+  b64: QWordBool;
+  ml: MyLongInt;
+  ts: TTestSet;
+  te: TTestEnum;
+  ta, ta2: TTestArray;
+  p: Pointer;
+  pl: PLongInt;
+  v: Variant;
+begin
+  Writeln('Ordinal variables');
+  ui8 := UInt8.Create(42);
+  if ui8 <> 42 then
+    Halt(1);
+  ui16 := UInt16.Create(42);
+  if ui16 <> 42 then
+    Halt(2);
+  ui32 := UInt32.Create(42);
+  if ui32 <> 42 then
+    Halt(3);
+  ui64 := UInt64.Create(42);
+  if ui64 <> 42 then
+    Halt(4);
+  i8 := Int8.Create(42);
+  if i8 <> 42 then
+    Halt(5);
+  i16 := Int16.Create(42);
+  if i16 <> 42 then
+    Halt(6);
+  i32 := Int32.Create(42);
+  if i32 <> 42 then
+    Halt(7);
+  i64 := Int64.Create(42);
+  if i64 <> 42 then
+    Halt(8);
+  Writeln('Boolean variables');
+  pb8 := Boolean.Create(True);
+  if not pb8 then
+    Halt(9);
+  pb16 := Boolean16.Create(True);
+  if not pb16 then
+    Halt(10);
+  pb32 := Boolean32.Create(True);
+  if not pb32 then
+    Halt(11);
+  pb64 := Boolean64.Create(True);
+  if not pb64 then
+    Halt(12);
+  b8 := ByteBool.Create(True);
+  if not b8 then
+    Halt(13);
+  b16 := WordBool.Create(True);
+  if not b16 then
+    Halt(14);
+  b32 := LongBool.Create(True);
+  if not b32 then
+    Halt(15);
+  b64 := QWordBool.Create(True);
+  if not b64 then
+    Halt(16);
+  Writeln('Float variables');
+  s := Single.Create(4.2);
+  if not SameValue(s, Single(4.2), 1e-100) then
+    Halt(17);
+  d := Double.Create(4.2);
+  if not SameValue(d, Double(4.2), 1e-100) then
+    Halt(18);
+{$if sizeof(Extended) <> sizeof(Double)}
+  e := Extended.Create(4.2);
+  if not SameValue(e, Extended(4.2), 1e-100) then
+    Halt(19);
+{$endif}
+  Writeln('Char variables');
+  ac := AnsiChar.Create('a');
+  if ac <> 'a' then
+    Halt(20);
+  wc := WideChar.Create(#$1234);
+  if wc <> #$1234 then
+    Halt(21);
+  Writeln('String variables');
+  ss := ShortString.Create('Test');
+  if ss <> 'Test' then
+    Halt(22);
+  _as := AnsiString.Create('Test');
+  if _as <> 'Test' then
+    Halt(23);
+  ws := WideString.Create(#$1234#$4321);
+  if ws <> #$1234#$4321 then
+    Halt(24);
+  us := UnicodeString.Create(#$1234#$4321);
+  if us <> #$1234#$4321 then
+    Halt(25);
+  Writeln('Pointer variables');
+  p := Pointer.Create(@p);
+  if p <> @p then
+    Halt(26);
+  pl := PLongInt.Create(@pl);
+  if pl <> @pl then
+    Halt(27);
+  Writeln('Other variables');
+  ml := MyLongInt.Create(42);
+  if ml <> 42 then
+    Halt(28);
+  te := TTestEnum.Create(teOne);
+  if te <> teOne then
+    Halt(29);
+  ts := TTestSet.Create([teOne, teTwo]);
+  if ts <> [teOne, teTwo] then
+    Halt(30);
+  SetLength(ta2, 2);
+  ta2[0] := 42;
+  ta2[1] := 21;
+  ta := TTestArray.Create(ta2);
+  if (Length(ta) <> 2) or (ta[0] <> ta2[0]) or (ta[1] <> ta2[1]) then
+    Halt(31);
+  v := Variant.Create(42);
+  if v <> 42 then
+    Halt(32);
+  Writeln('OK');
+end.

+ 20 - 0
tests/test/tthlp15.pp

@@ -0,0 +1,20 @@
+{ %FAIL }
+
+{ constructors without arguments are not allowed }
+
+program tthlp15;
+
+{$mode objfpc}
+
+type
+  TLongIntHelper = type helper for LongInt
+    constructor Create;
+  end;
+
+constructor TLongIntHelper.Create;
+begin
+  Self := 2;
+end;
+
+begin
+end.

+ 20 - 0
tests/test/tthlp16.pp

@@ -0,0 +1,20 @@
+{ %FAIL }
+
+{ constructors with only default arguments are not allowed }
+
+program tthlp16;
+
+{$mode objfpc}
+
+type
+  TLongIntHelper = type helper for LongInt
+    constructor Create(aArg1: LongInt = 0; aArg2: LongInt = 0);
+  end;
+
+constructor TLongIntHelper.Create(aArg1: LongInt = 0; aArg2: LongInt = 0);
+begin
+  Self := 2;
+end;
+
+begin
+end.

+ 13 - 0
tests/test/tthlp17.pp

@@ -0,0 +1,13 @@
+{ %FAIL }
+
+{ method usage should fail if no helper is in scope }
+
+program tthlp17;
+
+{$mode objfpc}
+
+var
+  i: LongInt;
+begin
+  i.Test;
+end.

+ 17 - 0
tests/test/tthlp18.pp

@@ -0,0 +1,17 @@
+program tthlp18;
+
+{$mode objfpc}
+{$apptype console}
+
+uses
+  uthlp;
+
+var
+  i: Integer;
+begin
+  i := 42;
+  i.Create(21);
+  if i <> 21 then
+    Halt(1);
+  Writeln('OK');
+end.

+ 15 - 0
tests/test/tthlp19.pp

@@ -0,0 +1,15 @@
+{ %FAIL }
+
+{ don't allow helper methods for constant declarations }
+
+program tthlp19;
+
+uses
+  uthlp;
+
+const
+  TestLongInt: LongInt = 42.Test;
+
+begin
+
+end.

+ 22 - 0
tests/test/tthlp2.pp

@@ -0,0 +1,22 @@
+{ %NORUN }
+
+{ this checks that the basic type helper syntax is parsed correctly }
+
+program tthlp2;
+
+{$mode delphi}{$H+}
+
+type
+  TTest = record helper for LongInt
+    procedure Test;
+  end;
+
+procedure TTest.Test;
+begin
+
+end;
+
+begin
+
+end.
+

+ 98 - 0
tests/test/tthlp3.pp

@@ -0,0 +1,98 @@
+{ this tests that the correct helper is used for variables }
+
+program tthlp3;
+
+{$mode objfpc}
+{$apptype console}
+
+uses
+  uthlp;
+
+procedure TestResult(aActual, aExpected, aError: LongInt);
+begin
+  if aActual <> aExpected then begin
+    Writeln('Expected: ', aExpected, ' got: ', aActual);
+    Halt(aError);
+  end;
+end;
+
+var
+  ui8: UInt8;
+  ui16: UInt16;
+  ui32: UInt32;
+  ui64: UInt64;
+  i8: Int8;
+  i16: Int16;
+  i32: Int32;
+  i64: Int64;
+  s: Single;
+  d: Double;
+  e: Extended;
+  ss: ShortString;
+  _as: AnsiString;
+  ws: WideString;
+  us: UnicodeString;
+  ac: AnsiChar;
+  wc: WideChar;
+  pb8: Boolean;
+  pb16: Boolean16;
+  pb32: Boolean32;
+  pb64: Boolean64;
+  b8: ByteBool;
+  b16: WordBool;
+  b32: LongBool;
+  b64: QWordBool;
+  ml: MyLongInt;
+  ts: TTestSet;
+  te: TTestEnum;
+  ta: TTestArray;
+  p: Pointer;
+  pl: PLongInt;
+  v: Variant;
+begin
+  Writeln('Ordinal variables');
+  TestResult(ui8.Test, 1, 1);
+  TestResult(ui16.Test, 2, 2);
+  TestResult(ui32.Test, 4, 3);
+  TestResult(ui64.Test, 8, 4);
+  TestResult(i8.Test, - 1, 5);
+  TestResult(i16.Test, - 2, 6);
+  TestResult(i32.Test, - 4, 7);
+  TestResult(i64.Test, - 8, 8);
+  Writeln('Boolean variables');
+  TestResult(pb8.Test, 1, 9);
+  TestResult(pb16.Test, 2, 10);
+  TestResult(pb32.Test, 4, 11);
+  TestResult(pb64.Test, 8, 12);
+  TestResult(b8.Test, - 1, 13);
+  TestResult(b16.Test, - 2, 14);
+  TestResult(b32.Test, - 4, 15);
+  TestResult(b64.Test, - 8, 16);
+  Writeln('Float variables');
+  TestResult(s.Test, 4, 17);
+  TestResult(d.Test, 8, 18);
+{$if sizeof(Extended) = sizeof(Double)}
+  // expect the helper for Doubles
+  TestResult(e.Test, 8, 19);
+{$else}
+  TestResult(e.Test, 10, 19);
+{$endif}
+  Writeln('Char variables');
+  TestResult(ac.Test, - 1, 20);
+  TestResult(wc.Test, - 2, 21);
+  Writeln('String variables');
+  TestResult(ss.Test, 1, 22);
+  TestResult(_as.Test, 2, 23);
+  TestResult(ws.Test, 3, 24);
+  TestResult(us.Test, 4, 25);
+  Writeln('Pointer variables');
+  TestResult(p.Test, 1, 26);
+  TestResult(pl.Test, 4, 27);
+  Writeln('Other variables');
+  TestResult(ml.Test, 42, 28);
+  TestResult(te.Test, 1, 29);
+  TestResult(ts.Test, 2, 30);
+  TestResult(ta.Test, 0, 31);
+  TestResult(v.Test, 3, 32);
+  Writeln('OK');
+end.

+ 61 - 0
tests/test/tthlp4.pp

@@ -0,0 +1,61 @@
+{ this tests that the correct helper is used for constants }
+
+program tthlp4;
+
+{$mode objfpc}
+{$apptype console}
+
+uses
+  uthlp;
+
+procedure TestResult(aActual, aExpected, aError: LongInt);
+begin
+  if aActual <> aExpected then begin
+    Writeln('Expected: ', aExpected, ' got: ', aActual, ' error: ', aError);
+    Halt(aError);
+  end;
+end;
+
+var
+  ml: MyLongInt;
+begin
+  Writeln('Ordinal constants');
+  TestResult(2.Test, -1, 1);
+  TestResult(-2.Test, -1, 2);
+  TestResult(200.Test, 1, 3);
+  TestResult(-200.Test, -2, 4);
+  TestResult(40000.Test, 2, 5);
+  TestResult(-20000.Test, -2, 6);
+  TestResult(-40000.Test, -4, 7);
+  TestResult(70000.Test, -4, 8);
+  TestResult(3000000000.Test, 4, 9);
+  TestResult($1ffffffff.Test, -8, 10);
+  TestResult($1fffffffffffffff.Test, -8, 11);
+  Writeln('Float constants');
+  TestResult(1.25.Test, 4, 12);
+{$if sizeof(Extended) = sizeof(Double)}
+  TestResult(1.25e10.Test, 8, 14);
+{$else}
+  TestResult(1.25e10.Test, 10, 14);
+{$endif}
+  Writeln('Boolean constants');
+  TestResult(True.Test, 1, 15);
+  TestResult(False.Test, 1, 16);
+  Writeln('String constants');
+  TestResult('ShortString'.Test, 1, 17);
+  TestResult('UnicodeString'#1234.Test, 4, 18);
+  Writeln('Misc constants');
+  TestResult(Nil.Test, 1, 19);
+  TestResult(teOne.Test, 1, 20);
+  TestResult('a'.Test, - 1, 21);
+  TestResult(#1234.Test, - 2, 22);
+{$push}
+{$T-}
+  // => Pointer
+  TestResult((@ml).Test, 1, 23);
+{$T+}
+  // => Pointer as well
+  TestResult((@ml).Test, 1, 24);
+{$pop}
+  Writeln('OK');
+end.

+ 15 - 0
tests/test/tthlp5.pp

@@ -0,0 +1,15 @@
+{ Test that by default string constants are handled as ShortString }
+
+program tthlp5;
+
+{$mode objfpc}
+{$apptype console}
+
+uses
+  uthlp;
+
+begin
+  if 'Hello World'.Test <> 1 then
+    Halt(1);
+  Writeln('OK');
+end.

+ 15 - 0
tests/test/tthlp6.pp

@@ -0,0 +1,15 @@
+{ Test that with $H+ string constants are handled as AnsiString }
+
+program tthlp6;
+
+{$mode objfpc}{$H+}
+{$apptype console}
+
+uses
+  uthlp;
+
+begin
+  if 'Hello World'.Test <> 2 then
+    Halt(1);
+  Writeln('OK');
+end.

+ 17 - 0
tests/test/tthlp7.pp

@@ -0,0 +1,17 @@
+{ Test that with $H+ and unicodestrings string constants are handled as
+  UnicodeString }
+
+program tthlp7;
+
+{$mode objfpc}{$H+}
+{$modeswitch unicodestrings}
+{$apptype console}
+
+uses
+  uthlp;
+
+begin
+  if 'Hello World'.Test <> 4 then
+    Halt(1);
+  Writeln('OK');
+end.

+ 19 - 0
tests/test/tthlp8.pp

@@ -0,0 +1,19 @@
+{ Test that "chaining" works correctly }
+
+program tthlp8;
+
+{$mode objfpc}{$H+}
+{$apptype console}
+
+uses
+  uthlp;
+
+begin
+  if 'Hello World'.Test.Test <> - 4 then
+    Halt(1);
+  if 'Hello World'[5].Test <> - 1 then
+    Halt(2);
+  if 'Hello World'[5].Test.Test <> - 4 then
+    Halt(3);
+  Writeln('OK');
+end.

+ 37 - 0
tests/test/tthlp9.pp

@@ -0,0 +1,37 @@
+{ this tests that class methods can be used in type helpers }
+
+program tthlp9;
+
+{$mode objfpc}
+{$apptype console}
+
+type
+  TInt32Helper = type helper for Int32
+    class function Test: LongInt; static;
+  end;
+
+  TShortStringHelper = type helper for ShortString
+    class function Test: LongInt; static;
+  end;
+
+class function TInt32Helper.Test: LongInt;
+begin
+  Result := SizeOf(Int32);
+end;
+
+class function TShortStringHelper.Test: LongInt;
+begin
+  Result := SizeOf(AnsiChar);
+end;
+
+var
+  i: LongInt;
+begin
+  if LongInt.Test <> 4 then
+    Halt(1);
+  if i.Test <> 4 then
+    Halt(2);
+  if ShortString.Test <> 1 then
+    Halt(3);
+  Writeln('OK');
+end.

+ 570 - 0
tests/test/uthlp.pp

@@ -0,0 +1,570 @@
+unit uthlp;
+
+{$ifdef fpc}
+  {$mode delphi}{$H+}
+{$endif}
+
+interface
+
+type
+  TTestEnum = (
+    teOne,
+    teTwo,
+    teThree
+  );
+  TTestSet = set of TTestEnum;
+  TTestArray = array of LongInt;
+  MyLongInt = type LongInt;
+
+  TUInt8Helper = record helper for UInt8
+    function Test: LongInt;
+    constructor Create(aArg: UInt8);
+  end;
+
+  TUInt16Helper = record helper for UInt16
+    function Test: LongInt;
+    constructor Create(aArg: UInt16);
+  end;
+
+  TUInt32Helper = record helper for UInt32
+    function Test: LongInt;
+    constructor Create(aArg: UInt32);
+  end;
+
+  TUInt64Helper = record helper for UInt64
+    function Test: LongInt;
+    constructor Create(aArg: UInt64);
+  end;
+
+  TInt8Helper = record helper for Int8
+    function Test: LongInt;
+    constructor Create(aArg: Int8);
+  end;
+
+  TInt16Helper = record helper for Int16
+    function Test: LongInt;
+    constructor Create(aArg: Int16);
+  end;
+
+  TInt32Helper = record helper for Int32
+    function Test: LongInt;
+    constructor Create(aArg: Int32);
+  end;
+
+  TInt64Helper = record helper for Int64
+    function Test: LongInt;
+    constructor Create(aArg: Int64);
+  end;
+
+  TBooleanHelper = record helper for Boolean
+    function Test: LongInt;
+    constructor Create(aArg: Boolean);
+  end;
+
+  TBoolean16Helper = record helper for Boolean16
+    function Test: LongInt;
+    constructor Create(aArg: Boolean16);
+  end;
+
+  TBoolean32Helper = record helper for Boolean32
+    function Test: LongInt;
+    constructor Create(aArg: Boolean32);
+  end;
+
+  TBoolean64Helper = record helper for Boolean64
+    function Test: LongInt;
+    constructor Create(aArg: Boolean64);
+  end;
+
+  TByteBoolHelper = record helper for ByteBool
+    function Test: LongInt;
+    constructor Create(aArg: ByteBool);
+  end;
+
+  TWordBoolHelper = record helper for WordBool
+    function Test: LongInt;
+    constructor Create(aArg: WordBool);
+  end;
+
+  TLongBoolHelper = record helper for LongBool
+    function Test: LongInt;
+    constructor Create(aArg: LongBool);
+  end;
+
+  TQWordBoolHelper = record helper for QWordBool
+    function Test: LongInt;
+    constructor Create(aArg: QWordBool);
+  end;
+
+  TShortStringHelper = record helper for ShortString
+    function Test: LongInt;
+    constructor Create(aArg: ShortString);
+  end;
+
+  TAnsiStringHelper = record helper for AnsiString
+    function Test: LongInt;
+    constructor Create(aArg: AnsiString);
+  end;
+
+  TWideStringHelper = record helper for WideString
+    function Test: LongInt;
+    constructor Create(aArg: WideString);
+  end;
+
+  TUnicodeStringHelper = record helper for UnicodeString
+    function Test: LongInt;
+    constructor Create(aArg: UnicodeString);
+  end;
+
+  TAnsiCharHelper = record helper for AnsiChar
+    function Test: LongInt;
+    constructor Create(aArg: AnsiChar);
+  end;
+
+  TWideCharHelper = record helper for WideChar
+    function Test: LongInt;
+    constructor Create(aArg: WideChar);
+  end;
+
+  TPointerHelper = record helper for Pointer
+    function Test: LongInt;
+    constructor Create(aArg: Pointer);
+  end;
+
+  TPLongIntHelper = record helper for PLongInt
+    function Test: LongInt;
+    constructor Create(aArg: PLongInt);
+  end;
+
+  TMyLongIntHelper = record helper for MyLongInt
+    function Test: LongInt;
+    constructor Create(aArg: MyLongInt);
+  end;
+
+  TTestEnumHelper = record helper for TTestEnum
+    function Test: LongInt;
+    constructor Create(aArg: TTestEnum);
+  end;
+
+  TTestSetHelper = record helper for TTestSet
+    function Test: LongInt;
+    constructor Create(aArg: TTestSet);
+  end;
+
+  TTestArrayHelper = record helper for TTestArray
+    function Test: LongInt;
+    constructor Create(aArg: TTestArray);
+  end;
+
+  TVariantHelper = record helper for Variant
+    function Test: LongInt;
+    constructor Create(aArg: Variant);
+  end;
+
+  TSingleHelper = record helper for Single
+    function Test: LongInt;
+    constructor Create(aArg: Single);
+  end;
+
+  TDoubleHelper = record helper for Double
+    function Test: LongInt;
+    constructor Create(aArg: Double);
+  end;
+
+{$if sizeof(extended) <> sizeof(double)}
+  TExtendedHelper = record helper for Extended
+    function Test: LongInt;
+    constructor Create(aArg: Extended);
+  end;
+{$endif}
+
+implementation
+
+{$if sizeof(extended) <> sizeof(double)}
+{ TExtendedHelper }
+
+function TExtendedHelper.Test: LongInt;
+begin
+  Result := SizeOf(Self);
+end;
+
+constructor TExtendedHelper.Create(aArg: Extended);
+begin
+  Self := aArg;
+end;
+{$endif}
+
+{ TDoubleHelper }
+
+function TDoubleHelper.Test: LongInt;
+begin
+  Result := SizeOf(Self);
+end;
+
+constructor TDoubleHelper.Create(aArg: Double);
+begin
+  Self := aArg;
+end;
+
+{ TSingleHelper }
+
+function TSingleHelper.Test: LongInt;
+begin
+  Result := SizeOf(Self);
+end;
+
+constructor TSingleHelper.Create(aArg: Single);
+begin
+  Self := aArg;
+end;
+
+{ TVariantHelper }
+
+function TVariantHelper.Test: LongInt;
+begin
+  Result := 3;
+end;
+
+constructor TVariantHelper.Create(aArg: Variant);
+begin
+  Self := aArg;
+end;
+
+{ TTestArrayHelper }
+
+function TTestArrayHelper.Test: LongInt;
+begin
+  Result := Length(Self);
+end;
+
+constructor TTestArrayHelper.Create(aArg: TTestArray);
+begin
+  Self := aArg;
+end;
+
+{ TTestSetHelper }
+
+function TTestSetHelper.Test: LongInt;
+begin
+  Result := 2;
+end;
+
+constructor TTestSetHelper.Create(aArg: TTestSet);
+begin
+  Self := aArg;
+end;
+
+{ TTestEnumHelper }
+
+function TTestEnumHelper.Test: LongInt;
+begin
+  Result := 1;
+end;
+
+constructor TTestEnumHelper.Create(aArg: TTestEnum);
+begin
+  Self := aArg;
+end;
+
+{ TMyLongIntHelper }
+
+function TMyLongIntHelper.Test: LongInt;
+begin
+  Result := 42;
+end;
+
+constructor TMyLongIntHelper.Create(aArg: MyLongInt);
+begin
+  Self := aArg;
+end;
+
+{ TPLongIntHelper }
+
+function TPLongIntHelper.Test: LongInt;
+begin
+  Result := 4;
+end;
+
+constructor TPLongIntHelper.Create(aArg: PLongInt);
+begin
+  Self := aArg;
+end;
+
+{ TPointerHelper }
+
+function TPointerHelper.Test: LongInt;
+begin
+  Result := 1;
+end;
+
+constructor TPointerHelper.Create(aArg: Pointer);
+begin
+  Self := aArg;
+end;
+
+{ TWideCharHelper }
+
+function TWideCharHelper.Test: LongInt;
+begin
+  Result := - 2;
+end;
+
+constructor TWideCharHelper.Create(aArg: WideChar);
+begin
+  Self := aArg;
+end;
+
+{ TAnsiCharHelper }
+
+function TAnsiCharHelper.Test: LongInt;
+begin
+  Result := - 1;
+end;
+
+constructor TAnsiCharHelper.Create(aArg: AnsiChar);
+begin
+  Self := aArg;
+end;
+
+{ TUnicodeStringHelper }
+
+function TUnicodeStringHelper.Test: LongInt;
+begin
+  Result := 4;
+end;
+
+constructor TUnicodeStringHelper.Create(aArg: UnicodeString);
+begin
+  Self := aArg;
+end;
+
+{ TWideStringHelper }
+
+function TWideStringHelper.Test: LongInt;
+begin
+  Result := 3;
+end;
+
+constructor TWideStringHelper.Create(aArg: WideString);
+begin
+  Self := aArg;
+end;
+
+{ TAnsiStringHelper }
+
+function TAnsiStringHelper.Test: LongInt;
+begin
+  Result := 2;
+end;
+
+constructor TAnsiStringHelper.Create(aArg: AnsiString);
+begin
+  Self := aArg;
+end;
+
+{ TShortStringHelper }
+
+function TShortStringHelper.Test: LongInt;
+begin
+  Result := 1;
+end;
+
+constructor TShortStringHelper.Create(aArg: ShortString);
+begin
+  Self := aArg;
+end;
+
+{ TQWordBoolHelper }
+
+function TQWordBoolHelper.Test: LongInt;
+begin
+  Result := - SizeOf(Self);
+end;
+
+constructor TQWordBoolHelper.Create(aArg: QWordBool);
+begin
+  Self := aArg;
+end;
+
+{ TLongBoolHelper }
+
+function TLongBoolHelper.Test: LongInt;
+begin
+  Result := - SizeOf(Self);
+end;
+
+constructor TLongBoolHelper.Create(aArg: LongBool);
+begin
+  Self := aArg;
+end;
+
+{ TWordBoolHelper }
+
+function TWordBoolHelper.Test: LongInt;
+begin
+  Result := - SizeOf(Self);
+end;
+
+constructor TWordBoolHelper.Create(aArg: WordBool);
+begin
+  Self := aArg;
+end;
+
+{ TByteBoolHelper }
+
+function TByteBoolHelper.Test: LongInt;
+begin
+  Result := - SizeOf(Self);
+end;
+
+constructor TByteBoolHelper.Create(aArg: ByteBool);
+begin
+  Self := aArg;
+end;
+
+{ TBoolean64Helper }
+
+function TBoolean64Helper.Test: LongInt;
+begin
+  Result := SizeOf(Self);
+end;
+
+constructor TBoolean64Helper.Create(aArg: Boolean64);
+begin
+  Self := aArg;
+end;
+
+{ TBoolean32Helper }
+
+function TBoolean32Helper.Test: LongInt;
+begin
+  Result := SizeOf(Self);
+end;
+
+constructor TBoolean32Helper.Create(aArg: Boolean32);
+begin
+  Self := aArg;
+end;
+
+{ TBoolean16Helper }
+
+function TBoolean16Helper.Test: LongInt;
+begin
+  Result := SizeOf(Self);
+end;
+
+constructor TBoolean16Helper.Create(aArg: Boolean16);
+begin
+  Self := aArg;
+end;
+
+{ TBooleanHelper }
+
+function TBooleanHelper.Test: LongInt;
+begin
+  Result := SizeOf(Self);
+end;
+
+constructor TBooleanHelper.Create(aArg: Boolean);
+begin
+  Self := aArg;
+end;
+
+{ TInt64Helper }
+
+function TInt64Helper.Test: LongInt;
+begin
+  Result := - SizeOf(Self);
+end;
+
+constructor TInt64Helper.Create(aArg: Int64);
+begin
+  Self := aArg;
+end;
+
+{ TInt32Helper }
+
+function TInt32Helper.Test: LongInt;
+begin
+  Result := - SizeOf(Self);
+end;
+
+constructor TInt32Helper.Create(aArg: Int32);
+begin
+  Self := aArg;
+end;
+
+{ TInt16Helper }
+
+function TInt16Helper.Test: LongInt;
+begin
+  Result := - SizeOf(Self);
+end;
+
+constructor TInt16Helper.Create(aArg: Int16);
+begin
+  Self := aArg;
+end;
+
+{ TInt8Helper }
+
+function TInt8Helper.Test: LongInt;
+begin
+  Result := - SizeOf(Self);
+end;
+
+constructor TInt8Helper.Create(aArg: Int8);
+begin
+  Self := aArg;
+end;
+
+{ TUInt64Helper }
+
+function TUInt64Helper.Test: LongInt;
+begin
+  Result := SizeOf(Self);
+end;
+
+constructor TUInt64Helper.Create(aArg: UInt64);
+begin
+  Self := aArg;
+end;
+
+{ TUInt32Helper }
+
+function TUInt32Helper.Test: LongInt;
+begin
+  Result := SizeOf(Self);
+end;
+
+constructor TUInt32Helper.Create(aArg: UInt32);
+begin
+  Self := aArg;
+end;
+
+{ TUInt16Helper }
+
+function TUInt16Helper.Test: LongInt;
+begin
+  Result := SizeOf(Self);
+end;
+
+constructor TUInt16Helper.Create(aArg: UInt16);
+begin
+  Self := aArg;
+end;
+
+{ TUInt8Helper }
+
+function TUInt8Helper.Test: LongInt;
+begin
+  Result := SizeOf(Self);
+end;
+
+constructor TUInt8Helper.Create(aArg: UInt8);
+begin
+  Self := aArg;
+end;
+
+end.
+