summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2>2020-04-26 22:33:58 +0000
committernickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2>2020-04-26 22:33:58 +0000
commitba4ac11a2eb5146a67c597af8d83f4fae915751d (patch)
tree558b1e67cfa8a98d899f7f0d778873f639f01286
parent419676ee2173c25a4607b569b951839be6425761 (diff)
parent898e4cabf7b38d13d6e862b77adb0dc59b65b8f1 (diff)
downloadfpc-ba4ac11a2eb5146a67c597af8d83f4fae915751d.tar.gz
* synchronized with trunk
git-svn-id: https://svn.freepascal.org/svn/fpc/branches/z80@45131 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r--compiler/defcmp.pas8
-rw-r--r--compiler/htypechk.pas2
-rw-r--r--compiler/msg/errore.msg5
-rw-r--r--compiler/msgidx.inc5
-rw-r--r--compiler/msgtxt.inc1006
-rw-r--r--compiler/ncnv.pas4
-rw-r--r--compiler/ncon.pas41
-rw-r--r--compiler/nmat.pas5
-rw-r--r--compiler/node.pas20
-rw-r--r--compiler/nset.pas5
-rw-r--r--compiler/pass_1.pas5
-rw-r--r--compiler/pdecl.pas26
-rw-r--r--compiler/pdecsub.pas32
-rw-r--r--compiler/pdecvar.pas4
-rw-r--r--compiler/pexpr.pas17
-rw-r--r--compiler/pgentype.pas6
-rw-r--r--compiler/pgenutil.pas695
-rw-r--r--compiler/pparautl.pas75
-rw-r--r--compiler/ppu.pas2
-rw-r--r--compiler/pstatmnt.pas4
-rw-r--r--compiler/ptype.pas12
-rw-r--r--compiler/symconst.pas11
-rw-r--r--compiler/symdef.pas52
-rw-r--r--compiler/symsym.pas40
-rw-r--r--compiler/systems.pas7
-rw-r--r--compiler/utils/ppuutils/ppudump.pp11
-rw-r--r--compiler/version.pas3
-rw-r--r--compiler/xtensa/agcpugas.pas2
-rw-r--r--packages/fcl-passrc/src/pasresolver.pp9
-rw-r--r--packages/libffi/src/ffi.pp4
-rw-r--r--packages/os4units/src/clipboard.pas2
-rw-r--r--packages/pastojs/src/fppas2js.pp43
-rw-r--r--packages/pastojs/tests/tcmodules.pas133
-rw-r--r--packages/rtl-console/src/amicommon/video.pp12
-rw-r--r--packages/rtl-extra/src/linux/unixsock.inc2
-rw-r--r--packages/rtl-extra/src/unix/ipc.pp4
-rw-r--r--rtl/xtensa/setjump.inc5
-rw-r--r--tests/test/tgenconst1.pp39
-rw-r--r--tests/test/tgenconst10.pp14
-rw-r--r--tests/test/tgenconst11.pp13
-rw-r--r--tests/test/tgenconst12.pp15
-rw-r--r--tests/test/tgenconst13.pp51
-rw-r--r--tests/test/tgenconst14.pp42
-rw-r--r--tests/test/tgenconst15.pp15
-rw-r--r--tests/test/tgenconst16.pp79
-rw-r--r--tests/test/tgenconst17.pp27
-rw-r--r--tests/test/tgenconst18.pp12
-rw-r--r--tests/test/tgenconst19.pp24
-rw-r--r--tests/test/tgenconst2.pp14
-rw-r--r--tests/test/tgenconst20.pp24
-rw-r--r--tests/test/tgenconst21.pp16
-rw-r--r--tests/test/tgenconst22.pp16
-rw-r--r--tests/test/tgenconst23.pp19
-rw-r--r--tests/test/tgenconst24.pp19
-rw-r--r--tests/test/tgenconst25.pp18
-rw-r--r--tests/test/tgenconst26.pp18
-rw-r--r--tests/test/tgenconst27.pp17
-rw-r--r--tests/test/tgenconst28.pp17
-rw-r--r--tests/test/tgenconst29.pp14
-rw-r--r--tests/test/tgenconst3.pp20
-rw-r--r--tests/test/tgenconst30.pp14
-rw-r--r--tests/test/tgenconst4.pp15
-rw-r--r--tests/test/tgenconst5.pp28
-rw-r--r--tests/test/tgenconst6.pp25
-rw-r--r--tests/test/tgenconst7.pp14
-rw-r--r--tests/test/tgenconst8.pp14
-rw-r--r--tests/test/tgenconst9.pp12
-rw-r--r--tests/webtbf/tw36975.pp10
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.