diff --git a/compiler/fmodule.pas b/compiler/fmodule.pas index ef9d14fa2d..615e47299e 100644 --- a/compiler/fmodule.pas +++ b/compiler/fmodule.pas @@ -178,6 +178,11 @@ interface moduleoptions: tmoduleoptions; deprecatedmsg: pshortstring; + { contains a list of types that are extended by helper types; the key is + the full name of the type and the data is a TFPObjectList of + tobjectdef instances (the helper defs) } + extendeddefs: TFPHashObjectList; + {create creates a new module which name is stored in 's'. LoadedFrom points to the module calling it. It is nil for the first compiled module. This allow inheritence of all path lists. MUST pay attention @@ -513,6 +518,7 @@ implementation symlist:=TFPObjectList.Create(false); wpoinfo:=nil; checkforwarddefs:=TFPObjectList.Create(false); + extendeddefs := TFPHashObjectList.Create(true); globalsymtable:=nil; localsymtable:=nil; globalmacrosymtable:=nil; @@ -602,6 +608,7 @@ implementation linkotherframeworks.Free; stringdispose(mainname); FImportLibraryList.Free; + extendeddefs.Free; stringdispose(objfilename); stringdispose(asmfilename); stringdispose(ppufilename); diff --git a/compiler/htypechk.pas b/compiler/htypechk.pas index 6a80db55a4..6cdd91e812 100644 --- a/compiler/htypechk.pas +++ b/compiler/htypechk.pas @@ -1827,33 +1827,34 @@ implementation else hashedid.id:=overloaded_names[FOperator]; hasoverload:=false; - { first search for potential symbols in the class helpers (this is - disabled in an inherited call if the method is available in the - extended class) } - if is_class(structdef) then - if search_last_objectpascal_helper(tobjectdef(structdef), helperdef) and searchhelpers then - begin - srsym:=nil; - while assigned(helperdef) do - begin - srsym:=tsym(helperdef.symtable.FindWithHash(hashedid)); - if assigned(srsym) and - { Delphi allows hiding a property by a procedure with the same name } - (srsym.typ=procsym) then - begin - hasoverload := processprocsym(tprocsym(srsym)); - { when there is no explicit overload we stop searching } - if not hasoverload then - break; - end; - helperdef:=helperdef.childof; - end; - if not hasoverload and assigned(srsym) then - exit; - end; - { now search in the class and its parents or the record } while assigned(structdef) do begin + { first search in helpers for this type } + if (is_class(structdef) or is_record(structdef)) + and searchhelpers then + begin + if search_last_objectpascal_helper(structdef,nil,helperdef) then + begin + srsym:=nil; + while assigned(helperdef) do + begin + srsym:=tsym(helperdef.symtable.FindWithHash(hashedid)); + if assigned(srsym) and + { Delphi allows hiding a property by a procedure with the same name } + (srsym.typ=procsym) then + begin + hasoverload := processprocsym(tprocsym(srsym)); + { when there is no explicit overload we stop searching } + if not hasoverload then + break; + end; + helperdef:=helperdef.childof; + end; + if not hasoverload and assigned(srsym) then + exit; + end; + end; + { now search in the type itself } srsym:=tprocsym(structdef.symtable.FindWithHash(hashedid)); if assigned(srsym) and { Delphi allows hiding a property by a procedure with the same name } diff --git a/compiler/msg/errore.msg b/compiler/msg/errore.msg index 9b50b8b5be..f76626e836 100644 --- a/compiler/msg/errore.msg +++ b/compiler/msg/errore.msg @@ -368,7 +368,7 @@ scanner_w_illegal_warn_identifier=02087_W_Illegal identifier "$1" for $WARN dire # # Parser # -# 03305 is the last used one +# 03306 is the last used one # % \section{Parser messages} % This section lists all parser messages. The parser takes care of the @@ -1355,22 +1355,25 @@ parser_e_forward_protocol_declaration_must_be_resolved=03298_E_Forward declarati % where \var{MyProtocol} is declared but not defined. parser_e_no_record_published=03299_E_Record types cannot have published sections % Published sections can be used only inside classes. -parser_e_no_destructor_in_records=03300_E_Destructors aren't allowed in records or class helpers -% Destructor declarations aren't allowed in records or class helpers. +parser_e_no_destructor_in_records=03300_E_Destructors aren't allowed in records or helpers +% Destructor declarations aren't allowed in records or helpers. 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_constructor_in_records=03302_E_Constructors aren't allowed in records -% Constructor declarations aren't allowed in records. +parser_e_no_constructor_in_records=03302_E_Constructors aren't allowed in records or record helpers +% Constructor declarations aren't allowed in records or record 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. parser_e_cant_use_type_parameters_here=03304_E_Type parameters may require initialization/finalization - can't be used in variant records % Type parameters may be specialized with types which (e.g. \var{ansistring}) need initialization/finalization % code which is implicitly generated by the compiler. -parser_e_not_allowed_in_classhelper=03305_E_"$1" is not allowed in class helpers -% Some directives and specifiers like "virtual", "dynamic", "published" aren't -% allowed inside class helpers in mode ObjFPC (they are ignored in mode Delphi). +parser_e_not_allowed_in_helper=03305_E_"$1" is not allowed in helpers +% Some directives and specifiers like "virtual", "dynamic", "override" aren't +% allowed inside class helpers in mode ObjFPC (they are ignored in mode Delphi), +% because they have no meaning within helpers. +parser_e_no_class_constructor_in_helpers=03306_E_Class constructors aren't allowed in helpers +% Class constructor declarations aren't allowed in helpers. % \end{description} # Type Checking # diff --git a/compiler/msgidx.inc b/compiler/msgidx.inc index f777b2d0ff..5a8a52e25b 100644 --- a/compiler/msgidx.inc +++ b/compiler/msgidx.inc @@ -393,7 +393,8 @@ const parser_e_no_constructor_in_records=03302; parser_e_at_least_one_argument_must_be_of_type=03303; parser_e_cant_use_type_parameters_here=03304; - parser_e_not_allowed_in_classhelper=03305; + parser_e_not_allowed_in_helper=03305; + parser_e_no_class_constructor_in_helpers=03306; type_e_mismatch=04000; type_e_incompatible_types=04001; type_e_not_equal_types=04002; @@ -887,9 +888,9 @@ const option_info=11024; option_help_pages=11025; - MsgTxtSize = 58973; + MsgTxtSize = 59014; MsgIdxMax : array[1..20] of longint=( - 24,88,306,103,84,54,111,22,202,63, + 24,88,307,103,84,54,111,22,202,63, 49,20,1,1,1,1,1,1,1,1 ); diff --git a/compiler/msgtxt.inc b/compiler/msgtxt.inc index 0c624f9197..257965c996 100644 --- a/compiler/msgtxt.inc +++ b/compiler/msgtxt.inc @@ -471,588 +471,590 @@ const msgtxt : array[0..000245,1..240] of char=( '03298_E_Forward declaration of objcprotocol "$1" must be resolved befo'+ 're an objcclass can conform to it'#000+ '03299_E_Record types cannot have published sections'#000+ - '03300_E_Destructors aren'#039't',' allowed in records or class helpers'#000+ + '03300_E_Destructors aren'#039't',' allowed in records or helpers'#000+ '03301_E_Class methods must be static in records'#000+ '03302_E_Constructors aren'#039't allowed in records'#000+ '03303_E_Either the result or at least one parameter must be of type "$'+ '1"'#000+ - '03304_E_Type parameters may require',' initialization/finalization - ca'+ + '03304_E_Type parameters may require initi','alization/finalization - ca'+ 'n'#039't be used in variant records'#000+ - '03305_E_"$1" is not allowed in class helpers'#000+ + '03305_E_"$1" is not allowed in helpers'#000+ + '03306_E_Class constructors aren'#039't allowed in helpers'#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 i','dentifier expected'#000+ + '04002_E_Type mism','atch between "$1" and "$2"'#000+ + '04003_E_Type identifier expected'#000+ '04004_E_Variable identifier expected'#000+ '04005_E_Integer expression expected, but got "$1"'#000+ '04006_E_Boolean expression expected, but got "$1"'#000+ '04007_E_Ordinal expression expected'#000+ - '04008_E_pointer type expected, but got "$1"'#000+ - '0400','9_E_class type expected, but got "$1"'#000+ + '04008_E','_pointer type expected, but got "$1"'#000+ + '04009_E_class type expected, but got "$1"'#000+ '04011_E_Can'#039't evaluate constant expression'#000+ '04012_E_Set elements are not compatible'#000+ '04013_E_Operation not implemented for sets'#000+ - '04014_W_Automatic type conversion from floating type to COMP which is '+ - 'an int','eger type'#000+ + '04014_W_Automatic type conversion f','rom floating type to COMP which i'+ + 's 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 u','se readln or writeln on typed file'#000+ + '04018_E_Can'#039't read or wri','te variables of this type'#000+ + '04019_E_Can'#039't use readln or writeln on typed file'#000+ '04020_E_Can'#039't use read or write on untyped file.'#000+ '04021_E_Type conflict between set elements'#000+ '04022_W_lo/hi(dword/qword) returns the upper/lower word/dword'#000+ - '04023_E_Integer or real expression expected'#000+ - '04024_E','_Wrong type "$1" in array constructor'#000+ + '04023_E_In','teger or real expression expected'#000+ + '04024_E_Wrong type "$1" in array constructor'#000+ '04025_E_Incompatible type for arg no. $1: Got "$2", expected "$3"'#000+ '04026_E_Method (variable) and Procedure (variable) are not compatible'#000+ - '04027_E_Illegal constant passed to internal math function'#000+ - '04028_E_','Can'#039't take the address of constant expressions'#000+ + '04027_E_Illegal constant ','passed to internal math function'#000+ + '04028_E_Can'#039't take 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+ + '0403','2_E_Can'#039't assign values to const variable'#000+ '04033_E_Array type required'#000+ '04034_E_interface type expected, but got "$1"'#000+ '04035_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_Typec','ast has different size ($1 -> $2) in assignment'#000+ + '04036_W_Mixing signed expressions and cardinals here ma','y cause a ran'+ + 'ge check error'#000+ + '04037_E_Typecast has different size ($1 -> $2) in assignment'#000+ '04038_E_enums with assignments can'#039't be used as array index'#000+ '04039_E_Class or Object types "$1" and "$2" are not related'#000+ - '04040_W_Class types "$1" and "$2" are not related'#000+ - '04041_E_Class or inter','face type expected, but got "$1"'#000+ + '04040_W_Class types "$1" and "$','2" are not related'#000+ + '04041_E_Class or interface type expected, but got "$1"'#000+ '04042_E_Type "$1" is not completely defined'#000+ '04043_W_String literal has more characters than short string length'#000+ - '04044_W_Comparison is always false due to range of values'#000+ - '04045_W_Comparison is always true due',' to range of values'#000+ + '04044_W_Comparison is always false due to range of val','ues'#000+ + '04045_W_Comparison is always true due to range of values'#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 error'#000+ - '04049_H_Type size mismatc','h, possible loss of data / range check erro'+ + '04048_W_Type size mismatch, possible loss of data / ra','nge 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 expected'#000+ - '04053_E_Operation "$1" not ','supported for types "$2" and "$3"'#000+ + '04052_E_Constant Expres','sion 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 portable'#000+ - '04057_E_Can'#039't determine which ','overloaded function to call'#000+ + '04056_W_Conversion between ordinals and pointers is no','t portable'#000+ + '04057_E_Can'#039't determine which overloaded function to call'#000+ '04058_E_Illegal counter variable'#000+ '04059_W_Converting constant real value to double for C variable argume'+ 'nt, add explicit typecast to prevent this.'#000+ - '04060_E_Class or COM interface type expected, but got "$1"'#000+ - '04061_E','_Constant packed arrays are not yet supported'#000+ + '04060_E_Class or COM inte','rface type expected, but got "$1"'#000+ + '04061_E_Constant packed arrays are not yet supported'#000+ '04062_E_Incompatible type for arg no. $1: Got "$2" expected "(Bit)Pack'+ 'ed Array"'#000+ '04063_E_Incompatible type for arg no. $1: Got "$2" expected "(not pack'+ - 'ed) Array"'#000+ - '04064_E_Elements of packed arrays',' cannot be of a type which need to '+ - 'be initialised'#000+ + 'ed)',' Array"'#000+ + '04064_E_Elements of packed arrays cannot be of a type which need to be'+ + ' initialised'#000+ '04065_E_Constant packed records and objects are not yet supported'#000+ '04066_W_Arithmetic "$1" on untyped pointer is unportable to {$T+}, sug'+ - 'gest typecast'#000+ - '04076_E_Can'#039't take address of a subrouti','ne marked as local'#000+ + 'gest typecast',#000+ + '04076_E_Can'#039't take address of a subroutine marked as local'#000+ '04077_E_Can'#039't export subroutine marked as local from a unit'#000+ '04078_E_Type is not automatable: "$1"'#000+ '04079_H_Converting the operands to "$1" before doing the add could pre'+ - 'vent overflow errors.'#000+ - '04080_H_Converting the operands',' to "$1" before doing the subtract co'+ - 'uld prevent overflow errors.'#000+ + 'vent overflo','w errors.'#000+ + '04080_H_Converting the operands to "$1" before doing the subtract coul'+ + 'd prevent overflow errors.'#000+ '04081_H_Converting the operands to "$1" before doing the multiply coul'+ 'd prevent overflow errors.'#000+ - '04082_W_Converting pointers to signed integers may result in wrong com'+ - 'parison',' results and range errors, use an unsigned type instead.'#000+ + '04082_W_Converting pointers to signe','d integers 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 Objective-C method or constant method n','ame'#000+ + '04086_E_Expecte','d Objective-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 got "$1"'#000+ - '04092_E_The type "$1" is ','not supported for interaction with the Obje'+ - 'ctive-C runtime.'#000+ + '04091_E_Objective-C protocol type expecte','d, but 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 may cause c'+ - 'rash or memory corrupti','on: $1 to $2'#000+ + '04095_W_Coerced univ parameter type in procedural va','riable 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 function'#000+ - '04098_E_Generic declaration',' of "$1" differs from previous declaratio'+ - 'n'#000+ + 'ject procedur','e 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 helper must extend "$1"'#000+ - '05000_E_Iden','tifier not found "$1"'#000+ + '04102_E_Derived re','cord helper must extend "$1"'#000+ + '05000_E_Identifier not found "$1"'#000+ '05001_F_Internal Error in SymTableStack()'#000+ '05002_E_Duplicate identifier "$1"'#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+ + '05005_E_Forward d','eclaration not solved "$1"'#000+ + '05007_E_Error in type definition'#000+ '05009_E_Forward type not resolved "$1"'#000+ '05010_E_Only static variables can be used in static methods or outside'+ ' methods'#000+ '05012_F_record or class type expected'#000+ - '05013_E_Instances of classes or objects with an abstract method a','re '+ + '05013_E_Instances of cla','sses or objects with an abstract method are '+ 'not allowed'#000+ '05014_W_Label not defined "$1"'#000+ '05015_E_Label used but not defined "$1"'#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+ + '05018_E_Label not fou','nd'#000+ '05019_E_identifier isn'#039't a label'#000+ - '05020','_E_label already defined'#000+ + '05020_E_label already defined'#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+ + '05025_N_L','ocal variable "$1" not used'#000+ + '05026_H_Value parameter "$1" is assigned but never used'#000+ '05027_N_Local variable "$1" is assigned but never used'#000+ '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+ + '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+ '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 varia','ble "$1" does not seem to be initialized'#000+ + '05035_E_Unknown record ','field identifier "$1"'#000+ + '05036_W_Local variable "$1" does not seem to be initialized'#000+ '05037_W_Variable "$1" does not seem to be initialized'#000+ '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 inte','rface method "$1" found'#000+ + '05','042_E_No matching implementation for interface method "$1" found'#000+ '05043_W_Symbol "$1" is deprecated'#000+ '05044_W_Symbol "$1" is not portable'#000+ '05055_W_Symbol "$1" is not implemented'#000+ '05056_E_Can'#039't create unique type from this type'#000+ - '05057_H_Local variable "$1" does not seem to be initialized',#000+ + '05057_H_Local vari','able "$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 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_Fo','und abstract method: $1'#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, 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 enumerato','r for the type "$1"'#000+ + '05066_W_Symbol "$1" is deprecat','ed: "$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 "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+ + '05070_E_Mismatch between number of declared parameters and n','umber of'+ + ' colons 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+ '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+ + '05076_W_Un','it "$1" is not portable'#000+ + '05077_W_Unit "$1" is belongs to a library'#000+ '05078_W_Unit "$1" is not implemented'#000+ '05079_W_Unit "$1" is experimental'#000+ '05080_E_No complete definition of the formally declared objcclass "$1"'+ ' is in scope'#000+ - '05081_E_Gotos into initialization or finalization blocks of u','nits ar'+ + '05081_E_Gotos into i','nitialization or finalization blocks of units ar'+ 'e 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+ '06009_E_Parameter list size exceeds 65535 bytes'#000+ - '06012_E_File types must be var parameters'#000+ - '06013_E_T','he use of a far pointer isn'#039't allowed there'#000+ + '06012_E_Fi','le types must be var parameters'#000+ + '06013_E_The use of a far pointer isn'#039't allowed there'#000+ '06015_E_EXPORT declared functions can'#039't be called'#000+ '06016_W_Possible illegal call of constructor or destructor'#000+ '06017_N_Inefficient code'#000+ - '06018_W_unreachable code'#000+ - '06020_E_Abstract methods can'#039't be cal','led directly'#000+ + '06018_W_unreachable c','ode'#000+ + '06020_E_Abstract methods can'#039't be called directly'#000+ '06027_DL_Register $1 weight $2 $3'#000+ '06029_DL_Stack frame is omitted'#000+ '06031_E_Object or class methods can'#039't be inline.'#000+ '06032_E_Procvar calls cannot be inline.'#000+ - '06033_E_No code for inline procedure stored'#000+ - '06035_E_Element zero of an a','nsi/wide- or longstring can'#039't be acc'+ - 'essed, use (set)length instead'#000+ + '06033_E_No code for inline proc','edure stored'#000+ + '06035_E_Element zero of an ansi/wide- or longstring can'#039't be acces'+ + 'sed, use (set)length instead'#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 b','lock'#000+ + '060','39_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+ - '0','6044_E_BREAK not allowed'#000+ + '06043_E_Local',' variables size exceeds supported limit'#000+ + '06044_E_BREAK not allowed'#000+ '06045_E_CONTINUE not allowed'#000+ '06046_F_Unknown compilerproc "$1". Check if you use the correct run ti'+ 'me library.'#000+ - '06047_F_Cannot find system type "$1". Check if you use the correct run'+ - ' time library.'#000+ - '06048_H_Inherited c','all to abstract method ignored'#000+ + '06047_F_Cannot find system type "$1". Check if you use the corr','ect r'+ + 'un time library.'#000+ + '06048_H_Inherited call to abstract method ignored'#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 subrouti','nes'#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 declared'#000+ '06053_E_Leaving procedures containing explicit or implicit exceptions '+ 'frames using goto is not allowed'#000+ - '07000_DL_Starting $1 styled assembler parsing'#000+ - '07001_DL_Finished $1 ','styled assembler parsing'#000+ + '07000_DL_Starting $1 style','d 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+ '07006_E_TYPE used without identifier'#000+ - '07007_E_Cannot use local variable or parameters here'#000+ - '07008_E_need',' to use OFFSET here'#000+ + '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+ '07012_E_Invalid constant expression'#000+ - '07013_E_Relocatable symbol is not allowed'#000+ - '07014_E_Invalid refere','nce syntax'#000+ + '07013_E_Relocatable sym','bol 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+ '07017_E_Invalid base and index register usage'#000+ - '07018_W_Possible error in object field handling'#000+ - '07019_E_Wrong scale factor specifi','ed'#000+ + '07018_W_Possible error in object field ha','ndling'#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+ '07023_W_@CODE and @DATA not supported'#000+ - '07024_E_Null label references are not allowed'#000+ + '07024_E_Null label references are not allowed'#000, '07025_E_Divide by zero in asm evaluator'#000+ - '0','7026_E_Illegal expression'#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+ '07030_W_$1 without operand translated into $1P'#000+ - '07031_W_ENTER instruction is not supported ','by Linux kernel'#000+ + '07','031_W_ENTER instruction is not supported by Linux kernel'#000+ '07032_W_Calling an overload function in assembler'#000+ '07033_E_Unsupported symbol type for operand'#000+ '07034_E_Constant value out of bounds'#000+ '07035_E_Error converting decimal $1'#000+ - '07036_E_Error converting octal $1'#000+ - '07037_E_Error convertin','g binary $1'#000+ + '07036_E_Error co','nverting 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+ '07041_E_Cannot use SELF outside a method'#000+ - '07042_E_Cannot use OLDEBP outside a nested procedure'#000+ - '07043_W_Procedu','res can'#039't return any value in asm code'#000+ + '07042_E_Cannot use OLDEBP o','utside 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+ '07046_W_Size suffix and destination or source size do not match'#000+ - '07047_E_Assembler syntax error'#000+ - '07048_E_Invalid ','combination of opcode and operands'#000+ + '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+ '07051_E_Invalid String expression'#000+ - '07052_W_constant with symbol $1 for address which is not on a pointer'#000+ - '07053_E_Unrecogn','ized opcode $1'#000+ + '07052_W_constant with symbol $1 for address w','hich is not on a pointe'+ + 'r'#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+ '07057_E_Too many operands on line'#000+ - '07058_W_NEAR ignored'#000+ + '07058_W_','NEAR ignored'#000+ '07059_W_FAR ignored'#000+ - '07060_E_','Duplicate local symbol $1'#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+ '07064_E_Invalid floating point register name'#000+ - '07066_W_Modulo not supported'#000+ - '07067_E_Invalid floating point constant ','$1'#000+ + '07066_W_Modulo not supported',#000+ + '07067_E_Invalid floating point constant $1'#000+ '07068_E_Invalid floating point expression'#000+ '07069_E_Wrong symbol type'#000+ '07070_E_Cannot index a local var or parameter with a register'#000+ '07071_E_Invalid segment override expression'#000+ - '07072_W_Identifier $1 supposed external'#000+ - '07073_E_Strings not all','owed as constants'#000+ + '07072_W_Identifier $1 ','supposed external'#000+ + '07073_E_Strings not allowed as constants'#000+ '07074_No type of variable specified'#000+ '07075_E_assembler code not returned to text section'#000+ '07076_E_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 ident','ifier'#000+ + '0707','8_E_Dollar token is used without an identifier'#000+ '07079_W_32bit constant created for address'#000+ '07080_N_.align is target specific, use .balign or .p2align'#000+ '07081_E_Can'#039't access fields directly for parameters'#000+ - '07082_E_Can'#039't access fields of objects/classes directly'#000+ - '07083_E_No size specifie','d and unable to determine the size of the op'+ - 'erands'#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+ - '07088_W_"$1 %st(n)" translated in','to "$1 %st(n),%st"'#000+ + '07087_W_"$1 %st(n)" translated into "$1 %st,','%st(n)"'#000+ + '07088_W_"$1 %st(n)" translated into "$1 %st(n),%st"'#000+ '07089_E_Char < not allowed here'#000+ '07090_E_Char > not allowed here'#000+ '07093_W_ALIGN not supported'#000+ '07094_E_Inc and Dec cannot be together'#000+ '07095_E_Invalid reglist for movem'#000+ - '07096_E_Reglist invalid for opcode'#000+ - '07097_E_Higher cpu mo','de required ($1)'#000+ + '07096_E_Reglist',' invalid for opcode'#000+ + '07097_E_Higher cpu mode required ($1)'#000+ '07098_W_No size specified and unable to determine the size of the oper'+ 'ands, using DWORD as default'#000+ '07099_E_Syntax error while trying to parse a shifter operand'#000+ - '07100_E_Address of packed component is not at a byte boundary'#000+ - '0','7101_W_No size specified and unable to determine the size of the op'+ - 'erands, using BYTE as default'#000+ + '07100_E_Address of pac','ked 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 with regcall convention'+ - #000+ - '07104_W_Use of ','-offset(%ebp) is not recommended for local variable a'+ - 'ccess'#000+ + '07103_W_Use of +offset(%ebp) is not compatibl','e with regcall conventi'+ + 'on'#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, a'+ - 'nd "$1" is not virtual'#000+ - '07107_E_Gene','rating PIC, but reference is not PIC-safe'#000+ + '07106_E_VMTOffset must be used in combination with a virtual met','hod,'+ + ' and "$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+ '07109_E_A register set cannot be empty'#000+ - '07110_W_@GOTPCREL is useless and potentially dangereous for local symb'+ - 'ols'#000+ - '08000_F_To','o many assembler files'#000+ + '07110_W_@GOTPCREL is useless and potentiall','y dangereous for local sy'+ + 'mbols'#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 secti','on'#000+ '08005_F_No binary writer selected'#000+ - '0800','6_E_Asm: Opcode $1 not 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+ - '08010_E_Asm: Immediate or reference expected'#000+ - '08011_E_Asm: $1 valu','e exceeds bounds $2'#000+ + '08010_E_Asm: Immediate o','r reference expected'#000+ + '08011_E_Asm: $1 value exceeds bounds $2'#000+ '08012_E_Asm: Short jump is out of range $1'#000+ '08013_E_Asm: Undefined label $1'#000+ '08014_E_Asm: Comp type not supported for this target'#000+ - '08015_E_Asm: Extended type not supported for this target'#000+ + '08015_E_Asm: Extended type not supported for this t','arget'#000+ '08016_E_Asm: Duplicate label $1'#000+ - '080','17_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+ - '09000_W_Source operating system redefined'#000+ - '09001_I_As','sembling (pipe) $1'#000+ + '09000_W_Sou','rce operating system redefined'#000+ + '09001_I_Assembling (pipe) $1'#000+ '09002_E_Can'#039't create assembler file: $1'#000+ '09003_E_Can'#039't create object file: $1'#000+ '09004_E_Can'#039't create archive file: $1'#000+ - '09005_E_Assembler $1 not found, switching to external assembling'#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+ + '09007_E_Error while assembling exitcode $1'#000+ '09008_E_Can'#039't call the assembler, error $1 switching to external a'+ 'ssembling'#000+ '09009_I_Assembling $1'#000+ '09010_I_Assembling with smartlinking $1'#000+ - '09011_W_Object $1 not found, Linking may fail !'#000+ - '09012_W_Library $1 not f','ound, Linking may fail !'#000+ + '09011_W_Object $1 not found, Li','nking 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+ '09015_I_Linking $1'#000+ '09016_E_Util $1 not found, switching to external linking'#000+ - '09017_T_Using util $1'#000+ - '09018_E_Creation of Executab','les not supported'#000+ + '09017_T_U','sing util $1'#000+ + '09018_E_Creation of Executables not supported'#000+ '09019_E_Creation of Dynamic/Shared Libraries not supported'#000+ '09020_I_Closing script $1'#000+ '09021_E_resource compiler "$1" not found, switching to external mode'#000+ - '09022_I_Compiling resource $1'#000+ - '09023_T_unit $1 can'#039't be statically li','nked, switching to smart l'+ - 'inking'#000+ + '09022_I_Compiling resource ','$1'#000+ + '09023_T_unit $1 can'#039't be statically linked, switching to smart lin'+ + 'king'#000+ '09024_T_unit $1 can'#039't be smart linked, switching to static linking'+ #000+ '09025_T_unit $1 can'#039't be shared linked, switching to static linkin'+ 'g'#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+ + '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 extern'+ - 'al mode'#000+ - '09031_E_Can'#039't open resource file "$1','"'#000+ + 'al ','mode'#000+ + '09031_E_Can'#039't open resource file "$1"'#000+ '09032_E_Can'#039't write resource file "$1"'#000+ '09128_F_Can'#039't post process executable $1'#000+ '09129_F_Can'#039't open executable $1'#000+ '09130_X_Size of Code: $1 bytes'#000+ '09131_X_Size of initialized data: $1 bytes'#000+ - '09132_X_Size of uninitialized data: $1 bytes'#000+ - '09133_','X_Stack space reserved: $1 bytes'#000+ + '09132_X_Si','ze of uninitialized data: $1 bytes'#000+ + '09133_X_Stack space reserved: $1 bytes'#000+ '09134_X_Stack space committed: $1 bytes'#000+ '09200_F_Executable image size is too big for $1 target.'#000+ - '09201_W_Object file "$1" contains 32-bit absolute relocation to symbol'+ + '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+ + '10001_T_PPU Loading $1'#000+ '10002_U_PPU Name: $1'#000+ '10003_U_PPU 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 Invalid Header (no PPU at the begin)'#000+ - '10008_U_PPU Invalid Version $1'#000+ - '10009_U_PPU is compiled for another p','rocessor'#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+ '10011_U_PPU Source: $1'#000+ '10012_U_Writing $1'#000+ '10013_F_Can'#039't Write PPU-File'#000+ '10014_F_Error reading PPU-File'#000+ '10015_F_unexpected end of PPU-File'#000+ - '10016_F_Invalid PPU-File entry: $1'#000+ - '10017_F_PPU Dbx ','count problem'#000+ + '10016_F_In','valid PPU-File entry: $1'#000+ + '10017_F_PPU Dbx count problem'#000+ '10018_E_Illegal unit name: $1'#000+ '10019_F_Too much units'#000+ '10020_F_Circular unit reference between $1 and $2'#000+ '10021_F_Can'#039't compile unit $1, no sources available'#000+ - '10022_F_Can'#039't find unit $1 used by $2'#000+ - '10023_W_Unit $1 was not found but',' $2 exists'#000+ + '10022_F_Can'#039't find unit $1 use','d by $2'#000+ + '10023_W_Unit $1 was not found but $2 exists'#000+ '10024_F_Unit $1 searched but $2 found'#000+ '10025_W_Compiling the system unit requires the -Us switch'#000+ '10026_F_There were $1 errors compiling module, stopping'#000+ '10027_U_Load from $1 ($2) unit $3'#000+ - '10028_U_Recompiling $1, checksum changed fo','r $2'#000+ + '10','028_U_Recompiling $1, checksum changed for $2'#000+ '10029_U_Recompiling $1, source found only'#000+ '10030_U_Recompiling unit, static lib is older than ppufile'#000+ '10031_U_Recompiling unit, shared lib is older than ppufile'#000+ - '10032_U_Recompiling unit, obj and asm are older than ppufile'#000+ - '10033_U_Recomp','iling unit, obj is older than asm'#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+ '10035_U_Parsing implementation of $1'#000+ '10036_U_Second load for unit $1'#000+ '10037_U_PPU Check file $1 time $2'#000+ - '10040_W_Can'#039't recompile unit $1, but found modifed include files'#000+ - '10041_','U_File $1 is newer than the one used for creating PPU file $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+ '10042_U_Trying to use a unit which was compiled with a different FPU m'+ 'ode'#000+ '10043_U_Loading interface units from $1'#000+ - '10044_U_Loading implementation units from $1'#000+ - '10045_U_Interface C','RC changed for unit $1'#000+ + '10044_U_Loading impleme','ntation units from $1'#000+ + '10045_U_Interface CRC changed for unit $1'#000+ '10046_U_Implementation CRC changed for unit $1'#000+ '10047_U_Finished compiling unit $1'#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_F','lag for reload: $1'#000+ + '10050_U_No reload',', already in second compile: $1'#000+ + '10051_U_Flag for reload: $1'#000+ '10052_U_Forced reloading'#000+ '10053_U_Previous state of $1: $2'#000+ '10054_U_Already compiling $1, setting second compile'#000+ '10055_U_Loading unit $1'#000+ '10056_U_Finished loading unit $1'#000+ - '10057_U_Registering new unit $1'#000+ - '10058_U_Re-resolving ','unit $1'#000+ + '10057_U_Regi','stering new unit $1'#000+ + '10058_U_Re-resolving unit $1'#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 optimizat'+ - 'ion feedback input ($2, $3); recompile it without ','wpo or use the sam'+ + 'ion feedb','ack 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 unit $1'#000+ '11000_O_$1 [options] [options]'#000+ - '11001_W_Only one source file supported, changing sou','rce file to comp'+ + '11001_W_Onl','y one source file supported, changing source file to comp'+ 'ile from "$1" into "$2"'#000+ '11002_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+ - '11005_N_No option inside $1 config file'#000+ - '11006_E_Illegal parame','ter: $1'#000+ + '11005_N_No option ins','ide $1 config file'#000+ + '11006_E_Illegal parameter: $1'#000+ '11007_H_-? writes help pages'#000+ '11008_F_Too many config files nested'#000+ '11009_F_Unable to open file $1'#000+ '11010_D_Reading further options from $1'#000+ '11011_W_Target is already set to: $1'#000+ - '11012_W_Shared libs not supported on DOS platform, reverti','ng to stat'+ + '11012_W_Shared li','bs not supported on DOS platform, reverting to stat'+ 'ic'#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} encoun'+ 'tered'#000+ - '11015_F_Open conditional at the end of the options file'#000+ - '11016_W_Debug info','rmation generation is not supported by this execut'+ - 'able'#000+ + '11015_F_Open conditional at the e','nd of the options file'#000+ + '11016_W_Debug information generation is not supported by this executab'+ + 'le'#000+ '11017_H_Try recompiling with -dGDB'#000+ '11018_W_You are using the obsolete switch $1'#000+ '11019_W_You are using the obsolete switch $1, please use $2'#000+ - '11020_N_Switching assembler to default source',' writing assembler'#000+ + '1102','0_N_Switching assembler to default source writing assembler'#000+ '11021_W_Assembler output selected "$1" is not compatible with "$2"'#000+ '11022_W_"$1" assembler use forced'#000+ '11026_T_Reading options from file $1'#000+ - '11027_T_Reading options from environment $1'#000+ + '11027_T_Reading options from environment $','1'#000+ '11028_D_Handling option "$1"'#000+ - '11029_O_**','* press enter ***'#000+ + '11029_O_*** press enter ***'#000+ '11030_H_Start of reading config file $1'#000+ '11031_H_End of reading config file $1'#000+ '11032_D_interpreting option "$1"'#000+ '11036_D_interpreting firstpass option "$1"'#000+ - '11033_D_interpreting file option "$1"'#000+ - '11034_D_Reading config file "$','1"'#000+ + '11033_D_interpreting file o','ption "$1"'#000+ + '11034_D_Reading config file "$1"'#000+ '11035_D_found source file name "$1"'#000+ '11039_E_Unknown code page'#000+ '11040_F_Config file $1 is a directory'#000+ '11041_W_Assembler output selected "$1" cannot generate debug info, deb'+ 'ugging disabled'#000+ - '11042_W_Use of ppc386.cfg is deprecated, please use',' fpc.cfg instead'#000+ + '11042_W_Us','e 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 targe'+ 't platform'#000+ - '11045_F_The feature "$1" is not, or not yet, suppo','rted on the select'+ + '11045_F_T','he feature "$1" is not, or not yet, supported on the select'+ 'ed target platform'#000+ '11046_N_DWARF debug information cannot be used with smart linking on t'+ 'his target, switching to static linking'#000+ - '11047_W_Option "$1" is ignored for the current target platform.'#000+ - '11048_W_Disabling external de','bug information because it is unsupport'+ - 'ed for the selected target/debug format combination.'#000+ + '11047_W_Option "$1" is ignored for the current targe','t platform.'#000+ + '11048_W_Disabling external debug information because it is unsupported'+ + ' for the selected target/debug format combination.'#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+ + '12001_D_Processing whole program optimiza','tion information in wpo fee'+ + 'dback file "$1"'#000+ '12002_D_Finished processing the whole program optimization information'+ ' 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 se','ction'+ + '12004_W_No handler reg','istered for whole program optimization section'+ ' "$2" at line $1 of wpo feedback file, ignoring'#000+ '12005_D_Found whole program optimization section "$1" with information'+ ' about "$2"'#000+ - '12006_F_The selected whole program optimizations require a previously '+ - 'generated feedback file (use -Fw to',' specify)'#000+ + '12006_F_The selected whole program optimizations require a previ','ousl'+ + 'y 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 th'+ - 'e generated info in (using -FW)'#000+ - '12009_E_Not generating any whole pro','gram optimization information, y'+ - 'et a feedback file was specified (using -FW)'#000+ + '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, yet an input f'+ 'eedback file was specified (using -Fw)'#000+ - '12011_D_Skipping whole program optimization section "$','1", because no'+ + '12011_D_Skipp','ing whole program optimization section "$1", because no'+ 't needed by the requested optimizations'#000+ '12012_W_Overriding previously read information for "$1" from feedback '+ 'input file using information in section "$2"'#000+ - '12013_E_Cannot extract symbol liveness information from program when s'+ - 't','ripping symbols, use -Xs-'#000+ + '12013_E_Cannot extract symbol ','liveness information from program when'+ + ' stripping 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 informatio'+ - 'n from linked program'#000+ - '12016_E_Error during reading symbol ','liveness information produced by'+ - ' "$1"'#000+ + 'n from linked pro','gram'#000+ + '12016_E_Error during reading symbol liveness information produced by "'+ + '$1"'#000+ '12017_F_Error executing "$1" (exitcode: $2) to extract symbol informat'+ 'ion from linked program'#000+ - '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 program optimisation feedback '+ - 'file "$1"'#000+ + '12018_E_Collection of symbol liveness information can only help whe','n'+ + ' 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 $FPC'+ 'CPU'#010+ 'Copyright (c) 1993-2010 by Florian Klaempfl'#000+ - '11024_Free Pascal Compiler version $FPCVERSION'#010+ + '11024_Fre','e Pascal Compiler version $FPCVERSION'#010+ #010+ - 'Co','mpiler Date : $FPCDATE'#010+ + 'Compiler Date : $FPCDATE'#010+ 'Compiler CPU Target: $FPCCPU'#010+ #010+ 'Supported targets:'#010+ @@ -1064,10 +1066,10 @@ const msgtxt : array[0..000245,1..240] of char=( 'Supported FPU instruction sets:'#010+ ' $FPUINSTRUCTIONSETS'#010+ #010+ - 'Supported ABI targets:'#010+ + 'S','upported ABI targets:'#010+ ' $ABITARGETS'#010+ #010+ - 'Supp','orted Optimizations:'#010+ + 'Supported Optimizations:'#010+ ' $OPTIMIZATIONS'#010+ #010+ 'Supported Whole Program Optimizations:'#010+ @@ -1077,196 +1079,196 @@ const msgtxt : array[0..000245,1..240] of char=( 'Supported Microcontroller types:'#010+ ' $CONTROLLERTYPES'#010+ #010+ - 'This program comes under the GNU General Public Licence'#010+ - 'For more information read C','OPYING.FPC'#010+ + 'This program comes under the GNU General P','ublic Licence'#010+ + 'For more information read COPYING.FPC'#010+ #010+ 'Report bugs, suggestions, etc. to:'#010+ ' http://bugs.freepascal.org'#010+ 'or'#010+ ' bugs@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+ + '11025_**0*_Put + after a boolean switch option to enable it, - to di','s'+ + 'able it'#010+ + '**1a_The compiler doesn'#039't delete the generated assembler file'#010+ '**2al_List sourcecode lines in assembler file'#010+ '**2an_List node info in assembler file'#010+ '*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+ + '**2ar_List register al','location/release info in assembler file'#010+ + '**2at_List temp allocation/release info in assembler file'#010+ '**1A_Output format:'#010+ '**2Adefault_Use default assembler'#010+ '3*2Aas_Assemble using GNU AS'#010+ - '3*2Amacho_Mach-O (Darwin, Intel 32 bit) using internal writer'#010+ - '3*2Anasmcoff_COFF (Go32v2) file usi','ng Nasm'#010+ + '3*2Amacho_Mach-O (Darwin, Intel 32 bit) using internal w','riter'#010+ + '3*2Anasmcoff_COFF (Go32v2) file using Nasm'#010+ '3*2Anasmelf_ELF32 (Linux) file using Nasm'#010+ '3*2Anasmwin32_Win32 object file using Nasm'#010+ '3*2Anasmwdosx_Win32/WDOSX object file using Nasm'#010+ '3*2Awasm_Obj file using Wasm (Watcom)'#010+ - '3*2Anasmobj_Obj file using Nasm'#010+ - '3*2Amasm_Obj file using Masm',' (Microsoft)'#010+ + '3*2Anasmobj_Obj fil','e 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*2Acoff_COFF (Go32v2) using internal writer'#010+ '3*2Apecoff_PE-COFF (Win32) using internal writer'#010+ - '4*2Aas_Assemble using GNU AS'#010+ - '6*2Aas_Unix o-file usin','g GNU AS'#010+ + '4*2Aas_Asse','mble using GNU AS'#010+ + '6*2Aas_Unix o-file using GNU AS'#010+ '6*2Agas_GNU Motorola assembler'#010+ '6*2Amit_MIT Syntax (old GAS)'#010+ '6*2Amot_Standard Motorola assembler'#010+ 'A*2Aas_Assemble using GNU AS'#010+ 'P*2Aas_Assemble using GNU AS'#010+ 'S*2Aas_Assemble using GNU AS'#010+ - '**1b_Generate browser info'#010+ - '**2bl_Generate local ','symbol info'#010+ + '**1b_Ge','nerate browser info'#010+ + '**2bl_Generate local symbol info'#010+ '**1B_Build all modules'#010+ '**1C_Code generation options:'#010+ '**2C3_Turn on ieee error checking for constants'#010+ '**2Ca_Select ABI, see fpc -i for possible values'#010+ - '**2Cb_Generate big-endian code'#010+ - '**2Cc_Set default calling conventio','n to '#010+ + '**2Cb_Generate big-endian co','de'#010+ + '**2Cc_Set default calling convention to '#010+ '**2CD_Create also dynamic library (not supported)'#010+ '**2Ce_Compilation with emulated floating point opcodes'#010+ '**2Cf_Select fpu instruction set to use, see fpc -i for possible va'+ 'lues'#010+ - '**2CF_Minimal floating point constant precision ','(default, 32, 64)'+ + '**2CF_M','inimal floating point constant precision (default, 32, 64)'+ #010+ '**2Cg_Generate PIC code'#010+ '**2Ch_ bytes heap (between 1023 and 67107840)'#010+ '**2Ci_IO-checking'#010+ '**2Cn_Omit linking stage'#010+ '**2Co_Check overflow of integer operations'#010+ - '**2CO_Check for possible overflow of integer operations'#010+ - '**2C','p_Select instruction set, see fpc -i for possible values'#010+ + '**2CO_Check for pos','sible overflow of integer operations'#010+ + '**2Cp_Select instruction set, see fpc -i for possible values'#010+ '**2CP=_ packing settings'#010+ '**3CPPACKSET=_ 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_Se','t stack checking size to '#010+ + '**2CR_Verif','y object method call validity'#010+ + '**2Cs_Set stack checking size to '#010+ '**2Ct_Stack checking (for testing only, see manual)'#010+ '**2CX_Create also smartlinked library'#010+ '**1d_Defines the symbol '#010+ '**1D_Generate a DEF file'#010+ - '**2Dd_Set description to '#010+ + '**2Dd_Set description',' to '#010+ '**2Dv_Set DLL version to '#010+ - '*','O2Dw_PM application'#010+ + '*O2Dw_PM application'#010+ '**1e_Set path to executable'#010+ '**1E_Same as -Cn'#010+ '**1fPIC_Same as -Cg'#010+ '**1F_Set file names and paths:'#010+ '**2Fa[,y]_(for a program) load units and [y] before uses is par'+ 'sed'#010+ - '**2Fc_Set input codepage to '#010+ - '**2FC_','Set RC compiler binary name to '#010+ + '**2','Fc_Set input codepage to '#010+ + '**2FC_Set RC compiler binary name to '#010+ '**2Fd_Disable the compiler'#039's internal directory cache'#010+ '**2FD_Set the directory where to search for compiler utilities'#010+ '**2Fe_Redirect error output to '#010+ - '**2Ff_Add to framework path (Darwin only',')'#010+ + '**2Ff<','x>_Add to framework path (Darwin only)'#010+ '**2FE_Set exe/unit output path to '#010+ '**2Fi_Add to include path'#010+ '**2Fl_Add to library path'#010+ '**2FL_Use as dynamic linker'#010+ - '**2Fm_Load unicode conversion table from .txt in the compiler di'+ - 'r'#010+ - '**2Fo_Add to obje','ct path'#010+ + '**2Fm_Load unicode conversion table from .txt in ','the compiler '+ + 'dir'#010+ + '**2Fo_Add to object path'#010+ '**2Fr_Load error message file '#010+ '**2FR_Set resource (.res) linker to '#010+ '**2Fu_Add to unit path'#010+ '**2FU_Set unit output path to , overrides -FE'#010+ - '**2FW_Store generated whole-program optimization feedback in '#010+ - '**','2Fw_Load previously stored whole-program optimization feedback '+ - 'from '#010+ + '**2FW_Store generated whol','e-program optimization feedback in '#010+ + '**2Fw_Load previously stored whole-program optimization feedback fr'+ + 'om '#010+ '*g1g_Generate debug information (default format for target)'#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+ + '*g2gh_Use heaptrace unit (for',' memory leak/corruption debugging)'#010+ + '*g2gl_Use line info unit (show more info with backtraces)'#010+ '*g2go_Set debug information options'#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'+ - ' name'#010+ + '*g3gostabsabsincludes_ Store ab','solute/full include file paths in Sta'+ + 'bs'#010+ + '*g3godwarfmethodclassprefix_ Prefix method names in DWARF with class n'+ + 'ame'#010+ '*g2gp_Preserve case in stabs symbol names'#010+ '*g2gs_Generate Stabs debug information'#010+ - '*g2gt_Trash local variables (to detect uninitialized uses)'#010+ - '*g2gv_Generates programs tr','aceable with Valgrind'#010+ + '*g2gt_Trash local variables (to detect uninit','ialized uses)'#010+ + '*g2gv_Generates programs traceable with Valgrind'#010+ '*g2gw_Generate DWARFv2 debug information (same as -gw2)'#010+ '*g2gw2_Generate DWARFv2 debug information'#010+ '*g2gw3_Generate DWARFv3 debug information'#010+ - '*g2gw4_Generate DWARFv4 debug information (experimental)'#010+ + '*g2gw4_Generate DWARFv4 debug informa','tion (experimental)'#010+ '**1i_Information'#010+ - '**2i','D_Return compiler date'#010+ + '**2iD_Return compiler date'#010+ '**2iV_Return short compiler version'#010+ '**2iW_Return full compiler version'#010+ '**2iSO_Return compiler OS'#010+ '**2iSP_Return compiler host processor'#010+ '**2iTO_Return target OS'#010+ - '**2iTP_Return target processor'#010+ - '**1I_Add to include ','path'#010+ + '**2iTP_Return tar','get processor'#010+ + '**1I_Add to include path'#010+ '**1k_Pass to the linker'#010+ '**1l_Write logo'#010+ '**1M_Set language mode to '#010+ '**2Mfpc_Free Pascal dialect (default)'#010+ '**2Mobjfpc_FPC mode with Object Pascal support'#010+ - '**2Mdelphi_Delphi 7 compatibility mode'#010+ - '**2Mtp_TP/BP 7.0 compatibility ','mode'#010+ + '**2Mdelphi_Delphi 7 compatibi','lity mode'#010+ + '**2Mtp_TP/BP 7.0 compatibility mode'#010+ '**2Mmacpas_Macintosh Pascal dialects compatibility mode'#010+ '**1n_Do not read the default config files'#010+ '**1N_Node tree optimizations'#010+ '**2Nu_Unroll loops'#010+ - '**1o_Change the name of the executable produced to '#010+ + '**1o_Change the name of the executable pro','duced to '#010+ '**1O_Optimizations:'#010+ - '**2O-','_Disable 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+ - '**2Oa=_Set alignment'#010+ - '**2Oo[NO]_Enable o','r disable optimizations, see fpc -i for possibl'+ - 'e values'#010+ + '**2Oa=_Set alignment'#010+ + '**2Oo[NO]_Enable or disable optimizations, see fpc -i for possible '+ + 'values'#010+ '**2Op_Set target cpu for optimizing, see fpc -i for possible values'+ #010+ '**2OW_Generate whole-program optimization feedback for optimization'+ - ' , see fpc -i for possible values'#010+ - '**2Ow<','x>_Perform whole-program optimization , see fpc -i for poss'+ - 'ible values'#010+ + ' <','x>, see fpc -i for possible values'#010+ + '**2Ow_Perform whole-program optimization , see fpc -i for possib'+ + 'le values'#010+ '**2Os_Optimize for size rather than speed'#010+ '**1pg_Generate profile code for gprof (defines FPC_PROFILE)'#010+ - '**1R_Assembler reading style:'#010+ - '**2Rdefault_Use default assembl','er for target'#010+ + '**1R_Assembler readi','ng style:'#010+ + '**2Rdefault_Use default assembler for target'#010+ '3*2Ratt_Read AT&T style assembler'#010+ '3*2Rintel_Read Intel style assembler'#010+ '6*2RMOT_Read motorola style assembler'#010+ '**1S_Syntax options:'#010+ '**2S2_Same as -Mobjfpc'#010+ - '**2Sc_Support operators like C (*=,+=,/= and -=)'#010+ - '**2Sa_Turn on asserti','ons'#010+ + '**2Sc_Support operators like ','C (*=,+=,/= and -=)'#010+ + '**2Sa_Turn on assertions'#010+ '**2Sd_Same as -Mdelphi'#010+ '**2Se_Error options. is a combination of the following:'#010+ '**3*_ : Compiler halts after the 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+ + '**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 ansistrings by default instead of shortstrings'#010+ - '**2Si_Turn on inlining of procedures/functions declared as "inline"'#010+ - '**2Sk_Load fpcylix',' unit'#010+ + '**2Si_Turn on inlining of procedures/function','s declared as "inline"'#010+ + '**2Sk_Load fpcylix unit'#010+ '**2SI_Set interface style to '#010+ '**3SIcom_COM compatible interface (default)'#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+ + '**2Ss_Constructor n','ame must be init (destructor must be done)'#010+ '**2Sx_Enable exception keywords (default in Delphi/ObjFPC modes)'#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+ - '**1T','_Target operating system:'#010+ + '**2sr_Skip regis','ter allocation phase (use with -alr)'#010+ + '**1T_Target operating system:'#010+ '3*2Tdarwin_Darwin/Mac OS X'#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: ','-T'+ + '3*2Tiphonesim_ iPhoneSimu','lator from iOS SDK 3.2+ (older versions: -T'+ 'darwin)'#010+ '3*2Tlinux_Linux'#010+ '3*2Tnetbsd_NetBSD'#010+ @@ -1275,17 +1277,17 @@ const msgtxt : array[0..000245,1..240] of char=( '3*2Topenbsd_OpenBSD'#010+ '3*2Tos2_OS/2 / eComStation'#010+ '3*2Tsunos_SunOS/Solaris'#010+ - '3*2Tsymbian_Symbian OS'#010+ - '3*2Tsolaris_Solaris',#010+ + '3','*2Tsymbian_Symbian OS'#010+ + '3*2Tsolaris_Solaris'#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*2Twin64_Win64 (64 bit Windows system','s)'#010+ '6*2Tamiga_Commodore Amiga'#010+ - '6*2Tatari_At','ari ST/STe/TT'#010+ + '6*2Tatari_Atari ST/STe/TT'#010+ '6*2Tlinux_Linux'#010+ '6*2Tpalmos_PalmOS'#010+ 'A*2Tdarwin_Darwin/iPhoneOS/iOS'#010+ @@ -1294,86 +1296,87 @@ const msgtxt : array[0..000245,1..240] of char=( 'P*2Tamiga_AmigaOS'#010+ 'P*2Tdarwin_Darwin/Mac OS X'#010+ 'P*2Tlinux_Linux'#010+ - 'P*2Tmacos_Mac OS (classic)'#010+ + 'P*2Tmacos_Mac OS (clas','sic)'#010+ 'P*2Tmorphos_MorphOS'#010+ - 'S*2Tsolaris_Sola','ris'#010+ + 'S*2Tsolaris_Solaris'#010+ 'S*2Tlinux_Linux'#010+ '**1u_Undefines the symbol '#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_Be v','erbose. is a combination of the following letters:'#010+ + '**1v_Be verbose. 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*_n : Show notes t : Show tried/used fi','les'#010+ + '**2*_n : Show note','s t : Show tried/used files'#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*_s : Show time stamps q : Show mess','age numbers'#010+ + '**2*_s : ','Show time stamps q : Show message numbers'#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 : Writ','e fpcdebug.txt with'#010+ + '**2*_ lots of debugging info'#010+ '**2*_m, : Don'#039't show messages numbered and '#010+ '3*1W_Target-specific options (targets)'#010+ 'A*1W_Target-specific options (targets)'#010+ - 'P*1W_Target-specific options (targets)'#010+ - 'p*1W_Target','-specific options (targets)'#010+ + 'P*1W_Target-','specific options (targets)'#010+ + 'p*1W_Target-specific options (targets)'#010+ '3*2Wb_Create a bundle instead of a library (Darwin)'#010+ 'P*2Wb_Create a bundle instead of a library (Darwin)'#010+ 'p*2Wb_Create a bundle instead of a library (Darwin)'#010+ - '3*2WB_Create a relocatable image (Windows)'#010+ - 'A*2WB_Create ','a relocatable image (Windows, Symbian)'#010+ + '3*2WB_Create a ','relocatable image (Windows)'#010+ + 'A*2WB_Create a relocatable image (Windows, Symbian)'#010+ '3*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+ - '3*2WD_Use DEFFILE to export function','s of DLL or EXE (Windows)'#010+ + 'P*2WC_Specify console type application (Classic Mac',' OS)'#010+ + '3*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+ - 'A*2We_Use external resources (Darwin)'#010+ - 'P*2We_Use external resources (Darwin)'#010, + 'A*2We_Use external resources (Darwi','n)'#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+ - 'A*2WG_Specify graphic type application (Windows)'#010+ - 'P*2WG_Specify graphic type application',' (Classic Mac OS)'#010+ + 'A*2WG_Specify graphic type application (Window','s)'#010+ + 'P*2WG_Specify graphic type application (Classic Mac OS)'#010+ '3*2Wi_Use internal resources (Darwin)'#010+ 'P*2Wi_Use internal resources (Darwin)'#010+ 'p*2Wi_Use internal resources (Darwin)'#010+ - '3*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+ - 'A*2WN_Do not generate relocation code,',' needed for debugging (Windows'+ + '3*2WN_Do not generate relocation code, needed for debugging (Window','s'+ ')'#010+ + 'A*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+ '3*2WR_Generate relocation code (Windows)'#010+ 'A*2WR_Generate relocation code (Windows)'#010+ 'P*2WT_Specify MPW tool type application (Classic Mac OS)'#010+ - '3*2WX_Enable executable stack (Linux)'#010+ - 'A*2WX_Enable executable stack (','Linux)'#010+ + '3*2WX_Enable executable stac','k (Linux)'#010+ + 'A*2WX_Enable executable stack (Linux)'#010+ 'p*2WX_Enable executable stack (Linux)'#010+ 'P*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 use standard library search path (needed for ','cross comp'+ + '**2Xd_Do not use ','standard library search path (needed for cross comp'+ 'ile)'#010+ '**2Xe_Use external linker'#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 m','ap'#010+ + '**2Xi_','Use internal linker'#010+ + '**2Xm_Generate link map'#010+ '**2XM_Set the name of the '#039'main'#039' program routine (default i'+ 's '#039'main'#039')'#010+ '**2XP_Prepend the binutils names with the prefix '#010+ '**2Xr_Set the linker'#039's rlink-path to (needed for cross comp'+ - 'ile, see the ld manual for more information',') (BeOS, Linux)'#010+ + 'il','e, see the ld manual for more information) (BeOS, Linux)'#010+ '**2XR_Prepend 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+ - '**2Xt_Link with st','atic libraries (-static is passed to linker)'#010+ + '**2XS_Try to link units statically (default, de','fines 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+ diff --git a/compiler/nflw.pas b/compiler/nflw.pas index 8764442a9e..9ec8a89108 100644 --- a/compiler/nflw.pas +++ b/compiler/nflw.pas @@ -824,7 +824,7 @@ implementation function create_for_in_loop(hloopvar, hloopbody, expr: tnode): tnode; var pd, movenext: tprocdef; - classhelper: tobjectdef; + helperdef: tobjectdef; current: tpropertysym; storefilepos: tfileposinfo; begin @@ -866,12 +866,12 @@ implementation { first search using the class helper hierarchy if it's a class } if (expr.resultdef.typ=objectdef) and - search_last_objectpascal_helper(tobjectdef(expr.resultdef),classhelper) then + search_last_objectpascal_helper(tobjectdef(expr.resultdef),nil,helperdef) then repeat - pd:=classhelper.search_enumerator_get; - classhelper:=classhelper.childof; - until (pd<>nil) or (classhelper=nil); - { we didn't found a class helper, so search in the + pd:=helperdef.search_enumerator_get; + helperdef:=helperdef.childof; + until (pd<>nil) or (helperdef=nil); + { we didn't find an enumerator in a helper, so search in the class/record/object itself } if pd=nil then pd:=tabstractrecorddef(expr.resultdef).search_enumerator_get; diff --git a/compiler/nobj.pas b/compiler/nobj.pas index 54f5840bb6..a8e38c3683 100644 --- a/compiler/nobj.pas +++ b/compiler/nobj.pas @@ -460,7 +460,7 @@ implementation "overriding" method } if is_objcclass(_class) and assigned(_class.childof) and - search_class_helper(_class.childof,pd.procsym.name,srsym,st) then + search_objc_helper(_class.childof,pd.procsym.name,srsym,st) then begin overridesclasshelper:=found_category_method(st); end; diff --git a/compiler/parser.pas b/compiler/parser.pas index f43c7d7684..de86bc8ca3 100644 --- a/compiler/parser.pas +++ b/compiler/parser.pas @@ -344,7 +344,11 @@ implementation Message1(parser_i_compiling,filename); { reset symtable } - symtablestack:=TSymtablestack.create; +{$ifdef useoldsearch} + symtablestack:=tsymtablestack.create; +{$else} + symtablestack:=tdefawaresymtablestack.create; +{$endif} macrosymtablestack:=TSymtablestack.create; systemunit:=nil; current_settings.defproccall:=init_settings.defproccall; diff --git a/compiler/pdecobj.pas b/compiler/pdecobj.pas index 9015b69e60..2e384a0267 100644 --- a/compiler/pdecobj.pas +++ b/compiler/pdecobj.pas @@ -582,7 +582,7 @@ implementation end; end; - procedure parse_extended_class(helpertype:thelpertype); + procedure parse_extended_type(helpertype:thelpertype); var hdef: tdef; begin @@ -954,6 +954,16 @@ implementation if is_objc_class_or_protocol(current_structdef) then Message(parser_e_objc_no_constructor_destructor); + if is_objectpascal_helper(current_structdef) then + if is_classdef then + { class constructors are not allowed in class helpers } + Message(parser_e_no_class_constructor_in_helpers) + else + if is_record(current_objectdef.extendeddef) then + { as long as constructors aren't allowed in records they + aren't allowed in helpers either } + Message(parser_e_no_constructor_in_records); + { only 1 class constructor is allowed } if is_classdef and (oo_has_class_constructor in current_structdef.objectoptions) then Message1(parser_e_only_one_class_constructor_allowed, current_structdef.objrealname^); @@ -1051,6 +1061,9 @@ implementation old_current_genericdef, old_current_specializedef: tstoreddef; old_parse_generic: boolean; + list: TFPObjectList; + s: String; + st: TSymtable; begin old_current_structdef:=current_structdef; old_current_genericdef:=current_genericdef; @@ -1170,7 +1183,7 @@ implementation { parse extended type for helpers } if is_objectpascal_helper(current_structdef) then - parse_extended_class(helpertype); + parse_extended_type(helpertype); { parse optional GUID for interfaces } parse_guid; @@ -1202,6 +1215,28 @@ implementation else if is_objcclass(current_structdef) then setobjcclassmethodoptions; + { if this helper is defined in the implementation section of the unit + 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) then + begin + { the topmost symtable must be a static symtable } + st:=current_structdef.owner; + while st.symtabletype in [objectsymtable,recordsymtable] do + st:=st.defowner.owner; + if st.symtabletype=staticsymtable then + begin + s:=make_mangledname('',current_objectdef.extendeddef.symtable,''); + list:=TFPObjectList(current_module.extendeddefs.Find(s)); + if not assigned(list) then + begin + list:=TFPObjectList.Create(false); + current_module.extendeddefs.Add(s, list); + end; + list.add(current_structdef); + end; + end; + { return defined objectdef } result:=current_objectdef; diff --git a/compiler/pdecsub.pas b/compiler/pdecsub.pas index 4b8a9ee275..8985b5c15f 100644 --- a/compiler/pdecsub.pas +++ b/compiler/pdecsub.pas @@ -1630,7 +1630,7 @@ begin internalerror(200304269); if is_objectpascal_helper(tprocdef(pd).struct) and (m_objfpc in current_settings.modeswitches) then - Message1(parser_e_not_allowed_in_classhelper, arraytokeninfo[_ABSTRACT].str); + Message1(parser_e_not_allowed_in_helper, arraytokeninfo[_ABSTRACT].str); if assigned(tprocdef(pd).struct) and (oo_is_sealed in tprocdef(pd).struct.objectoptions) then Message(parser_e_sealed_class_cannot_have_abstract_methods) @@ -1649,7 +1649,7 @@ begin internalerror(200910170); if is_objectpascal_helper(tprocdef(pd).struct) and (m_objfpc in current_settings.modeswitches) then - Message1(parser_e_not_allowed_in_classhelper, arraytokeninfo[_FINAL].str); + Message1(parser_e_not_allowed_in_helper, arraytokeninfo[_FINAL].str); if (po_virtualmethod in pd.procoptions) then include(pd.procoptions,po_finalmethod) else @@ -1697,7 +1697,7 @@ begin Message(parser_e_constructor_cannot_be_not_virtual); if is_objectpascal_helper(tprocdef(pd).struct) and (m_objfpc in current_settings.modeswitches) then - Message1(parser_e_not_allowed_in_classhelper, arraytokeninfo[_VIRTUAL].str); + Message1(parser_e_not_allowed_in_helper, arraytokeninfo[_VIRTUAL].str); {$ifdef WITHDMT} if is_object(tprocdef(pd).struct) and (token<>_SEMICOLON) then @@ -1750,7 +1750,7 @@ begin if is_objectpascal_helper(tprocdef(pd).struct) then begin if m_objfpc in current_settings.modeswitches then - Message1(parser_e_not_allowed_in_classhelper, arraytokeninfo[_OVERRIDE].str) + Message1(parser_e_not_allowed_in_helper, arraytokeninfo[_OVERRIDE].str) end else if not(is_class_or_interface_or_objc(tprocdef(pd).struct)) then Message(parser_e_no_object_override) @@ -1779,7 +1779,7 @@ begin if is_objectpascal_helper(tprocdef(pd).struct) then begin if m_objfpc in current_settings.modeswitches then - Message1(parser_e_not_allowed_in_classhelper, arraytokeninfo[_MESSAGE].str); + Message1(parser_e_not_allowed_in_helper, arraytokeninfo[_MESSAGE].str); end else if not is_class(tprocdef(pd).struct) and @@ -1841,7 +1841,7 @@ begin if is_objectpascal_helper(tprocdef(pd).struct) then begin if m_objfpc in current_settings.modeswitches then - Message1(parser_e_not_allowed_in_classhelper, arraytokeninfo[_REINTRODUCE].str); + Message1(parser_e_not_allowed_in_helper, arraytokeninfo[_REINTRODUCE].str); end else if not(is_class_or_interface_or_object(tprocdef(pd).struct)) and diff --git a/compiler/pexpr.pas b/compiler/pexpr.pas index 25b2b3e9eb..317b60acf0 100644 --- a/compiler/pexpr.pas +++ b/compiler/pexpr.pas @@ -1035,7 +1035,7 @@ implementation else static_name:=lower(generate_nested_name(sym.owner,'_'))+'_'+sym.name; if sym.owner.defowner.typ=objectdef then - searchsym_in_class(tobjectdef(sym.owner.defowner),tobjectdef(sym.owner.defowner),static_name,sym,srsymtable,hs_searchfirst) + searchsym_in_class(tobjectdef(sym.owner.defowner),tobjectdef(sym.owner.defowner),static_name,sym,srsymtable,true) else searchsym_in_record(trecorddef(sym.owner.defowner),static_name,sym,srsymtable); if assigned(sym) then @@ -1512,7 +1512,7 @@ implementation begin p1:=ctypenode.create(hdef); { search also in inherited methods } - searchsym_in_class(tobjectdef(hdef),tobjectdef(current_structdef),pattern,srsym,srsymtable,hs_searchfirst); + searchsym_in_class(tobjectdef(hdef),tobjectdef(current_structdef),pattern,srsym,srsymtable,true); if assigned(srsym) then check_hints(srsym,srsym.symoptions,srsym.deprecatedmsg); consume(_ID); @@ -2147,7 +2147,7 @@ implementation if token=_ID then begin structh:=tobjectdef(tclassrefdef(p1.resultdef).pointeddef); - searchsym_in_class(tobjectdef(structh),tobjectdef(structh),pattern,srsym,srsymtable,hs_searchfirst); + searchsym_in_class(tobjectdef(structh),tobjectdef(structh),pattern,srsym,srsymtable,true); if assigned(srsym) then begin check_hints(srsym,srsym.symoptions,srsym.deprecatedmsg); @@ -2171,7 +2171,7 @@ implementation if token=_ID then begin structh:=tobjectdef(p1.resultdef); - searchsym_in_class(tobjectdef(structh),tobjectdef(structh),pattern,srsym,srsymtable,hs_searchfirst); + searchsym_in_class(tobjectdef(structh),tobjectdef(structh),pattern,srsym,srsymtable,true); if assigned(srsym) then begin check_hints(srsym,srsym.symoptions,srsym.deprecatedmsg); @@ -2398,7 +2398,7 @@ implementation if is_objectpascal_helper(current_structdef) then searchsym_in_helper(tobjectdef(current_structdef),tobjectdef(current_structdef),hs,srsym,srsymtable,true) else - searchsym_in_class(hclassdef,tobjectdef(current_structdef),hs,srsym,srsymtable,hs_nosearch); + searchsym_in_class(hclassdef,tobjectdef(current_structdef),hs,srsym,srsymtable,true); end else begin @@ -2410,7 +2410,7 @@ implementation if is_objectpascal_helper(current_structdef) then searchsym_in_helper(tobjectdef(current_structdef),tobjectdef(current_structdef),hs,srsym,srsymtable,true) else - searchsym_in_class(hclassdef,tobjectdef(current_structdef),hs,srsym,srsymtable,hs_nosearch); + searchsym_in_class(hclassdef,tobjectdef(current_structdef),hs,srsym,srsymtable,true); end; if assigned(srsym) then begin @@ -2444,7 +2444,7 @@ implementation if (po_msgint in pd.procoptions) or (po_msgstr in pd.procoptions) then begin - searchsym_in_class(hclassdef,hclassdef,'DEFAULTHANDLER',srsym,srsymtable,hs_searchfirst); + searchsym_in_class(hclassdef,hclassdef,'DEFAULTHANDLER',srsym,srsymtable,true); if not assigned(srsym) or (srsym.typ<>procsym) then internalerror(200303171); diff --git a/compiler/pinline.pas b/compiler/pinline.pas index 0d38657eea..03a26570e4 100644 --- a/compiler/pinline.pas +++ b/compiler/pinline.pas @@ -434,7 +434,7 @@ implementation { search the constructor also in the symbol tables of the parents } afterassignment:=false; - searchsym_in_class(classh,classh,pattern,srsym,srsymtable,hs_searchfirst); + searchsym_in_class(classh,classh,pattern,srsym,srsymtable,true); consume(_ID); do_member_read(classh,false,srsym,p1,again,[cnf_new_call]); { we need to know which procedure is called } diff --git a/compiler/psub.pas b/compiler/psub.pas index 195bb6d7c7..1cf3103197 100644 --- a/compiler/psub.pas +++ b/compiler/psub.pas @@ -1985,6 +1985,9 @@ implementation hp : tdef; oldcurrent_filepos : tfileposinfo; oldsymtablestack : tsymtablestack; +{$ifndef useoldsearch} + oldextendeddefs : TFPHashObjectList; +{$endif} pu : tused_unit; hmodule : tmodule; specobj : tabstractrecorddef; @@ -1999,7 +2002,13 @@ implementation { Setup symtablestack a definition time } specobj:=tabstractrecorddef(ttypesym(p).typedef); oldsymtablestack:=symtablestack; +{$ifdef useoldsearch} symtablestack:=tsymtablestack.create; +{$else} + oldextendeddefs:=current_module.extendeddefs; + current_module.extendeddefs:=TFPHashObjectList.create(true); + symtablestack:=tdefawaresymtablestack.create; +{$endif} if not assigned(specobj.genericdef) then internalerror(200705151); hmodule:=find_module_from_symtable(specobj.genericdef.owner); @@ -2046,6 +2055,10 @@ implementation end; { Restore symtablestack } +{$ifndef useoldsearch} + current_module.extendeddefs.free; + current_module.extendeddefs:=oldextendeddefs; +{$endif} symtablestack.free; symtablestack:=oldsymtablestack; end; diff --git a/compiler/ptype.pas b/compiler/ptype.pas index 5097fbf46b..f79a2906e4 100644 --- a/compiler/ptype.pas +++ b/compiler/ptype.pas @@ -159,6 +159,9 @@ implementation generictype : ttypesym; generictypelist : TFPObjectList; oldsymtablestack : tsymtablestack; +{$ifndef useoldsearch} + oldextendeddefs : TFPHashObjectList; +{$endif} hmodule : tmodule; pu : tused_unit; uspecializename, @@ -295,7 +298,13 @@ implementation to get types right, however this is not perfect, we should probably record the resolved symbols } oldsymtablestack:=symtablestack; +{$ifdef useoldsearch} symtablestack:=tsymtablestack.create; +{$else} + oldextendeddefs:=current_module.extendeddefs; + current_module.extendeddefs:=TFPHashObjectList.create(true); + symtablestack:=tdefawaresymtablestack.create; +{$endif} if not assigned(genericdef) then internalerror(200705151); hmodule:=find_module_from_symtable(genericdef.owner); @@ -362,6 +371,10 @@ implementation end; { Restore symtablestack } +{$ifndef useoldsearch} + current_module.extendeddefs.free; + current_module.extendeddefs:=oldextendeddefs; +{$endif} symtablestack.free; symtablestack:=oldsymtablestack; end @@ -889,8 +902,6 @@ implementation result:=current_structdef; { insert in symtablestack } symtablestack.push(recst); - { parse record } - consume(_RECORD); { usage of specialized type inside its generic template } if assigned(genericdef) then @@ -1472,7 +1483,14 @@ implementation end; _RECORD: begin - def:=record_dec(name,genericdef,genericlist); + consume(token); + if (idtoken=_HELPER) and (m_advanced_records in current_settings.modeswitches) then + begin + consume(_HELPER); + def:=object_dec(odt_helper,name,genericdef,genericlist,nil,ht_record); + end + else + def:=record_dec(name,genericdef,genericlist); end; _PACKED, _BITPACKED: diff --git a/compiler/symbase.pas b/compiler/symbase.pas index 41cc2da513..bb984dc350 100644 --- a/compiler/symbase.pas +++ b/compiler/symbase.pas @@ -130,8 +130,8 @@ interface constructor create; destructor destroy;override; procedure clear; - procedure push(st:TSymtable); - procedure pop(st:TSymtable); + procedure push(st:TSymtable); virtual; + procedure pop(st:TSymtable); virtual; function top:TSymtable; end; diff --git a/compiler/symconst.pas b/compiler/symconst.pas index 7ecb206d8c..51f18ff869 100644 --- a/compiler/symconst.pas +++ b/compiler/symconst.pas @@ -338,12 +338,6 @@ type ht_record ); - { defines when helper methods should be searched } - thelpersearch=(hs_nosearch, { helper methods are not searched at all } - hs_searchfirst, { search before the actual extended types symbols } - hs_searchlast { search only if no symbol is found in the extended type } - ); - { Variations in interfaces implementation } { Beware, this data is duplicated in the compiler and rtl. } { Do not change the order of the fields. } @@ -470,8 +464,7 @@ type { options for symtables } tsymtableoption = ( - sto_has_classhelper { contains at least one class - helper symbol } + sto_has_helper { contains at least one helper symbol } ); tsymtableoptions = set of tsymtableoption; diff --git a/compiler/symdef.pas b/compiler/symdef.pas index 2ceb9a6b35..0543191992 100644 --- a/compiler/symdef.pas +++ b/compiler/symdef.pas @@ -648,6 +648,15 @@ interface function is_publishable : boolean;override; end; + tdefawaresymtablestack = class(TSymtablestack) + private + procedure addhelpers(st: TSymtable); + procedure removehelpers(st: TSymtable); + public + procedure push(st: TSymtable); override; + procedure pop(st: TSymtable); override; + end; + var current_structdef: tabstractrecorddef; { used for private functions check !! } current_genericdef: tstoreddef; { used to reject declaration of generic class inside generic class } @@ -923,6 +932,96 @@ implementation result := '_' + result; end; +{**************************************************************************** + TDEFAWARESYMTABLESTACK + (symtablestack descendant that does some special actions on + the pushed/popped symtables) +****************************************************************************} + + procedure tdefawaresymtablestack.addhelpers(st: TSymtable); + var + i: integer; + s: string; + list: TFPObjectList; + def: tdef; + begin + { search the symtable from first to last; the helper to use will be the + last one in the list } + for i:=0 to st.symlist.count-1 do + begin + if not (st.symlist[i] is ttypesym) then + continue; + def:=ttypesym(st.SymList[i]).typedef; + if is_objectpascal_helper(def) then + begin + s:=make_mangledname('',tobjectdef(def).extendeddef.symtable,''); + list:=TFPObjectList(current_module.extendeddefs.Find(s)); + if not assigned(list) then + begin + list:=TFPObjectList.Create(false); + current_module.extendeddefs.Add(s,list); + end; + list.Add(def); + end + else + { add nested helpers as well } + if def.typ in [recorddef,objectdef] then + addhelpers(tabstractrecorddef(def).symtable); + end; + end; + + procedure tdefawaresymtablestack.removehelpers(st: TSymtable); + var + i, j: integer; + tmpst: TSymtable; + list: TFPObjectList; + begin + for i:=current_module.extendeddefs.count-1 downto 0 do + begin + list:=TFPObjectList(current_module.extendeddefs[i]); + for j:=list.count-1 downto 0 do + begin + if not (list[j] is tobjectdef) then + Internalerror(2011031501); + tmpst:=tobjectdef(list[j]).owner; + repeat + if tmpst=st then + begin + list.delete(j); + break; + end + else + begin + if assigned(tmpst.defowner) then + tmpst:=tmpst.defowner.owner + else + tmpst:=nil; + end; + until not assigned(tmpst) or (tmpst.symtabletype in [globalsymtable,staticsymtable]); + end; + if list.count=0 then + current_module.extendeddefs.delete(i); + end; + end; + + procedure tdefawaresymtablestack.push(st: TSymtable); + begin + { nested helpers will be added as well } + if (st.symtabletype in [globalsymtable,staticsymtable]) and + (sto_has_helper in st.tableoptions) then + addhelpers(st); + inherited push(st); + end; + + procedure tdefawaresymtablestack.pop(st: TSymtable); + begin + inherited pop(st); + { nested helpers will be removed as well } + if (st.symtabletype in [globalsymtable,staticsymtable]) and + (sto_has_helper in st.tableoptions) then + removehelpers(st); + end; + {**************************************************************************** TDEF (base class for definitions) @@ -4160,7 +4259,7 @@ implementation objecttype:=ot; childof:=nil; if objecttype=odt_helper then - owner.includeoption(sto_has_classhelper); + owner.includeoption(sto_has_helper); symtable:=tObjectSymtable.create(self,n,current_settings.packrecords); { create space for vmt !! } vmtentries:=TFPList.Create; diff --git a/compiler/symtable.pas b/compiler/symtable.pas index 9fc202ebbf..d0136a9995 100644 --- a/compiler/symtable.pas +++ b/compiler/symtable.pas @@ -220,19 +220,23 @@ interface function searchsym_type(const s : TIDString;out srsym:tsym;out srsymtable:TSymtable):boolean; function searchsym_in_module(pm:pointer;const s : TIDString;out srsym:tsym;out srsymtable:TSymtable):boolean; function searchsym_in_named_module(const unitname, symname: TIDString; out srsym: tsym; out srsymtable: tsymtable): boolean; - function searchsym_in_class(classh,contextclassh:tobjectdef;const s : TIDString;out srsym:tsym;out srsymtable:TSymtable;searchhelper:thelpersearch):boolean; + function searchsym_in_class(classh,contextclassh:tobjectdef;const s : TIDString;out srsym:tsym;out srsymtable:TSymtable;searchhelper:boolean):boolean; function searchsym_in_record(recordh:tabstractrecorddef;const s : TIDString;out srsym:tsym;out srsymtable:TSymtable):boolean; function searchsym_in_class_by_msgint(classh:tobjectdef;msgid:longint;out srdef : tdef;out srsym:tsym;out srsymtable:TSymtable):boolean; function searchsym_in_class_by_msgstr(classh:tobjectdef;const s:string;out srsym:tsym;out srsymtable:TSymtable):boolean; + { searches symbols inside of a helper's implementation } function searchsym_in_helper(classh,contextclassh:tobjectdef;const s: TIDString;out srsym:tsym;out srsymtable:TSymtable;aHasInherited:boolean):boolean; function search_system_type(const s: TIDString): ttypesym; function search_named_unit_globaltype(const unitname, typename: TIDString; throwerror: boolean): ttypesym; function search_struct_member(pd : tabstractrecorddef;const s : string):tsym; function search_assignment_operator(from_def,to_def:Tdef;explicit:boolean):Tprocdef; function search_enumerator_operator(from_def,to_def:Tdef):Tprocdef; - function search_last_objectpascal_helper(pd : tabstractrecorddef;out odef : tobjectdef):boolean; - function search_objectpascal_class_helper(pd,contextclassh : tobjectdef;const s : string; out srsym: tsym; out srsymtable: tsymtable):boolean; - function search_class_helper(pd : tobjectdef;const s : string; out srsym: tsym; out srsymtable: tsymtable):boolean; + { searches for the helper definition that's currently active for pd } + function search_last_objectpascal_helper(pd,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_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, } {and returns it if found. Returns nil otherwise.} @@ -1919,7 +1923,7 @@ implementation srsymtable:=stackitem^.symtable; if (srsymtable.symtabletype=objectsymtable) then begin - if searchsym_in_class(tobjectdef(srsymtable.defowner),tobjectdef(srsymtable.defowner),s,srsym,srsymtable,hs_searchfirst) then + if searchsym_in_class(tobjectdef(srsymtable.defowner),tobjectdef(srsymtable.defowner),s,srsym,srsymtable,true) then begin result:=true; exit; @@ -2149,29 +2153,12 @@ implementation end; - function searchsym_in_class(classh,contextclassh:tobjectdef;const s : TIDString;out srsym:tsym;out srsymtable:TSymtable;searchhelper:thelpersearch):boolean; + function searchsym_in_class(classh,contextclassh:tobjectdef;const s : TIDString;out srsym:tsym;out srsymtable:TSymtable;searchhelper:boolean):boolean; var hashedid : THashedIDString; - exdef : tabstractrecorddef; orgclass : tobjectdef; i : longint; begin - { search for a class helper method first if this is an Object Pascal - class } - if is_class(classh) and (searchhelper = hs_searchfirst) then - begin - result:=search_objectpascal_class_helper(classh,contextclassh,s,srsym,srsymtable); - if result then - begin - { if the procsym is overloaded we need to use the "original" - symbol; the helper symbol will be find when searching for - overloads } - if (srsym.typ<>procsym) or - not (sp_has_overloaded in tprocsym(srsym).symoptions) then - Exit; - end; - end; - orgclass:=classh; { in case this is a formal objcclass, first find the real definition } if assigned(classh) then @@ -2182,7 +2169,9 @@ implementation or be a parent of contextclassh. E.g. for inherited searches the classh is the parent or a class helper. } if not (contextclassh.is_related(classh) or - (contextclassh.extendeddef=classh)) then + (assigned(contextclassh.extendeddef) and + (contextclassh.extendeddef.typ=objectdef) and + contextclassh.extendeddef.is_related(classh))) then internalerror(200811161); end; result:=false; @@ -2202,7 +2191,7 @@ implementation end; for i:=0 to classh.ImplementedInterfaces.count-1 do begin - if searchsym_in_class(TImplementedInterface(classh.ImplementedInterfaces[i]).intfdef,contextclassh,s,srsym,srsymtable,hs_nosearch) then + if searchsym_in_class(TImplementedInterface(classh.ImplementedInterfaces[i]).intfdef,contextclassh,s,srsym,srsymtable,false) then begin result:=true; exit; @@ -2221,6 +2210,19 @@ implementation begin while assigned(classh) do begin + { search for a class helper method first if this is an Object + Pascal class } + if is_class(classh) and searchhelper then + begin + result:=search_objectpascal_helper(classh,contextclassh,s,srsym,srsymtable); + if result then + { if the procsym is overloaded we need to use the + "original" symbol; the helper symbol will be found when + searching for overloads } + if (srsym.typ<>procsym) or + not (sp_has_overloaded in tprocsym(srsym).symoptions) then + exit; + end; srsymtable:=classh.symtable; srsym:=tsym(srsymtable.FindWithHash(hashedid)); if assigned(srsym) and @@ -2234,11 +2236,7 @@ implementation end; end; if is_objcclass(orgclass) then - result:=search_class_helper(orgclass,s,srsym,srsymtable) - else - { this is currently not used, so maybe this can be removed again... } - if is_class(orgclass) and (searchhelper = hs_searchlast) then - result:=search_objectpascal_class_helper(orgclass,contextclassh,s,srsym,srsymtable) + result:=search_objc_helper(orgclass,s,srsym,srsymtable) else begin srsym:=nil; @@ -2251,6 +2249,15 @@ implementation hashedid : THashedIDString; begin hashedid.id:=s; + { search for a record helper method first } + result:=search_objectpascal_helper(recordh,recordh,s,srsym,srsymtable); + if result then + { if the procsym is overloaded we need to use the + "original" symbol; the helper symbol will be found when + searching for overloads } + if (srsym.typ<>procsym) or + not (sp_has_overloaded in tprocsym(srsym).symoptions) then + exit; srsymtable:=recordh.symtable; srsym:=tsym(srsymtable.FindWithHash(hashedid)); if assigned(srsym) and is_visible_for_object(srsym,recordh) then @@ -2339,88 +2346,59 @@ implementation function searchsym_in_helper(classh,contextclassh:tobjectdef;const s: TIDString;out srsym:tsym;out srsymtable:TSymtable;aHasInherited:boolean):boolean; var hashedid : THashedIDString; - tmpsrsym : tsym; - tmpsrsymtable : tsymtable; - found : boolean; + parentclassh : tobjectdef; begin if not is_objectpascal_helper(classh) then Internalerror(2011030101); hashedid.id:=s; - if is_class(classh.extendeddef) then + { in a helper things are a bit more complex: + 1. search the symbol in the helper (if not "inherited") + 2. search the symbol in the extended type + 3. search the symbol in the parent helpers + 4. only classes: search the symbol in the parents of the extended type + } + if not aHasInherited then begin - { in a class helper things are a bit more complex: - 1. search the symbol in the helper (if not "inherited") - 2. search the symbol in the extended type - 3. search the symbol in the parent helpers - 4. search the symbol in the parents of the extended type - Thus we search in the hierarchy of the extended type first and - check whether the returned symtable (if any) belongs to the - extended type or one of its parents. If the latter we first - check whether one of the helper parents contains a suitable - symbol - } - if not aHasInherited then + { search in the helper itself } + srsymtable:=classh.symtable; + srsym:=tsym(srsymtable.FindWithHash(hashedid)); + if assigned(srsym) and + is_visible_for_object(srsym,contextclassh) then begin - { search in the helper itself } - srsymtable:=classh.symtable; - srsym:=tsym(srsymtable.FindWithHash(hashedid)); - if assigned(srsym) and - is_visible_for_object(srsym,contextclassh) then - begin - addsymref(srsym); - result:=true; - exit; - end; + addsymref(srsym); + result:=true; + exit; end; - { search in the hierarchy of the extended class } - found:=searchsym_in_class(tobjectdef(classh.extendeddef),contextclassh,s,tmpsrsym,tmpsrsymtable,hs_nosearch); - if not found then - begin - if assigned(classh.childof) then - begin - { the symbol isn't in the extended type's hierarchy, - so search in the parents of the helper } - result:=searchsym_in_class(classh.childof,contextclassh,s,srsym,srsymtable,hs_nosearch); - if result and is_visible_for_object(srsym,contextclassh) then - addsymref(srsym); - end; - end - else - begin - if (tmpsrsymtable.defowner=classh.extendeddef) and - is_visible_for_object(tmpsrsym,contextclassh) then - begin - { the symbol was found in the extended type } - result:=true; - srsym:=tmpsrsym; - srsymtable:=tmpsrsymtable; - exit; - end - else - begin - result:=false; - { search in the helper's parents first } - if assigned(classh.childof) then - result:=searchsym_in_helper(classh.childof,contextclassh,s,srsym,srsymtable,false); - if not result then - begin - { we use the symbol found in one of the extended - type's ancestors } - result:=true; - srsym:=tmpsrsym; - srsymtable:=tmpsrsymtable; - end; - if assigned(srsym) and is_visible_for_object(srsym,contextclassh) then - addsymref(srsym); - end; - end; - end - else if is_record(classh.extendeddef) and - searchsym_in_record(classh.extendeddef, s, srsym, srsymtable) then + end; + { now search in the extended type itself } + srsymtable:=classh.extendeddef.symtable; + srsym:=tsym(srsymtable.FindWithHash(hashedid)); + if assigned(srsym) and + is_visible_for_object(srsym,contextclassh) then begin + addsymref(srsym); result:=true; exit; end; + { now search in the parent helpers } + parentclassh:=classh.childof; + while assigned(parentclassh) do + begin + srsymtable:=parentclassh.symtable; + srsym:=tsym(srsymtable.FindWithHash(hashedid)); + if assigned(srsym) and + is_visible_for_object(srsym,contextclassh) then + begin + addsymref(srsym); + result:=true; + exit; + end; + parentclassh:=parentclassh.childof; + end; + if is_class(classh.extendeddef) then + { now search in the parents of the extended class (with helpers!) } + result:=searchsym_in_class(tobjectdef(classh.extendeddef).childof,contextclassh,s,srsym,srsymtable,true); + { addsymref is already called by searchsym_in_class } end; function search_specific_assignment_operator(assignment_type:ttoken;from_def,to_def:Tdef):Tprocdef; @@ -2555,12 +2533,19 @@ implementation end; end; - function search_last_objectpascal_helper(pd : tabstractrecorddef;out odef : tobjectdef):boolean; + function search_last_objectpascal_helper(pd,contextclassh : tabstractrecorddef;out odef : tobjectdef):boolean; var +{$ifdef useoldsearch} stackitem : psymtablestackitem; i : integer; srsymtable : tsymtable; +{$else} + s: string; + list: TFPObjectList; + i: integer; +{$endif} begin +{$ifdef useoldsearch} result:=false; stackitem:=symtablestack.stack; while assigned(stackitem) do @@ -2568,7 +2553,7 @@ implementation srsymtable:=stackitem^.symtable; { only check symtables that contain a class helper } if (srsymtable.symtabletype in [staticsymtable,globalsymtable]) and - (sto_has_classhelper in srsymtable.tableoptions) then + (sto_has_helper in srsymtable.tableoptions) then begin { we need to search from last to first } for i:=srsymtable.symlist.count-1 downto 0 do @@ -2588,9 +2573,27 @@ implementation end; stackitem:=stackitem^.next; end; +{$else} + result:=false; + s:=make_mangledname('',pd.symtable,''); + list:=TFPObjectList(current_module.extendeddefs.Find(s)); + if assigned(list) and (list.count>0) then + begin + i:=list.count-1; + repeat + odef:=tobjectdef(list[list.count-1]); + result:=(odef.owner.symtabletype in [staticsymtable,globalsymtable]) or + is_visible_for_object(tobjectdef(list[i]).typesym,contextclassh); + dec(i); + until result or (i<0); + if not result then + { just to be sure that noone uses odef } + odef:=nil; + end; +{$endif} end; - function search_objectpascal_class_helper(pd,contextclassh : tobjectdef;const s: string; out srsym: tsym; out srsymtable: tsymtable):boolean; + function search_objectpascal_helper(pd,contextclassh : tabstractrecorddef;const s: string; out srsym: tsym; out srsymtable: tsymtable):boolean; var hashedid : THashedIDString; @@ -2602,7 +2605,7 @@ implementation { if there is no class helper for the class then there is no need to search further } - if not search_last_objectpascal_helper(pd,classh) then + if not search_last_objectpascal_helper(pd,contextclassh,classh) then exit; hashedid.id:=s; @@ -2629,13 +2632,7 @@ implementation if assigned(current_procinfo) and (srsym.owner.symtabletype=staticsymtable) then include(current_procinfo.flags,pi_uses_static_symtable); - { no need to keep looking. There might be other - categories that extend this, a parent or child - class with a method with the same name (either - overriding this one, or overridden by this one), - but that doesn't matter as far as the basic - procsym is concerned. - } + { the first found method wins } srsym:=tprocdef(tprocsym(srsym).procdeflist[i]).procsym; srsymtable:=srsym.owner; addsymref(srsym); @@ -2644,7 +2641,7 @@ implementation end; end; - { try the class helper parent if available } + { try the helper parent if available } classh:=classh.childof; until classh=nil; @@ -2652,7 +2649,7 @@ implementation srsymtable:=nil; end; - function search_class_helper(pd : tobjectdef;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; var hashedid : THashedIDString; stackitem : psymtablestackitem; @@ -2796,7 +2793,7 @@ implementation { not found, now look for class helpers } if is_objcclass(pd) then - search_class_helper(tobjectdef(orgpd),s,result,srsymtable) + search_objc_helper(tobjectdef(orgpd),s,result,srsymtable) else result:=nil; end; @@ -2864,7 +2861,7 @@ implementation begin _defaultprop:=nil; { first search in helper's hierarchy } - if search_last_objectpascal_helper(pd, helperpd) then + if search_last_objectpascal_helper(pd,nil,helperpd) then while assigned(helperpd) do begin helperpd.symtable.SymList.ForEachCall(@tstoredsymtable(helperpd.symtable).testfordefaultproperty,@_defaultprop); diff --git a/compiler/utils/ppudump.pp b/compiler/utils/ppudump.pp index 8b29aca0bd..536af8451a 100644 --- a/compiler/utils/ppudump.pp +++ b/compiler/utils/ppudump.pp @@ -429,8 +429,7 @@ end; procedure readsymtableoptions(const s: string); type tsymtableoption = ( - sto_has_classhelper { contains at least one class - helper symbol } + sto_has_helper { contains at least one helper symbol } ); tsymtableoptions = set of tsymtableoption; tsymtblopt=record @@ -440,7 +439,7 @@ type const symtblopts=1; symtblopt : array[1..symtblopts] of tsymtblopt=( - (mask:sto_has_classhelper; str:'Has class helper') + (mask:sto_has_helper; str:'Has helper') ); var options : tsymtableoptions; @@ -1947,7 +1946,7 @@ type odt_dispinterface, odt_objcclass, odt_objcprotocol, - odt_classhelper + odt_helper ); tvarianttype = ( vt_normalvariant,vt_olevariant