diff options
author | nickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2020-04-26 22:33:58 +0000 |
---|---|---|
committer | nickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2020-04-26 22:33:58 +0000 |
commit | ba4ac11a2eb5146a67c597af8d83f4fae915751d (patch) | |
tree | 558b1e67cfa8a98d899f7f0d778873f639f01286 | |
parent | 419676ee2173c25a4607b569b951839be6425761 (diff) | |
parent | 898e4cabf7b38d13d6e862b77adb0dc59b65b8f1 (diff) | |
download | fpc-ba4ac11a2eb5146a67c597af8d83f4fae915751d.tar.gz |
* synchronized with trunk
git-svn-id: https://svn.freepascal.org/svn/fpc/branches/z80@45131 3ad0048d-3df7-0310-abae-a5850022a9f2
68 files changed, 2168 insertions, 826 deletions
diff --git a/compiler/defcmp.pas b/compiler/defcmp.pas index 67f3119557..e4e15182ab 100644 --- a/compiler/defcmp.pas +++ b/compiler/defcmp.pas @@ -345,9 +345,13 @@ implementation internalerror(2012091302); symfrom:=ttypesym(tstoreddef(def_from).genericparas[i]); symto:=ttypesym(tstoreddef(def_to).genericparas[i]); - if not (symfrom.typ=typesym) or not (symto.typ=typesym) then + if not (symfrom.typ in [typesym,constsym]) or not (symto.typ in [typesym,constsym]) then internalerror(2012121401); - if not equal_defs(ttypesym(symfrom).typedef,ttypesym(symto).typedef) then + if symto.typ<>symfrom.typ then + diff:=true + else if (symfrom.typ=constsym) and (symto.typ=constsym) and not equal_constsym(tconstsym(symfrom),tconstsym(symto),true) then + diff:=true + else if not equal_defs(ttypesym(symfrom).typedef,ttypesym(symto).typedef) then diff:=true; if diff then break; diff --git a/compiler/htypechk.pas b/compiler/htypechk.pas index 743ec69b10..b989fb2259 100644 --- a/compiler/htypechk.pas +++ b/compiler/htypechk.pas @@ -2779,7 +2779,7 @@ implementation internalerror(2015060301); { check whether the given parameters are compatible to the def's constraints } - if not check_generic_constraints(pd,spezcontext.genericdeflist,spezcontext.poslist) then + if not check_generic_constraints(pd,spezcontext.paramlist,spezcontext.poslist) then exit; def:=generate_specialization_phase2(spezcontext,pd,false,''); case def.typ of diff --git a/compiler/msg/errore.msg b/compiler/msg/errore.msg index 62888c272e..aa2b23ca06 100644 --- a/compiler/msg/errore.msg +++ b/compiler/msg/errore.msg @@ -1617,7 +1617,7 @@ parser_e_generic_constraints_not_allowed_here=03355_E_Generic constraint not all % # Type Checking # -# 04127 is the last used one +# 04128 is the last used one # % \section{Type checking errors} % This section lists all errors that can occur when type checking is @@ -2061,6 +2061,9 @@ type_e_forward_interface_type_does_not_match=04127_E_The interface type of the f % When declaring an interface forward, the interface type must be the same as at the actual declaration of the interface. % This is in particular important with regard to the parent interface which implicitly sets the interface type for the % child interface. +type_e_generic_const_type_not_allowed=04128_E_Type not allowed for generic constant parameter: $1 +% Only types that can also be used (indirectly) for untyped constants can be used as a +% type for a generic constant parameter. % \end{description} # # Symtable diff --git a/compiler/msgidx.inc b/compiler/msgidx.inc index 0649132b3a..c7b36f9c25 100644 --- a/compiler/msgidx.inc +++ b/compiler/msgidx.inc @@ -584,6 +584,7 @@ const type_w_empty_constant_range_set=04125; type_e_cblock_callconv=04126; type_e_forward_interface_type_does_not_match=04127; + type_e_generic_const_type_not_allowed=04128; sym_e_id_not_found=05000; sym_f_internal_error_in_symtablestack=05001; sym_e_duplicate_id=05002; @@ -1125,9 +1126,9 @@ const option_info=11024; option_help_pages=11025; - MsgTxtSize = 85143; + MsgTxtSize = 85203; MsgIdxMax : array[1..20] of longint=( - 28,106,356,128,99,63,143,36,223,68, + 28,106,356,129,99,63,143,36,223,68, 62,20,30,1,1,1,1,1,1,1 ); diff --git a/compiler/msgtxt.inc b/compiler/msgtxt.inc index c7a9002bfd..81d0cfddfa 100644 --- a/compiler/msgtxt.inc +++ b/compiler/msgtxt.inc @@ -1,8 +1,8 @@ const msgtxt_codepage=20127; {$ifdef Delphi} -const msgtxt : array[0..000354] of string[240]=( +const msgtxt : array[0..000355] of string[240]=( {$else Delphi} -const msgtxt : array[0..000354,1..240] of char=( +const msgtxt : array[0..000355,1..240] of char=( {$endif Delphi} '01000_T_Compiler: $1'#000+ '01001_D_Compiler OS: $1'#000+ @@ -741,428 +741,431 @@ const msgtxt : array[0..000354,1..240] of char=( 'n.'#000+ '04127_E_The interface type of the forward declaration and the declared'+ ' interface type do not matc','h for interface $1'#000+ + '04128_E_Type not allowed for generic constant parameter: $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+ + '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+ + '05005_E_Forward declaration not solved "$1"'#000+ '05007_E_Error in type definition'#000+ '05009_E_Forward type not resolved "$1"'#000+ '05010_E_Only static variables can be used in static methods or outside'+ ' methods'#000+ - '05012_E_Record or object or class type expected'#000+ - '05013_E_Instances of cla','sses or objects with an abstract method are '+ - 'not allowed'#000+ + '05012_E_Reco','rd or object or class type expected'#000+ + '05013_E_Instances of classes or objects with an abstract method are no'+ + 't allowed'#000+ '05014_W_Label not defined "$1"'#000+ '05015_E_Label used but not defined "$1"'#000+ '05016_E_Illegal label declaration'#000+ - '05017_E_GOTO and LABEL are not supported (use switch -Sg)'#000+ - '05018_E_Label not fou','nd'#000+ + '05017_E_GOTO and LA','BEL are not supported (use switch -Sg)'#000+ + '05018_E_Label not found'#000+ '05019_E_Identifier isn'#039't a label'#000+ '05020_E_Label already defined'#000+ '05021_E_Illegal type declaration of set elements'#000+ '05022_E_Forward class definition not resolved "$1"'#000+ - '05023_H_Unit "$1" not used in $2'#000+ + '05023_H_Unit "','$1" not used in $2'#000+ '05024_H_Parameter "$1" not used'#000+ - '05025_N_L','ocal variable "$1" not used'#000+ + '05025_N_Local variable "$1" not used'#000+ '05026_H_Value parameter "$1" is assigned but never used'#000+ '05027_N_Local variable "$1" is assigned but never used'#000+ '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+ + '05029_N','_Private field "$1.$2" is never used'#000+ + '05030_N_Private field "$1.$2" is assigned but never used'#000+ '05031_N_Private method "$1.$2" never used'#000+ '05032_E_Set type expected'#000+ '05033_W_Function result does not seem to be set'#000+ - '05034_W_Type "$1" is not aligned correctly in current record for C'#000+ - '05035_E_Unknown record ','field identifier "$1"'#000+ + '05034_W_Type "$1" is not align','ed correctly in current record for C'#000+ + '05035_E_Unknown record field identifier "$1"'#000+ '05036_W_Local variable "$1" does not seem to be initialized'#000+ '05037_W_Variable "$1" does not seem to be initialized'#000+ '05038_E_Identifier idents no member "$1"'#000+ - '05039_H_Found declaration: $1'#000+ + '050','39_H_Found declaration: $1'#000+ '05040_E_Data element too large'#000+ - '05','042_E_No matching implementation for interface method "$1" found'#000+ + '05042_E_No matching implementation for interface method "$1" found'#000+ '05043_W_Symbol "$1" is deprecated'#000+ '05044_W_Symbol "$1" is not portable'#000+ '05055_W_Symbol "$1" is not implemented'#000+ - '05056_E_Can'#039't create unique type from this type'#000+ - '05057_H_Local vari','able "$1" does not seem to be initialized'#000+ + '05056_','E_Can'#039't create unique type from this type'#000+ + '05057_H_Local variable "$1" does not seem to be initialized'#000+ '05058_H_Variable "$1" does not seem to be initialized'#000+ '05059_W_Function result variable does not seem to be initialized'#000+ - '05060_H_Function result variable does not seem to be initialized'#000+ - '05061_W_Variab','le "$1" read but nowhere assigned'#000+ + '05060_H_Function re','sult variable does not seem to be initialized'#000+ + '05061_W_Variable "$1" read but nowhere assigned'#000+ '05062_H_Found abstract method: $1'#000+ '05063_W_Symbol "$1" is experimental'#000+ '05064_W_Forward declaration "$1" not resolved, assumed external'#000+ - '05065_W_Symbol "$1" is belongs to a library'#000+ - '05066_W_Symbol "$1" is depre','cated: "$2"'#000+ + '05065_W_Symb','ol "$1" is belongs to a library'#000+ + '05066_W_Symbol "$1" is deprecated: "$2"'#000+ '05067_E_Cannot find an enumerator for the type "$1"'#000+ '05068_E_Cannot find a "MoveNext" method in enumerator "$1"'#000+ - '05069_E_Cannot find a "Current" property in enumerator "$1"'#000+ - '05070_E_Mismatch between number of declared parameters an','d number of'+ - ' colons in message string.'#000+ + '05069_E_Cannot find a "Current" property in enumerator "$','1"'#000+ + '05070_E_Mismatch between number of declared parameters and number of c'+ + 'olons in message string.'#000+ '05071_N_Private type "$1.$2" never used'#000+ '05072_N_Private const "$1.$2" never used'#000+ '05073_N_Private property "$1.$2" never used'#000+ - '05074_W_Unit "$1" is deprecated'#000+ + '05074_W_Unit "$1"',' is deprecated'#000+ '05075_W_Unit "$1" is deprecated: "$2"'#000+ - '05076_W','_Unit "$1" is not portable'#000+ + '05076_W_Unit "$1" is not portable'#000+ '05077_W_Unit "$1" is belongs to a library'#000+ '05078_W_Unit "$1" is not implemented'#000+ '05079_W_Unit "$1" is experimental'#000+ - '05080_E_No full definition of the formally declared class "$1" is in s'+ - 'cope. Add the unit containing ','its full definition to the uses clause'+ + '05080_E_No full definition of the formal','ly declared class "$1" is in'+ + ' scope. Add the unit containing its full definition to the uses clause'+ '.'#000+ '05081_E_Gotos into initialization or finalization blocks of units are '+ 'not allowed'#000+ '05082_E_Invalid external name "$1" for formal class "$2"'#000+ - '05083_E_Complete class definition with external name "$1" her','e'#000+ + '0','5083_E_Complete class definition with external name "$1" here'#000+ '05084_W_Possible library conflict: symbol "$1" from library "$2" also '+ 'found in library "$3"'#000+ '05085_E_Cannot add implicit constructor '#039'Create'#039' because ident'+ - 'ifier already used by "$1"'#000+ - '05086_E_Cannot generate default constructor for class, be','cause paren'+ - 't has no parameterless constructor'#000+ + 'ifier already used by "$','1"'#000+ + '05086_E_Cannot generate default constructor for class, because parent '+ + 'has no parameterless constructor'#000+ '05087_D_Adding helper for $1'#000+ '05088_E_Found declaration: $1'#000+ '05089_W_Local variable "$1" of a managed type does not seem to be init'+ - 'ialized'#000+ - '05090_W_Variable "$1" of a managed type does not seem to ','be initiali'+ - 'zed'#000+ + 'ializ','ed'#000+ + '05090_W_Variable "$1" of a managed type does not seem to be initialize'+ + 'd'#000+ '05091_H_Local variable "$1" of a managed type does not seem to be init'+ 'ialized'#000+ '05092_H_Variable "$1" of a managed type does not seem to be initialize'+ 'd'#000+ - '05093_W_Function result variable of a managed type does not seem to be'+ - ' init','ialized'#000+ + '05093_W_Functio','n result variable of a managed type does not seem to '+ + 'be initialized'#000+ '05094_H_Function result variable of a managed type does not seem to be'+ ' initialized'#000+ '05095_W_Duplicate identifier "$1"'#000+ - '05096_E_Generic type parameter "$1" does not match with the one in the'+ - ' declaration'#000+ - '05097_E_Generic type parameter d','eclared as "$1"'#000+ + '05096_E_Generic type parameter "$1" does not match with',' the one in t'+ + 'he declaration'#000+ + '05097_E_Generic type parameter declared as "$1"'#000+ '05098_E_Record or object type expected'#000+ '06009_E_Parameter list size exceeds 65535 bytes'#000+ '06012_E_File types must be var parameters'#000+ - '06013_E_The use of a far pointer isn'#039't allowed there'#000+ - '06015_E_EXPORT declared functions cannot b','e called'#000+ + '06013_E_The use of a far pointer is','n'#039't allowed there'#000+ + '06015_E_EXPORT declared functions cannot 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 cannot be called directly'#000+ - '06027_DL_Register $1 weight $2 $3'#000+ + '06027_DL_Re','gister $1 weight $2 $3'#000+ '06029_DL_Stack frame is omitted'#000+ - '06031','_E_Object or class methods cannot be inline.'#000+ + '06031_E_Object or class methods cannot 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 ansi/wide- or longstring cannot be accessed'+ - ', use (set)length instead'#000+ - '06037_E_Constru','ctors or destructors cannot be called inside a '#039'w'+ - 'ith'#039' clause'#000+ + '06035_E_Element zero of an ansi/wide- or longstring',' cannot be access'+ + 'ed, 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 block'#000+ - '06040_E_Control flow statements are not allowed in a finally block'#000+ - '06041_W_Pa','rameters size exceeds limit for certain cpu'#039's'#000+ + '06040_E_Control f','low statements are not 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+ - '06044_E_BREAK not allowed'#000+ + '06044_E_BREAK not allo','wed'#000+ '06045_E_CONTINUE not allowed'#000+ - '06046_F_Unknown compilerpro','c "$1". Check if you use the correct run '+ - 'time library.'#000+ + '06046_F_Unknown compilerproc "$1". Check if you use the correct run ti'+ + 'me library.'#000+ '06047_F_Cannot find system type "$1". Check if you use the correct run'+ ' time library.'#000+ - '06048_H_Inherited call to abstract method ignored'#000+ - '06049_E_Goto label "$1" not defined or optimized a','way'#000+ + '06048_H_Inherited call to abstract metho','d 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 subroutines'#000+ - '06052_E_Label must be defined in the same scope as it is declared'#000+ - '06053_E_Lea','ving procedures containing explicit or implicit exception'+ - 's frames using goto is not allowed'#000+ + '06052_E_Label mus','t be defined in the same scope as it is declared'#000+ + '06053_E_Leaving procedures containing explicit or implicit exceptions '+ + 'frames using goto is not allowed'#000+ '06054_E_In ISO mode, the mod operator is defined only for positive quo'+ 'tient'#000+ - '06055_DL_Auto inlining: $1'#000+ - '06056_E_The function used, is not supported b','y the selected instruct'+ - 'ion set: $1'#000+ + '06055_DL_Aut','o inlining: $1'#000+ + '06056_E_The function used, is not supported by the selected instructio'+ + 'n set: $1'#000+ '06057_F_Maximum number of units ($1) reached for the current target'#000+ '06058_N_Call to subroutine "$1" marked as inline is not inlined'#000+ - '06059_E_Case statement does not handle ordinal value "$1", and no else'+ - '/ot','herwise statement is present.'#000+ + '06059_E_Case ','statement does not handle ordinal value "$1", and no el'+ + 'se/otherwise statement is present.'#000+ '06060_W_Case statement does not handle all possible cases'#000+ '06061_W_The current subroutine "$1" cannot be compiled for the target '+ 'CPU, creating dummy'#000+ - '06062_W_The target CPU does not support preserving the registe','rs in '+ + '06','062_W_The target CPU does not support preserving the registers in '+ 'subroutine "$1"'#000+ '07000_DL_Starting $1 styled assembler parsing'#000+ '07001_DL_Finished $1 styled assembler parsing'#000+ '07002_E_Non-label pattern contains @'#000+ - '07004_E_Error building record offset'#000+ + '07004_E_Error building record',' offset'#000+ '07005_E_OFFSET used without identifier'#000+ - '07006_E_TYPE ','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+ '07009_E_Need to use $ here'#000+ - '07010_E_Cannot use multiple relocatable symbols'#000+ + '07010_E_Cannot use multiple relocatable symb','ols'#000+ '07011_E_Relocatable symbol can only be added'#000+ - '07012_E_Inv','alid constant expression'#000+ + '07012_E_Invalid constant expression'#000+ '07013_E_Relocatable symbol is not allowed'#000+ '07014_E_Invalid reference syntax'#000+ '07015_E_You cannot reach $1 from that code'#000+ - '07016_E_Local symbols/labels are not allowed as references'#000+ - '07017_E_Invalid base and index registe','r usage'#000+ + '07016_E_Local symbols/labels are not ','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 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 support','ed'#000+ + '07022_E_Invalid stri','ng as opcode operand: $1'#000+ + '07023_W_@CODE and @DATA not supported'#000+ '07024_E_Null label references are not allowed'#000+ '07025_E_Divide by zero in asm evaluator'#000+ '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, + '07028_E_Invalid symbol refer','ence'#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+ '07032_W_Calling an overload function in assembler'#000+ - '07033_E_Unsupported symbol type for operand'#000+ + '07033_E_Unsupported symb','ol type for operand'#000+ '07034_E_Constant value out of bounds'#000+ - '070','35_E_Error converting decimal $1'#000+ + '07035_E_Error converting decimal $1'#000+ '07036_E_Error converting octal $1'#000+ '07037_E_Error converting binary $1'#000+ '07038_E_Error converting hexadecimal $1'#000+ '07039_H_$1 translated to $2'#000+ - '07040_W_$1 is associated to an overloaded function'#000+ - '07041_E_Cannot use ','SELF outside a method'#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_Procedures cannot 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+ + '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+ '07049_E_Assembler syntax error in operand'#000+ - '07050_E_Assembler syntax error in constant'#000+ - '07051_E_Invalid String expres','sion'#000+ + '07050_E_Asse','mbler syntax error in constant'#000+ + '07051_E_Invalid String expression'#000+ '07052_W_Constant with symbol $1 for address which is not on a pointer'#000+ '07053_E_Unrecognized opcode $1'#000+ '07054_E_Invalid or missing opcode'#000+ - '07055_E_Invalid combination of prefix and opcode: $1'#000+ - '07056_E_Invalid combination of override and opc','ode: $1'#000+ + '07055_E_Invalid combination of prefix an','d 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+ '07059_W_FAR ignored'#000+ '07060_E_Duplicate local symbol $1'#000+ '07061_E_Undefined local symbol $1'#000+ - '07062_E_Unknown label identifier $1'#000+ + '07062_E_Unknown label identif','ier $1'#000+ '07063_E_Invalid register name'#000+ - '07064_E_Invalid floatin','g point register name'#000+ + '07064_E_Invalid floating point register name'#000+ '07066_W_Modulo not supported'#000+ '07067_E_Invalid floating point constant $1'#000+ '07068_E_Invalid floating point expression'#000+ '07069_E_Wrong symbol type'#000+ - '07070_E_Cannot index a local var or parameter with a register'#000+ - '07071_E_Invalid ','segment override expression'#000+ + '07070_E_Cannot ind','ex 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 allowed as constants'#000+ '07074_E_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+ + '07075_E_Assembler code not return','ed to text section'#000+ + '07076_E_Not a directive or local symbol $1'#000+ '07077_E_Using a defined name as a local label'#000+ '07078_E_Dollar token is used without an identifier'#000+ '07079_W_32bit constant created for address'#000+ - '07080_N_.align is target specific, use .balign or .p2align'#000+ - '07081_E_Cannot directly access fields o','f pointer-based parameters'#000+ + '07080_N_.align is target specific, use',' .balign or .p2align'#000+ + '07081_E_Cannot directly access fields of pointer-based parameters'#000+ '07082_E_Can'#039't access fields of objects/classes directly'#000+ '07083_E_No size specified and unable to determine the size of the oper'+ 'ands'#000+ - '07084_E_Cannot use RESULT in this function'#000+ - '07086_W_"$1" without operand translated',' into "$1 %st,%st(1)"'#000+ + '07084_E_Cannot use RES','ULT 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 into "$1 %st(n),%st"'#000+ '07089_E_Char < not allowed here'#000+ - '07090_E_Char > not allowed here'#000+ + '07090_E_Char > not all','owed here'#000+ '07093_W_ALIGN not supported'#000+ - '07094_E_Inc and Dec ca','nnot be together'#000+ + '07094_E_Inc and Dec cannot be together'#000+ '07095_E_Invalid register list for MOVEM or FMOVEM'#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+ - '0','7099_E_Syntax error while trying to parse a shifter operand'#000+ + '07098_W_No size specified and unable to ','determine the size of the op'+ + 'erands, 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+ - '07101_W_No size specified and unable to determine the size of the oper'+ - 'ands, using BYTE as default'#000+ - '07102_W_Use of $1 fo','r parameters invalid here'#000+ + '07101_W_No size specified and unable to determine the size',' of the op'+ + 'erands, using BYTE as default'#000+ + '07102_W_Use of $1 for parameters invalid here'#000+ '07103_W_Use of $1 is not compatible with regcall convention'#000+ '07104_W_Use of $1 is not recommended for local variable access'#000+ - '07105_W_Use of $1, access may cause a crash or value may be lost'#000+ - '07106_E_VMTOffset must be ','used in combination with a virtual method,'+ - ' and "$1" is not virtual'#000+ + '07105_W_Use of $1, access may c','ause a crash or value may be lost'#000+ + '07106_E_VMTOffset must be used in combination with a virtual method, a'+ + 'nd "$1" is not virtual'#000+ '07107_E_Generating PIC, but reference is not PIC-safe'#000+ - '07108_E_All registers in a register set must be of the same kind and w'+ - 'idth'#000+ + '07108_E_All registers in a register set must be of the same',' kind and'+ + ' width'#000+ '07109_E_A register set cannot be empty'#000+ - '07110','_W_@GOTPCREL is useless and potentially dangerous for local sym'+ - 'bols'#000+ + '07110_W_@GOTPCREL is useless and potentially dangerous for local symbo'+ + 'ls'#000+ '07111_W_Constant with general purpose segment register'#000+ '07112_E_Invalid offset value for $1'#000+ - '07113_E_Invalid register for $1'#000+ - '07114_E_SEH directives are allowed only in pure a','ssembler procedures'+ - #000+ + '07113_E_Invalid regis','ter for $1'#000+ + '07114_E_SEH directives are allowed only in pure assembler procedures'#000+ '07115_E_Directive "$1" is not supported for the current target'#000+ '07116_E_This function'#039's result location cannot be encoded directly'+ - ' in a single operand when "nostackframe" is used'#000+ - '07117_E_GOTPCREL references in Intel assem','bler syntax cannot contain'+ - ' a base or index register, and their offset must 0.'#000+ + ' in a single operand when "nost','ackframe" is used'#000+ + '07117_E_GOTPCREL references in Intel assembler syntax cannot contain a'+ + ' base or index register, and their offset must 0.'#000+ '07118_E_The current target does not support GOTPCREL relocations'#000+ - '07119_W_Exported/global symbols should be accessed via the GOT'#000+ - '07120_W_Check size of memory opera','nd "$1"'#000+ + '07119_W_Exported/global symbols shoul','d be accessed via the GOT'#000+ + '07120_W_Check size of memory operand "$1"'#000+ '07121_W_Check size of memory operand "$1: memory-operand-size is $2 bi'+ 'ts, but expected [$3 bits]"'#000+ '07122_W_Check size of memory operand "$1: memory-operand-size is $2 bi'+ - 'ts, but expected [$3 bits + $4 byte offset]"'#000+ - '07123_W_Check "$1: ','offset of memory operand is negative "$2 byte"'#000+ + 'ts, ','but expected [$3 bits + $4 byte offset]"'#000+ + '07123_W_Check "$1: offset of memory operand is negative "$2 byte"'#000+ '07124_W_Check "$1: size of memory operand is empty, but es exists diff'+ - 'erent definitions of the memory size =>> map to $2 (smallest option)"'#000+ - '07125_E_Invalid register used in memory reference exp','ression: "$1"'#000+ + 'erent definitions of the memory size =>> map to $2 (smallest op','tion)'+ + '"'#000+ + '07125_E_Invalid register used in memory reference expression: "$1"'#000+ '07126_E_SEG used without identifier'#000+ '07127_E_@CODE and @DATA can only be used with the SEG operator'#000+ - '07128_E_Not enough space (16 bits required) for the segment constant o'+ - 'f symbol $1'#000+ - '07129_E_Invalid value of .code directive cons','tant'#000+ + '07128_E_Not enough space (16 bits required) for the segment constan','t'+ + ' of symbol $1'#000+ + '07129_E_Invalid value of .code directive constant'#000+ '07130_W_No size specified and unable to determine the size of the cons'+ 'tant, using BYTE as default'#000+ '07131_W_No size specified and unable to determine the size of the cons'+ - 'tant, using WORD as default'#000+ + 'tant, u','sing WORD as default'#000+ '07132_E_Cannot override ES segment'#000+ - '0713','3_W_Reference is not valid here (expected "$1")'#000+ + '07133_W_Reference is not valid here (expected "$1")'#000+ '07134_E_Address sizes do not match'#000+ '07135_E_Instruction "POP CS" is not valid for the current target'#000+ - '07136_W_Instruction "POP CS" is not portable (it only works on 8086 an'+ - 'd 8088 CPUs)'#000+ - '07137_E_L','abel $1 can only be declared public before it'#039's defined'+ - #000+ + '07136_W_Instruction "POP CS" is ','not portable (it only works on 8086 '+ + 'and 8088 CPUs)'#000+ + '07137_E_Label $1 can only be declared public before it'#039's defined'#000+ '07138_E_Local label $1 cannot be declared public'#000+ '07139_E_Cannot use multiple segment overrides'#000+ - '07140_W_Multiple segment overrides (only the last one will take effect'+ - ')'#000+ - '07141_W_Segment b','ase $1 will be generated, but is ignored by the CPU'+ - ' in 64-bit mode'#000+ + '07140_W_Multiple segment over','rides (only the last one will take effe'+ + 'ct)'#000+ + '07141_W_Segment base $1 will be generated, but is ignored by the CPU i'+ + 'n 64-bit mode'#000+ '07142_E_Mismatch broadcasting elements (expected: {$1} found: {$2})'#000+ '08000_F_Too many assembler files'#000+ - '08001_F_Selected assembler output not supported'#000+ - '08002_F_Comp not support','ed'#000+ + '08001_F_Sele','cted 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+ '08005_F_No binary writer selected'#000+ '08006_E_Asm: Opcode $1 not in table'#000+ - '08007_E_Asm: $1 invalid combination of opcode and operands'#000+ - '0800','8_E_Asm: 16 Bit references not supported'#000+ + '080','07_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 value exceeds bounds $2'#000+ - '08012_E_Asm: Short jump is out of range $1'#000+ - '08013_E_Asm: Undefined label $1'#000, + '08012_E_Asm: Sh','ort 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+ '08016_E_Asm: Duplicate label $1'#000+ '08017_E_Asm: Redefined label $1'#000+ - '08018_E_Asm: First defined here'#000+ + '08018_','E_Asm: First defined here'#000+ '08019_E_Asm: Invalid register $1'#000+ - '0','8020_E_Asm: 16 or 32 Bit references not supported'#000+ + '08020_E_Asm: 16 or 32 Bit references not supported'#000+ '08021_E_Asm: 64 Bit operands not supported'#000+ '08022_E_Asm: AH,BH,CH or DH cannot be used in an instruction requiring'+ ' REX prefix'#000+ - '08023_E_Missing .seh_endprologue directive'#000+ - '08024_E_Function prolo','gue exceeds 255 bytes'#000+ + '08023','_E_Missing .seh_endprologue directive'#000+ + '08024_E_Function prologue exceeds 255 bytes'#000+ '08025_E_.seh_handlerdata directive without preceding .seh_handler'#000+ '08026_F_Relocation count for section $1 exceeds 65535'#000+ - '08027_N_Change of bind type of symbol $1 from $2 to $3 after use'#000+ - '08028_H_Change of bind type of sy','mbol $1 from $2 to $3 after use'#000+ + '08027_N_Change of bind type of symbol ','$1 from $2 to $3 after use'#000+ + '08028_H_Change of bind type of symbol $1 from $2 to $3 after use'#000+ '08029_E_Asm: 32 Bit references not supported'#000+ '08030_F_Code segment too large'#000+ '08031_F_Data segment too large'#000+ - '08032_E_Instruction not supported by the selected instruction set'#000+ - '08033_E_Asm: conditional branch des','tination is out of range'#000+ + '08032_E_Instruction not supported by the ','selected instruction set'#000+ + '08033_E_Asm: conditional branch destination is out of range'#000+ '08034_E_Asm: RIP cannot be used as index register or with another regi'+ 'ster in a reference'#000+ '08035_F_Illegal function size for SEH function'#000+ - '09000_W_Source operating system redefined'#000+ + '09000_W_Source ope','rating system redefined'#000+ '09001_I_Assembling (pipe) $1'#000+ - '09002_E','_Can'#039't create assembler file: $1'#000+ + '09002_E_Can'#039't create assembler file: $1'#000+ '09003_E_Can'#039't create object file: $1 (error code: $2)'#000+ '09004_E_Can'#039't create archive file: $1'#000+ - '09005_E_Assembler $1 not found, switching to external assembling'#000+ + '09005_E_Assembler $1 not found, switching to external a','ssembling'#000+ '09006_T_Using assembler: $1'#000+ - '09007_E_Error while as','sembling 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 found, Lin','king may fail !'#000+ + '09011_W_Object $1 not',' found, Linking may fail !'#000+ + '09012_W_Library $1 not found, Linking may fail !'#000+ '09013_E_Error while linking'#000+ '09014_E_Can'#039't call the linker, switching to external linking'#000+ '09015_I_Linking $1'#000+ - '09016_E_Util $1 not found, switching to external linking'#000+ + '09016_E_Util $1 not found, switching to external linking',#000+ '09017_T_Using util $1'#000+ - '09018_E_Creation of Executables not s','upported'#000+ + '09018_E_Creation of Executables not supported'#000+ '09019_E_Creation of Dynamic/Shared Libraries not supported'#000+ '09035_E_Creation of Static 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+ + '09021_E_Resource compiler "$1" not ','found, switching to external mode'+ + #000+ + '09022_I_Compiling resource $1'#000+ '09023_T_Unit $1 cannot be statically linked, switching to smart linkin'+ 'g'#000+ '09024_T_Unit $1 cannot be smart linked, switching to static linking'#000+ - '09025_T_Unit $1 cannot be shared linked, switching to static linking'#000+ - '09026_E_Unit $1 cannot be s','mart or static linked'#000+ + '09025_T_Unit $1 cannot be shared lin','ked, switching to static linking'+ + #000+ + '09026_E_Unit $1 cannot be smart or static linked'#000+ '09027_E_Unit $1 cannot 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 ext','e'+ + '090','30_E_Can'#039't call the resource compiler "$1", switching to exte'+ 'rnal mode'#000+ '09031_E_Can'#039't open resource file "$1"'#000+ '09032_E_Can'#039't write resource file "$1"'#000+ '09033_N_File "$1" not found for backquoted cat command'#000+ - '09034_W_"$1" not found, this will probably cause a linking failure'#000+ - '09128_F_Can'#039't post process exe','cutable $1'#000+ + '09034_W_"$1" not found, this will pro','bably cause a linking failure'#000+ + '09128_F_Can'#039't post process executable $1'#000+ '09129_F_Can'#039't open executable $1'#000+ '09130_X_Size of Code: $1 bytes'#000+ '09131_X_Size of initialized data: $1 bytes'#000+ '09132_X_Size of uninitialized data: $1 bytes'#000+ - '09133_X_Stack space reserved: $1 bytes'#000+ - '09134_X_Stack space committed: $1 byte','s'#000+ + '09133_X_Stack spa','ce 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'+ ' "$2".'#000+ - '09202_E_Program segment too large (exceeds 64k by $1 bytes)'#000+ - '09203_E_Code segment "$1" too large (exceeds ','64k by $2 bytes)'#000+ + '09202_E_Program segment too large (exceeds 64','k by $1 bytes)'#000+ + '09203_E_Code segment "$1" too large (exceeds 64k by $2 bytes)'#000+ '09204_E_Data segment "$1" too large (exceeds 64k by $2 bytes)'#000+ '09205_E_Segment "$1" too large (exceeds 64k by $2 bytes)'#000+ - '09206_E_Group "$1" too large (exceeds 64k by $2 bytes)'#000+ - '09207_E_Cannot create a .COM file, because the pr','ogram contains segm'+ - 'ent relocations'#000+ + '09206_E_Group "$1" too large (exceeds 64k by',' $2 bytes)'#000+ + '09207_E_Cannot create a .COM file, because the program contains segmen'+ + 't relocations'#000+ '09208_W_Program "$1" uses experimental CheckPointer option'#000+ '09209_E_Multiple defined symbol "$1"'#000+ - '09210_E_COMDAT selection mode $1 not supported (section: "$1")'#000+ - '09211_E_Associative section expected for COMDA','T section "$1"'#000+ + '09210_E_COMDAT selection mode $1 not supported (s','ection: "$1")'#000+ + '09211_E_Associative section expected for COMDAT section "$1"'#000+ '09212_E_COMDAT section selection mode doesn'#039't match for section "$'+ '1" and symbol "$2"'#000+ '09213_E_Associative COMDAT section for section "$1" not found'#000+ - '09214_D_Discarding duplicate symbol "$1" due to COMDAT selection mode'#000+ - '09215_D_','Discarding duplicate symbol "$1" with same size due to COMDA'+ - 'T selection mode'#000+ + '09214_D_Discarding',' duplicate symbol "$1" due to COMDAT selection mod'+ + 'e'#000+ + '09215_D_Discarding duplicate symbol "$1" with same size due to COMDAT '+ + 'selection mode'#000+ '09216_D_Discarding duplicate symbol "$1" with same content due to COMD'+ 'AT selection mode'#000+ - '09217_D_Replacing duplicate symbol "$1" with smaller size due to COMDA'+ - 'T sel','ection mode'#000+ + '09217_D_Replaci','ng duplicate symbol "$1" with smaller size due to COM'+ + 'DAT selection mode'#000+ '09218_E_Size of duplicate COMDAT symbol "$1" differs'#000+ '09219_E_Content of duplicate COMDAT symbol "$1" differs'#000+ '09220_E_COMDAT selection mode for symbol "$1" differs'#000+ - '09221_E_Undefined symbol: $1 (first seen in $2)'#000+ - '09222_E_Undefined',' symbol: $1'#000+ + '09221','_E_Undefined symbol: $1 (first seen in $2)'#000+ + '09222_E_Undefined symbol: $1'#000+ '10000_T_Unitsearch: $1'#000+ '10001_T_PPU Loading $1'#000+ '10002_U_PPU Name: $1'#000+ @@ -1170,228 +1173,227 @@ const msgtxt : array[0..000354,1..240] of char=( '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 Ve','rsion $1'#000+ + '10007_U_PPU',' Invalid Header (no PPU at the begin)'#000+ + '10008_U_PPU Invalid Version $1'#000+ '10009_U_PPU is compiled for another processor'#000+ '10010_U_PPU is compiled for another target'#000+ '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+ + '10014_F_Err','or reading PPU-File'#000+ '10015_F_Unexpected end of PPU-File'#000+ - '10016','_F_Invalid PPU-File entry: $1'#000+ + '10016_F_Invalid PPU-File entry: $1'#000+ '10017_F_PPU Dbx count problem'#000+ '10018_E_Illegal unit name: $1 (expecting $2)'#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_Ca','n'#039't find unit $1 used by $2'#000+ + '10','021_F_Can'#039't compile unit $1, no sources available'#000+ + '10022_F_Can'#039't find unit $1 used by $2'#000+ '10023_W_Unit $1 was not found but $2 exists'#000+ '10024_F_Unit $1 searched but $2 found'#000+ '10025_W_Compiling the system unit requires the -Us switch'#000+ - '10026_F_There were $1 errors compiling module, stopping'#000+ - '10027_U_Load fro','m $1 ($2) unit $3'#000+ + '10026_F_Ther','e were $1 errors compiling module, stopping'#000+ + '10027_U_Load from $1 ($2) unit $3'#000+ '10028_U_Recompiling $1, checksum changed for $2'#000+ '10029_U_Recompiling $1, source found only'#000+ '10030_U_Recompiling unit, static lib is older than ppufile'#000+ - '10031_U_Recompiling unit, shared lib is older than ppufile'#000+ - '10032_U_Recomp','iling unit, obj and asm are older than ppufile'#000+ + '10031_U_Recom','piling unit, shared lib is older than ppufile'#000+ + '10032_U_Recompiling unit, obj and asm are older than ppufile'#000+ '10033_U_Recompiling unit, obj is older than asm'#000+ '10034_U_Parsing interface of $1'#000+ '10035_U_Parsing implementation of $1'#000+ - '10036_U_Second load for unit $1'#000+ + '10036_U_Second l','oad for unit $1'#000+ '10037_U_PPU Check file $1 time $2'#000+ - '10040_W_Ca','n'#039't recompile unit $1, but found modified include file'+ - 's'#000+ + '10040_W_Can'#039't recompile unit $1, but found modified 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+ + '10042_U_Trying to use a unit which was compiled with a d','ifferent FPU'+ + ' mode'#000+ '10043_U_Loading interface units from $1'#000+ - '10','044_U_Loading implementation units from $1'#000+ + '10044_U_Loading implementation units from $1'#000+ '10045_U_Interface CRC changed for unit $1'#000+ '10046_U_Implementation CRC changed for unit $1'#000+ '10047_U_Finished compiling unit $1'#000+ - '10048_U_Adding dependency: $1 depends on $2'#000+ - '10049_U_No reload, is caller:',' $1'#000+ + '10048_U_Addin','g dependency: $1 depends on $2'#000+ + '10049_U_No reload, is caller: $1'#000+ '10050_U_No reload, already in second compile: $1'#000+ '10051_U_Flag for reload: $1'#000+ '10052_U_Forced reloading'#000+ '10053_U_Previous state of $1: $2'#000+ - '10054_U_Already compiling $1, setting second compile'#000+ + '10054_U_Already compiling $1, setting sec','ond compile'#000+ '10055_U_Loading unit $1'#000+ - '10056_U_Finished loading',' unit $1'#000+ + '10056_U_Finished loading unit $1'#000+ '10057_U_Registering new unit $1'#000+ '10058_U_Re-resolving unit $1'#000+ '10059_U_Skipping re-resolving unit $1, still loading used units'#000+ - '10060_U_Unloading resource unit $1 (not needed)'#000+ - '10061_E_Unit $1 was compiled using a different whole progr','am optimiz'+ - 'ation feedback input ($2, $3); recompile it without wpo or use the sam'+ - 'e wpo feedback input file for this compilation invocation'#000+ - '10062_U_Indirect interface (objects/classes) CRC changed for unit $1'#000+ - '10063_U_PPU is compiled for anoth','er i8086 memory model'#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 same '+ + 'wpo feedback input file for this compilation invocation'#000+ + '10062_U_Indirect interface (objects/classe','s) CRC changed for unit $1'+ + #000+ + '10063_U_PPU is compiled for another i8086 memory model'#000+ '10064_U_Loading unit $1 from package $2'#000+ '10065_F_Internal type "$1" was not found. Check if you use the correct'+ ' run time library.'#000+ - '10066_F_Internal type "$1" does not look as expected. Check if you use'+ - ' the correct run ti','me library.'#000+ + '10066_F_Internal type "$1" do','es not look as expected. Check if you u'+ + 'se the correct run time library.'#000+ '10067_U_Skipping unit, PPU and compiler have to be both compiled with '+ 'or without LLVM support'#000+ '11000_O_$1 [options] <inputfile> [options]'#000+ - '11001_W_Only one source file supported, changing source file to compil'+ - 'e from "$1" into "$2"',#000+ + '11001_W_Only one source file su','pported, 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 parameter: $1'#000+ + '1','1006_E_Illegal parameter: $1'#000+ '11007_H_-? writes help pages'#000+ - '11','008_F_Too many config files nested'#000+ + '11008_F_Too many config files nested'#000+ '11009_F_Unable to open file $1'#000+ '11010_D_Reading further options from $1'#000+ '11011_W_Target is already set to: $1'#000+ - '11012_W_Shared libs not supported on DOS platform, reverting to static'+ - #000+ - '11013_F_In options file $1',' at line $2 too many #IF(N)DEFs encountere'+ - 'd'#000+ + '11012_W_Shared libs not supported on ','DOS platform, reverting to stat'+ + 'ic'#000+ + '11013_F_In options file $1 at line $2 too many #IF(N)DEFs encountered'#000+ '11014_F_In options file $1 at line $2 unexpected #ENDIFs encountered'#000+ '11015_F_Open conditional at the end of the options file'#000+ - '11016_W_Debug information generation is not supported by this executab'+ - 'l','e'#000+ + '11016_W_Deb','ug information generation is not supported by this execut'+ + 'able'#000+ '11017_H_Try recompiling with -dGDB'#000+ '11018_W_You are using the obsolete switch $1'#000+ '11019_W_You are using the obsolete switch $1, please use $2'#000+ - '11020_N_Switching assembler to default source writing assembler'#000+ - '11021_W_Assembler output selected ','"$1" is not compatible with "$2"'#000+ + '11020_N_Switching assembler to default',' source writing assembler'#000+ + '11021_W_Assembler output selected "$1" is not compatible with "$2"'#000+ '11022_W_"$1" assembler use forced'#000+ '11026_T_Reading options from file $1'#000+ '11027_T_Reading options from environment $1'#000+ '11028_D_Handling option "$1"'#000+ - '11029_O_*** press enter ***'#000+ - '11030_H_Start of reading config fil','e $1'#000+ + '110','29_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+ + '11034_D_Reading config ','file "$1"'#000+ '11035_D_Found source file name "$1"'#000+ - '11039_E_Unknow','n codepage "$1"'#000+ + '11039_E_Unknown codepage "$1"'#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+ - '11043_F_In options file $1 at li','ne $2 #ELSE directive without #IF(N)'+ - 'DEF found'#000+ + '11042_W_Use of ppc386.cfg is deprecated,',' please use fpc.cfg instead'#000+ + '11043_F_In options file $1 at line $2 #ELSE directive without #IF(N)DE'+ + 'F found'#000+ '11044_F_Option "$1" is not, or not yet, supported on the current targe'+ 't platform'#000+ - '11045_F_The feature "$1" is not, or not yet, supported on the selected'+ - ' target platform'#000+ - '11046_N_DWARF debug inform','ation cannot be used with smart linking on'+ - ' this target, switching to static linking'#000+ + '11045_F_The feature "$1" is not, or not yet, supporte','d 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 debug information because it is unsupported'+ - ' for the selected targ','et/debug format combination.'#000+ + '11048_W_Disabling external debug',' information because it is unsupport'+ + 'ed for the selected target/debug format combination.'#000+ '11049_N_DWARF debug information cannot be used with smart linking with'+ ' external assembler, disabling static library creation.'#000+ - '11050_E_Invalid value for MACOSX_DEPLOYMENT_TARGET environment variabl'+ - 'e: $1'#000+ - '11051_E_I','nvalid value for IPHONEOS_DEPLOYMENT_TARGET environment var'+ - 'iable: $1'#000+ + '11050_E_Invalid value for',' MACOSX_DEPLOYMENT_TARGET environment varia'+ + 'ble: $1'#000+ + '11051_E_Invalid value for IPHONEOS_DEPLOYMENT_TARGET environment varia'+ + 'ble: $1'#000+ '11052_E_You must use a FPU type of VFPV2, VFPV3 or VFPV3_D16 when usin'+ 'g the EABIHF ABI target'#000+ - '11053_W_The selected debug format is not supported on the current targ'+ - 'et, not',' changing the current setting'#000+ + '11053_W_The selec','ted debug format is not supported on the current ta'+ + 'rget, not changing the current setting'#000+ '11054_E_Argument to "$1" is missing'#000+ '11055_E_Malformed parameter: $1'#000+ '11056_W_Smart linking requires external linker'#000+ - '11057_E_Creating .COM files is not supported in the current memory mod'+ - 'el. Only the tiny memory ','model supports making .COM files.'#000+ + '11057_E_Creating .COM files is not ','supported in the current memory m'+ + 'odel. Only the tiny memory model supports making .COM files.'#000+ '11058_W_Experimental CheckPointer option not enabled because it is inc'+ 'omptatible with -Ur option.'#000+ - '11059_E_Unsupported target architecture -P$1, invoke the "fpc" compile'+ - 'r driver instead.'#000+ - '11060_E_Feature swit','ches are only supported while compiling the syst'+ - 'em unit.'#000+ + '11059_E_Unsupported target architecture -P$1, in','voke the "fpc" compi'+ + 'ler driver instead.'#000+ + '11060_E_Feature switches are only supported while compiling the system'+ + ' unit.'#000+ '11061_N_The selected debug format is not supported by the internal lin'+ 'ker, switching to external linking'#000+ - '12000_F_Cannot open whole program optimization feedback file "$1"'#000+ - '12001_D_Proc','essing whole program optimization information in wpo fee'+ - 'dback file "$1"'#000+ + '12000_F_Cannot ope','n whole program optimization feedback file "$1"'#000+ + '12001_D_Processing whole program optimization information in wpo feedb'+ + 'ack file "$1"'#000+ '12002_D_Finished processing the whole program optimization information'+ ' in wpo feedback file "$1"'#000+ - '12003_E_Expected section header, but got "$2" at line $1 of wpo feedba'+ - 'c','k file'#000+ + '12003_E_Exp','ected section header, but got "$2" at line $1 of wpo feed'+ + 'back file'#000+ '12004_W_No handler registered 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 previousl'+ - 'y generated feedback file (use -Fw to specify)'#000+ + '12005_D_Found whole program optimization section "$1" wit','h informati'+ + 'on about "$2"'#000+ + '12006_F_The selected whole program optimizations require a previously '+ + 'generated feedback file (use -Fw to specify)'#000+ '12007_E_No collected information necessary to perform "$1" whole progr'+ 'am optimization found'#000+ - '12008_F_Specify a whole program optimization feedback file to store ','t'+ - 'he generated info in (using -FW)'#000+ + '12008_F_','Specify a whole program optimization feedback file to store '+ + 'the 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 specif','ied (using -Fw)'#000+ + '12010_E_Not performing any whole ','program optimizations, yet an input'+ + ' feedback file was specified (using -Fw)'#000+ '12011_D_Skipping whole program optimization section "$1", because not '+ 'needed by the requested optimizations'#000+ - '12012_W_Overriding previously read information for "$1" from feedback '+ - 'input file using information in section "$2"'#000+ - '1','2013_E_Cannot extract symbol liveness information from program when'+ - ' stripping symbols, use -Xs-'#000+ + '12012_W_Overriding previously read information for "$1" ','from feedbac'+ + 'k input file using information in section "$2"'#000+ + '12013_E_Cannot extract symbol liveness information from program when s'+ + 'tripping symbols, use -Xs-'#000+ '12014_E_Cannot extract symbol liveness information from program when w'+ - 'hen not linking'#000+ - '12015_F_Cannot find "$1" or "$2" to extract symbol livenes','s informat'+ - 'ion from linked program'#000+ + 'hen not linkin','g'#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+ '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'+ - ' using smart linking, use -CX -XX'#000+ + 'io','n 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 fi'+ 'le "$1"'#000+ '13001_F_Can'#039't find package $1'#000+ - '13002_U_PCP file for package $1 found'#000+ + '13002_U_','PCP file for package $1 found'#000+ '13003_E_Duplicate package $1'#000+ - '1','3004_E_Unit $1 can not be part of a package'#000+ + '13004_E_Unit $1 can not be part of a package'#000+ '13005_N_Unit $1 is implicitely imported into package $2'#000+ '13006_F_Failed to create PCP file $2 for package $1'#000+ - '13007_F_Failed to read PCP file for package $1'#000+ + '13007_F_Failed to read PCP f','ile for package $1'#000+ '13008_T_PCP loading $1'#000+ - '13009_U_PCP Name: ','$1'#000+ + '13009_U_PCP Name: $1'#000+ '13010_U_PCP Flags: $1'#000+ '13011_U_PCP Crc: $1'#000+ '13012_U_PCP Time: $1'#000+ '13013_U_PCP File too short'#000+ '13014_U_PCP Invalid Header (no PCP at the begin)'#000+ '13015_U_PCP Invalid Version $1'#000+ - '13016_U_PCP is compiled for another processor'#000+ - '13017_U_PCP is compil','ed for another target'#000+ + '13016_U','_PCP is compiled for another processor'#000+ + '13017_U_PCP is compiled for another target'#000+ '13018_U_Writing $1'#000+ '13019_F_Can'#039't Write PCP-File'#000+ '13020_F_Error reading PCP-File'#000+ '13021_F_Unexpected end of PCP-File'#000+ '13022_F_Invalid PCP-File entry: $1'#000+ - '13023_U_Trying to use a unit which was compiled with a different FPU ', - 'mode'#000+ + '13023_U_T','rying to use a unit which was compiled with a different FPU'+ + ' mode'#000+ '13024_T_Packagesearch: $1'#000+ '13025_U_Required package $1'#000+ '13026_U_Contained unit $1'#000+ '13027_E_Unit $1 is already contained in package $2'#000+ - '13028_W_Unit $1 is imported from indirectly required package $2'#000+ + '13028_W_Unit $1 is imported from indirectly ','required package $2'#000+ '13029_U_PPL filename $1'#000+ - '11023_Free Pasca','l Compiler version $FPCFULLVERSION [$FPCDATE] for $F'+ - 'PCCPU'#010+ + '11023_Free Pascal Compiler version $FPCFULLVERSION [$FPCDATE] for $FPC'+ + 'CPU'#010+ 'Copyright (c) 1993-2020 by Florian Klaempfl and others'#000+ '11024_Free Pascal Compiler version $FPCVERSION'#010+ #010+ - 'Compiler date : $FPCDATE'#010+ + 'Compiler date ',': $FPCDATE'#010+ 'Compiler CPU target: $FPCCPU'#010+ #010+ - 'Supported targets (','targets marked with '#039'{*}'#039' are under devel'+ - 'opment):'#010+ + 'Supported targets (targets marked with '#039'{*}'#039' are under develop'+ + 'ment):'#010+ ' $OSTARGETS'#010+ #010+ 'Supported CPU instruction sets:'#010+ @@ -1400,10 +1402,10 @@ const msgtxt : array[0..000354,1..240] of char=( 'Supported FPU instruction sets:'#010+ ' $FPUINSTRUCTIONSETS'#010+ #010+ - 'Supported inline assembler modes:'#010+ + 'Supported',' inline assembler modes:'#010+ ' $ASMMODES'#010+ #010+ - 'Recognized compiler an','d RTL features:'#010+ + 'Recognized compiler and RTL features:'#010+ ' $FEATURELIST'#010+ #010+ 'Recognized modeswitches:'#010+ @@ -1415,355 +1417,354 @@ const msgtxt : array[0..000354,1..240] of char=( 'Supported Optimizations:'#010+ ' $OPTIMIZATIONS'#010+ #010+ - 'Supported Whole Program Optimizations:'#010+ + 'Supported Whole Program O','ptimizations:'#010+ ' All'#010+ ' $WPOPTIMIZATIONS'#010+ #010+ - 'Code Generation Back','end'#010+ + 'Code Generation Backend'#010+ ' $CODEGENERATIONBACKEND'#010+ #010+ 'Supported Microcontroller types:$\n $CONTROLLERTYPES$\n'#010+ 'This program comes under the GNU General Public Licence'#010+ - 'For more information read COPYING.v2'#010+ + 'For more information read COPYING.v2'#010, #010+ 'Please report bugs in our bug tracker on:'#010+ - ' ','http://bugs.freepascal.org'#010+ + ' http://bugs.freepascal.org'#010+ #010+ 'More information may be found on our WWW pages (including directions'#010+ 'for mailing lists useful for asking questions or discussing potential'#010+ - 'new features, etc.):'#010+ + 'new features,',' etc.):'#010+ ' http://www.freepascal.org'#000+ - '11025_F*0','*_Only options valid for the default or selected platform a'+ - 're listed.'#010+ + '11025_F*0*_Only options valid for the default or selected platform are'+ + ' listed.'#010+ '**0*_Put + after a boolean switch option to enable it, - to disable it'+ '.'#010+ - '**1@<x>_Read compiler options from <x> in addition to the default fpc.'+ - 'cfg'#010+ - '**1a_The compiler does n','ot delete the generated assembler file'#010+ + '**1@<x>_Read compiler options from <x>',' in addition to the default fp'+ + 'c.cfg'#010+ + '**1a_The compiler does not delete the generated assembler file'#010+ '**2a5_Don'#039't generate Big Obj COFF files for GNU Binutils older tha'+ 'n 2.25 (Windows, NativeNT)'#010+ '**2al_List sourcecode lines in assembler file'#010+ - '**2an_List node info in assembler file (-dEXTDEBUG compiler)'#010+ - '*','*2ao_Add an extra option to external assembler call (ignored for in'+ - 'ternal)'#010+ + '**','2an_List node info in assembler file (-dEXTDEBUG compiler)'#010+ + '**2ao_Add an extra option to external assembler call (ignored for inte'+ + 'rnal)'#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 i','n assembler file'#010+ + '**2ar_List register allocation/release info',' in assembler file'#010+ + '**2at_List temp allocation/release info in assembler file'#010+ '**1A<x>_Output format:'#010+ '**2Adefault_Use default assembler'#010+ '3*2Aas_Assemble using GNU AS'#010+ '3*2Amacho_Mach-O (Darwin, Intel 32 bit) using internal writer'#010+ - '8*2Anasm_Assemble using Nasm'#010+ + '8*2Anasm_Assemb','le using Nasm'#010+ '8*2Anasmobj_Assemble using Nasm'#010+ - '3*2Anasm_Assem','ble using Nasm'#010+ + '3*2Anasm_Assemble using Nasm'#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*2Anasmdarwin_macho32 object file using Nasm (e','xperimental)'#010+ + '3*2Anasmwdosx_Win32/WDOSX object file',' using Nasm'#010+ + '3*2Anasmdarwin_macho32 object file using Nasm (experimental)'#010+ '3*2Awasm_Obj file using Wasm (Watcom)'#010+ '3*2Anasmobj_Obj file using Nasm'#010+ '3*2Amasm_Obj file using Masm (Microsoft)'#010+ '3*2Atasm_Obj file using Tasm (Borland)'#010+ - '3*2Aelf_ELF (Linux) using internal writer'#010+ - '3*2Acoff_COFF (Go32v2) using intern','al writer'#010+ + '3*2Aelf_ELF (Linu','x) using internal writer'#010+ + '3*2Acoff_COFF (Go32v2) using internal writer'#010+ '3*2Apecoff_PE-COFF (Win32) using internal writer'#010+ '3*2Ayasm_Assemble using Yasm (experimental)'#010+ '4*2Aas_Assemble using GNU AS'#010+ '4*2Agas_Assemble using GNU GAS'#010+ - '4*2Agas-darwin_Assemble darwin Mach-O64 using GNU GAS'#010+ - '4*2Amasm_Win64 object f','ile using ml64 (Microsoft)'#010+ + '4*2Agas-darwin_As','semble darwin Mach-O64 using GNU GAS'#010+ + '4*2Amasm_Win64 object file using ml64 (Microsoft)'#010+ '4*2Apecoff_PE-COFF (Win64) using internal writer'#010+ '4*2Aelf_ELF (Linux-64bit) using internal writer'#010+ '4*2Ayasm_Assemble using Yasm (experimental)'#010+ - '4*2Anasm_Assemble using Nasm (experimental)'#010+ - '4*2Anasmwin64_Assemble Win64',' object file using Nasm (experimental)'#010+ + '4*2Anasm_Ass','emble using Nasm (experimental)'#010+ + '4*2Anasmwin64_Assemble Win64 object file using Nasm (experimental)'#010+ '4*2Anasmelf_Assemble Linux-64bit object file using Nasm (experimental)'+ #010+ - '4*2Anasmdarwin_Assemble darwin macho64 object file using Nasm (experim'+ + '4*2Anasmdarwin_Assemble darwin macho64 object file using Nasm (experim', 'ental)'#010+ '6*2Aas_Unix o-file using GNU AS'#010+ - '6*2Agas_GNU Motorola ','assembler'#010+ + '6*2Agas_GNU Motorola assembler'#010+ '6*2Amit_MIT Syntax (old GAS)'#010+ '6*2Amot_Standard Motorola assembler'#010+ '6*2Avasm_Use vasm to assemble'#010+ 'A*2Aas_Assemble using GNU AS'#010+ 'P*2Aas_Assemble using GNU AS'#010+ - 'S*2Aas_Assemble using GNU AS'#010+ + 'S*2Aas_Assemble u','sing GNU AS'#010+ '**1b_Generate browser info'#010+ - '**2bl_Generate local ','symbol info'#010+ + '**2bl_Generate local symbol info'#010+ '**1B_Build all modules'#010+ '**1C<x>_Code generation options:'#010+ '**2C3_Turn on ieee error checking for constants'#010+ '**2Ca<x>_Select ABI; see fpc -i or fpc -ia for possible values'#010+ - '**2Cb_Generate code for a big-endian variant of the target ar','chitect'+ + '*','*2Cb_Generate code for a big-endian variant of the target architect'+ 'ure'#010+ '**2Cc<x>_Set default calling convention to <x>'#010+ '**2CD_Create also dynamic library (not supported)'#010+ '**2Ce_Compilation with emulated floating point opcodes'#010+ - '**2CE_Generate FPU code which can raise exceptions'#010+ - '**2Cf<x>_Select fpu instru','ction set to use; see fpc -i or fpc -if fo'+ - 'r possible values'#010+ + '**2CE_Generate FP','U code which can raise exceptions'#010+ + '**2Cf<x>_Select fpu instruction set to use; see fpc -i or fpc -if for '+ + 'possible values'#010+ '**2CF<x>_Minimal floating point constant precision (default, 32, 64)'#010+ '**2Cg_Generate PIC code'#010+ - '**2Ch<n>[,m]_<n> bytes min heap size (between 1023 and 67107840) and o'+ - 'ptionally [m] max',' heap size'#010+ + '**2Ch<n>[,m]_<n> bytes min ','heap size (between 1023 and 67107840) and'+ + ' optionally [m] max heap size'#010+ '**2Ci_IO-checking'#010+ 'A*2CI<x>_Select instruction set on ARM: ARM or THUMB'#010+ 'l*2CL<x>_LLVM code generation options'#010+ - 'l*3CLflto_Enable Link-time optimisation (needed both when compiling un'+ - 'its and programs/libraries)'#010+ - 'l*3CLfltonosystem_Disa','ble LTO for the system unit (needed with at le'+ - 'ast Xcode 10.2 and earlier due to linker bugs)'#010+ + 'l*3CLflto_Enable Link-time optimisation (needed both when co','mpiling '+ + 'units and programs/libraries)'#010+ + 'l*3CLfltonosystem_Disable LTO for the system unit (needed with at leas'+ + 't Xcode 10.2 and earlier due to linker bugs)'#010+ 'l*3CLv<x>_LLVM target version: Xcode-10.1, 7.0, 8.0, .., 10.0'#010+ - '**2Cn_Omit linking stage'#010+ + '**2Cn_Omit linking stage'#010, 'P*2CN_Generate nil-pointer checks (AIX-only)'#010+ - '**2Co_Check ove','rflow of integer operations'#010+ + '**2Co_Check overflow of integer operations'#010+ '**2CO_Check for possible overflow of integer operations'#010+ '**2Cp<x>_Select instruction set; see fpc -i or fpc -ic for possible va'+ 'lues'#010+ - '**2CP<x>=<y>_ packing settings'#010+ - '**3CPPACKSET=<y>_ <y> set allocation: 0, 1 or DEFA','ULT or NORMAL, 2, '+ - '4 and 8'#010+ + '**2CP<x>=<y>_ packing',' settings'#010+ + '**3CPPACKSET=<y>_ <y> set allocation: 0, 1 or DEFAULT or NORMAL, 2, 4 '+ + 'and 8'#010+ '**3CPPACKENUM=<y>_ <y> enum packing: 0, 1, 2 and 4 or DEFAULT or NORMA'+ 'L'#010+ '**3CPPACKRECORD=<y>_ <y> record packing: 0 or DEFAULT or NORMAL, 1, 2,'+ - ' 4, 8, 16 and 32'#010+ + ' 4, 8, 16 an','d 32'#010+ '**2Cr_Range checking'#010+ - '**2CR_Verify object method call va','lidity'#010+ + '**2CR_Verify object method call validity'#010+ '**2Cs<n>_Set stack checking size to <n>'#010+ '**2Ct_Stack checking (for testing only, see manual)'#010+ '8*2CT<x>_Target-specific code generation options'#010+ - '3*2CT<x>_Target-specific code generation options'#010+ - '4*2CT<x>_Target-specific code generation op','tions'#010+ + '3*2CT<x>_Target-specific code ge','neration options'#010+ + '4*2CT<x>_Target-specific code generation options'#010+ 'p*2CT<x>_Target-specific code generation options'#010+ 'P*2CT<x>_Target-specific code generation options'#010+ 'J*2CT<x>_Target-specific code generation options'#010+ - 'A*2CT<x>_Target-specific code generation options'#010+ - 'p*3CTsmalltoc_ Generate smaller TOCs a','t the expense of execution spe'+ - 'ed (AIX)'#010+ + 'A*2CT<x>_Target-specific co','de generation options'#010+ + 'p*3CTsmalltoc_ Generate smaller TOCs at the expense of execution speed'+ + ' (AIX)'#010+ 'P*3CTsmalltoc_ Generate smaller TOCs at the expense of execution speed'+ ' (AIX)'#010+ - 'J*3CTautogetterprefix=X_ Automatically create getters for properties '+ - 'with prefix X (empty string disables)'#010+ - 'J*3CTautosetterp','refix=X_ Automatically create setters for propertie'+ + 'J*3CTautogetterprefix=X_ Automatically create getters for prope','rtie'+ 's with prefix X (empty string disables)'#010+ + 'J*3CTautosetterprefix=X_ Automatically create setters for properties '+ + 'with prefix X (empty string disables)'#010+ '8*3CTcld_ Emit a CLD instruction before using the x86 '+ + 'string instruction','s'#010+ + '3*3CTcld_ Emit a CLD instruction before using the x86 '+ 'string instructions'#010+ - '3*3CTcld_ Emit a CLD instruction before us','ing the x8'+ - '6 string instructions'#010+ '4*3CTcld_ Emit a CLD instruction before using the x86 '+ 'string instructions'#010+ - '8*3CTfarprocspushoddbp_ Increment BP before pushing it in the pr'+ - 'ologue of far functions'#010+ - 'J*3CTcompactintarrayinit','_ Generate smaller (but potentially slower) '+ - 'code for initializing integer array constants'#010+ + '8*3CTfarprocspushoddbp_ Increment BP before pushing ','it in the '+ + 'prologue of far functions'#010+ + 'J*3CTcompactintarrayinit_ Generate smaller (but potentially slower) co'+ + 'de for initializing integer array constants'#010+ 'J*3CTenumfieldinit_ Initialize enumeration fields in constructor'+ - 's to enumtype(0), after calling inherited constructors'#010+ - 'J*3CTinitlocals_ ',' Initialize local variables that trigger a '+ - 'JVM bytecode verification error if used uninitialized (slows down code'+ - ')'#010+ - 'J*3CTlowercaseprocstart_ Lowercase the first character of procedure/f'+ - 'unction/method names'#010+ - 'A*3CTthumbinterworking_ Generate T','humb interworking-safe code if pos'+ - 'sible'#010+ + 's to enumtype(0), af','ter calling inherited constructors'#010+ + 'J*3CTinitlocals_ Initialize local variables that trigger a JV'+ + 'M bytecode verification error if used uninitialized (slows down code)'#010+ + 'J*3CTlowercaseprocstart_ Lowercase the first character of proced','ure'+ + '/function/method names'#010+ + 'A*3CTthumbinterworking_ Generate Thumb interworking-safe code if possi'+ + 'ble'#010+ 'J*2Cv_Var/out parameter copy-out checking'#010+ 'A*2CV<x>_Set section threadvar model to <x>'#010+ '**2CX_Create also smartlinked library'#010+ - '**1d<x>_Defines the symbol <x>'#010+ + '**1d<x>_Defines ','the symbol <x>'#010+ '**1D_Generate a DEF file'#010+ - '**2Dd<x>_Set descrip','tion to <x>'#010+ + '**2Dd<x>_Set description to <x>'#010+ '**2Dv<x>_Set DLL version to <x>'#010+ '*O2Dw_PM application'#010+ '**1e<x>_Set path to executable'#010+ '**1E_Same as -Cn'#010+ '**1fPIC_Same as -Cg'#010+ '**1F<x>_Set file names and paths:'#010+ - '**2Fa<x>[,y]_(for a program) load units <x> and [y] before uses is par'+ - 'sed',#010+ + '**2Fa<x>[,y]_','(for a program) load units <x> and [y] before uses is p'+ + 'arsed'#010+ '**2Fc<x>_Set input codepage to <x>'#010+ '**2FC<x>_Set RC compiler binary name to <x>'#010+ '**2Fd_Disable the compiler'#039's internal directory cache'#010+ - '**2FD<x>_Set the directory where to search for compiler utilities'#010+ + '**2FD<x>_Set the directory where to search for',' compiler utilities'#010+ '**2Fe<x>_Redirect error output to <x>'#010+ - '**','2Ff<x>_Add <x> to framework path (Darwin only)'#010+ + '**2Ff<x>_Add <x> to framework path (Darwin only)'#010+ '**2FE<x>_Set exe/unit output path to <x>'#010+ '**2Fi<x>_Add <x> to include path'#010+ '**2Fl<x>_Add <x> to library path'#010+ - '**2FL<x>_Use <x> as dynamic linker'#010+ - '**2Fm<x>_Load unicode conversion table from <x>.txt',' in the compiler '+ - 'dir'#010+ + '**2FL<x>_Use <x> as dynami','c linker'#010+ + '**2Fm<x>_Load unicode conversion table from <x>.txt in the compiler di'+ + 'r'#010+ '**2FM<x>_Set the directory where to search for unicode binary files'#010+ '**2FN<x>_Add <x> to list of default unit scopes (namespaces)'#010+ - '**2Fo<x>_Add <x> to object path'#010+ + '**2Fo<x>_Add <x> to object pat','h'#010+ '**2Fr<x>_Load error message file <x>'#010+ - '**2FR<x>_Set resource',' (.res) linker to <x>'#010+ + '**2FR<x>_Set resource (.res) linker to <x>'#010+ '**2Fu<x>_Add <x> to unit path'#010+ '**2FU<x>_Set unit output path to <x>, overrides -FE'#010+ '**2FW<x>_Store generated whole-program optimization feedback in <x>'#010+ - '**2Fw<x>_Load previously stored whole-program optimization feedback ','f'+ - 'rom <x>'#010+ + '**2Fw<x>','_Load previously stored whole-program optimization feedback '+ + 'from <x>'#010+ '*g1g_Generate debug information (default format for target)'#010+ '*g2gc_Generate checks for pointers (experimental, only available on so'+ - 'me targets, might generate false positive)'#010+ - '*g2gh_Use heaptrace unit (for memory leak/corruption debug','ging)'#010+ + 'me targets, might generate false positive',')'#010+ + '*g2gh_Use heaptrace unit (for memory leak/corruption debugging)'#010+ '*g2gl_Use line info unit (show more info with backtraces)'#010+ '*g2gm_Generate Microsoft CodeView debug information (experimental)'#010+ '*g2go<x>_Set debug information options'#010+ - '*g3godwarfsets_ Enable DWARF '#039'set'#039' type debug information (bre'+ - 'aks gdb ','< 6.5)'#010+ + '*g3godwarf','sets_ Enable DWARF '#039'set'#039' type debug information (b'+ + 'reaks gdb < 6.5)'#010+ '*g3gostabsabsincludes_ Store absolute/full include file paths in Stabs'+ #010+ '*g3godwarfmethodclassprefix_ Prefix method names in DWARF with class n'+ 'ame'#010+ - '*g3godwarfcpp_ Simulate C++ debug information in DWARF'#010+ - '*g3godwarfomflinnum_ Generate lin','e number information in OMF LINNUM '+ - 'records in MS LINK format in addition to the DWARF debug information ('+ - 'Open Watcom Debugger/Linker compatibility)'#010+ - '*g2gp_Preserve case in stabs symbol names'#010+ + '*g3godwarfcpp_ Simulate C++ ','debug information in DWARF'#010+ + '*g3godwarfomflinnum_ Generate line number information in OMF LINNUM re'+ + 'cords in MS LINK format in addition to the DWARF debug information (Op'+ + 'en Watcom Debugger/Linker compatibility)'#010+ + '*g2gp_Preserve case in stabs sym','bol names'#010+ '*g2gs_Generate Stabs debug information'#010+ - '*g2gt_Trash',' local variables (to detect uninitialized uses; multiple '+ - #039't'#039' changes the trashing value)'#010+ + '*g2gt_Trash local variables (to detect uninitialized uses; multiple '#039+ + 't'#039' changes the trashing value)'#010+ '*g2gv_Generates programs traceable with Valgrind'#010+ - '*g2gw_Generate DWARFv2 debug information (same as -gw2)'#010+ + '*g2gw_Generate DWARFv2 debug information (','same as -gw2)'#010+ '*g2gw2_Generate DWARFv2 debug information'#010+ - '*g2g','w3_Generate DWARFv3 debug information'#010+ + '*g2gw3_Generate DWARFv3 debug information'#010+ '*g2gw4_Generate DWARFv4 debug information (experimental)'#010+ '**1i_Information'#010+ '**2iD_Return compiler date'#010+ '**2iSO_Return compiler OS'#010+ - '**2iSP_Return compiler host processor'#010+ + '**2iSP_Return c','ompiler host processor'#010+ '**2iTO_Return target OS'#010+ - '**2iTP_Return',' target processor'#010+ + '**2iTP_Return target processor'#010+ '**2iV_Return short compiler version'#010+ '**2iW_Return full compiler version'#010+ '**2ia_Return list of supported ABI targets'#010+ - '**2ib_Return the used code generation backend type'#010+ + '**2ib_Return the used code generation backend ty','pe'#010+ '**2ic_Return list of supported CPU instruction sets'#010+ - '**2if','_Return list of supported FPU instruction sets'#010+ + '**2if_Return list of supported FPU instruction sets'#010+ '**2ii_Return list of supported inline assembler modes'#010+ '**2im_Return list of supported modeswitches'#010+ - '**2io_Return list of supported optimizations'#010+ - '**2ir_Return list of recognized compiler and RTL f','eatures'#010+ + '**2io_Return list of supported opti','mizations'#010+ + '**2ir_Return list of recognized compiler and RTL features'#010+ '**2it_Return list of supported targets'#010+ '**2iu_Return list of supported microcontroller types'#010+ '**2iw_Return list of supported whole program optimizations'#010+ - '**1I<x>_Add <x> to include path'#010+ + '**1I<x>_Add <x> to in','clude path'#010+ '**1k<x>_Pass <x> to the linker'#010+ '**1l_Write logo'#010+ - '**','1M<x>_Set language mode to <x> / enable modeswitch <x> (see option'+ - ' -im)'#010+ + '**1M<x>_Set language mode to <x> / enable modeswitch <x> (see option -'+ + 'im)'#010+ '**2Mfpc_Free Pascal dialect (default)'#010+ '**2Mobjfpc_FPC mode with Object Pascal support'#010+ - '**2Mdelphi_Delphi 7 compatibility mode'#010+ + '**2Mdelphi_Delphi 7 com','patibility mode'#010+ '**2Mtp_TP/BP 7.0 compatibility mode'#010+ - '**2Mmacp','as_Macintosh Pascal dialects compatibility mode'#010+ + '**2Mmacpas_Macintosh Pascal dialects compatibility mode'#010+ '**2Miso_ISO 7185 mode'#010+ '**2Mextendedpascal_ISO 10206 mode'#010+ '**2Mdelphiunicode_Delphi 2009 and later compatibility mode'#010+ - '**2*_Each mode (as listed above) enables its default set of modeswitch'+ - 'es.'#010+ - '**2','*_Other modeswitches are disabled and need to be enabled one by a'+ - 'nother.'#010+ + '**2*_Each mode (a','s listed above) enables its default set of modeswit'+ + 'ches.'#010+ + '**2*_Other modeswitches are disabled and need to be enabled one by ano'+ + 'ther.'#010+ '**1M<x>-_Disable modeswitch <x> (see option -im)'#010+ '**1n_Do not read the default config files'#010+ - '**1o<x>_Change the name of the executable produced to <x>'#010+ - '**1O<x>_Optimizati','ons:'#010+ + '**1o<x>_Change t','he name of the executable produced to <x>'#010+ + '**1O<x>_Optimizations:'#010+ '**2O-_Disable optimizations'#010+ '**2O1_Level 1 optimizations (quick and debugger friendly)'#010+ '**2O2_Level 2 optimizations (-O1 + quick optimizations)'#010+ - '**2O3_Level 3 optimizations (-O2 + slow optimizations)'#010+ - '**2O4_Level 4 optimizations (-O3 + opt','imizations which might have un'+ - 'expected side effects)'#010+ + '**2O3_Level 3 optimizations (-O2 ','+ slow optimizations)'#010+ + '**2O4_Level 4 optimizations (-O3 + optimizations which might have unex'+ + 'pected side effects)'#010+ '**2Oa<x>=<y>_Set alignment'#010+ '**2Oo[NO]<x>_Enable or disable optimizations; see fpc -i or fpc -io fo'+ 'r possible values'#010+ - '**2Op<x>_Set target cpu for optimizing; see fpc -i or fpc -ic for poss'+ - 'ib','le values'#010+ + '**2Op<x>_Set',' target cpu for optimizing; see fpc -i or fpc -ic for po'+ + 'ssible values'#010+ '**2OW<x>_Generate whole-program optimization feedback for optimization'+ ' <x>; see fpc -i or fpc -iw for possible values'#010+ - '**2Ow<x>_Perform whole-program optimization <x>; see fpc -i or fpc -iw'+ - ' for possible values'#010+ - '**2Os_Optimize for si','ze rather than speed'#010+ + '**2Ow<x>_Perform whole-program optimization <x>; see',' fpc -i or fpc -'+ + 'iw for possible values'#010+ + '**2Os_Optimize for size rather than speed'#010+ '**1pg_Generate profile code for gprof (defines FPC_PROFILE)'#010+ 'F*1P<x>_Target CPU / compiler related options:'#010+ 'F*2PB_Show default compiler binary'#010+ - 'F*2PP_Show default target cpu'#010+ - 'F*2P<x>_Set target CPU (aarch64,arm,avr,i386,i8','086,jvm,m68k,mips,mip'+ - 'sel,powerpc,powerpc64,sparc,x86_64)'#010+ + 'F*2PP_Show defaul','t target cpu'#010+ + 'F*2P<x>_Set target CPU (aarch64,arm,avr,i386,i8086,jvm,m68k,mips,mipse'+ + 'l,powerpc,powerpc64,sparc,x86_64)'#010+ '**1R<x>_Assembler reading style:'#010+ '**2Rdefault_Use default assembler for target'#010+ '3*2Ratt_Read AT&T style assembler'#010+ - '3*2Rintel_Read Intel style assembler'#010+ - '4*2Ratt_Read AT&T style assembler'#010, + '3*2Rintel_R','ead Intel style assembler'#010+ + '4*2Ratt_Read AT&T style assembler'#010+ '4*2Rintel_Read Intel style assembler'#010+ '8*2Ratt_Read AT&T style assembler'#010+ '8*2Rintel_Read Intel style assembler'#010+ '6*2RMOT_Read Motorola style assembler'#010+ '**1S<x>_Syntax options:'#010+ - '**2S2_Same as -Mobjfpc'#010+ - '**2Sc_Support operators like C (*=,+=,/= and -=',')'#010+ + '**2S2_Same',' as -Mobjfpc'#010+ + '**2Sc_Support operators like C (*=,+=,/= and -=)'#010+ '**2Sa_Turn on assertions'#010+ '**2Sd_Same as -Mdelphi'#010+ '**2Se<x>_Error options. <x> is a combination of the following:'#010+ '**3*_<n> : Compiler halts after the <n> errors (default is 1)'#010+ - '**3*_w : Compiler also halts after warnings'#010+ - '**3*_n : Compiler als','o halts after notes'#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+ '**2Sf_Enable certain features in compiler and RTL; see fpc -i or fpc -'+ 'ir for possible values)'#010+ - '**2Sg_Enable LABEL and GOTO (default in -Mtp and -Mdelphi)'#010+ - '**2Sh_Use reference counte','d strings (ansistring by default) instead '+ - 'of shortstrings'#010+ + '**2Sg_Enable LABEL and GO','TO (default in -Mtp and -Mdelphi)'#010+ + '**2Sh_Use reference counted strings (ansistring by default) instead of'+ + ' shortstrings'#010+ '**2Si_Turn on inlining of procedures/functions declared as "inline"'#010+ - '**2Sj_Allows typed constants to be writeable (default in all modes)'#010+ + '**2Sj_Allows typed constants to be writeable (default ','in all modes)'#010+ '**2Sk_Load fpcylix unit'#010+ - '**2SI<x>_Set interface',' style to <x>'#010+ + '**2SI<x>_Set interface style to <x>'#010+ '**3SIcom_COM compatible interface (default)'#010+ '**3SIcorba_CORBA compatible interface'#010+ '**2Sm_Support macros like C (global)'#010+ '**2So_Same as -Mtp'#010+ - '**2Sr_Transparent file names in ISO mode'#010+ - '**2Ss_Constructor name must be init (destructor',' must be done)'#010+ + '**2Sr_Transparent file names',' in ISO mode'#010+ + '**2Ss_Constructor name must be init (destructor must be done)'#010+ '**2Sv_Support vector processing (use CPU vector extensions if availabl'+ 'e)'#010+ '**2Sx_Enable exception keywords (default in Delphi/ObjFPC modes)'#010+ - '**2Sy_@<pointer> returns a typed pointer, same as $T+'#010+ - '**1s_Do not call assembler and li','nker'#010+ + '**2Sy_@<pointer> returns a ','typed pointer, same as $T+'#010+ + '**1s_Do not call assembler and linker'#010+ '**2sh_Generate script to link on host'#010+ '**2st_Generate script to link on target'#010+ '**2sr_Skip register allocation phase (use with -alr)'#010+ '**1T<x>_Target operating system:'#010+ - '3*2Tandroid_Android'#010+ + '3*2Tandroid','_Android'#010+ '3*2Taros_AROS'#010+ '3*2Tbeos_BeOS'#010+ - '3*2Tdarwin_Darwin/Mac O','S X'#010+ + '3*2Tdarwin_Darwin/Mac OS X'#010+ '3*2Tembedded_Embedded'#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*2Thaiku_Haiku'#010+ - '3*2Tiphonesim_iPhoneSimulator from iOS SDK 3.2+ (older versions: -Tdar'+ - 'win)'#010+ - '3*2Tl','inux_Linux'#010+ + '3*2Tiphonesim_iPhone','Simulator from iOS SDK 3.2+ (older versions: -Td'+ + 'arwin)'#010+ + '3*2Tlinux_Linux'#010+ '3*2Tnativent_Native NT API (experimental)'#010+ '3*2Tnetbsd_NetBSD'#010+ '3*2Tnetware_Novell Netware Module (clib)'#010+ '3*2Tnetwlibc_Novell Netware Module (libc)'#010+ '3*2Topenbsd_OpenBSD'#010+ - '3*2Tos2_OS/2 / eComStation'#010+ + '3*2Tos','2_OS/2 / eComStation'#010+ '3*2Tsymbian_Symbian OS'#010+ - '3*2Tsolaris_Sola','ris'#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*2Tandroid_Android'#010+ '4*2Taros_AROS'#010+ - '4*2Tdarwin_Darwin/Mac OS X'#010+ + '4*2Tdarwin_Darwin/Mac OS ','X'#010+ '4*2Tdragonfly_DragonFly BSD'#010+ '4*2Tembedded_Embedded'#010+ - '4*2Tfree','bsd_FreeBSD'#010+ + '4*2Tfreebsd_FreeBSD'#010+ '4*2Thaiku_Haiku'#010+ '4*2Tiphonesim_iPhoneSimulator'#010+ '4*2Tlinux_Linux'#010+ @@ -1771,9 +1772,9 @@ const msgtxt : array[0..000354,1..240] of char=( '4*2Topenbsd_OpenBSD'#010+ '4*2Tsolaris_Solaris'#010+ '4*2Twin64_Win64 (64 bit Windows systems)'#010+ - '6*2Tamiga_Commodore Amiga'#010+ + '6*2Tami','ga_Commodore Amiga'#010+ '6*2Tatari_Atari ST/STe/TT'#010+ - '6*2Tembedded_Em','bedded'#010+ + '6*2Tembedded_Embedded'#010+ '6*2Tlinux_Linux'#010+ '6*2Tnetbsd_NetBSD'#010+ '6*2Tmacos_Mac OS'#010+ @@ -1782,9 +1783,9 @@ const msgtxt : array[0..000354,1..240] of char=( '8*2Tmsdos_MS-DOS (and compatible)'#010+ '8*2Twin16_Windows 16 Bit'#010+ 'A*2Tandroid_Android'#010+ - 'A*2Taros_AROS'#010+ + 'A*2','Taros_AROS'#010+ 'A*2Tdarwin_Darwin/iPhoneOS/iOS'#010+ - 'A*2Tembedded_Embed','ded'#010+ + 'A*2Tembedded_Embedded'#010+ 'A*2Tfreertos_FreeRTOS'#010+ 'A*2Tgba_Game Boy Advance'#010+ 'A*2Tlinux_Linux'#010+ @@ -1793,10 +1794,10 @@ const msgtxt : array[0..000354,1..240] of char=( 'A*2Tpalmos_PalmOS'#010+ 'A*2Tsymbian_Symbian'#010+ 'A*2Twince_Windows CE'#010+ - 'a*2Tandroid_Android'#010+ + 'a*2Tandroid_Andr','oid'#010+ 'a*2Tdarwin_Darwin/iOS'#010+ 'a*2Tlinux_Linux'#010+ - 'a*2Twin64_Windows ','64'#010+ + 'a*2Twin64_Windows 64'#010+ 'J*2Tandroid_Android'#010+ 'J*2Tjava_Java'#010+ 'm*2Tandroid_Android'#010+ @@ -1806,10 +1807,10 @@ const msgtxt : array[0..000354,1..240] of char=( 'M*2Tlinux_Linux'#010+ 'P*2Taix_AIX'#010+ 'P*2Tamiga_AmigaOS'#010+ - 'P*2Tdarwin_Darwin/Mac OS X'#010+ + 'P*2Tdarwin_Darwin','/Mac OS X'#010+ 'P*2Tembedded_Embedded'#010+ 'P*2Tlinux_Linux'#010+ - 'P*2Tmacos_Ma','c OS (classic)'#010+ + 'P*2Tmacos_Mac OS (classic)'#010+ 'P*2Tmorphos_MorphOS'#010+ 'P*2Tnetbsd_NetBSD'#010+ 'P*2Twii_Wii'#010+ @@ -1818,11 +1819,11 @@ const msgtxt : array[0..000354,1..240] of char=( 'p*2Tembedded_Embedded'#010+ 'p*2Tlinux_Linux'#010+ 'R*2Tlinux_Linux'#010+ - 'R*2Tembedded_Embedded'#010+ + 'R*2Tembedded_Embedded'#010, 'r*2Tlinux_Linux'#010+ 'r*2Tembedded_Embedded'#010+ 'S*2Tlinux_Linux'#010+ - 'S*2Tso','laris_Solaris'#010+ + 'S*2Tsolaris_Solaris'#010+ 's*2Tlinux_Linux'#010+ 'V*2Tembedded_Embedded'#010+ 'x*2Tembedded_Embedded'#010+ @@ -1830,146 +1831,145 @@ const msgtxt : array[0..000354,1..240] of char=( 'x*2Tlinux_Linux'#010+ '**1u<x>_Undefines the symbol <x>'#010+ '**1U_Unit options:'#010+ - '**2Un_Do not check where the unit name matches the file name'#010+ - '**2Ur_Generate ','release unit files (never automatically recompiled)'#010+ + '**2Un_Do not che','ck where the unit name matches the file name'#010+ + '**2Ur_Generate release unit files (never automatically recompiled)'#010+ '**2Us_Compile a system unit'#010+ '**1v<x>_Be verbose. <x> is a combination of the following letters:'#010+ - '**2*_e : Show errors (default) 0 : Show nothing (except errors)'#010+ - '**2*_w : Show warnings ',' u : Show unit info'#010+ + '**2*_e : Show errors (default) ',' 0 : Show nothing (except errors'+ + ')'#010+ + '**2*_w : Show warnings u : Show unit info'#010+ '**2*_n : Show notes t : Show tried/used files'#010+ '**2*_h : Show hints c : Show conditionals'#010+ - '**2*_i : Show general info d : Show debug info'#010+ - '**2*_l : Show linenumbers ',' r : Rhide/GCC compatibility mod'+ - 'e'#010+ + '**2*_i : Show general inf','o d : Show debug info'#010+ + '**2*_l : Show linenumbers r : Rhide/GCC compatibility mode'#010+ '**2*_s : Show time stamps q : Show message numbers'#010+ '**2*_a : Show everything x : Show info about invoked tools'+ #010+ - '**2*_b : Write file names messages p : Write tree.log with pars','e t'+ + '**2*_','b : Write file names messages p : Write tree.log with parse t'+ 'ree'#010+ '**2*_ with full path v : Write fpcdebug.txt with'#010+ '**2*_z : Write output to stderr lots of debugging info'#010+ - '**2*_m<x>,<y> : Do not show messages numbered <x> and <y>'#010+ - 'F*1V<x>_Append '#039'-<x>'#039' to the used compiler bin','ary name (e.g.'+ - ' for version)'#010+ + '**2*_m<x>,<y> : Do not show messages numbere','d <x> and <y>'#010+ + 'F*1V<x>_Append '#039'-<x>'#039' to the used compiler binary name (e.g. f'+ + 'or version)'#010+ '**1W<x>_Target-specific options (targets)'#010+ '3*2WA_Specify native type application (Windows)'#010+ '4*2WA_Specify native type application (Windows)'#010+ - 'A*2WA_Specify native type application (Windows)'#010+ - '3*2Wb_Create a bundle inst','ead of a library (Darwin)'#010+ + 'A*2WA_Specify ','native type application (Windows)'#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+ - 'a*2Wb_Create a bundle instead of a library (Darwin)'#010+ + 'a*2Wb_Create a bundle instead of a library (Darwin',')'#010+ 'A*2Wb_Create a bundle instead of a library (Darwin)'#010+ - '4*2Wb_','Create a bundle instead of a library (Darwin)'#010+ + '4*2Wb_Create a bundle instead of a library (Darwin)'#010+ '3*2WB_Create a relocatable image (Windows, Symbian)'#010+ '3*2WB<x>_Set image base to <x> (Windows, Symbian)'#010+ - '4*2WB_Create a relocatable image (Windows)'#010+ + '4*2WB_Create a relocatable image',' (Windows)'#010+ '4*2WB<x>_Set image base to <x> (Windows)'#010+ - 'A*2WB_Cr','eate a relocatable image (Windows, Symbian)'#010+ + 'A*2WB_Create a relocatable image (Windows, Symbian)'#010+ 'A*2WB<x>_Set image base to <x> (Windows, Symbian)'#010+ '3*2WC_Specify console type application (EMX, OS/2, Windows)'#010+ - '4*2WC_Specify console type application (Windows)'#010+ - 'A*2WC_Specify console type applicatio','n (Windows)'#010+ + '4*2WC_Specify console type',' application (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 functions of DLL or EXE (Windows)'#010+ - '4*2WD_Use DEFFILE to export functions of DLL or EXE (Windows)'#010+ - 'A*2WD_Use DEFFILE to export functions of DLL or ','EXE (Windows)'#010+ + '4*2WD_Use DEFFILE to export functions of DLL or EX','E (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+ 'A*2We_Use external resources (Darwin)'#010+ - 'P*2We_Use external resources (Darwin)'#010+ - 'p*2We_Use external resources (Darwin',')'#010+ + 'P*2We_Use exte','rnal 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+ '4*2WG_Specify graphic type application (Windows)'#010+ - 'A*2WG_Specify graphic type application (Windows)'#010+ - 'P*2WG_Specify graphic typ','e application (Classic Mac OS)'#010+ + 'A*2WG_Specify ','graphic type application (Windows)'#010+ + 'P*2WG_Specify graphic type application (Classic Mac OS)'#010+ '3*2Wi_Use internal resources (Darwin)'#010+ '4*2Wi_Use internal resources (Darwin)'#010+ 'a*2Wi_Use internal resources (Darwin)'#010+ - 'A*2Wi_Use internal resources (Darwin)'#010+ + 'A*2Wi_Use internal resources (Darwi','n)'#010+ 'P*2Wi_Use internal resources (Darwin)'#010+ - 'p*2Wi_Use internal ','resources (Darwin)'#010+ + 'p*2Wi_Use internal resources (Darwin)'#010+ '3*2WI_Turn on/off the usage of import sections (Windows)'#010+ '4*2WI_Turn on/off the usage of import sections (Windows)'#010+ - 'A*2WI_Turn on/off the usage of import sections (Windows)'#010+ - '8*2Wh_Use huge code for units (ignored for models ','with CODE in a uni'+ - 'que segment)'#010+ + 'A*2WI_Turn on/off the usage of import sections ','(Windows)'#010+ + '8*2Wh_Use huge code for units (ignored for models with CODE in a uniqu'+ + 'e segment)'#010+ '8*2Wm<x>_Set memory model'#010+ '8*3WmTiny_Tiny memory model'#010+ '8*3WmSmall_Small memory model (default)'#010+ '8*3WmMedium_Medium memory model'#010+ - '8*3WmCompact_Compact memory model'#010+ + '8*3WmCompact_Compact me','mory model'#010+ '8*3WmLarge_Large memory model'#010+ - '8*3WmHuge_Huge memo','ry model'#010+ + '8*3WmHuge_Huge memory model'#010+ '3*2WM<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ... (Darwi'+ 'n)'#010+ '4*2WM<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ... (Darwi'+ 'n)'#010+ - 'p*2WM<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ... (Darwi'+ - 'n)'#010+ - 'P*2WM<x>_Min','imum Mac OS X deployment version: 10.4, 10.5.1, ... (Dar'+ + 'p*2WM<x>_Minimum Mac OS X',' deployment version: 10.4, 10.5.1, ... (Dar'+ 'win)'#010+ + 'P*2WM<x>_Minimum Mac OS X deployment version: 10.4, 10.5.1, ... (Darwi'+ + 'n)'#010+ '3*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+ - '4*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+ - 'A*2WN_Do not generate relocation code, ','needed for debugging (Windows'+ + '4*2WN_Do not generate relocation code, needed for',' debugging (Windows'+ ')'#010+ + 'A*2WN_Do not generate relocation code, needed for debugging (Windows)'#010+ 'A*2Wp<x>_Specify the controller type; see fpc -i or fpc -iu for possib'+ 'le values'#010+ - 'm*2Wp<x>_Specify the controller type; see fpc -i or fpc -iu for possib'+ + 'm*2Wp<x>_Specify the controller type; see fpc -i or fpc -iu for possi', + 'ble values'#010+ + 'V*2Wp<x>_Specify the controller type; see fpc -i or fpc -iu for possib'+ 'le values'#010+ - 'V*2Wp<x>_Specify the controller type; see fpc -i ','or fpc -iu for poss'+ - 'ible values'#010+ '3*2WP<x>_Minimum iOS deployment version: 3.0, 5.0.1, ... (iphonesim)'#010+ '4*2WP<x>_Minimum iOS deployment version: 8.0, 8.0.2, ... (iphonesim)'#010+ - 'a*2WP<x>_Minimum iOS deployment version: 7.0, 7.1.2, ... (Darwin)'#010+ - 'A*2WP','<x>_Minimum iOS deployment version: 3.0, 5.0.1, ... (Darwin)'#010+ + 'a*2WP<x>_Mi','nimum iOS deployment version: 7.0, 7.1.2, ... (Darwin)'#010+ + 'A*2WP<x>_Minimum iOS deployment version: 3.0, 5.0.1, ... (Darwin)'#010+ '3*2WR_Generate relocation code (Windows)'#010+ '4*2WR_Generate relocation code (Windows)'#010+ - 'A*2WR_Generate relocation code (Windows)'#010+ + 'A*2WR_Generate relocation code (Windo','ws)'#010+ '8*2Wt<x>_Set the target executable format'#010+ - '8*3Wtexe_Creat','e a DOS .EXE file (default)'#010+ + '8*3Wtexe_Create a DOS .EXE file (default)'#010+ '8*3Wtcom_Create a DOS .COM file (requires tiny memory model)'#010+ 'P*2WT_Specify MPW tool type application (Classic Mac OS)'#010+ - '**2WX_Enable executable stack (Linux)'#010+ + '**2WX_Enable executable stack (Lin','ux)'#010+ '**1X_Executable options:'#010+ - '**2X9_Generate linkerscript for',' GNU Binutils ld older than version 2'+ - '.19.1 (Linux)'#010+ + '**2X9_Generate linkerscript for GNU Binutils ld older than version 2.1'+ + '9.1 (Linux)'#010+ '**2Xc_Pass --shared/-dynamic to the linker (BeOS, Darwin, FreeBSD, Lin'+ 'ux)'#010+ - '**2Xd_Do not search default library path (sometimes required for cross'+ - '-compiling when not using -XR)'#010+ - '**2Xe_Use exte','rnal linker'#010+ + '**2Xd_Do not search default library path (sometimes req','uired for cro'+ + 'ss-compiling when not using -XR)'#010+ + '**2Xe_Use external linker'#010+ '**2Xf_Substitute pthread library name for linking (BSD)'#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 l','inker'#010+ + '**2XD_Try to link units dyna','mically (defines FPC_LINK_DYNAMIC)'#010+ + '**2Xi_Use internal linker'#010+ 'L*2XlS<x>_LLVM utilties suffix (e.g. -7 in case clang is called clang-'+ '7)'#010+ '**2XLA_Define library substitutions for linking'#010+ '**2XLO_Define order of library linking'#010+ - '**2XLD_Exclude default order of standard libraries'#010+ - '**2Xm_Generate link map',#010+ + '**2XLD_Exclude',' default order of standard libraries'#010+ + '**2Xm_Generate link map'#010+ '**2XM<x>_Set the name of the '#039'main'#039' program routine (default i'+ 's '#039'main'#039')'#010+ '**2Xn_Use target system native linker instead of GNU ld (Solaris, AIX)'+ #010+ - 'F*2Xp<x>_First search for the compiler binary in the directory <x>'#010+ - '**2XP<x>_Prepend the binutils',' names with the prefix <x>'#010+ + 'F*2Xp<x>_First search for the compil','er binary in the directory <x>'#010+ + '**2XP<x>_Prepend the binutils names with the prefix <x>'#010+ '**2Xr<x>_Set the linker'#039's rlink-path to <x> (needed for cross comp'+ 'ile, see the ld manual for more information) (BeOS, Linux)'#010+ - '**2XR<x>_Prepend <x> to all linker search paths (BeOS, Darwin, FreeBSD'+ - ', Linux, Mac OS, S','olaris)'#010+ + '**2XR<x>_Prepend <x> to all ','linker search paths (BeOS, Darwin, FreeB'+ + 'SD, 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 static libraries (-static is passed to linker)'#010+ + '**2Xt_Link with static libraries (-static is passed to linker)',#010+ '**2Xv_Generate table for Virtual Entry calls'#010+ - '**2XV_Use VLin','k as external linker (default on Amiga, MorphOS)'+ - #010+ + '**2XV_Use VLink as external linker (default on Amiga, MorphOS)'#010+ '**2XX_Try to smartlink units (defines FPC_LINK_SMART)'#010+ '**1*_'#010+ '**1?_Show this help'#010+ - '**1h_Shows this help without waiting' + '**1h_Shows this help without wait','ing' ); diff --git a/compiler/ncnv.pas b/compiler/ncnv.pas index 32053b4adb..65d0777905 100644 --- a/compiler/ncnv.pas +++ b/compiler/ncnv.pas @@ -3102,7 +3102,8 @@ implementation { for constant values on absolute variables, swapping is required } if (target_info.endian = endian_big) and (nf_absolute in flags) then swap_const_value(tordconstnode(left).value,tordconstnode(left).resultdef.size); - adaptrange(resultdef,tordconstnode(left).value,([nf_internal,nf_absolute]*flags)<>[],nf_explicit in flags,cs_check_range in localswitches); + if not(nf_generic_para in flags) then + adaptrange(resultdef,tordconstnode(left).value,([nf_internal,nf_absolute]*flags)<>[],nf_explicit in flags,cs_check_range in localswitches); { swap value back, but according to new type } if (target_info.endian = endian_big) and (nf_absolute in flags) then swap_const_value(tordconstnode(left).value,resultdef.size); @@ -3219,6 +3220,7 @@ implementation end; if (convtype=tc_int_2_int) and (left.nodetype=typeconvn) and (ttypeconvnode(left).convtype=tc_bool_2_int) then begin + ttypeconvnode(left).totypedef:=resultdef; ttypeconvnode(left).resultdef:=resultdef; result:=left; left:=nil; diff --git a/compiler/ncon.pas b/compiler/ncon.pas index 61255c6c48..f723750917 100644 --- a/compiler/ncon.pas +++ b/compiler/ncon.pas @@ -306,6 +306,7 @@ implementation p1 : tnode; len : longint; pc : pchar; + value_set : pconstset; begin p1:=nil; case p.consttyp of @@ -331,18 +332,50 @@ implementation constwstring : p1:=cstringconstnode.createunistr(pcompilerwidestring(p.value.valueptr)); constreal : - p1:=crealconstnode.create(pbestreal(p.value.valueptr)^,p.constdef); + begin + if (sp_generic_para in p.symoptions) and not (sp_generic_const in p.symoptions) then + p1:=crealconstnode.create(default(bestreal),p.constdef) + else + p1:=crealconstnode.create(pbestreal(p.value.valueptr)^,p.constdef); + end; constset : - p1:=csetconstnode.create(pconstset(p.value.valueptr),p.constdef); + begin + if sp_generic_const in p.symoptions then + begin + new(value_set); + value_set^:=pconstset(p.value.valueptr)^; + p1:=csetconstnode.create(value_set,p.constdef); + end + else if sp_generic_para in p.symoptions then + begin + new(value_set); + p1:=csetconstnode.create(value_set,p.constdef); + end + else + p1:=csetconstnode.create(pconstset(p.value.valueptr),p.constdef); + end; constpointer : - p1:=cpointerconstnode.create(p.value.valueordptr,p.constdef); + begin + if sp_generic_para in p.symoptions then + p1:=cpointerconstnode.create(default(tconstptruint),p.constdef) + else + p1:=cpointerconstnode.create(p.value.valueordptr,p.constdef); + end; constnil : p1:=cnilnode.create; constguid : - p1:=cguidconstnode.create(pguid(p.value.valueptr)^); + begin + if sp_generic_para in p.symoptions then + p1:=cguidconstnode.create(default(tguid)) + else + p1:=cguidconstnode.create(pguid(p.value.valueptr)^); + end; else internalerror(200205103); end; + { transfer generic param flag from symbol to node } + if sp_generic_para in p.symoptions then + include(p1.flags,nf_generic_para); genconstsymtree:=p1; end; diff --git a/compiler/nmat.pas b/compiler/nmat.pas index b4a51f2521..91ce6726d2 100644 --- a/compiler/nmat.pas +++ b/compiler/nmat.pas @@ -131,7 +131,10 @@ implementation end; if rv = 0 then begin - Message(parser_e_division_by_zero); + { if the node is derived from a generic const parameter + then don't issue an error } + if not (nf_generic_para in flags) then + Message(parser_e_division_by_zero); { recover } tordconstnode(right).value := 1; end; diff --git a/compiler/node.pas b/compiler/node.pas index 0c2ba4efbb..2b81f63377 100644 --- a/compiler/node.pas +++ b/compiler/node.pas @@ -276,10 +276,13 @@ interface nf_block_with_exit, { tloadvmtaddrnode } - nf_ignore_for_wpo { we know that this loadvmtaddrnode cannot be used to construct a class instance } + nf_ignore_for_wpo, { we know that this loadvmtaddrnode cannot be used to construct a class instance } - { WARNING: there are now 31 elements in this type, and a set of this - type is written to the PPU. So before adding more than 32 elements, + { node is derived from generic parameter } + nf_generic_para + + { WARNING: there are now 32 elements in this type, and a set of this + type is written to the PPU. So before adding more elements, either move some flags to specific nodes, or stream a normalset to the ppu } @@ -1380,6 +1383,9 @@ implementation constructor tunarynode.create(t:tnodetype;l : tnode); begin inherited create(t); + { transfer generic paramater flag } + if assigned(l) and (nf_generic_para in l.flags) then + include(flags,nf_generic_para); left:=l; end; @@ -1482,7 +1488,10 @@ implementation constructor tbinarynode.create(t:tnodetype;l,r : tnode); begin inherited create(t,l); - right:=r + { transfer generic paramater flag } + if assigned(r) and (nf_generic_para in r.flags) then + include(flags,nf_generic_para); + right:=r; end; @@ -1635,6 +1644,9 @@ implementation constructor ttertiarynode.create(_t:tnodetype;l,r,t : tnode); begin inherited create(_t,l,r); + { transfer generic parameter flag } + if assigned(t) and (nf_generic_para in t.flags) then + include(flags,nf_generic_para); third:=t; end; diff --git a/compiler/nset.pas b/compiler/nset.pas index 0832b97b20..0b31de9342 100644 --- a/compiler/nset.pas +++ b/compiler/nset.pas @@ -424,8 +424,9 @@ implementation { both types must be compatible } if compare_defs(left.resultdef,right.resultdef,left.nodetype)=te_incompatible then IncompatibleTypes(left.resultdef,right.resultdef); - { Check if only when its a constant set } - if (left.nodetype=ordconstn) and (right.nodetype=ordconstn) then + { check if only when its a constant set and + ignore range nodes which are generic parameter derived } + if not (nf_generic_para in flags) and (left.nodetype=ordconstn) and (right.nodetype=ordconstn) then begin { upper limit must be greater or equal than lower limit } if (tordconstnode(left).value>tordconstnode(right).value) and diff --git a/compiler/pass_1.pas b/compiler/pass_1.pas index 5f59984329..2ac00dbc43 100644 --- a/compiler/pass_1.pas +++ b/compiler/pass_1.pas @@ -62,6 +62,7 @@ implementation procedure typecheckpass_internal_loop(var p : tnode; out node_changed: boolean); var hp : tnode; + oldflags : tnodeflags; begin codegenerror:=false; repeat @@ -73,9 +74,13 @@ implementation if assigned(hp) then begin node_changed:=true; + oldflags:=p.flags; p.free; { switch to new node } p:=hp; + { transfer generic paramter flag } + if nf_generic_para in oldflags then + include(p.flags,nf_generic_para); end; until not assigned(hp) or assigned(hp.resultdef); diff --git a/compiler/pdecl.pas b/compiler/pdecl.pas index e42574044e..1c52d152e3 100644 --- a/compiler/pdecl.pas +++ b/compiler/pdecl.pas @@ -135,7 +135,10 @@ implementation setconstn : begin new(ps); - ps^:=tsetconstnode(p).value_set^; + if assigned(tsetconstnode(p).value_set) then + ps^:=tsetconstnode(p).value_set^ + else + ps^:=[]; hp:=cconstsym.create_ptr(orgname,constset,ps,p.resultdef); end; pointerconstn : @@ -185,8 +188,22 @@ implementation end; end; else - Message(parser_e_illegal_expression); + begin + { the node is from a generic parameter constant and is + untyped so we need to pass a placeholder constant + instead of givng an error } + if nf_generic_para in p.flags then + hp:=cconstsym.create_ord(orgname,constnil,0,p.resultdef) + else + Message(parser_e_illegal_expression); + end; end; + { transfer generic param flag from node to symbol } + if nf_generic_para in p.flags then + begin + include(hp.symoptions,sp_generic_const); + include(hp.symoptions,sp_generic_para); + end; current_tokenpos:=storetokenpos; p.free; readconstant:=hp; @@ -716,8 +733,9 @@ implementation { we are not freeing the type parameters, so register them } for i:=0 to generictypelist.count-1 do begin - ttypesym(generictypelist[i]).register_sym; - tstoreddef(ttypesym(generictypelist[i]).typedef).register_def; + tstoredsym(generictypelist[i]).register_sym; + if tstoredsym(generictypelist[i]).typ=typesym then + tstoreddef(ttypesym(generictypelist[i]).typedef).register_def; end; str(generictypelist.Count,s); diff --git a/compiler/pdecsub.pas b/compiler/pdecsub.pas index 7e750eb8bc..45b42857f5 100644 --- a/compiler/pdecsub.pas +++ b/compiler/pdecsub.pas @@ -628,7 +628,7 @@ implementation for i:=0 to genericparams.count-1 do begin sym:=ttypesym(genericparams[i]); - if tstoreddef(sym.typedef).is_registered then + if (sym.typ<>constsym) and tstoreddef(sym.typedef).is_registered then begin sym.typedef.free; sym.typedef:=nil; @@ -813,9 +813,11 @@ implementation function check_generic_parameters(def:tstoreddef):boolean; var i : longint; - decltype, - impltype : ttypesym; + declsym, + implsym : tsym; + impltype : ttypesym absolute implsym; implname : tsymstr; + fileinfo : tfileposinfo; begin result:=true; if not assigned(def.genericparas) then @@ -826,18 +828,23 @@ implementation internalerror(2018090104); for i:=0 to def.genericparas.count-1 do begin - decltype:=ttypesym(def.genericparas[i]); - impltype:=ttypesym(genericparams[i]); + declsym:=tsym(def.genericparas[i]); + implsym:=tsym(genericparams[i]); implname:=upper(genericparams.nameofindex(i)); - if decltype.name<>implname then + if declsym.name<>implname then begin - messagepos1(impltype.fileinfo,sym_e_generic_type_param_mismatch,impltype.realname); - messagepos1(decltype.fileinfo,sym_e_generic_type_param_decl,decltype.realname); + messagepos1(implsym.fileinfo,sym_e_generic_type_param_mismatch,implsym.realname); + messagepos1(declsym.fileinfo,sym_e_generic_type_param_decl,declsym.realname); result:=false; end; - if df_genconstraint in impltype.typedef.defoptions then + if ((implsym.typ=typesym) and (df_genconstraint in impltype.typedef.defoptions)) or + (implsym.typ=constsym) then begin - messagepos(tstoreddef(impltype.typedef).genconstraintdata.fileinfo,parser_e_generic_constraints_not_allowed_here); + if implsym.typ=constsym then + fileinfo:=impltype.fileinfo + else + fileinfo:=tstoreddef(impltype.typedef).genconstraintdata.fileinfo; + messagepos(fileinfo,parser_e_generic_constraints_not_allowed_here); result:=false; end; end; @@ -1127,8 +1134,9 @@ implementation { register the parameters } for i:=0 to genericparams.count-1 do begin - ttypesym(genericparams[i]).register_sym; - tstoreddef(ttypesym(genericparams[i]).typedef).register_def; + tsym(genericparams[i]).register_sym; + if tsym(genericparams[i]).typ=typesym then + tstoreddef(ttypesym(genericparams[i]).typedef).register_def; end; insert_generic_parameter_types(pd,nil,genericparams); { the list is no longer required } diff --git a/compiler/pdecvar.pas b/compiler/pdecvar.pas index 85c47b5132..57f2cf5c1f 100644 --- a/compiler/pdecvar.pas +++ b/compiler/pdecvar.pas @@ -1707,6 +1707,10 @@ implementation hdef:=generrordef; end; + { field type is a generic param so set a flag in the struct } + if assigned(hdef.typesym) and (sp_generic_para in hdef.typesym.symoptions) then + include(current_structdef.defoptions,df_has_generic_fields); + { Process procvar directives } if maybe_parse_proc_directives(hdef) then semicoloneaten:=true; diff --git a/compiler/pexpr.pas b/compiler/pexpr.pas index 250c96c668..95eb9a7eb8 100644 --- a/compiler/pexpr.pas +++ b/compiler/pexpr.pas @@ -447,6 +447,9 @@ implementation { no packed bit support for these things } if l=in_bitsizeof_x then statement_syssym:=caddnode.create(muln,statement_syssym,cordconstnode.create(8,sizesinttype,true)); + { type sym is a generic parameter } + if assigned(p1.resultdef.typesym) and (sp_generic_para in p1.resultdef.typesym.symoptions) then + include(statement_syssym.flags,nf_generic_para); end else begin @@ -467,6 +470,9 @@ implementation end else statement_syssym:=cordconstnode.create(p1.resultdef.packedbitsize,sizesinttype,true); + { type def is a struct with generic fields } + if df_has_generic_fields in p1.resultdef.defoptions then + include(statement_syssym.flags,nf_generic_para); { p1 not needed !} p1.destroy; end; @@ -4247,7 +4253,10 @@ implementation gendef:=generate_specialization_phase2(spezcontext,tstoreddef(gendef),false,''); spezcontext.free; spezcontext:=nil; - gensym:=gendef.typesym; + if gendef.typ=errordef then + gensym:=generrorsym + else + gensym:=gendef.typesym; end; procdef: begin @@ -4601,7 +4610,7 @@ implementation filepos : tfileposinfo; oldafterassignment, updatefpos : boolean; - + oldflags : tnodeflags; begin oldafterassignment:=afterassignment; p1:=sub_expr(opcompare,[ef_accept_equal],nil); @@ -4658,10 +4667,14 @@ implementation else updatefpos:=false; end; + oldflags:=p1.flags; { get the resultdef for this expression } if not assigned(p1.resultdef) and dotypecheck then do_typecheckpass(p1); + { transfer generic paramter flag } + if nf_generic_para in oldflags then + include(p1.flags,nf_generic_para); afterassignment:=oldafterassignment; if updatefpos then p1.fileinfo:=filepos; diff --git a/compiler/pgentype.pas b/compiler/pgentype.pas index b2847c78f6..948353298d 100644 --- a/compiler/pgentype.pas +++ b/compiler/pgentype.pas @@ -42,7 +42,7 @@ type tspecializationcontext=class public - genericdeflist : tfpobjectlist; + paramlist : tfpobjectlist; poslist : tfplist; prettyname : ansistring; specializename : ansistring; @@ -58,7 +58,7 @@ implementation constructor tspecializationcontext.create; begin - genericdeflist:=tfpobjectlist.create(false); + paramlist:=tfpobjectlist.create(false); poslist:=tfplist.create; end; @@ -66,7 +66,7 @@ destructor tspecializationcontext.destroy; var i : longint; begin - genericdeflist.free; + paramlist.free; for i:=0 to poslist.count-1 do dispose(pfileposinfo(poslist[i])); poslist.free; diff --git a/compiler/pgenutil.pas b/compiler/pgenutil.pas index e8489726aa..9c0fba9eef 100644 --- a/compiler/pgenutil.pas +++ b/compiler/pgenutil.pas @@ -42,9 +42,9 @@ uses function generate_specialization_phase1(out context:tspecializationcontext;genericdef:tdef;symname:string):tdef;inline; function generate_specialization_phase1(out context:tspecializationcontext;genericdef:tdef;parsedtype:tdef;symname:string;parsedpos:tfileposinfo):tdef; function generate_specialization_phase2(context:tspecializationcontext;genericdef:tstoreddef;parse_class_parent:boolean;_prettyname:ansistring):tdef; - function check_generic_constraints(genericdef:tstoreddef;paradeflist:tfpobjectlist;poslist:tfplist):boolean; + function check_generic_constraints(genericdef:tstoreddef;paramlist:tfpobjectlist;poslist:tfplist):boolean; function parse_generic_parameters(allowconstraints:boolean):tfphashobjectlist; - function parse_generic_specialization_types(genericdeflist:tfpobjectlist;poslist:tfplist;out prettyname,specializename:ansistring):boolean; + function parse_generic_specialization_types(paramlist:tfpobjectlist;poslist:tfplist;out prettyname,specializename:ansistring):boolean; procedure insert_generic_parameter_types(def:tstoreddef;genericdef:tstoreddef;genericlist:tfphashobjectlist); procedure maybe_insert_generic_rename_symbol(const name:tidstring;genericlist:tfphashobjectlist); function generate_generic_name(const name:tidstring;specializename:ansistring;owner_hierarchy:string):tidstring; @@ -65,16 +65,148 @@ uses { common } cutils,fpccrc, { global } - globals,tokens,verbose,finput, + globals,tokens,verbose,finput,constexp, { symtable } - symconst,symsym,symtable,defcmp,procinfo, + symconst,symsym,symtable,defcmp,defutil,procinfo, { modules } fmodule, - node,nobj, + node,nobj,ncon, { parser } scanner, pbase,pexpr,pdecsub,ptype,psub,pparautl; + type + tdeftypeset = set of tdeftyp; + const + tgeneric_param_const_types : tdeftypeset = [orddef,stringdef,floatdef,setdef,pointerdef,enumdef]; + tgeneric_param_nodes : tnodetypeset = [typen,ordconstn,stringconstn,realconstn,setconstn,niln]; + + function get_generic_param_def(sym:tsym):tdef; + begin + if sym.typ=constsym then + result:=tconstsym(sym).constdef + else + result:=ttypesym(sym).typedef; + end; + + function compare_orddef_by_range(param1,param2:torddef;value:tconstvalue):boolean; + begin + if (value.valueord<param2.low) or (value.valueord>param2.high) then + result:=false + else + result:=true; + end; + + function compare_generic_params(param1,param2:tdef;constparamsym:tconstsym):boolean; + begin + if (param1.typ=orddef) and (param2.typ=orddef) then + begin + if is_boolean(param2) then + result:=is_boolean(param1) + else if is_char(param2) then + result:=is_char(param1) + else if compare_orddef_by_range(torddef(param1),torddef(param2),constparamsym.value) then + result:=true + else + result:=false; + end + { arraydef is string constant so it's compatible with stringdef } + else if (param1.typ=arraydef) and (param2.typ=stringdef) then + result:=true + { integer ords are compatible with float } + else if (param1.typ=orddef) and is_integer(param1) and (param2.typ=floatdef) then + result:=true + { undefined def is compatible with all types } + else if param2.typ=undefineddef then + result:=true + { sets require stricter checks } + else if is_set(param2) then + result:=equal_defs(param1,param2) + else + result:=param1.typ=param2.typ; + end; + + function create_generic_constsym(fromdef:tdef;node:tnode;out prettyname:string):tconstsym; + const + undefinedname = 'undefined'; + var + sym : tconstsym; + setdef : tsetdef; + enumsym : tsym; + enumname : string; + sp : pchar; + ps : ^tconstset; + pd : ^bestreal; + i : integer; + begin + if node=nil then + internalerror(2020011401); + case node.nodetype of + ordconstn: + begin + sym:=cconstsym.create_ord(undefinedname,constord,tordconstnode(node).value,fromdef); + prettyname:=tostr(tordconstnode(node).value.svalue); + end; + stringconstn: + begin + getmem(sp,tstringconstnode(node).len+1); + move(tstringconstnode(node).value_str^,sp^,tstringconstnode(node).len+1); + sym:=cconstsym.create_string(undefinedname,conststring,sp,tstringconstnode(node).len,fromdef); + prettyname:=''''+tstringconstnode(node).value_str+''''; + end; + realconstn: + begin + new(pd); + pd^:=trealconstnode(node).value_real; + sym:=cconstsym.create_ptr(undefinedname,constreal,pd,fromdef); + prettyname:=realtostr(trealconstnode(node).value_real); + end; + setconstn: + begin + new(ps); + ps^:=tsetconstnode(node).value_set^; + sym:=cconstsym.create_ptr(undefinedname,constset,ps,fromdef); + setdef:=tsetdef(tsetconstnode(node).resultdef); + prettyname:='['; + for i := setdef.setbase to setdef.setmax do + if i in tsetconstnode(node).value_set^ then + begin + if setdef.elementdef.typ=enumdef then + enumsym:=tenumdef(setdef.elementdef).int2enumsym(i) + else + enumsym:=nil; + if assigned(enumsym) then + enumname:=enumsym.realname + else if setdef.elementdef.typ=orddef then + begin + if torddef(setdef.elementdef).ordtype=uchar then + enumname:=chr(i) + else + enumname:=tostr(i); + end + else + enumname:=tostr(i); + if length(prettyname) > 1 then + prettyname:=prettyname+','+enumname + else + prettyname:=prettyname+enumname; + end; + prettyname:=prettyname+']'; + end; + niln: + begin + { only "nil" is available for pointer constants } + sym:=cconstsym.create_ord(undefinedname,constnil,0,fromdef); + prettyname:='nil'; + end; + else + internalerror(2019021601); + end; + { the sym needs an owner for later checks so use the typeparam owner } + sym.owner:=fromdef.owner; + include(sym.symoptions,sp_generic_const); + result:=sym; + end; procedure maybe_add_waiting_unit(tt:tdef); var @@ -104,203 +236,231 @@ uses end; end; - function check_generic_constraints(genericdef:tstoreddef;paradeflist:tfpobjectlist;poslist:tfplist):boolean; + function check_generic_constraints(genericdef:tstoreddef;paramlist:tfpobjectlist;poslist:tfplist):boolean; var i,j, intfcount : longint; formaldef, paradef : tstoreddef; + genparadef : tdef; objdef, paraobjdef, formalobjdef : tobjectdef; intffound : boolean; filepos : tfileposinfo; + is_const : boolean; begin { check whether the given specialization parameters fit to the eventual constraints of the generic } if not assigned(genericdef.genericparas) or (genericdef.genericparas.count=0) then internalerror(2012101001); - if genericdef.genericparas.count<>paradeflist.count then + if genericdef.genericparas.count<>paramlist.count then internalerror(2012101002); - if paradeflist.count<>poslist.count then + if paramlist.count<>poslist.count then internalerror(2012120801); result:=true; for i:=0 to genericdef.genericparas.count-1 do begin filepos:=pfileposinfo(poslist[i])^; - formaldef:=tstoreddef(ttypesym(genericdef.genericparas[i]).typedef); - if formaldef.typ=undefineddef then - { the parameter is of unspecified type, so no need to check } - continue; - if not (df_genconstraint in formaldef.defoptions) or - not assigned(formaldef.genconstraintdata) then - internalerror(2013021602); - paradef:=tstoreddef(paradeflist[i]); - { undefineddef is compatible with anything } - if formaldef.typ=undefineddef then - continue; - if paradef.typ<>formaldef.typ then + paradef:=tstoreddef(get_generic_param_def(tsym(paramlist[i]))); + is_const:=tsym(paramlist[i]).typ=constsym; + genparadef:=genericdef.get_generic_param_def(i); + { validate const params } + if not genericdef.is_generic_param_const(i) and is_const then begin - case formaldef.typ of - recorddef: - { delphi has own fantasy about record constraint - (almost non-nullable/non-nilable value type) } - if m_delphi in current_settings.modeswitches then - case paradef.typ of - floatdef,enumdef,orddef: - continue; - objectdef: - if tobjectdef(paradef).objecttype=odt_object then - continue - else - MessagePos(filepos,type_e_record_type_expected); + MessagePos(filepos,type_e_mismatch); + exit(false); + end + else if genericdef.is_generic_param_const(i) then + begin + { param type mismatch (type <> const) } + if genericdef.is_generic_param_const(i)<>is_const then + begin + MessagePos(filepos,type_e_mismatch); + exit(false); + end; + { type constrained param doesn't match type } + if not compare_generic_params(paradef,genericdef.get_generic_param_def(i),tconstsym(paramlist[i])) then + begin + MessagePos2(filepos,type_e_incompatible_types,FullTypeName(paradef,genparadef),FullTypeName(genparadef,paradef)); + exit(false); + end; + end; + { test constraints for non-const params } + if not genericdef.is_generic_param_const(i) then + begin + formaldef:=tstoreddef(ttypesym(genericdef.genericparas[i]).typedef); + if formaldef.typ=undefineddef then + { the parameter is of unspecified type, so no need to check } + continue; + if not (df_genconstraint in formaldef.defoptions) or + not assigned(formaldef.genconstraintdata) then + internalerror(2013021602); + { undefineddef is compatible with anything } + if formaldef.typ=undefineddef then + continue; + if paradef.typ<>formaldef.typ then + begin + case formaldef.typ of + recorddef: + { delphi has own fantasy about record constraint + (almost non-nullable/non-nilable value type) } + if m_delphi in current_settings.modeswitches then + case paradef.typ of + floatdef,enumdef,orddef: + continue; + objectdef: + if tobjectdef(paradef).objecttype=odt_object then + continue + else + MessagePos(filepos,type_e_record_type_expected); + else + MessagePos(filepos,type_e_record_type_expected); + end else MessagePos(filepos,type_e_record_type_expected); - end - else - MessagePos(filepos,type_e_record_type_expected); - objectdef: - case tobjectdef(formaldef).objecttype of - odt_class, - odt_javaclass: - MessagePos1(filepos,type_e_class_type_expected,paradef.typename); - odt_interfacecom, - odt_interfacecorba, - odt_dispinterface, - odt_interfacejava: - MessagePos1(filepos,type_e_interface_type_expected,paradef.typename); + objectdef: + case tobjectdef(formaldef).objecttype of + odt_class, + odt_javaclass: + MessagePos1(filepos,type_e_class_type_expected,paradef.typename); + odt_interfacecom, + odt_interfacecorba, + odt_dispinterface, + odt_interfacejava: + MessagePos1(filepos,type_e_interface_type_expected,paradef.typename); + else + internalerror(2012101003); + end; + errordef: + { ignore } + ; else - internalerror(2012101003); + internalerror(2012101004); end; - errordef: - { ignore } - ; - else - internalerror(2012101004); - end; - result:=false; - end - else - begin - { the paradef types are the same, so do special checks for the - cases in which they are needed } - if formaldef.typ=objectdef then + result:=false; + end + else begin - paraobjdef:=tobjectdef(paradef); - formalobjdef:=tobjectdef(formaldef); - if not (formalobjdef.objecttype in [odt_class,odt_javaclass,odt_interfacecom,odt_interfacecorba,odt_interfacejava,odt_dispinterface]) then - internalerror(2012101102); - if formalobjdef.objecttype in [odt_interfacecom,odt_interfacecorba,odt_interfacejava,odt_dispinterface] then + { the paradef types are the same, so do special checks for the + cases in which they are needed } + if formaldef.typ=objectdef then begin - { this is either a concerete interface or class type (the - latter without specific implemented interfaces) } - case paraobjdef.objecttype of - odt_interfacecom, - odt_interfacecorba, - odt_interfacejava, - odt_dispinterface: - begin - if (oo_is_forward in paraobjdef.objectoptions) and - (paraobjdef.objecttype=formalobjdef.objecttype) and - (df_genconstraint in formalobjdef.defoptions) and - ( - (formalobjdef.objecttype=odt_interfacecom) and - (formalobjdef.childof=interface_iunknown) - ) - or - ( - (formalobjdef.objecttype=odt_interfacecorba) and - (formalobjdef.childof=nil) - ) then - continue; - if not def_is_related(paraobjdef,formalobjdef.childof) then + paraobjdef:=tobjectdef(paradef); + formalobjdef:=tobjectdef(formaldef); + if not (formalobjdef.objecttype in [odt_class,odt_javaclass,odt_interfacecom,odt_interfacecorba,odt_interfacejava,odt_dispinterface]) then + internalerror(2012101102); + if formalobjdef.objecttype in [odt_interfacecom,odt_interfacecorba,odt_interfacejava,odt_dispinterface] then + begin + { this is either a concerete interface or class type (the + latter without specific implemented interfaces) } + case paraobjdef.objecttype of + odt_interfacecom, + odt_interfacecorba, + odt_interfacejava, + odt_dispinterface: begin - MessagePos2(filepos,type_e_incompatible_types,paraobjdef.typename,formalobjdef.childof.typename); - result:=false; + if (oo_is_forward in paraobjdef.objectoptions) and + (paraobjdef.objecttype=formalobjdef.objecttype) and + (df_genconstraint in formalobjdef.defoptions) and + ( + (formalobjdef.objecttype=odt_interfacecom) and + (formalobjdef.childof=interface_iunknown) + ) + or + ( + (formalobjdef.objecttype=odt_interfacecorba) and + (formalobjdef.childof=nil) + ) then + continue; + if not def_is_related(paraobjdef,formalobjdef.childof) then + begin + MessagePos2(filepos,type_e_incompatible_types,paraobjdef.typename,formalobjdef.childof.typename); + result:=false; + end; end; - end; - odt_class, - odt_javaclass: - begin - objdef:=paraobjdef; - intffound:=false; - while assigned(objdef) do + odt_class, + odt_javaclass: begin - for j:=0 to objdef.implementedinterfaces.count-1 do - if timplementedinterface(objdef.implementedinterfaces[j]).intfdef=formalobjdef.childof then - begin - intffound:=true; + objdef:=paraobjdef; + intffound:=false; + while assigned(objdef) do + begin + for j:=0 to objdef.implementedinterfaces.count-1 do + if timplementedinterface(objdef.implementedinterfaces[j]).intfdef=formalobjdef.childof then + begin + intffound:=true; + break; + end; + if intffound then break; - end; - if intffound then - break; - objdef:=objdef.childof; + objdef:=objdef.childof; + end; + result:=intffound; + if not result then + MessagePos2(filepos,parser_e_class_doesnt_implement_interface,paraobjdef.typename,formalobjdef.childof.typename); + end; + else + begin + MessagePos1(filepos,type_e_class_or_interface_type_expected,paraobjdef.typename); + result:=false; end; - result:=intffound; - if not result then - MessagePos2(filepos,parser_e_class_doesnt_implement_interface,paraobjdef.typename,formalobjdef.childof.typename); - end; - else - begin - MessagePos1(filepos,type_e_class_or_interface_type_expected,paraobjdef.typename); - result:=false; end; - end; - end - else - begin - { this is either a "class" or a concrete instance with - or without implemented interfaces } - if not (paraobjdef.objecttype in [odt_class,odt_javaclass]) then - begin - MessagePos1(filepos,type_e_class_type_expected,paraobjdef.typename); - result:=false; - continue; - end; - { for forward declared classes we allow pure TObject/class declarations } - if (oo_is_forward in paraobjdef.objectoptions) and - (df_genconstraint in formaldef.defoptions) then - begin - if (formalobjdef.childof=class_tobject) and - not formalobjdef.implements_any_interfaces then - continue; - end; - if assigned(formalobjdef.childof) and - not def_is_related(paradef,formalobjdef.childof) then - begin - MessagePos2(filepos,type_e_incompatible_types,paraobjdef.typename,formalobjdef.childof.typename); - result:=false; - end; - intfcount:=0; - for j:=0 to formalobjdef.implementedinterfaces.count-1 do + end + else begin - objdef:=paraobjdef; - while assigned(objdef) do + { this is either a "class" or a concrete instance with + or without implemented interfaces } + if not (paraobjdef.objecttype in [odt_class,odt_javaclass]) then + begin + MessagePos1(filepos,type_e_class_type_expected,paraobjdef.typename); + result:=false; + continue; + end; + { for forward declared classes we allow pure TObject/class declarations } + if (oo_is_forward in paraobjdef.objectoptions) and + (df_genconstraint in formaldef.defoptions) then begin - intffound:=assigned( - find_implemented_interface(objdef, - timplementedinterface(formalobjdef.implementedinterfaces[j]).intfdef - ) - ); + if (formalobjdef.childof=class_tobject) and + not formalobjdef.implements_any_interfaces then + continue; + end; + if assigned(formalobjdef.childof) and + not def_is_related(paradef,formalobjdef.childof) then + begin + MessagePos2(filepos,type_e_incompatible_types,paraobjdef.typename,formalobjdef.childof.typename); + result:=false; + end; + intfcount:=0; + for j:=0 to formalobjdef.implementedinterfaces.count-1 do + begin + objdef:=paraobjdef; + while assigned(objdef) do + begin + intffound:=assigned( + find_implemented_interface(objdef, + timplementedinterface(formalobjdef.implementedinterfaces[j]).intfdef + ) + ); + if intffound then + break; + objdef:=objdef.childof; + end; if intffound then - break; - objdef:=objdef.childof; + inc(intfcount) + else + MessagePos2(filepos,parser_e_class_doesnt_implement_interface,paraobjdef.typename,timplementedinterface(formalobjdef.implementedinterfaces[j]).intfdef.typename); end; - if intffound then - inc(intfcount) - else - MessagePos2(filepos,parser_e_class_doesnt_implement_interface,paraobjdef.typename,timplementedinterface(formalobjdef.implementedinterfaces[j]).intfdef.typename); + if intfcount<>formalobjdef.implementedinterfaces.count then + result:=false; end; - if intfcount<>formalobjdef.implementedinterfaces.count then - result:=false; end; end; end; end; end; - - function parse_generic_specialization_types_internal(genericdeflist:tfpobjectlist;poslist:tfplist;out prettyname,specializename:ansistring;parsedtype:tdef;parsedpos:tfileposinfo):boolean; + function parse_generic_specialization_types_internal(paramlist:tfpobjectlist;poslist:tfplist;out prettyname,specializename:ansistring;parsedtype:tdef;parsedpos:tfileposinfo):boolean; var old_block_type : tblock_type; first : boolean; @@ -310,9 +470,11 @@ uses namepart : string; prettynamepart : ansistring; module : tmodule; + constprettyname : string; + validparam : boolean; begin result:=true; - if genericdeflist=nil then + if paramlist=nil then internalerror(2012061401); { set the block type to type, so that the parsed type are returned as ttypenode (e.g. classes are in non type-compatible blocks returned as @@ -324,7 +486,7 @@ uses first:=not assigned(parsedtype); if assigned(parsedtype) then begin - genericdeflist.Add(parsedtype); + paramlist.Add(parsedtype.typesym); module:=find_module_from_symtable(parsedtype.owner); if not assigned(module) then internalerror(2016112801); @@ -350,8 +512,10 @@ uses consume(_COMMA); block_type:=bt_type; tmpparampos:=current_filepos; - typeparam:=factor(false,[ef_type_only]); - if typeparam.nodetype=typen then + typeparam:=factor(false,[ef_accept_equal]); + { determine if the typeparam node is a valid type or const } + validparam:=typeparam.nodetype in tgeneric_param_nodes; + if validparam then begin if tstoreddef(typeparam.resultdef).is_generic and ( @@ -367,31 +531,46 @@ uses end; if typeparam.resultdef.typ<>errordef then begin - if not assigned(typeparam.resultdef.typesym) then + if (typeparam.nodetype=typen) and not assigned(typeparam.resultdef.typesym) then message(type_e_generics_cannot_reference_itself) else if (typeparam.resultdef.typ<>errordef) then begin - genericdeflist.Add(typeparam.resultdef); + { all non-type nodes are considered const } + if typeparam.nodetype<>typen then + paramlist.Add(create_generic_constsym(typeparam.resultdef,typeparam,constprettyname)) + else + begin + constprettyname:=''; + paramlist.Add(typeparam.resultdef.typesym); + end; module:=find_module_from_symtable(typeparam.resultdef.owner); if not assigned(module) then internalerror(2016112802); namepart:='_$'+hexstr(module.moduleid,8)+'$$'+typeparam.resultdef.unique_id_str; + if constprettyname<>'' then + namepart:=namepart+'$$'+constprettyname; { we use the full name of the type to uniquely identify it } - if (symtablestack.top.symtabletype=parasymtable) and - (symtablestack.top.defowner.typ=procdef) and - (typeparam.resultdef.owner=symtablestack.top) then + if typeparam.nodetype=typen then begin - { special handling for specializations inside generic function declarations } - prettynamepart:=tdef(symtablestack.top.defowner).fullownerhierarchyname(true)+tprocdef(symtablestack.top.defowner).procsym.prettyname; - end - else - begin - prettynamepart:=typeparam.resultdef.fullownerhierarchyname(true); + if (symtablestack.top.symtabletype=parasymtable) and + (symtablestack.top.defowner.typ=procdef) and + (typeparam.resultdef.owner=symtablestack.top) then + begin + { special handling for specializations inside generic function declarations } + prettynamepart:=tdef(symtablestack.top.defowner).fullownerhierarchyname(true)+tprocdef(symtablestack.top.defowner).procsym.prettyname; + end + else + begin + prettynamepart:=typeparam.resultdef.fullownerhierarchyname(true); + end; end; specializename:=specializename+namepart; if not first then prettyname:=prettyname+','; - prettyname:=prettyname+prettynamepart+typeparam.resultdef.typesym.prettyname; + if constprettyname<>'' then + prettyname:=prettyname+constprettyname + else + prettyname:=prettyname+prettynamepart+typeparam.resultdef.typesym.prettyname; end; end else @@ -411,12 +590,12 @@ uses end; - function parse_generic_specialization_types(genericdeflist:tfpobjectlist;poslist:tfplist;out prettyname,specializename:ansistring):boolean; + function parse_generic_specialization_types(paramlist:tfpobjectlist;poslist:tfplist;out prettyname,specializename:ansistring):boolean; var dummypos : tfileposinfo; begin FillChar(dummypos, SizeOf(tfileposinfo), 0); - result:=parse_generic_specialization_types_internal(genericdeflist,poslist,prettyname,specializename,nil,dummypos); + result:=parse_generic_specialization_types_internal(paramlist,poslist,prettyname,specializename,nil,dummypos); end; @@ -502,7 +681,7 @@ uses context:=tspecializationcontext.create; { Parse type parameters } - err:=not parse_generic_specialization_types_internal(context.genericdeflist,context.poslist,context.prettyname,context.specializename,parsedtype,parsedpos); + err:=not parse_generic_specialization_types_internal(context.paramlist,context.poslist,context.prettyname,context.specializename,parsedtype,parsedpos); if err then begin if not try_to_consume(_GT) then @@ -556,7 +735,7 @@ uses { search a generic with the given count of params } countstr:=''; - str(context.genericdeflist.Count,countstr); + str(context.paramlist.Count,countstr); genname:=genname+'$'+countstr; ugenname:=upper(genname); @@ -681,6 +860,8 @@ uses tempst : tglobalsymtable; psym, srsym : tsym; + paramdef1, + paramdef2, def : tdef; old_block_type : tblock_type; state : tspecializationstate; @@ -708,7 +889,7 @@ uses pd:=nil; - if not check_generic_constraints(genericdef,context.genericdeflist,context.poslist) then + if not check_generic_constraints(genericdef,context.paramlist,context.poslist) then begin { the parameters didn't fit the constraints, so don't continue with the specialization } @@ -724,20 +905,19 @@ uses else prettyname:=genericdef.typesym.prettyname; prettyname:=prettyname+'<'+context.prettyname+'>'; - generictypelist:=tfphashobjectlist.create(false); { build the list containing the types for the generic params } if not assigned(genericdef.genericparas) then internalerror(2013092601); - if context.genericdeflist.count<>genericdef.genericparas.count then + if context.paramlist.count<>genericdef.genericparas.count then internalerror(2013092603); for i:=0 to genericdef.genericparas.Count-1 do begin srsym:=tsym(genericdef.genericparas[i]); if not (sp_generic_para in srsym.symoptions) then internalerror(2013092602); - generictypelist.add(srsym.realname,tdef(context.genericdeflist[i]).typesym); + generictypelist.add(srsym.realname,context.paramlist[i]); end; { Special case if we are referencing the current defined object } @@ -792,11 +972,33 @@ uses allequal:=true; for i:=0 to generictypelist.count-1 do begin - if not equal_defs(ttypesym(generictypelist[i]).typedef,ttypesym(tstoreddef(def).genericparas[i]).typedef) then + if tsym(generictypelist[i]).typ<>tsym(tstoreddef(def).genericparas[i]).typ then + begin + allequal:=false; + break; + end; + if tsym(generictypelist[i]).typ=constsym then + paramdef1:=tconstsym(generictypelist[i]).constdef + else + paramdef1:=ttypesym(generictypelist[i]).typedef; + if tsym(tstoreddef(def).genericparas[i]).typ=constsym then + paramdef2:=tconstsym(tstoreddef(def).genericparas[i]).constdef + else + paramdef2:=ttypesym(tstoreddef(def).genericparas[i]).typedef; + if not equal_defs(paramdef2,paramdef2) then begin allequal:=false; break; end; + if (tsym(generictypelist[i]).typ=constsym) and + ( + (tconstsym(generictypelist[i]).consttyp<>tconstsym(tstoreddef(def).genericparas[i]).consttyp) or + not same_constvalue(tconstsym(generictypelist[i]).consttyp,tconstsym(generictypelist[i]).value,tconstsym(tstoreddef(def).genericparas[i]).value) + ) then + begin + allequal:=false; + break; + end; end; if allequal then begin @@ -1159,25 +1361,43 @@ uses function parse_generic_parameters(allowconstraints:boolean):tfphashobjectlist; var - generictype : ttypesym; - i,firstidx : longint; + generictype : tstoredsym; + i,firstidx,const_list_index : longint; srsymtable : tsymtable; basedef,def : tdef; defname : tidstring; + allowconst, allowconstructor, + is_const, doconsume : boolean; constraintdata : tgenericconstraintdata; old_block_type : tblock_type; fileinfo : tfileposinfo; + last_token : ttoken; + last_type_pos : tfileposinfo; begin result:=tfphashobjectlist.create(false); firstidx:=0; + const_list_index:=0; old_block_type:=block_type; block_type:=bt_type; + allowconst:=true; + is_const:=false; + last_token:=NOTOKEN; + last_type_pos:=current_filepos; repeat + if allowconst and try_to_consume(_CONST) then + begin + allowconst:=false; + is_const:=true; + const_list_index:=result.count; + end; if token=_ID then begin - generictype:=ctypesym.create(orgpattern,cundefinedtype); + if is_const then + generictype:=cconstsym.create_undefined(orgpattern,cundefinedtype) + else + generictype:=ctypesym.create(orgpattern,cundefinedtype); { type parameters need to be added as strict private } generictype.visibility:=vis_strictprivate; include(generictype.symoptions,sp_generic_para); @@ -1185,7 +1405,43 @@ uses end; consume(_ID); fileinfo:=current_tokenpos; - if try_to_consume(_COLON) then + { const restriction } + if is_const and try_to_consume(_COLON) then + begin + def:=nil; + { parse the type and assign the const type to generictype } + single_type(def,[]); + for i:=const_list_index to result.count-1 do + begin + { finalize constant information once type is known } + if assigned(def) and (def.typ in tgeneric_param_const_types) then + begin + case def.typ of + orddef, + enumdef: + tconstsym(result[i]).consttyp:=constord; + stringdef: + tconstsym(result[i]).consttyp:=conststring; + floatdef: + tconstsym(result[i]).consttyp:=constreal; + setdef: + tconstsym(result[i]).consttyp:=constset; + { pointer always refers to nil with constants } + pointerdef: + tconstsym(result[i]).consttyp:=constnil; + else + internalerror(2020011402); + end; + tconstsym(result[i]).constdef:=def; + end + else + Message1(type_e_generic_const_type_not_allowed,def.fulltypename); + end; + { after type restriction const list terminates } + is_const:=false; + end + { type restriction } + else if try_to_consume(_COLON) then begin if not allowconstraints then Message(parser_e_generic_constraints_not_allowed_here); @@ -1302,6 +1558,7 @@ uses basedef:=cobjectdef.create(tobjectdef(def).objecttype,defname,tobjectdef(def),false); constraintdata.interfaces.delete(0); end; + if basedef.typ<>errordef then with tstoreddef(basedef) do begin @@ -1328,21 +1585,34 @@ uses begin { two different typeless parameters are considered as incompatible } for i:=firstidx to result.count-1 do - begin - ttypesym(result[i]).typedef:=cundefineddef.create(false); - ttypesym(result[i]).typedef.typesym:=ttypesym(result[i]); - end; + if tsym(result[i]).typ<>constsym then + begin + ttypesym(result[i]).typedef:=cundefineddef.create(false); + ttypesym(result[i]).typedef.typesym:=ttypesym(result[i]); + end; { a semicolon terminates a type parameter group } firstidx:=result.count; end; end; + if token=_SEMICOLON then + begin + is_const:=false; + allowconst:=true; + end; + last_token:=token; + last_type_pos:=current_filepos; until not (try_to_consume(_COMMA) or try_to_consume(_SEMICOLON)); + { if the constant parameter is not terminated then the type restriction was + not specified and we need to give an error } + if is_const then + consume(_COLON); { two different typeless parameters are considered as incompatible } for i:=firstidx to result.count-1 do - begin - ttypesym(result[i]).typedef:=cundefineddef.create(false); - ttypesym(result[i]).typedef.typesym:=ttypesym(result[i]); - end; + if tsym(result[i]).typ<>constsym then + begin + ttypesym(result[i]).typedef:=cundefineddef.create(false); + ttypesym(result[i]).typedef.typesym:=ttypesym(result[i]); + end; block_type:=old_block_type; end; @@ -1350,7 +1620,9 @@ uses procedure insert_generic_parameter_types(def:tstoreddef;genericdef:tstoreddef;genericlist:tfphashobjectlist); var i : longint; - generictype,sym : ttypesym; + generictype : tstoredsym; + generictypedef : tdef; + sym : tsym; st : tsymtable; begin def.genericdef:=genericdef; @@ -1375,10 +1647,23 @@ uses def.genericparas:=tfphashobjectlist.create(false); for i:=0 to genericlist.count-1 do begin - generictype:=ttypesym(genericlist[i]); + generictype:=tstoredsym(genericlist[i]); if assigned(generictype.owner) then begin - sym:=ctypesym.create(genericlist.nameofindex(i),generictype.typedef); + if generictype.typ=typesym then + sym:=ctypesym.create(genericlist.nameofindex(i),ttypesym(generictype).typedef) + else if generictype.typ=constsym then + { generictype is a constsym that was created in create_generic_constsym + during phase 1 so we pass this directly without copying } + begin + sym:=generictype; + { the sym name is still undefined so we set it to match + the generic param name so it's accessible } + sym.realname:=genericlist.nameofindex(i); + include(sym.symoptions,sp_generic_const); + end + else + internalerror(2019021602); { type parameters need to be added as strict private } sym.visibility:=vis_strictprivate; st.insert(sym); @@ -1386,13 +1671,17 @@ uses end else begin - if (generictype.typedef.typ=undefineddef) and (generictype.typedef<>cundefinedtype) then + if generictype.typ=typesym then begin - { the generic parameters were parsed before the genericdef existed thus the - undefineddefs were added as part of the parent symtable } - if assigned(generictype.typedef.owner) then - generictype.typedef.owner.DefList.Extract(generictype.typedef); - generictype.typedef.changeowner(st); + generictypedef:=ttypesym(generictype).typedef; + if (generictypedef.typ=undefineddef) and (generictypedef<>cundefinedtype) then + begin + { the generic parameters were parsed before the genericdef existed thus the + undefineddefs were added as part of the parent symtable } + if assigned(generictypedef.owner) then + generictypedef.owner.DefList.Extract(generictypedef); + generictypedef.changeowner(st); + end; end; st.insert(generictype); include(generictype.symoptions,sp_generic_para); diff --git a/compiler/pparautl.pas b/compiler/pparautl.pas index b61173d50c..936806b141 100644 --- a/compiler/pparautl.pas +++ b/compiler/pparautl.pas @@ -631,27 +631,48 @@ implementation function check_generic_parameters(fwpd,currpd:tprocdef):boolean; var i : longint; - fwtype, - currtype : ttypesym; + fwsym, + currsym : tsym; + currtype : ttypesym absolute currsym; + fileinfo : tfileposinfo; begin result:=true; if fwpd.genericparas.count<>currpd.genericparas.count then internalerror(2018090101); for i:=0 to fwpd.genericparas.count-1 do begin - fwtype:=ttypesym(fwpd.genericparas[i]); - currtype:=ttypesym(currpd.genericparas[i]); - if fwtype.name<>currtype.name then + fwsym:=tsym(fwpd.genericparas[i]); + currsym:=tsym(currpd.genericparas[i]); + if fwsym.name<>currsym.name then begin - messagepos1(currtype.fileinfo,sym_e_generic_type_param_mismatch,currtype.realname); - messagepos1(fwtype.fileinfo,sym_e_generic_type_param_decl,fwtype.realname); + messagepos1(currsym.fileinfo,sym_e_generic_type_param_mismatch,currsym.realname); + messagepos1(fwsym.fileinfo,sym_e_generic_type_param_decl,fwsym.realname); result:=false; end; - if (fwpd.interfacedef or assigned(fwpd.struct)) and (df_genconstraint in currtype.typedef.defoptions) then + if (fwpd.interfacedef or assigned(fwpd.struct)) and + ( + ((currsym.typ=typesym) and (df_genconstraint in currtype.typedef.defoptions)) or + (currsym.typ=constsym) + ) then begin - messagepos(tstoreddef(currtype.typedef).genconstraintdata.fileinfo,parser_e_generic_constraints_not_allowed_here); + if currsym.typ=constsym then + fileinfo:=currsym.fileinfo + else + fileinfo:=tstoreddef(currtype.typedef).genconstraintdata.fileinfo; + messagepos(fileinfo,parser_e_generic_constraints_not_allowed_here); result:=false; end; + if not fwpd.interfacedef and not assigned(fwpd.struct) and + (fwsym.typ=constsym) then + begin + { without modeswitch RepeatForward we need to check here + if the type of the constants match } + if (currsym.typ<>constsym) or not equal_defs(tconstsym(fwsym).constdef,tconstsym(currsym).constdef) then + begin + messagepos1(currpd.fileinfo,parser_e_header_dont_match_forward,currpd.fullprocname(false)); + result:=false; + end; + end; end; end; @@ -659,8 +680,10 @@ implementation function equal_generic_procdefs(fwpd,currpd:tprocdef):boolean; var i : longint; - fwtype, - currtype : ttypesym; + fwsym, + currsym : tsym; + fwtype : ttypesym absolute fwsym; + currtype : ttypesym absolute currsym; foundretdef : boolean; begin result:=false; @@ -677,14 +700,36 @@ implementation foundretdef:=false; for i:=0 to fwpd.genericparas.count-1 do begin - fwtype:=ttypesym(fwpd.genericparas[i]); - currtype:=ttypesym(currpd.genericparas[i]); + fwsym:=tsym(fwpd.genericparas[i]); + currsym:=tsym(currpd.genericparas[i]); { if the type in the currpd isn't a pure undefineddef (thus there are constraints and the fwpd was declared in the interface, then we can stop right there } - if fwpd.interfacedef and ((currtype.typedef.typ<>undefineddef) or (df_genconstraint in currtype.typedef.defoptions)) then + if fwpd.interfacedef and + ( + (currsym.typ=constsym) or + ((currsym.typ=typesym) and + ( + (currtype.typedef.typ<>undefineddef) or + (df_genconstraint in currtype.typedef.defoptions) + ) + ) + )then exit; - if not foundretdef then + if not fwpd.interfacedef then + begin + if (fwsym.typ=constsym) and (currsym.typ=constsym) then + begin + { check whether the constant type for forward functions match } + if not equal_defs(tconstsym(fwsym).constdef,tconstsym(currsym).constdef) then + exit; + end + else if (fwsym.typ=constsym) then + { if the forward sym is a constant, the implementation needs to be one + as well } + exit; + end; + if not foundretdef and (fwsym.typ=typesym) then begin { if the returndef is the same as this parameter's def then this needs to be the case for both procdefs } diff --git a/compiler/ppu.pas b/compiler/ppu.pas index 2fc15500d2..49c6e47647 100644 --- a/compiler/ppu.pas +++ b/compiler/ppu.pas @@ -50,7 +50,7 @@ const CurrentPPUVersion = 207; { for any other changes to the ppu format, increase this version number (it's a cardinal) } - CurrentPPULongVersion = 8; + CurrentPPULongVersion = 9; { unit flags } uf_big_endian = $000004; diff --git a/compiler/pstatmnt.pas b/compiler/pstatmnt.pas index ed9a3c9005..d81e151821 100644 --- a/compiler/pstatmnt.pas +++ b/compiler/pstatmnt.pas @@ -361,7 +361,9 @@ implementation procedure check_range(hp:tnode; fordef: tdef); begin if (hp.nodetype=ordconstn) and - (fordef.typ<>errordef) then + (fordef.typ<>errordef) and + { the node was derived from a generic parameter so ignore range check } + not(nf_generic_para in hp.flags) then adaptrange(fordef,tordconstnode(hp).value,false,false,true); end; diff --git a/compiler/ptype.pas b/compiler/ptype.pas index ab3db2b048..86e7dff317 100644 --- a/compiler/ptype.pas +++ b/compiler/ptype.pas @@ -1316,6 +1316,7 @@ implementation procedure array_dec(is_packed:boolean;genericdef:tstoreddef;genericlist:tfphashobjectlist); var + isgeneric : boolean; lowval, highval : TConstExprInt; indexdef : tdef; @@ -1362,6 +1363,7 @@ implementation lowval:=0; highval:=1; indexdef:=def; + isgeneric:=true; end; else Message(sym_e_error_in_type_def); @@ -1409,6 +1411,7 @@ implementation begin { defaults } indexdef:=generrordef; + isgeneric:=false; { use defaults which don't overflow the compiler } lowval:=0; highval:=0; @@ -1424,12 +1427,15 @@ implementation else begin pt:=expr(true); + isgeneric:=false; if pt.nodetype=typen then setdefdecl(pt.resultdef) else begin if pt.nodetype=rangen then begin + if nf_generic_para in pt.flags then + isgeneric:=true; { pure ordconstn expressions can be checked for generics as well, but don't give an error in case of parsing a generic if that isn't yet the case } @@ -1446,7 +1452,9 @@ implementation highval:=tordconstnode(trangenode(pt).right).value; if highval<lowval then begin - Message(parser_e_array_lower_less_than_upper_bound); + { ignore error if node is generic param } + if not (nf_generic_para in pt.flags) then + Message(parser_e_array_lower_less_than_upper_bound); highval:=lowval; end else if (lowval<int64(low(asizeint))) or @@ -1494,6 +1502,8 @@ implementation end; if is_packed then include(arrdef.arrayoptions,ado_IsBitPacked); + if isgeneric then + include(arrdef.arrayoptions,ado_IsGeneric); if token=_COMMA then consume(_COMMA) diff --git a/compiler/symconst.pas b/compiler/symconst.pas index 08951b97ca..116b70883a 100644 --- a/compiler/symconst.pas +++ b/compiler/symconst.pas @@ -212,8 +212,9 @@ type generic is encountered to ease inline specializations, etc; those symbols can be "overridden" with a completely different symbol } - sp_explicitrename { this is used to keep track of type renames created + sp_explicitrename, { this is used to keep track of type renames created by the user } + sp_generic_const ); tsymoptions=set of tsymoption; @@ -241,7 +242,10 @@ type { internal def that's not for any export } df_internal, { the local def is referenced from a public function } - df_has_global_ref + df_has_global_ref, + { the def was derived with generic type or const fields so the size + of the def can not be determined } + df_has_generic_fields ); tdefoptions=set of tdefoption; @@ -567,7 +571,8 @@ type ado_IsArrayOfConst, // array of const ado_IsConstString, // string constant ado_IsBitPacked, // bitpacked array - ado_IsVector // Vector + ado_IsVector, // Vector + ado_IsGeneric // the index of the array is generic (meaning that the size is not yet known) ); tarraydefoptions=set of tarraydefoption; diff --git a/compiler/symdef.pas b/compiler/symdef.pas index a07584ab0a..2d0543bc0d 100644 --- a/compiler/symdef.pas +++ b/compiler/symdef.pas @@ -175,6 +175,9 @@ interface function is_generic:boolean; { same as above for specializations } function is_specialization:boolean; + { generic utilities } + function is_generic_param_const(index:integer):boolean;inline; + function get_generic_param_def(index:integer):tdef;inline; { registers this def in the unit's deflist; no-op if already registered } procedure register_def; override; { add the def to the top of the symtable stack if it's not yet owned @@ -2407,14 +2410,32 @@ implementation for i:=0 to genericparas.count-1 do begin sym:=tsym(genericparas[i]); - if sym.typ<>symconst.typesym then + { sym must be either a type or const } + if not (sym.typ in [symconst.typesym,symconst.constsym]) then internalerror(2014050903); if sym.owner.defowner<>self then exit(false); + if (sym.typ=symconst.constsym) and (sp_generic_const in sym.symoptions) then + exit(false); end; end; + function tstoreddef.is_generic_param_const(index:integer):boolean; + begin + result:=tsym(genericparas[index]).typ=constsym; + end; + + + function tstoreddef.get_generic_param_def(index:integer):tdef; + begin + if tsym(genericparas[index]).typ=constsym then + result:=tconstsym(genericparas[index]).constdef + else + result:=ttypesym(genericparas[index]).typedef; + end; + + function tstoreddef.is_specialization: boolean; var i : longint; @@ -2430,10 +2451,13 @@ implementation for i:=0 to genericparas.count-1 do begin sym:=tsym(genericparas[i]); - if sym.typ<>symconst.typesym then + { sym must be either a type or const } + if not (sym.typ in [symconst.typesym,symconst.constsym]) then internalerror(2014050904); if sym.owner.defowner<>self then exit(true); + if (sym.typ=symconst.constsym) and (sp_generic_const in sym.symoptions) then + exit(true); end; result:=false; end; @@ -4179,7 +4203,7 @@ implementation ppufile.getderef(rangedefderef); lowrange:=ppufile.getasizeint; highrange:=ppufile.getasizeint; - ppufile.getset(tppuset1(arrayoptions)); + ppufile.getset(tppuset2(arrayoptions)); ppuload_platform(ppufile); symtable:=tarraysymtable.create(self); tarraysymtable(symtable).ppuload(ppufile) @@ -4219,7 +4243,7 @@ implementation ppufile.putderef(rangedefderef); ppufile.putasizeint(lowrange); ppufile.putasizeint(highrange); - ppufile.putset(tppuset1(arrayoptions)); + ppufile.putset(tppuset2(arrayoptions)); writeentry(ppufile,ibarraydef); tarraysymtable(symtable).ppuwrite(ppufile); end; @@ -4339,6 +4363,7 @@ implementation (ado_IsDynamicArray in arrayoptions) or (ado_IsConvertedPointer in arrayoptions) or (ado_IsConstructor in arrayoptions) or + (ado_IsGeneric in arrayoptions) or (highrange<lowrange) ) and (size=-1) then @@ -4543,7 +4568,8 @@ implementation fullparas, paramname : ansistring; module : tmodule; - sym : ttypesym; + sym : tsym; + def : tdef; i : longint; begin { we want at least enough space for an ellipsis } @@ -4552,15 +4578,21 @@ implementation fullparas:=''; for i:=0 to genericparas.count-1 do begin - sym:=ttypesym(genericparas[i]); + sym:=tsym(genericparas[i]); module:=find_module_from_symtable(sym.owner); if not assigned(module) then internalerror(2014121202); + if not (sym.typ in [constsym,symconst.typesym]) then + internalerror(2020042501); + if sym.typ=constsym then + def:=tconstsym(sym).constdef + else + def:=ttypesym(sym).typedef; paramname:=module.realmodulename^; - if sym.typedef.typ in [objectdef,recorddef] then - paramname:=paramname+'.'+tabstractrecorddef(sym.typedef).rttiname + if def.typ in [objectdef,recorddef] then + paramname:=paramname+'.'+tabstractrecorddef(def).rttiname else - paramname:=paramname+'.'+sym.typedef.typename; + paramname:=paramname+'.'+def.typename; if length(fullparas)+commacount[i>0]+length(paramname)>maxlength then begin if i>0 then @@ -5958,7 +5990,7 @@ implementation if AValue then include(implprocoptions,pio_empty) else - include(implprocoptions,pio_empty); + exclude(implprocoptions,pio_empty); end; diff --git a/compiler/symsym.pas b/compiler/symsym.pas index 30f6a10f14..66674b21fa 100644 --- a/compiler/symsym.pas +++ b/compiler/symsym.pas @@ -401,6 +401,7 @@ interface constructor create_ptr(const n : string;t : tconsttyp;v : pointer;def:tdef);virtual; constructor create_string(const n : string;t : tconsttyp;str:pchar;l:longint;def:tdef);virtual; constructor create_wstring(const n : string;t : tconsttyp;pw:pcompilerwidestring);virtual; + constructor create_undefined(const n : string;def:tdef);virtual; constructor ppuload(ppufile:tcompilerppufile); destructor destroy;override; procedure buildderef;override; @@ -491,6 +492,8 @@ interface procedure check_hints(const srsym: tsym; const symoptions: tsymoptions; const deprecatedmsg : pshortstring);inline; procedure check_hints(const srsym: tsym; const symoptions: tsymoptions; const deprecatedmsg : pshortstring;filepos:tfileposinfo); + function same_constvalue(consttyp:tconsttyp;const value1,value2:tconstvalue):boolean; + implementation uses @@ -528,6 +531,30 @@ implementation end; + function same_constvalue(consttyp:tconsttyp;const value1,value2:tconstvalue):boolean; + begin + case consttyp of + constnone, + constnil: + result:=true; + constord: + result:=value1.valueord=value2.valueord; + constpointer: + result:=value1.valueordptr=value2.valueordptr; + conststring, + constreal, + constset, + constresourcestring, + constwstring, + constguid: begin + if value1.len<>value2.len then + exit(false); + result:=CompareByte(value1.valueptr^,value2.valueptr^,value1.len)=0; + end; + end; + end; + + procedure check_hints(const srsym: tsym; const symoptions: tsymoptions; const deprecatedmsg : pshortstring); begin check_hints(srsym,symoptions,deprecatedmsg,current_filepos); @@ -1618,7 +1645,6 @@ implementation tparasymtable(parast).ppuwrite(ppufile); end; - {**************************************************************************** TABSTRACTVARSYM ****************************************************************************} @@ -2426,6 +2452,15 @@ implementation end; + constructor tconstsym.create_undefined(const n : string;def: tdef); + begin + inherited create(constsym,n); + fillchar(value,sizeof(value),#0); + consttyp:=constnone; + constdef:=def; + end; + + constructor tconstsym.ppuload(ppufile:tcompilerppufile); var pd : pbestreal; @@ -2509,8 +2544,7 @@ implementation destructor tconstsym.destroy; begin case consttyp of - constnone: - internalerror(2019050703); + constnone, constord, constpointer, constnil: diff --git a/compiler/systems.pas b/compiler/systems.pas index d898dfea03..d4430804fd 100644 --- a/compiler/systems.pas +++ b/compiler/systems.pas @@ -1147,7 +1147,14 @@ begin {$endif riscv64} {$ifdef xtensa} + {$ifdef linux} + {$define default_target_set} + default_target(system_xtensa_linux); + {$endif} + + {$ifndef default_target_set} default_target(system_xtensa_embedded); + {$endif ndef default_target_set} {$endif xtensa} end; diff --git a/compiler/utils/ppuutils/ppudump.pp b/compiler/utils/ppuutils/ppudump.pp index 39412e730f..08a7e8b7cb 100644 --- a/compiler/utils/ppuutils/ppudump.pp +++ b/compiler/utils/ppuutils/ppudump.pp @@ -1687,7 +1687,8 @@ const (mask:sp_generic_para; str:'Generic Parameter'), (mask:sp_has_deprecated_msg; str:'Has Deprecated Message'), (mask:sp_generic_dummy; str:'Generic Dummy'), - (mask:sp_explicitrename; str:'Explicit Rename') + (mask:sp_explicitrename; str:'Explicit Rename'), + (mask:sp_generic_const; str:'Generic Constant Parameter') ); var symoptions : tsymoptions; @@ -2743,7 +2744,8 @@ const (mask:df_not_registered_no_free; str:'Unregistered/No free (invalid)'), (mask:df_llvm_no_struct_packing; str:'LLVM unpacked struct'), (mask:df_internal; str:'Internal'), - (mask:df_has_global_ref; str:'Has Global Ref') + (mask:df_has_global_ref; str:'Has Global Ref'), + (mask:df_has_generic_fields; str:'Has generic fields') ); defstate : array[1..ord(high(tdefstate))] of tdefstateinfo=( (mask:ds_vmt_written; str:'VMT Written'), @@ -3267,14 +3269,15 @@ const { ado_IsArrayOfConst } 'ArrayOfConst', { ado_IsConstString } 'ConstString', { ado_IsBitPacked } 'BitPacked', - { ado_IsVector } 'Vector' + { ado_IsVector } 'Vector', + { ado_IsGeneric } 'Generic' ); var symoptions: tarraydefoptions; i: tarraydefoption; first: boolean; begin - ppufile.getset(tppuset1(symoptions)); + ppufile.getset(tppuset2(symoptions)); if symoptions<>[] then begin if ado_IsDynamicArray in symoptions then Include(ArrayDef.Options, aoDynamic); diff --git a/compiler/version.pas b/compiler/version.pas index 662a8b8373..22641b765a 100644 --- a/compiler/version.pas +++ b/compiler/version.pas @@ -80,6 +80,9 @@ interface {$ifdef cpuriscv32} source_cpu_string = 'riscv32'; {$endif cpuriscv32} +{$ifdef cpuxtensa} + source_cpu_string = 'xtensa'; +{$endif cpuxtensa} function version_string:string; function full_version_string:string; diff --git a/compiler/xtensa/agcpugas.pas b/compiler/xtensa/agcpugas.pas index 07defa4607..ad54b48abf 100644 --- a/compiler/xtensa/agcpugas.pas +++ b/compiler/xtensa/agcpugas.pas @@ -173,7 +173,7 @@ unit agcpugas; idtxt : 'AS'; asmbin : 'as'; asmcmd : '-o $OBJ $EXTRAOPT $ASM --longcalls'; - supported_targets : [system_xtensa_embedded]; + supported_targets : [system_xtensa_embedded,system_xtensa_linux,system_xtensa_freertos]; flags : [af_needar,af_smartlink_sections,af_supports_dwarf,af_stabs_use_function_absolute_addresses]; labelprefix : '.L'; labelmaxlen : -1; diff --git a/packages/fcl-passrc/src/pasresolver.pp b/packages/fcl-passrc/src/pasresolver.pp index 35fcebfe60..13b804b252 100644 --- a/packages/fcl-passrc/src/pasresolver.pp +++ b/packages/fcl-passrc/src/pasresolver.pp @@ -431,7 +431,8 @@ const btArrayRangeTypes = btAllChars+btAllBooleans+btAllInteger; btAllRanges = btArrayRangeTypes+[btRange]; btAllWithSubType = [btSet, btArrayLit, btArrayOrSet, btRange]; - btAllStandardTypes = [ + btAllIntrinsicTypes = btAllInteger+btAllStringAndChars+btAllFloats+btAllBooleans; + btAllFPCTypes = [ btChar, {$ifdef FPC_HAS_CPSTRING} btAnsiChar, @@ -2080,7 +2081,7 @@ type // built in types and functions procedure ClearBuiltInIdentifiers; virtual; procedure AddObjFPCBuiltInIdentifiers( - const TheBaseTypes: TResolveBaseTypes = btAllStandardTypes; + const TheBaseTypes: TResolveBaseTypes = btAllFPCTypes; const TheBaseProcs: TResolverBuiltInProcs = bfAllStandardProcs); virtual; function AddBaseType(const aName: string; Typ: TResolverBaseType): TResElDataBaseType; function AddCustomBaseType(const aName: string; aClass: TResElDataBaseTypeClass): TPasUnresolvedSymbolRef; @@ -10435,7 +10436,7 @@ begin end; end; // default: search for type helpers - if (LeftResolved.BaseType in btAllStandardTypes) + if (LeftResolved.BaseType in btAllIntrinsicTypes) or (LeftResolved.BaseType=btContext) or (LeftResolved.BaseType=btCustom) then begin @@ -22038,7 +22039,7 @@ begin if LoType=nil then RaiseMsg(20170216152004,nExprTypeMustBeClassOrRecordTypeGot,sExprTypeMustBeClassOrRecordTypeGot, [BaseTypeNames[ExprResolved.BaseType]],ErrorEl); - if (ExprResolved.BaseType in btAllStandardTypes) then + if (ExprResolved.BaseType in btAllIntrinsicTypes) then // ok else if (ExprResolved.BaseType=btContext) then // ok diff --git a/packages/libffi/src/ffi.pp b/packages/libffi/src/ffi.pp index fa41898ee2..2e6de0af0c 100644 --- a/packages/libffi/src/ffi.pp +++ b/packages/libffi/src/ffi.pp @@ -272,8 +272,8 @@ const FFI_TRAMPOLINE_SIZE = 20; {$elseif defined(CPUMIPS64)} FFI_TRAMPOLINE_SIZE = 56; -#endif - +{$elseif defined(CPUXTENSA)} + FFI_TRAMPOLINE_SIZE = 24; {$endif} { diff --git a/packages/os4units/src/clipboard.pas b/packages/os4units/src/clipboard.pas index 05f52c684c..c1a3f8e2fd 100644 --- a/packages/os4units/src/clipboard.pas +++ b/packages/os4units/src/clipboard.pas @@ -13,7 +13,7 @@ **********************************************************************} unit clipboard; - +{$PACKRECORDS 2} interface uses diff --git a/packages/pastojs/src/fppas2js.pp b/packages/pastojs/src/fppas2js.pp index d8410b96c7..2d319662b9 100644 --- a/packages/pastojs/src/fppas2js.pp +++ b/packages/pastojs/src/fppas2js.pp @@ -15106,42 +15106,39 @@ begin ClassPath:=CreateReferencePath(ProcScope.ClassRecScope.Element,AContext,rpkPathAndName); Call.AddArg(CreatePrimitiveDotExpr(ClassPath,PosEl)); end; - if (ImplProc.Body.Functions.Count>0) - or aResolver.HasAnonymousFunctions(ImplProc.Body.Body) then - begin - // has nested procs -> add "var self = this;" - FuncContext.AddLocalVar(GetBIName(pbivnSelf),ThisPas); - SelfSt:=CreateVarStatement(GetBIName(pbivnSelf), - CreatePrimitiveDotExpr('this',ImplProc),ImplProc); - AddBodyStatement(SelfSt,PosEl); - if ImplProcScope.SelfArg<>nil then - begin - // redirect Pascal-Self to JS-Self - FuncContext.AddLocalVar(GetBIName(pbivnSelf),ImplProcScope.SelfArg); - end; - end - else if ImplProcScope.SelfArg<>nil then - begin - // no nested procs -> redirect Pascal-Self to JS-this - FuncContext.AddLocalVar('this',ImplProcScope.SelfArg); - end; end else begin - // no "this" + // "this" has no direct Pascal element if ProcScope.ClassRecScope<>nil then begin - // static method -> hide local + // static method ClassOrRec:=ProcScope.ClassRecScope.Element; LocalVar:=FuncContext.FindLocalIdentifier(ClassOrRec); if (LocalVar<>nil) and (LocalVar.Name='this') then + // "this" is not the class -> hide it (absolute path will be used) FuncContext.AddLocalVar(LocalVarHide,ClassOrRec); end; + end; + if (ImplProc.Body.Functions.Count>0) + or aResolver.HasAnonymousFunctions(ImplProc.Body.Body) then + begin + // has nested procs -> add "var $Self = this;" + if ThisPas<>nil then + FuncContext.AddLocalVar(GetBIName(pbivnSelf),ThisPas); + SelfSt:=CreateVarStatement(GetBIName(pbivnSelf), + CreatePrimitiveDotExpr('this',ImplProc),ImplProc); + AddBodyStatement(SelfSt,PosEl); if ImplProcScope.SelfArg<>nil then begin - // no nested procs -> redirect Pascal-Self to JS-this - FuncContext.AddLocalVar('this',ImplProcScope.SelfArg); + // redirect Pascal-Self to JS-Self + FuncContext.AddLocalVar(GetBIName(pbivnSelf),ImplProcScope.SelfArg); end; + end + else if ImplProcScope.SelfArg<>nil then + begin + // no nested procs -> redirect Pascal-Self to JS-this + FuncContext.AddLocalVar('this',ImplProcScope.SelfArg); end; end; {$IFDEF VerbosePas2JS} diff --git a/packages/pastojs/tests/tcmodules.pas b/packages/pastojs/tests/tcmodules.pas index be2b4dc428..3ee8dbd111 100644 --- a/packages/pastojs/tests/tcmodules.pas +++ b/packages/pastojs/tests/tcmodules.pas @@ -702,12 +702,14 @@ type Procedure TestTypeHelper_Constructor; Procedure TestTypeHelper_Word; Procedure TestTypeHelper_Double; + Procedure TestTypeHelper_NativeInt; Procedure TestTypeHelper_StringChar; Procedure TestTypeHelper_JSValue; Procedure TestTypeHelper_Array; Procedure TestTypeHelper_EnumType; Procedure TestTypeHelper_SetType; Procedure TestTypeHelper_InterfaceType; + Procedure TestTypeHelper_NestedSelf; // proc types Procedure TestProcType; @@ -24090,6 +24092,99 @@ begin ''])); end; +procedure TTestModule.TestTypeHelper_NativeInt; +begin + StartProgram(false); + Add([ + '{$modeswitch typehelpers}', + 'type', + ' MaxInt = type nativeint;', + ' THelperI = type helper for MaxInt', + ' function ToStr: String;', + ' end;', + ' MaxUInt = type nativeuint;', + ' THelperU = type helper for MaxUInt', + ' function ToStr: String;', + ' end;', + 'function THelperI.ToStr: String;', + 'begin', + ' Result:=str(Self);', + 'end;', + 'function THelperU.ToStr: String;', + 'begin', + ' Result:=str(Self);', + 'end;', + 'procedure DoIt(s: string);', + 'begin', + 'end;', + 'var i: MaxInt;', + 'begin', + ' DoIt(i.toStr);', + ' DoIt(i.toStr());', + ' (i*i).toStr;', + ' DoIt((i*i).toStr);', + '']); + ConvertProgram; + CheckSource('TestTypeHelper_NativeInt', + LinesToStr([ // statements + 'rtl.createHelper($mod, "THelperI", null, function () {', + ' this.ToStr = function () {', + ' var Result = "";', + ' Result = "" + this.get();', + ' return Result;', + ' };', + '});', + 'rtl.createHelper($mod, "THelperU", null, function () {', + ' this.ToStr = function () {', + ' var Result = "";', + ' Result = "" + this.get();', + ' return Result;', + ' };', + '});', + 'this.DoIt = function (s) {', + '};', + 'this.i = 0;', + '']), + LinesToStr([ // $mod.$main + '$mod.DoIt($mod.THelperI.ToStr.call({', + ' p: $mod,', + ' get: function () {', + ' return this.p.i;', + ' },', + ' set: function (v) {', + ' this.p.i = v;', + ' }', + '}));', + '$mod.DoIt($mod.THelperI.ToStr.call({', + ' p: $mod,', + ' get: function () {', + ' return this.p.i;', + ' },', + ' set: function (v) {', + ' this.p.i = v;', + ' }', + '}));', + '$mod.THelperI.ToStr.call({', + ' a: $mod.i * $mod.i,', + ' get: function () {', + ' return this.a;', + ' },', + ' set: function (v) {', + ' rtl.raiseE("EPropReadOnly");', + ' }', + '});', + '$mod.DoIt($mod.THelperI.ToStr.call({', + ' a: $mod.i * $mod.i,', + ' get: function () {', + ' return this.a;', + ' },', + ' set: function (v) {', + ' rtl.raiseE("EPropReadOnly");', + ' }', + '}));', + ''])); +end; + procedure TTestModule.TestTypeHelper_StringChar; begin StartProgram(false); @@ -24597,6 +24692,44 @@ begin ''])); end; +procedure TTestModule.TestTypeHelper_NestedSelf; +begin + StartProgram(false); + Add([ + '{$modeswitch typehelpers}', + 'type', + ' THelper = type helper for string', + ' procedure Run(Value: string);', + ' end;', + 'procedure THelper.Run(Value: string);', + ' function Sub(i: nativeint): boolean;', + ' begin', + ' Result:=Self[i+1]=Value[i];', + ' end;', + 'begin', + ' if Self[3]=Value[4] then ;', + 'end;', + 'begin', + '']); + ConvertProgram; + CheckSource('TestTypeHelper_NestedSelf', + LinesToStr([ // statements + 'rtl.createHelper($mod, "THelper", null, function () {', + ' this.Run = function (Value) {', + ' var $Self = this;', + ' function Sub(i) {', + ' var Result = false;', + ' Result = $Self.get().charAt((i + 1) - 1) === Value.charAt(i - 1);', + ' return Result;', + ' };', + ' if ($Self.get().charAt(2) === Value.charAt(3)) ;', + ' };', + '});', + '']), + LinesToStr([ // $mod.$main + ''])); +end; + procedure TTestModule.TestProcType; begin StartProgram(false); diff --git a/packages/rtl-console/src/amicommon/video.pp b/packages/rtl-console/src/amicommon/video.pp index 502cfe93c1..4ea60eb1ab 100644 --- a/packages/rtl-console/src/amicommon/video.pp +++ b/packages/rtl-console/src/amicommon/video.pp @@ -584,11 +584,11 @@ begin SmallForce or ForceCursorUpdate then begin {$ifdef WITHBUFFERING} - DrawChar(BufRp, OldCursorY, OldCursorX, crHidden); - if CursorState then DrawChar(BufRp, CursorY, CursorX, CursorType); + DrawChar(BufRp, OldCursorX, OldCursorY, crHidden); + if CursorState then DrawChar(BufRp, CursorX, CursorY, CursorType); {$else} - DrawChar(VideoWindow^.RPort, OldCursorY, OldCursorX, crHidden); - if CursorState then DrawChar(VideoWindow^.RPort, CursorY, CursorX, CursorType); + DrawChar(VideoWindow^.RPort, OldCursorX, OldCursorY, crHidden); + if CursorState then DrawChar(VideoWindow^.RPort, CursorX, CursorY, CursorType); {$endif} OldCursorX := CursorX; OldCursorY := CursorY; @@ -602,8 +602,8 @@ end; procedure SysSetCursorPos(NewCursorX, NewCursorY: Word); begin - CursorX := NewCursorY; - CursorY := NewCursorX; + CursorX := NewCursorX; + CursorY := NewCursorY; SysUpdateScreen(False); end; diff --git a/packages/rtl-extra/src/linux/unixsock.inc b/packages/rtl-extra/src/linux/unixsock.inc index 45a52dd33d..e86a4cf5c2 100644 --- a/packages/rtl-extra/src/linux/unixsock.inc +++ b/packages/rtl-extra/src/linux/unixsock.inc @@ -13,7 +13,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. } -{$if not defined(cpux86_64) and not defined(cpuaarch64) and not defined(cpuriscv32) and not defined(cpuriscv64) and not defined(NO_SYSCALL_SOCKETCALL)} +{$if not defined(cpux86_64) and not defined(cpuaarch64) and not defined(cpuriscv32) and not defined(cpuriscv64) and not defined(cpuxtensa) and not defined(NO_SYSCALL_SOCKETCALL)} {$define NEED_SOCKETCALL} {$endif} diff --git a/packages/rtl-extra/src/unix/ipc.pp b/packages/rtl-extra/src/unix/ipc.pp index 0daf1b0329..8b4367d038 100644 --- a/packages/rtl-extra/src/unix/ipc.pp +++ b/packages/rtl-extra/src/unix/ipc.pp @@ -546,7 +546,7 @@ type msg_lrpid : ipc_pid_t; pad1 : qword; pad2 : qword; -{$ENDIF} +{$ENDIF} end; {$else} {$if defined(Darwin)} @@ -888,7 +888,7 @@ uses Syscall; {$ifndef FPC_USE_LIBC} {$if defined(Linux)} - {$if defined(cpux86_64) or defined(cpuaarch64) or defined(cpuriscv32) or defined(cpuriscv64) or defined(NO_SYSCALL_IPC)} + {$if defined(cpux86_64) or defined(cpuaarch64) or defined(cpuriscv32) or defined(cpuriscv64) or defined(cpuxtensa) or defined(NO_SYSCALL_IPC)} {$i ipcsys.inc} {$else} {$i ipccall.inc} diff --git a/rtl/xtensa/setjump.inc b/rtl/xtensa/setjump.inc index 4e7123dcba..aff9a3cfce 100644 --- a/rtl/xtensa/setjump.inc +++ b/rtl/xtensa/setjump.inc @@ -14,13 +14,12 @@ **********************************************************************} -function fpc_setjmp(var S : jmp_buf) : longint;assembler;[Public, alias : 'FPC_SETJMP'];nostackframe; compilerproc; +function fpc_setjmp(var S : jmp_buf) : longint;assembler;[Public, alias : 'FPC_SETJMP']; compilerproc; asm + movi a2,0 end; procedure fpc_longjmp(var S : jmp_buf;value : longint);assembler;[Public, alias : 'FPC_LONGJMP']; compilerproc; asm end; - - diff --git a/tests/test/tgenconst1.pp b/tests/test/tgenconst1.pp new file mode 100644 index 0000000000..1cf3be5037 --- /dev/null +++ b/tests/test/tgenconst1.pp @@ -0,0 +1,39 @@ +{ %NORUN } +{$mode objfpc} +{ + test all possible constants +} +program tgenconst1; + +type + TEnums = (Blaise, Pascal); + kNames = set of TEnums; + kChars = set of char; + +type + generic TBoolean<const U: boolean> = record end; + generic TString<const U: string> = record end; + generic TFloat<const U: single> = record end; + generic TInteger<const U: integer> = record end; + generic TChar<const U: char> = record end; + generic TByte<const U: byte> = record end; + generic TQWord<const U: QWord> = record end; + generic TEnum<const U: TEnums> = record end; + generic TNames<const U: kNames> = record end; + generic TChars<const U: kChars> = record end; + generic TPointer<const U: pointer> = record end; + +var + a: specialize TBoolean<true>; + b: specialize TString<'string'>; + c: specialize TFloat<1>; + d: specialize TInteger<10>; + e: specialize TByte<255>; + f: specialize TChar<'a'>; + g: specialize TEnum<Pascal>; + h: specialize TNames<[Blaise,Pascal]>; + i: specialize TChars<['a','b']>; + j: specialize TQWord<10>; + k: specialize TPointer<nil>; +begin +end. diff --git a/tests/test/tgenconst10.pp b/tests/test/tgenconst10.pp new file mode 100644 index 0000000000..eecb0bf162 --- /dev/null +++ b/tests/test/tgenconst10.pp @@ -0,0 +1,14 @@ +{%FAIL} +{$mode objfpc} +{ + test type mismatch when specializing generic type with constant value +} +program tgenconst10; + +type + generic TByte<T> = record end; + +var + a: specialize TByte<10>; +begin +end. diff --git a/tests/test/tgenconst11.pp b/tests/test/tgenconst11.pp new file mode 100644 index 0000000000..5895fd00c7 --- /dev/null +++ b/tests/test/tgenconst11.pp @@ -0,0 +1,13 @@ +{%FAIL} +{$mode objfpc} +{ + test def compare fail with specialized types +} +program tgenconst11; +type + generic TConst<const U: integer> = class end; +var + a:specialize TConst<10>; +begin + a:=specialize TConst<'string'>.Create; +end
\ No newline at end of file diff --git a/tests/test/tgenconst12.pp b/tests/test/tgenconst12.pp new file mode 100644 index 0000000000..24fa5c802e --- /dev/null +++ b/tests/test/tgenconst12.pp @@ -0,0 +1,15 @@ +{ %NORUN } +{$mode objfpc} +{ + test def compare with specialized types +} +program tgenconst12; + +type + generic TTest<const U: integer> = class + end; + +type + ATest = specialize TTest<100>; +begin +end. diff --git a/tests/test/tgenconst13.pp b/tests/test/tgenconst13.pp new file mode 100644 index 0000000000..13235d1437 --- /dev/null +++ b/tests/test/tgenconst13.pp @@ -0,0 +1,51 @@ +{$mode objfpc} +{$modeswitch advancedrecords} +{ + test advanced record constants assigned from generic constant values +} +program tgenconst13; + +type + kNames = set of (Blaise,Pascal); + kChars = set of char; +type + generic TBoolean<const U: boolean> = record const value = U; end; + generic TString<const U: string> = record const value = U; end; + generic TFloat<const U: single> = record const value = U; end; + generic TInteger<const U: integer> = record const value = U; end; + generic TByte<const U: byte> = record const value = U; end; + generic TChar<const U: char> = record const value = U; end; + generic TQWord<const U: QWord> = record const value = U; end; + generic TNames<const U: kNames> = record const value = U; end; + generic TChars<const U: kChars> = record const value = U; end; + +procedure Test(failed: boolean); inline; +begin + if failed then + begin + writeln('failed!'); + halt(-1); + end; +end; + +var + g0: specialize TBoolean<true>; + g1: specialize TString<'string'>; + g2: specialize TFloat<10.5>; + g3: specialize TInteger<10>; + g4: specialize TByte<255>; + g5: specialize TChar<'a'>; + g6: specialize TQWord<1000000000>; + g7: specialize TNames<[Blaise,Pascal]>; + g8: specialize TChars<['a','b']>; +begin + Test(g0.value <> true); + Test(g1.value <> 'string'); + Test(g2.value <> 10.5); + Test(g3.value <> 10); + Test(g4.value <> 255); + Test(g5.value <> 'a'); + Test(g6.value <> 1000000000); + Test(g7.value <> [Blaise,Pascal]); + Test(g8.value <> ['a','b']); +end. diff --git a/tests/test/tgenconst14.pp b/tests/test/tgenconst14.pp new file mode 100644 index 0000000000..64e5af91b7 --- /dev/null +++ b/tests/test/tgenconst14.pp @@ -0,0 +1,42 @@ +{$mode objfpc} +{$modeswitch advancedrecords} +{ + test binary operators with generic constant params +} +program tgenconst14; + +type + generic TBinaryOp<const I: Integer> = record + const + d0 = I + I; + d1 = I - I; + d2 = I * I; + d3 = I / I; + d4 = I div I; + d5 = I mod I; + d6 = I and I; + d7 = I or I; + d8 = I shl 2; + d9 = I shr 2; + end; + +procedure Check(aExpected, aActual: Integer; aErrorCode: LongInt); +begin + if aExpected <> aActual then + Halt(aErrorCode); +end; + +var + op: specialize TBinaryOp<100>; +begin + Check(op.d0, 100 + 100, 1); + Check(op.d1, 100 - 100, 2); + Check(op.d2, 100 * 100, 3); + Check(Trunc(op.d3), Trunc(100 / 100), 4); + Check(op.d4, 100 div 100, 5); + Check(op.d5, 100 mod 100, 6); + Check(op.d6, 100 and 100, 7); + Check(op.d7, 100 or 100, 8); + Check(op.d8, 100 shl 2, 9); + Check(op.d9, 100 shr 2, 10); +end. diff --git a/tests/test/tgenconst15.pp b/tests/test/tgenconst15.pp new file mode 100644 index 0000000000..5eea8571b4 --- /dev/null +++ b/tests/test/tgenconst15.pp @@ -0,0 +1,15 @@ +{%FAIL} +{$mode objfpc} +{$modeswitch advancedrecords} +{ + test binary operator error with wrong constant type +} +program tgenconst15; + +type + generic TInt<const I: string> = record + const c = I div I; + end; + +begin +end.
\ No newline at end of file diff --git a/tests/test/tgenconst16.pp b/tests/test/tgenconst16.pp new file mode 100644 index 0000000000..dcfa89df2f --- /dev/null +++ b/tests/test/tgenconst16.pp @@ -0,0 +1,79 @@ +{ %NORUN } +{$mode objfpc} +{$modeswitch advancedrecords} +{ + various operator tests +} +program tgenconst16; + +type + Day = (mon,tue,wed,thu,fri,sat,sun); + Days = set of Day; + generic TSet<const I: Days> = record + const + d0 = I + I; // Union + d1 = I - I; // Difference + d2 = I * I; // Intersection + d3 = I >< I; // Symmetric difference + d4 = I <= I; // Contains + d5 = mon in I; + end; + generic TArray<const I: integer> = record + type + t0 = array[0..I - 1] of integer; + t1 = array[0..high(I)] of integer; + t2 = array[0..low(I)] of integer; + t3 = array[0..sizeof(I)] of integer; + public + d0: array[0..I - 1] of integer; + d1: array[0..high(I)] of integer; + d2: array[0..low(I)] of integer; + d3: array[0..sizeof(I)] of integer; + end; + generic TUnaryOp<const I: integer> = record + const + d0 = -I; + d1 = +I; + d2 = not I; + end; + generic TBinaryOp<const I: integer> = record + const + // Arithmetic operators + // https://freepascal.org/docs-html/ref/refsu45.html + d0 = I + I; + d1 = I - I; + d2 = I * I; + d3 = I / I; + d4 = I div I; + d5 = I mod I; + // Boolean operators + // https://freepascal.org/docs-html/ref/refsu47.html + d6 = I and I; + d7 = I or I; + d8 = I xor I; + // Logical operators + // https://freepascal.org/docs-html/ref/refsu46.html + d9 = I shl I; + d10 = I shr I; + d11 = I << I; + d12 = I >> I; + // Relational operators + // https://freepascal.org/docs-html/ref/refsu50.html#x153-17500012.8.6 + d13 = I <> I; + d14 = I < I; + d15 = I > I; + d16 = I <= I; + d17 = I >= I; + d18 = I = I; + end; + generic TOther<const I: integer> = record + procedure DoThis(param: integer = I); + end; + +procedure TOther.DoThis(param: integer = I); +begin + writeln(param, ' default:', I); +end; + +begin +end. diff --git a/tests/test/tgenconst17.pp b/tests/test/tgenconst17.pp new file mode 100644 index 0000000000..ac91913e79 --- /dev/null +++ b/tests/test/tgenconst17.pp @@ -0,0 +1,27 @@ +{ %NORUN } +{$mode objfpc} +{$modeswitch advancedrecords} +{ + testing range checking for arrays and for-loops +} + +program tgenconst17; + +type + generic TStaticList<T; const Length: SizeUInt> = record + Values: array[0..Length - 1] of T; + procedure Display; + end; + +procedure TStaticList.Display; +var + I, n: SizeUInt; +begin + for I := 0 to Length - 1 do + WriteLn(Values[I]); +end; + +var + list: specialize TStaticList<Integer, 20>; +begin +end. diff --git a/tests/test/tgenconst18.pp b/tests/test/tgenconst18.pp new file mode 100644 index 0000000000..b539384759 --- /dev/null +++ b/tests/test/tgenconst18.pp @@ -0,0 +1,12 @@ +{%FAIL} +{$mode objfpc} +{ + test undefined constants which must be typed +} +program tgenconst18; + +type + generic TUndefined<const U> = record end; + +begin +end. diff --git a/tests/test/tgenconst19.pp b/tests/test/tgenconst19.pp new file mode 100644 index 0000000000..146e05416e --- /dev/null +++ b/tests/test/tgenconst19.pp @@ -0,0 +1,24 @@ +{ %NORUN } +unit tgenconst19; + +{$mode objfpc} + +interface + +generic procedure Test<const A, B: LongInt>; +generic procedure Test2<const A, B: LongInt>; + +implementation + +{ currently it does not matter whether , or ; is used in the definition (Delphi + compatible) } + +generic procedure Test<A, B>; +begin +end; + +generic procedure Test2<A; B>; +begin +end; + +end. diff --git a/tests/test/tgenconst2.pp b/tests/test/tgenconst2.pp new file mode 100644 index 0000000000..7189ca7195 --- /dev/null +++ b/tests/test/tgenconst2.pp @@ -0,0 +1,14 @@ +{ %NORUN } +{$mode objfpc} +{ + test lists of types/contants +} +program tgenconst2; + +type + generic TMoreThanOne<T1,T2;const U1,U2:integer> = record end; + +var + a: specialize TMoreThanOne<integer,string,10,10>; +begin +end. diff --git a/tests/test/tgenconst20.pp b/tests/test/tgenconst20.pp new file mode 100644 index 0000000000..26b36d6984 --- /dev/null +++ b/tests/test/tgenconst20.pp @@ -0,0 +1,24 @@ +{ %NORUN } +unit tgenconst20; + +{$mode delphi} + +interface + +procedure Test<const A, B: LongInt>; +procedure Test2<const A, B: LongInt>; + +implementation + +{ currently it does not matter whether , or ; is used in the definition (Delphi + compatible) } + +procedure Test<A, B>; +begin +end; + +procedure Test2<A; B>; +begin +end; + +end. diff --git a/tests/test/tgenconst21.pp b/tests/test/tgenconst21.pp new file mode 100644 index 0000000000..eae6248eee --- /dev/null +++ b/tests/test/tgenconst21.pp @@ -0,0 +1,16 @@ +unit tgenconst21; + +{$mode objfpc} + +interface + +implementation + +generic procedure Test<A; const N: LongInt>; forward; + +generic procedure Test<A; const N: LongInt>; +begin +end; + +end. + diff --git a/tests/test/tgenconst22.pp b/tests/test/tgenconst22.pp new file mode 100644 index 0000000000..433cc50492 --- /dev/null +++ b/tests/test/tgenconst22.pp @@ -0,0 +1,16 @@ +unit tgenconst22; + +{$mode delphi} + +interface + +implementation + +procedure Test<A; const N: LongInt>; forward; + +procedure Test<A; const N: LongInt>; +begin +end; + +end. + diff --git a/tests/test/tgenconst23.pp b/tests/test/tgenconst23.pp new file mode 100644 index 0000000000..2592ac32a7 --- /dev/null +++ b/tests/test/tgenconst23.pp @@ -0,0 +1,19 @@ +{ %FAIL } + +unit tgenconst23; + +{$mode objfpc} + +interface + +implementation + +generic procedure Test<A; const N: LongInt>; forward; + +generic procedure Test<A; const N: String>; +begin +end; + + +end. + diff --git a/tests/test/tgenconst24.pp b/tests/test/tgenconst24.pp new file mode 100644 index 0000000000..8e3c082e8b --- /dev/null +++ b/tests/test/tgenconst24.pp @@ -0,0 +1,19 @@ +{ %FAIL } + +unit tgenconst24; + +{$mode delphi} + +interface + +implementation + +procedure Test<A; const N: LongInt>; forward; + +procedure Test<A; const N: String>; +begin +end; + + +end. + diff --git a/tests/test/tgenconst25.pp b/tests/test/tgenconst25.pp new file mode 100644 index 0000000000..23897e78aa --- /dev/null +++ b/tests/test/tgenconst25.pp @@ -0,0 +1,18 @@ +{ %FAIL } + +unit tgenconst25; + +{$mode objfpc} + +interface + +implementation + +generic procedure Test<A; const N: LongInt>; forward; + +generic procedure Test<A; N>; +begin +end; + +end. + diff --git a/tests/test/tgenconst26.pp b/tests/test/tgenconst26.pp new file mode 100644 index 0000000000..629ce36b23 --- /dev/null +++ b/tests/test/tgenconst26.pp @@ -0,0 +1,18 @@ +{ %FAIL } + +unit tgenconst26; + +{$mode delphi} + +interface + +implementation + +procedure Test<A; const N: LongInt>; forward; + +procedure Test<A; N>; +begin +end; + +end. + diff --git a/tests/test/tgenconst27.pp b/tests/test/tgenconst27.pp new file mode 100644 index 0000000000..f31725d5b9 --- /dev/null +++ b/tests/test/tgenconst27.pp @@ -0,0 +1,17 @@ +{ %FAIL } + +unit tgenconst27; + +{$mode objfpc} + +interface + +generic procedure Test<const A: LongInt>; + +implementation + +generic procedure Test<const A: LongInt>; +begin +end; + +end. diff --git a/tests/test/tgenconst28.pp b/tests/test/tgenconst28.pp new file mode 100644 index 0000000000..56bb48f987 --- /dev/null +++ b/tests/test/tgenconst28.pp @@ -0,0 +1,17 @@ +{ %FAIL } + +unit tgenconst28; + +{$mode delphi} + +interface + +procedure Test<const A: LongInt>; + +implementation + +procedure Test<const A: LongInt>; +begin +end; + +end. diff --git a/tests/test/tgenconst29.pp b/tests/test/tgenconst29.pp new file mode 100644 index 0000000000..0e235771df --- /dev/null +++ b/tests/test/tgenconst29.pp @@ -0,0 +1,14 @@ +{ %NORUN } +program tgenconst29; + +{$mode objfpc} + +type + TRange = 3..4; + + generic TTest<const U: TRange> = record end; + +var + t: specialize TTest<3>; +begin +end. diff --git a/tests/test/tgenconst3.pp b/tests/test/tgenconst3.pp new file mode 100644 index 0000000000..a85ede2169 --- /dev/null +++ b/tests/test/tgenconst3.pp @@ -0,0 +1,20 @@ +{ %NORUN } +{$mode objfpc} +{$modeswitch advancedrecords} +{ + test integer constants in static array ranges +} +program tgenconst3; + +type + generic TList<T;const U:integer> = record + const + max = U; + public + m_list: array[0..max-1] of T; + end; + +var + list: specialize TList<integer,128>; +begin +end. diff --git a/tests/test/tgenconst30.pp b/tests/test/tgenconst30.pp new file mode 100644 index 0000000000..07f3274dad --- /dev/null +++ b/tests/test/tgenconst30.pp @@ -0,0 +1,14 @@ +{ %FAIL } +program tgenconst30; + +{$mode objfpc} + +type + TRange = 3..4; + + generic TTest<const U: TRange> = record end; + +var + t: specialize TTest<2>; +begin +end. diff --git a/tests/test/tgenconst4.pp b/tests/test/tgenconst4.pp new file mode 100644 index 0000000000..d401150ed2 --- /dev/null +++ b/tests/test/tgenconst4.pp @@ -0,0 +1,15 @@ +{ %NORUN } +{$mode objfpc} +{ + test constants in generic procedures +} +program tgenconst4; + +generic procedure DoThis<T;const U:string>(msg: string = U); +begin + writeln(msg, ' sizeof:',sizeof(t), ' default: ', U); +end; + +begin + specialize DoThis<integer,'genparam'>('hello world'); +end. diff --git a/tests/test/tgenconst5.pp b/tests/test/tgenconst5.pp new file mode 100644 index 0000000000..56976549cb --- /dev/null +++ b/tests/test/tgenconst5.pp @@ -0,0 +1,28 @@ +{ %NORUN } +{$mode objfpc} +{ + test nested generic records with constants +} +program tgenconst5; + +type + generic THelperA<const U:integer> = record + list: array[0..U-1] of byte; + end; + +type + generic THelperB<T> = record + value: T; + end; + +type + generic TList<T; const U:integer> = record + helperA: specialize THelperA<U>; + helperB: specialize THelperB<T>; + end; + +var + list: specialize TList<integer,32>; +begin + writeln('sizeof:',sizeof(list)); +end. diff --git a/tests/test/tgenconst6.pp b/tests/test/tgenconst6.pp new file mode 100644 index 0000000000..03d056ffd8 --- /dev/null +++ b/tests/test/tgenconst6.pp @@ -0,0 +1,25 @@ +{ %NORUN } +{$mode delphi} +{ + test delphi mode +} +program tgenconst6; + +type + TList<T; const U: integer> = class + list: array[0..U-1] of T; + function capacity: integer; + end; + +function TList<T; U>.capacity: integer; +begin + result := U; +end; + +var + nums:TList<integer,16>; + strs:TList<string,16>; +begin + nums := TList<integer,16>.Create; + strs := TList<string,16>.Create; +end. diff --git a/tests/test/tgenconst7.pp b/tests/test/tgenconst7.pp new file mode 100644 index 0000000000..22bd037ebf --- /dev/null +++ b/tests/test/tgenconst7.pp @@ -0,0 +1,14 @@ +{%FAIL} +{$mode objfpc} +{ + test type mismatch when specializing constant values +} +program tgenconst7; + +type + generic TInteger<const U: integer> = record end; + +var + a: specialize TInteger<'string'>; +begin +end. diff --git a/tests/test/tgenconst8.pp b/tests/test/tgenconst8.pp new file mode 100644 index 0000000000..418ba3c63e --- /dev/null +++ b/tests/test/tgenconst8.pp @@ -0,0 +1,14 @@ +{%FAIL} +{$mode objfpc} +{ + test out of range error with constants +} +program tgenconst8; + +type + generic TByte<const U: Byte> = record end; + +var + a: specialize TByte<300>; +begin +end. diff --git a/tests/test/tgenconst9.pp b/tests/test/tgenconst9.pp new file mode 100644 index 0000000000..8438b70cb6 --- /dev/null +++ b/tests/test/tgenconst9.pp @@ -0,0 +1,12 @@ +{%FAIL} +{$mode objfpc} +{ + test type mismatch when specializing constants with types +} +program tgenconst9; +type + generic TByte<const U: Byte> = record end; +var + a: specialize TByte<string>; +begin +end. diff --git a/tests/webtbf/tw36975.pp b/tests/webtbf/tw36975.pp new file mode 100644 index 0000000000..ce3a43da36 --- /dev/null +++ b/tests/webtbf/tw36975.pp @@ -0,0 +1,10 @@ +{ %FAIL } +program tw36975; + +{$mode objfpc}{$H+} +type + generic TTest <T,const N:Tintegerarray> = class + end; + +begin +end. |