diff --git a/compiler/htypechk.pas b/compiler/htypechk.pas index df513f8c87..708bf6aee7 100644 --- a/compiler/htypechk.pas +++ b/compiler/htypechk.pas @@ -133,7 +133,10 @@ interface procedure test_local_to_procvar(from_def:tprocvardef;to_def:tdef); { sets varsym varstate field correctly } - procedure set_varstate(p:tnode;newstate:tvarstate;must_be_valid:boolean); + type + tvarstateflag = (vsf_must_be_valid,vsf_use_hints); + tvarstateflags = set of tvarstateflag; + procedure set_varstate(p:tnode;newstate:tvarstate;varstateflags:tvarstateflags); { sets the callunique flag, if the node is a vecn, } { takes care of type casts etc. } @@ -730,7 +733,7 @@ implementation end; - procedure set_varstate(p:tnode;newstate:tvarstate;must_be_valid:boolean); + procedure set_varstate(p:tnode;newstate:tvarstate;varstateflags:tvarstateflags); var hsym : tabstractvarsym; begin @@ -743,10 +746,10 @@ implementation tc_cchar_2_pchar, tc_cstring_2_pchar, tc_array_2_pointer : - must_be_valid:=false; + exclude(varstateflags,vsf_must_be_valid); tc_pchar_2_string, tc_pointer_2_array : - must_be_valid:=true; + include(varstateflags,vsf_must_be_valid); end; p:=tunarynode(p).left; end; @@ -754,9 +757,9 @@ implementation p:=tunarynode(p).left; vecn: begin - set_varstate(tbinarynode(p).right,vs_used,true); + set_varstate(tbinarynode(p).right,vs_used,[vsf_must_be_valid]); if not(tunarynode(p).left.resulttype.def.deftype in [stringdef,arraydef]) then - must_be_valid:=true; + include(varstateflags,vsf_must_be_valid); p:=tunarynode(p).left; end; { do not parse calln } @@ -767,7 +770,7 @@ implementation if (tloadnode(p).symtableentry.typ in [localvarsym,paravarsym,globalvarsym]) then begin hsym:=tabstractvarsym(tloadnode(p).symtableentry); - if must_be_valid and (hsym.varstate=vs_declared) then + if (vsf_must_be_valid in varstateflags) and (hsym.varstate=vs_declared) then begin { Give warning/note for uninitialized locals } if assigned(hsym.owner) and @@ -778,10 +781,22 @@ implementation if (vo_is_funcret in hsym.varoptions) then CGMessage(sym_w_function_result_not_set) else - if tloadnode(p).symtable.symtabletype=localsymtable then - CGMessage1(sym_n_uninitialized_local_variable,hsym.realname) - else - CGMessage1(sym_n_uninitialized_variable,hsym.realname); + begin + if tloadnode(p).symtable.symtabletype=localsymtable then + begin + if (vsf_use_hints in varstateflags) then + CGMessage1(sym_h_uninitialized_local_variable,hsym.realname) + else + CGMessage1(sym_w_uninitialized_local_variable,hsym.realname); + end + else + begin + if (vsf_use_hints in varstateflags) then + CGMessage1(sym_h_uninitialized_variable,hsym.realname) + else + CGMessage1(sym_w_uninitialized_variable,hsym.realname); + end; + end; end; end; { don't override vs_used with vs_assigned } @@ -2033,7 +2048,10 @@ implementation end. { $Log$ - Revision 1.119 2005-03-10 00:15:20 peter + Revision 1.120 2005-03-25 22:20:18 peter + * add hint when passing an uninitialized variable to a var parameter + + Revision 1.119 2005/03/10 00:15:20 peter don't allow overloading orddef,enumdef.floatdef for unary operators Revision 1.118 2005/02/20 13:12:22 peter diff --git a/compiler/msg/errore.msg b/compiler/msg/errore.msg index 0ed9e27c54..dab180bedd 100644 --- a/compiler/msg/errore.msg +++ b/compiler/msg/errore.msg @@ -1328,12 +1328,12 @@ sym_w_wrong_C_pack=05034_W_Type "$1" is not aligned correctly in current record % for C structures. sym_e_illegal_field=05035_E_Unknown record field identifier "$1" % The field doesn't exist in the record/object definition. -sym_n_uninitialized_local_variable=05036_W_Local variable "$1" does not seem to be initialized +sym_w_uninitialized_local_variable=05036_W_Local variable "$1" does not seem to be initialized % This message is displayed if the compiler thinks that a variable will % be used (i.e. appears in the right-hand-side of an expression) when it % was not initialized first (i.e. appeared in the left-hand side of an % assigment) -sym_n_uninitialized_variable=05037_W_Variable "$1" does not seem to be initialized +sym_w_uninitialized_variable=05037_W_Variable "$1" does not seem to be initialized % This message is displayed if the compiler thinks that a variable will % be used (i.e. appears in the right-hand-side of an expression) when it % was not initialized first (i.e. appeared in the left-hand side of an @@ -1369,6 +1369,16 @@ sym_e_cant_create_unique_type=05056_E_Can't create unique type from this type % Only simple types like ordinal, float and string types are supported when % redefining a type with \var{type newtype = type oldtype;}. % \end{description} +sym_h_uninitialized_local_variable=05057_H_Local variable "$1" does not seem to be initialized +% This message is displayed if the compiler thinks that a variable will +% be used (i.e. appears in the right-hand-side of an expression) when it +% was not initialized first (i.e. appeared in the left-hand side of an +% assigment) +sym_h_uninitialized_variable=05058_H_Variable "$1" does not seem to be initialized +% This message is displayed if the compiler thinks that a variable will +% be used (i.e. appears in the right-hand-side of an expression) when it +% was not initialized first (i.e. appeared in the left-hand side of an +% assigment) # # Codegenerator # diff --git a/compiler/msgidx.inc b/compiler/msgidx.inc index 4627a3b687..8f2067e80d 100644 --- a/compiler/msgidx.inc +++ b/compiler/msgidx.inc @@ -371,8 +371,8 @@ const sym_w_function_result_not_set=05033; sym_w_wrong_C_pack=05034; sym_e_illegal_field=05035; - sym_n_uninitialized_local_variable=05036; - sym_n_uninitialized_variable=05037; + sym_w_uninitialized_local_variable=05036; + sym_w_uninitialized_variable=05037; sym_e_id_no_member=05038; sym_h_param_list=05039; sym_e_segment_too_large=05040; @@ -381,6 +381,8 @@ const sym_w_non_portable_symbol=05044; sym_w_non_implemented_symbol=05055; sym_e_cant_create_unique_type=05056; + sym_h_uninitialized_local_variable=05057; + sym_h_uninitialized_variable=05058; cg_e_parasize_too_big=06009; cg_e_file_must_call_by_reference=06012; cg_e_cant_use_far_pointer_there=06013; @@ -651,9 +653,9 @@ const option_info=11024; option_help_pages=11025; - MsgTxtSize = 38145; + MsgTxtSize = 38259; MsgIdxMax : array[1..20] of longint=( - 19,69,214,59,57,46,100,20,35,60, + 19,69,214,59,59,46,100,20,35,60, 40,1,1,1,1,1,1,1,1,1 ); diff --git a/compiler/msgtxt.inc b/compiler/msgtxt.inc index b84ab10799..b5b3c57b52 100644 --- a/compiler/msgtxt.inc +++ b/compiler/msgtxt.inc @@ -1,7 +1,7 @@ {$ifdef Delphi} -const msgtxt : array[0..000158] of string[240]=( +const msgtxt : array[0..000159] of string[240]=( {$else Delphi} -const msgtxt : array[0..000158,1..240] of char=( +const msgtxt : array[0..000159,1..240] of char=( {$endif Delphi} '01000_T_Compiler: $1'#000+ '01001_D_Compiler OS: $1'#000+ @@ -421,506 +421,510 @@ const msgtxt : array[0..000158,1..240] of char=( '05044_W_Symbol "$1" is not portable'#000+ '05055_W_Symbol "$1" is not implemented'#000+ '05056_E_Can'#039't create unique type from this type'#000+ + '05057_H_Local variable "$1" does not seem to be initialized'#000+ + '05058','_H_Variable "$1" does not seem to be initialized'#000+ '06009_E_Parameter list size exceeds 65535 bytes'#000+ - '06012_E_File type','s must be var parameters'#000+ + '06012_E_File types must be var parameters'#000+ '06013_E_The use of a far pointer isn'#039't allowed there'#000+ - '06015_E_EXPORT declared functions can'#039't be called'#000+ + '06015_E_EXPORT declared functions can'#039't be calle','d'#000+ '06016_W_Possible illegal call of constructor or destructor'#000+ '06017_N_Inefficient code'#000+ '06018_W_unreachable code'#000+ - '060','20_E_Abstract methods can'#039't be called directly'#000+ + '06020_E_Abstract methods can'#039't be called directly'#000+ '06027_DL_Register $1 weight $2 $3'#000+ '06029_DL_Stack frame is omitted'#000+ - '06031_E_Object or class methods can'#039't be inline.'#000+ + '06031_E_Objec','t or class methods can'#039't be inline.'#000+ '06032_E_Procvar calls cannot be inline.'#000+ - '06033_E_No code for inline procedure s','tored'#000+ + '06033_E_No code for inline procedure stored'#000+ '06035_E_Element zero of an ansi/wide- or longstring can'#039't be acces'+ 'sed, use (set)length instead'#000+ - '06037_E_Constructors or destructors can not be called inside a '#039'wi'+ - 'th'#039' clause'#000+ + '06037_E_Constructors or d','estructors can not be called inside a '#039'w'+ + 'ith'#039' clause'#000+ '06038_E_Cannot call message handler methods directly'#000+ - '06039_E_J','ump in or outside of an exception block'#000+ + '06039_E_Jump in or outside of an exception block'#000+ '06040_E_Control flow statements aren'#039't allowed in a finally block'#000+ - '06041_W_Parameters size exceeds limit for certain cpu'#039's'#000+ + '06041_W_Parameters s','ize exceeds limit for certain cpu'#039's'#000+ '06042_W_Local variable size exceed limit for certain cpu'#039's'#000+ - '06043_E_Local varia','bles size exceeds supported limit'#000+ + '06043_E_Local variables size exceeds supported limit'#000+ '06044_E_BREAK not allowed'#000+ '06045_E_CONTINUE not allowed'#000+ - '07000_DL_Starting $1 styled assembler parsing'#000+ + '07000_DL_Starting $1 styled assembler',' parsing'#000+ '07001_DL_Finished $1 styled assembler parsing'#000+ '07002_E_Non-label pattern contains @'#000+ - '07004_E_Error building',' record offset'#000+ + '07004_E_Error building record offset'#000+ '07005_E_OFFSET used without identifier'#000+ '07006_E_TYPE used without identifier'#000+ - '07007_E_Cannot use local variable or parameters here'#000+ + '07007_E_Cannot use local variable o','r parameters here'#000+ '07008_E_need to use OFFSET here'#000+ '07009_E_need to use $ here'#000+ - '07010_E_Cannot use multiple relocatab','le symbols'#000+ + '07010_E_Cannot use multiple relocatable symbols'#000+ '07011_E_Relocatable symbol can only be added'#000+ '07012_E_Invalid constant expression'#000+ - '07013_E_Relocatable symbol is not allowed'#000+ + '07013_E_Relocatable symbol is not ','allowed'#000+ '07014_E_Invalid reference syntax'#000+ '07015_E_You can not reach $1 from that code'#000+ - '07016_E_Local symbols/labels ','aren'#039't allowed as references'#000+ + '07016_E_Local symbols/labels aren'#039't allowed as references'#000+ '07017_E_Invalid base and index register usage'#000+ '07018_W_Possible error in object field handling'#000+ - '07019_E_Wrong scale factor specified'#000+ + '070','19_E_Wrong scale factor specified'#000+ '07020_E_Multiple index register usage'#000+ '07021_E_Invalid operand type'#000+ - '07022_E_Inval','id string as opcode operand: $1'#000+ + '07022_E_Invalid string as opcode operand: $1'#000+ '07023_W_@CODE and @DATA not supported'#000+ '07024_E_Null label references are not allowed'#000+ - '07025_E_Divide by zero in asm evaluator'#000+ + '07025_E_Di','vide by zero in asm evaluator'#000+ '07026_E_Illegal expression'#000+ '07027_E_escape sequence ignored: $1'#000+ - '07028_E_Invalid symbo','l reference'#000+ + '07028_E_Invalid symbol reference'#000+ '07029_W_Fwait can cause emulation problems with emu387'#000+ '07030_W_$1 without operand translated into $1P'#000+ - '07031_W_ENTER instruction is not supported by Linux kernel'#000+ + '07031_W_ENTE','R instruction is not supported by Linux kernel'#000+ '07032_W_Calling an overload function in assembler'#000+ - '07033_E_Unsupport','ed symbol type for operand'#000+ + '07033_E_Unsupported symbol type for operand'#000+ '07034_E_Constant value out of bounds'#000+ '07035_E_Error converting decimal $1'#000+ - '07036_E_Error converting octal $1'#000+ + '07036_E_Error converting o','ctal $1'#000+ '07037_E_Error converting binary $1'#000+ '07038_E_Error converting hexadecimal $1'#000+ '07039_H_$1 translated to $2'#000+ - '070','40_W_$1 is associated to an overloaded function'#000+ + '07040_W_$1 is associated to an overloaded function'#000+ '07041_E_Cannot use SELF outside a method'#000+ - '07042_E_Cannot use OLDEBP outside a nested procedure'#000+ + '07042_E_Cannot use OLDEBP outside a n','ested procedure'#000+ '07043_W_Procedures can'#039't return any value in asm code'#000+ '07044_E_SEG not supported'#000+ - '07045_E_Size suffi','x 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+ + '07047_E_Assemble','r syntax error'#000+ '07048_E_Invalid combination of opcode and operands'#000+ '07049_E_Assembler syntax error in operand'#000+ - '07050_','E_Assembler syntax error in constant'#000+ + '07050_E_Assembler syntax error in constant'#000+ '07051_E_Invalid String expression'#000+ - '07052_W_constant with symbol $1 for address which is not on a pointer'#000+ + '07052_W_constant with symbol $1 for address which is no','t on a pointe'+ + 'r'#000+ '07053_E_Unrecognized opcode $1'#000+ '07054_E_Invalid or missing opcode'#000+ - '07055_E_Invalid combination of pre','fix and opcode: $1'#000+ + '07055_E_Invalid combination of prefix and opcode: $1'#000+ '07056_E_Invalid combination of override and opcode: $1'#000+ '07057_E_Too many operands on line'#000+ - '07058_W_NEAR ignored'#000+ + '07058_W_NEAR ignor','ed'#000+ '07059_W_FAR ignored'#000+ '07060_E_Duplicate local symbol $1'#000+ '07061_E_Undefined local symbol $1'#000+ - '07062_E_Unknown label i','dentifier $1'#000+ + '07062_E_Unknown label identifier $1'#000+ '07063_E_Invalid register name'#000+ '07064_E_Invalid floating point register name'#000+ '07066_W_Modulo not supported'#000+ - '07067_E_Invalid floating point constant $1'#000+ + '07067_E_I','nvalid floating point constant $1'#000+ '07068_E_Invalid floating point expression'#000+ '07069_E_Wrong symbol type'#000+ - '07070_E_Cann','ot index a local var or parameter with a register'#000+ + '07070_E_Cannot index a local var or parameter with a register'#000+ '07071_E_Invalid segment override expression'#000+ - '07072_W_Identifier $1 supposed external'#000+ + '07072_W_Identifier $1 supposed e','xternal'#000+ '07073_E_Strings not allowed as constants'#000+ '07074_No type of variable specified'#000+ - '07075_E_assembler code not re','turned to text section'#000+ + '07075_E_assembler code not returned to text section'#000+ '07076_E_Not a directive or local symbol $1'#000+ '07077_E_Using a defined name as a local label'#000+ - '07078_E_Dollar token is used without an identifier'#000+ + '07078_E_Dollar',' token is used without an identifier'#000+ '07079_W_32bit constant created for address'#000+ - '07080_N_.align is target specific,',' use .balign or .p2align'#000+ + '07080_N_.align is target specific, use .balign or .p2align'#000+ '07081_E_Can'#039't access fields directly for parameters'#000+ - '07082_E_Can'#039't access fields of objects/classes directly'#000+ + '07082_E_Can'#039't access fields of objects/classes di','rectly'#000+ '07083_E_No size specified and unable to determine the size of the oper'+ 'ands'#000+ - '07084_E_Cannot use RESULT in thi','s function'#000+ + '07084_E_Cannot use RESULT in this function'#000+ '07086_W_"$1" without operand translated into "$1 %st,%st(1)"'#000+ '07087_W_"$1 %st(n)" translated into "$1 %st,%st(n)"'#000+ - '07088_W_"$1 %st(n)" translated into "$1 %st(n),%st"'#000+ + '07','088_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 allowed here'#000+ '07093_W_ALIGN not supported'#000+ '07094_E_Inc and Dec cannot be together'#000+ '07095_E_Invalid reglist for movem'#000+ - '07096_E_Reglist invalid for opcode'#000+ + '07096_E_Reglist invalid f','or opcode'#000+ '07097_E_Higher cpu mode required ($1)'#000+ - '07098_W_No size specified and unable to determine the size of the ','op'+ - 'erands, using DWORD as default'#000+ + '07098_W_No size specified and unable to determine the size of the oper'+ + 'ands, using DWORD as default'#000+ '07099_E_Syntax error while trying to parse a shifter operand'#000+ - '08000_F_Too many assembler files'#000+ + '08000_F_Too many assembler files',#000+ '08001_F_Selected assembler output not supported'#000+ '08002_F_Comp not supported'#000+ - '08003_F_Direct not support for binary ','writers'#000+ + '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+ + '08006_E_Asm: Opcode $1 not',' in table'#000+ '08007_E_Asm: $1 invalid combination of opcode and operands'#000+ - '08008_E_Asm: 16 Bit references not supported'#000, + '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+ + '08','012_E_Asm: Short jump is out of range $1'#000+ '08013_E_Asm: Undefined label $1'#000+ - '08014_E_Asm: Comp type not supported for ','this target'#000+ + '08014_E_Asm: Comp type not supported for this target'#000+ '08015_E_Asm: Extended type not supported for this target'#000+ '08016_E_Asm: Duplicate label $1'#000+ - '08017_E_Asm: Redefined label $1'#000+ + '08017_E_Asm: Redefined la','bel $1'#000+ '08018_E_Asm: First defined here'#000+ '08019_E_Asm: Invalid register $1'#000+ - '09000_W_Source operating system redefined'#000, + '09000_W_Source operating system redefined'#000+ '09001_I_Assembling (pipe) $1'#000+ '09002_E_Can'#039't create assember file: $1'#000+ '09003_E_Can'#039't create object file: $1'#000+ - '09004_E_Can'#039't create archive file: $1'#000+ + '09004_E_Can'#039't create ','archive file: $1'#000+ '09005_E_Assembler $1 not found, switching to external assembling'#000+ '09006_T_Using assembler: $1'#000+ - '0900','7_E_Error while assembling exitcode $1'#000+ + '09007_E_Error while assembling exitcode $1'#000+ '09008_E_Can'#039't call the assembler, error $1 switching to external a'+ 'ssembling'#000+ - '09009_I_Assembling $1'#000+ + '09009_I_Ass','embling $1'#000+ '09010_I_Assembling with smartlinking $1'#000+ '09011_W_Object $1 not found, Linking may fail !'#000+ - '09012_W_Library',' $1 not found, Linking may fail !'#000+ + '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+ + '090','15_I_Linking $1'#000+ '09016_E_Util $1 not found, switching to external linking'#000+ '09017_T_Using util $1'#000+ - '09018_E_Creation of',' Executables not supported'#000+ + '09018_E_Creation of Executables not supported'#000+ '09019_E_Creation of Dynamic/Shared Libraries not supported'#000+ '09020_I_Closing script $1'#000+ - '09021_E_resource compiler not found, switching to external mode'#000+ + '09021_E_resour','ce compiler not found, switching to external mode'#000+ '09022_I_Compiling resource $1'#000+ - '09023_T_unit $1 can'#039't be staticall','y linked, switching to smart l'+ - 'inking'#000+ + '09023_T_unit $1 can'#039't be statically linked, switching to smart lin'+ + 'king'#000+ '09024_T_unit $1 can'#039't be smart linked, switching to static linking'+ #000+ - '09025_T_unit $1 can'#039't be shared linked, switching to static linkin'+ - 'g'#000+ + '09025_T_unit $1 can'#039't ','be shared linked, switching to static link'+ + 'ing'#000+ '09026_E_unit $1 can'#039't be smart or static linked'#000+ - '09027_E_unit $1 can'#039,'t be shared or static linked'#000+ + '09027_E_unit $1 can'#039't be shared or static linked'#000+ '09028_F_Can'#039't post process executable $1'#000+ '09029_F_Can'#039't open executable $1'#000+ - '09030_X_Size of Code: $1 bytes'#000+ + '09030_X_Size of Code: $','1 bytes'#000+ '09031_X_Size of initialized data: $1 bytes'#000+ '09032_X_Size of uninitialized data: $1 bytes'#000+ - '09033_X_Stack spac','e reserved: $1 bytes'#000+ + '09033_X_Stack space reserved: $1 bytes'#000+ '09034_X_Stack space commited: $1 bytes'#000+ '10000_T_Unitsearch: $1'#000+ '10001_T_PPU Loading $1'#000+ - '10002_U_PPU Name: $1'#000+ + '10002_U_PPU Name: $1',#000+ '10003_U_PPU Flags: $1'#000+ '10004_U_PPU Crc: $1'#000+ '10005_U_PPU Time: $1'#000+ '10006_U_PPU File too short'#000+ - '10007_U_PPU Invalid Hea','der (no PPU at the begin)'#000+ + '10007_U_PPU Invalid Header (no PPU at the begin)'#000+ '10008_U_PPU Invalid Version $1'#000+ '10009_U_PPU is compiled for another processor'#000+ - '10010_U_PPU is compiled for an other target'#000+ + '10010_U_PPU is compiled',' for an other target'#000+ '10011_U_PPU Source: $1'#000+ '10012_U_Writing $1'#000+ '10013_F_Can'#039't Write PPU-File'#000+ - '10014_F_Error reading ','PPU-File'#000+ + '10014_F_Error reading PPU-File'#000+ '10015_F_unexpected end of PPU-File'#000+ '10016_F_Invalid PPU-File entry: $1'#000+ '10017_F_PPU Dbx count problem'#000+ - '10018_E_Illegal unit name: $1'#000+ + '10018_E_Illegal u','nit name: $1'#000+ '10019_F_Too much units'#000+ '10020_F_Circular unit reference between $1 and $2'#000+ - '10021_F_Can'#039't compile unit $','1, no sources available'#000+ + '10021_F_Can'#039't compile unit $1, no sources available'#000+ '10022_F_Can'#039't find unit $1'#000+ '10023_W_Unit $1 was not found but $2 exists'#000+ - '10024_F_Unit $1 searched but $2 found'#000+ + '10024_F_Unit $1 searched but $2',' found'#000+ '10025_W_Compiling the system unit requires the -Us switch'#000+ - '10026_F_There were $1 errors compiling module, st','opping'#000+ + '10026_F_There were $1 errors compiling module, stopping'#000+ '10027_U_Load from $1 ($2) unit $3'#000+ '10028_U_Recompiling $1, checksum changed for $2'#000+ - '10029_U_Recompiling $1, source found only'#000+ + '10029_U_Recompiling $1, source found ','only'#000+ '10030_U_Recompiling unit, static lib is older than ppufile'#000+ - '10031_U_Recompiling unit, shared lib is older than',' ppufile'#000+ + '10031_U_Recompiling unit, shared lib is older than ppufile'#000+ '10032_U_Recompiling unit, obj and asm are older than ppufile'#000+ '10033_U_Recompiling unit, obj is older than asm'#000+ - '10034_U_Parsing interface of $1'#000+ + '10034_U_','Parsing interface of $1'#000+ '10035_U_Parsing implementation of $1'#000+ '10036_U_Second load for unit $1'#000+ - '10037_U_PPU Check fil','e $1 time $2'#000+ + '10037_U_PPU Check file $1 time $2'#000+ '10040_W_Can'#039't recompile unit $1, but found modifed include files'#000+ - '10041_H_File $1 is newer than Release PPU file $2'#000+ + '10041_H_File $1 is newer than Release PPU file $','2'#000+ '10042_U_Using a unit which was not compiled with correct FPU mode'#000+ '10043_U_Loading interface units from $1'#000+ - '10044_','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+ + '10046_U_Implementation CRC changed for unit $','1'#000+ '10047_U_Finished compiling unit $1'#000+ '10048_U_Add dependency of $1 to $2'#000+ '10049_U_No reload, is caller: $1'#000+ - '10050_U_N','o reload, already in second compile: $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+ + '10053_U_Previous state of $1: $2'#000, '10054_U_Already compiling $1, setting second compile'#000+ '10055_U_Loading unit $1'#000+ '10056_U_Finished loading unit $1'#000+ - '1005','7_U_Registering new 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+ - '11000_$1 [options] [options]'#000+ + '11000','_$1 [options] [options]'#000+ '11001_W_Only one source file supported'#000+ - '11002_W_DEF file can be created only fo','r OS/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+ + '11005_N_No option inside $1',' config file'#000+ '11006_E_Illegal parameter: $1'#000+ '11007_H_-? writes help pages'#000+ '11008_F_Too many config files nested'#000+ - '11009','_F_Unable to open file $1'#000+ + '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+ + '11012_W_Shared libs not',' supported on DOS platform, reverting to stat'+ + 'ic'#000+ '11013_F_too many IF(N)DEFs'#000+ '11014_F_too many ENDIFs'#000+ - '11015_F_open co','nditional at the end of the file'#000+ + '11015_F_open conditional at the end of the file'#000+ '11016_W_Debug information generation is not supported by this executab'+ 'le'#000+ - '11017_H_Try recompiling with -dGDB'#000+ + '11017_H_Try recompil','ing with -dGDB'#000+ '11018_E_You are using the obsolete switch $1'#000+ - '11019_E_You are using the obsolete switch $1, please u','se $2'#000+ + '11019_E_You are using the obsolete switch $1, please use $2'#000+ '11020_N_Switching assembler to default source writing assembler'#000+ - '11021_W_Assembler output selected "$1" is not compatible with "$2"'#000+ + '11021_W_Assembler 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 env','ironment $1'#000+ + '11027_T_Reading options from environment $1'#000+ '11028_D_Handling option "$1"'#000+ '11029__*** press enter ***'#000+ '11030_H_Start of reading config file $1'#000+ - '11031_H_End of reading config file $1'#000+ + '11031_H_End of rea','ding config file $1'#000+ '11032_D_interpreting option "$1"'#000+ '11036_D_interpreting firstpass option "$1"'#000+ - '11033_D_interpreti','ng file option "$1"'#000+ + '11033_D_interpreting file option "$1"'#000+ '11034_D_Reading config file "$1"'#000+ '11035_D_found source file name "$1"'#000+ '11039_E_Unknown code page'#000+ - '11023_Free Pascal Compiler version $FPCVERSION [$FPCDATE] for $FPCCPU'#010+ + '11023_Free ','Pascal Compiler version $FPCVERSION [$FPCDATE] for $FPCCP'+ + 'U'#010+ 'Copyright (c) 1993-2005 by Florian Klaempfl'#000+ - '11024_Free ','Pascal Compiler version $FPCVERSION'#010+ + '11024_Free Pascal Compiler version $FPCVERSION'#010+ #010+ 'Compiler Date : $FPCDATE'#010+ 'Compiler CPU Target: $FPCCPU'#010+ #010+ 'Supported targets:'#010+ - ' $OSTARGETS'#010+ + ' $OSTARGE','TS'#010+ #010+ 'This program comes under the GNU General Public Licence'#010+ 'For more information read COPYING.FPC'#010+ #010+ - 'Report bugs,sug','gestions etc to:'#010+ + 'Report bugs,suggestions etc to:'#010+ ' bugrep@freepascal.org'#000+ - '11025_**0*_put + after a boolean switch option to enable it, - to disa'+ + '11025_**0*_put + after a boolean switch option to enable it, - to disa', 'ble it'#010+ '**1a_the compiler doesn'#039't delete the generated assembler file'#010+ - '**2al_list sourcecode lines in assembler file',#010+ + '**2al_list sourcecode lines in assembler file'#010+ '**2an_list node info in assembler file'#010+ '*L2ap_use pipes instead of creating temporary assembler files'#010+ - '**2ar_list register allocation/release info in assembler file'#010+ + '**2ar_list register allo','cation/release info in assembler file'#010+ '**2at_list temp allocation/release info in assembler file'#010+ - '**1A_output for','mat:'#010+ + '**1A_output format:'#010+ '**2Adefault_use default assembler'#010+ '3*2Aas_assemble using GNU AS'#010+ '3*2Anasmcoff_coff (Go32v2) file using Nasm'#010+ - '3*2Anasmelf_elf32 (Linux) file using Nasm'#010+ + '3*2Anasmelf_elf','32 (Linux) file using Nasm'#010+ '3*2Anasmwin32_Win32 object file using Nasm'#010+ - '3*2Anasmwdosx_Win32/WDOSX object file using ','Nasm'#010+ + '3*2Anasmwdosx_Win32/WDOSX object file using Nasm'#010+ '3*2Awasm_obj file using Wasm (Watcom)'#010+ '3*2Anasmobj_obj file using Nasm'#010+ '3*2Amasm_obj file using Masm (Microsoft)'#010+ - '3*2Atasm_obj file using Tasm (Borland)'#010+ + '3*2Atasm_o','bj file using Tasm (Borland)'#010+ '3*2Aelf_elf32 (Linux) using internal writer'#010+ - '3*2Acoff_coff (Go32v2) using internal wri','ter'#010+ + '3*2Acoff_coff (Go32v2) using internal writer'#010+ '3*2Apecoff_pecoff (Win32) using internal writer'#010+ '4*2Aas_assemble using GNU AS'#010+ '6*2Aas_Unix o-file using GNU AS'#010+ - '6*2Agas_GNU Motorola assembler'#010+ + '6*2Agas_GNU M','otorola assembler'#010+ '6*2Amit_MIT Syntax (old GAS)'#010+ '6*2Amot_Standard Motorola assembler'#010+ 'A*2Aas_assemble using GNU AS'#010+ - 'P*','2Aas_assemble using GNU AS'#010+ + 'P*2Aas_assemble using GNU AS'#010+ 'S*2Aas_assemble using GNU AS'#010+ '**1b_generate browser info'#010+ '**2bl_generate local symbol info'#010+ - '**1B_build all modules'#010+ + '**1B_build',' all modules'#010+ '**1C_code generation options:'#010+ '**2Cc_set default calling convention to '#010+ - '**2CD_create also dyn','amic library (not supported)'#010+ + '**2CD_create also dynamic library (not supported)'#010+ '**2Ce_Compilation with emulated floating point opcodes'#010+ - '**2Cf_Select fpu instruction set to use to '#010+ + '**2Cf_Select fpu instruction set to use',' to '#010+ '**2Cg_Generate PIC code'#010+ '**2Ch_ bytes heap (between 1023 and 67107840)'#010+ '**2Ci_IO-checking'#010+ - '**2Cn_omit l','inking stage'#010+ + '**2Cn_omit linking stage'#010+ '**2Co_check overflow of integer operations'#010+ '**2Cr_range checking'#010+ '**2CR_verify object method call validity'#010+ - '**2Cs_set stack size to '#010+ + '**2Cs','_set stack size to '#010+ '**2Ct_stack checking'#010+ '**2CX_create also smartlinked library'#010+ '**1d_defines the symbol '#010+ - '*','*1D_generate a DEF file'#010+ + '**1D_generate a DEF file'#010+ '**2Dd_set description to '#010+ '**2Dv_set DLL version to '#010+ '*O2Dw_PM application'#010+ - '**1e_set path to executable'#010+ + '**1e_set path ','to executable'#010+ '**1E_same as -Cn'#010+ '**1F_set file names and paths:'#010+ - '**2Fa[,y]_for a program load first units a','nd [y] before uses '+ - 'is parsed'#010+ + '**2Fa[,y]_for a program load first units and [y] before uses is'+ + ' parsed'#010+ '**2Fc_sets input codepage to '#010+ - '**2FD_sets the directory where to search for compiler utilities'#010+ + '**2FD_sets the directory where to search for compiler util','ities'#010+ '**2Fe_redirect error output to '#010+ '**2FE_set exe/unit output path to '#010+ - '**2Fi_adds to include ','path'#010+ + '**2Fi_adds to include path'#010+ '**2Fl_adds to library path'#010+ '**2FL_uses as dynamic linker'#010+ '**2Fo_adds to object path'#010+ - '**2Fr_load error message file '#010+ + '**2Fr_load erro','r message file '#010+ '**2Fu_adds to unit path'#010+ '**2FU_set unit output path to , overrides -FE'#010+ - '*g1g_generat','e debugger information:'#010+ + '*g1g_generate debugger information:'#010+ '*g2gc_generate checks for pointers'#010+ '*g2gd_use dbx'#010+ '*g2gg_use gsym'#010+ - '*g2gh_use heap trace unit (for memory leak debugging)'#010+ + '*g2gh_use heap trace unit (for memory ','leak debugging)'#010+ '*g2gl_use line info unit to show more info for backtraces'#010+ - '*g2gv_generates programs tracable with v','algrind'#010+ + '*g2gv_generates programs tracable with valgrind'#010+ '*g2gw_generate dwarf debugging info'#010+ '**1i_information'#010+ '**2iD_return compiler date'#010+ '**2iV_return compiler version'#010+ - '**2iSO_return compiler OS'#010+ + '**2iSO_r','eturn compiler OS'#010+ '**2iSP_return compiler processor'#010+ '**2iTO_return target OS'#010+ '**2iTP_return target processor'#010+ - '**1I_','adds to include path'#010+ + '**1I_adds to include path'#010+ '**1k_Pass to the linker'#010+ '**1l_write logo'#010+ '**1M_set language mode to '#010+ - '**2Mfpc_free pascal dialect (default)'#010+ + '**2Mfpc_free pascal d','ialect (default)'#010+ '**2Mobjfpc_switch some Delphi 2 extensions on'#010+ '**2Mdelphi_tries to be Delphi compatible'#010+ - '**2Mtp_tri','es to be TP/BP 7.0 compatible'#010+ + '**2Mtp_tries to be TP/BP 7.0 compatible'#010+ '**2Mgpc_tries to be gpc compatible'#010+ - '**2Mmacpas_tries to be compatible to the macintosh pascal dialects'#010+ + '**2Mmacpas_tries to be compatible to the macintosh pascal dia','lects'#010+ '**1n_don'#039't read the default config file'#010+ '**1o_change the name of the executable produced to '#010+ - '**1O_op','timizations:'#010+ + '**1O_optimizations:'#010+ '3*2Og_generate smaller code'#010+ '3*2OG_generate faster code (default)'#010+ '**2Or_keep certain variables in registers'#010+ - '3*2Ou_enable uncertain optimizations (see docs)'#010+ + '3*2Ou_','enable uncertain optimizations (see docs)'#010+ '3*2O1_level 1 optimizations (quick optimizations)'#010+ - '3*2O2_level 2 optimiza','tions (-O1 + slower optimizations)'#010+ + '3*2O2_level 2 optimizations (-O1 + slower optimizations)'#010+ '3*2O3_level 3 optimizations (-O2 repeatedly, max 5 times)'#010+ '3*2Op_target processor:'#010+ - '3*3Op1_set target processor to 386/486'#010+ + '3*3Op1','_set target processor to 386/486'#010+ '3*3Op2_set target processor to Pentium/PentiumMMX (tm)'#010+ - '3*3Op3_set target processo','r to PPro/PII/c6x86/K6 (tm)'#010+ + '3*3Op3_set target processor to PPro/PII/c6x86/K6 (tm)'#010+ '6*2Og_generate smaller code'#010+ '6*2OG_generate faster code (default)'#010+ - '6*2Ox_optimize maximum (still BUGGY!!!)'#010+ + '6*2Ox_optimize maximum (still BUG','GY!!!)'#010+ '6*2O0_set target processor to a MC68000'#010+ '6*2O2_set target processor to a MC68020+ (default)'#010+ - '**1pg_generate p','rofile code for gprof (defines FPC_PROFILE)'#010+ + '**1pg_generate profile code for gprof (defines FPC_PROFILE)'#010+ '**1R_assembler reading style:'#010+ '**2Rdefault_use default assembler'#010+ - '3*2Ratt_read AT&T style assembler'#010+ + '3*2Ratt_read AT','&T style assembler'#010+ '3*2Rintel_read Intel style assembler'#010+ '6*2RMOT_read motorola style assembler'#010+ - '**1S_syntax optio','ns:'#010+ + '**1S_syntax options:'#010+ '**2S2_same as -Mobjfpc'#010+ '**2Sc_supports operators like C (*=,+=,/= and -=)'#010+ '**2Sa_include assertion code.'#010+ - '**2Sd_same as -Mdelphi'#010+ + '**2Sd_same as -Mdel','phi'#010+ '**2Se_error options. is a combination of the following:'#010+ - '**3*_ : compiler stops after the errors ','(default is 1)'#010+ + '**3*_ : compiler stops after the errors (default is 1)'#010+ '**3*_w : compiler stops also after warnings'#010+ '**3*_n : compiler stops also after notes'#010+ - '**3*_h : compiler stops also after hints'#010+ + '**3*_h : compiler stops al','so after hints'#010+ '**2Sg_allow LABEL and GOTO'#010+ '**2Sh_Use ansistrings'#010+ '**2Si_support C++ styled INLINE'#010+ - '**2SI_set inter','face style to '#010+ + '**2SI_set interface style to '#010+ '**3SIcom_COM compatible interface (default)'#010+ '**3SIcorba_CORBA compatible interface'#010+ - '**2Sm_support macros like C (global)'#010+ + '**2Sm_support macros like ','C (global)'#010+ '**2So_same as -Mtp'#010+ '**2Sp_same as -Mgpc'#010+ '**2Ss_constructor name must be init (destructor must be done)'#010+ - '**','2St_allow static keyword in objects'#010+ + '**2St_allow static keyword in objects'#010+ '**1s_don'#039't call assembler and linker'#010+ '**2sh_Generate script to link on host'#010+ - '**2st_Generate script to link on target'#010+ + '**2st_Generate ','script to link on target'#010+ '**2sr_Skip register allocation phase (use with -alr)'#010+ '**1T_Target operating system:'#010+ - '3*2','Temx_OS/2 via EMX (including EMX/RSX extender)'#010+ + '3*2Temx_OS/2 via EMX (including EMX/RSX extender)'#010+ '3*2Tfreebsd_FreeBSD'#010+ '3*2Tgo32v2_Version 2 of DJ Delorie DOS extender'#010+ - '3*2Tlinux_Linux'#010+ + '3*2Tlinux_L','inux'#010+ '3*2Tnetbsd_NetBSD'#010+ '3*2Tnetware_Novell Netware Module (clib)'#010+ '3*2Tnetwlibc_Novell Netware Module (libc)'#010+ - '3*2Topen','bsd_OpenBSD'#010+ + '3*2Topenbsd_OpenBSD'#010+ '3*2Tos2_OS/2 / eComStation'#010+ '3*2Tsunos_SunOS/Solaris'#010+ '3*2Twatcom_Watcom compatible DOS extender'#010+ - '3*2Twdosx_WDOSX DOS extender'#010+ + '3*2Twdosx_WDOSX DOS e','xtender'#010+ '3*2Twin32_Windows 32 Bit'#010+ '4*2Tlinux_Linux'#010+ '6*2Tamiga_Commodore Amiga'#010+ '6*2Tatari_Atari ST/STe/TT'#010+ - '6*2Tlinux_Lin','ux-68k'#010+ + '6*2Tlinux_Linux-68k'#010+ '6*2Tmacos_Macintosh m68k (not supported)'#010+ '6*2Tpalmos_PalmOS'#010+ 'A*2Tlinux_Linux'#010+ 'P*2Tdarwin_Darwin and MacOS X on PowerPC'#010+ - 'P*2Tlinux_Linux on PowerPC'#010+ + 'P*2','Tlinux_Linux on PowerPC'#010+ 'P*2Tmacos_MacOS (classic) on PowerPC'#010+ 'P*2Tmorphos_MorphOS'#010+ 'S*2Tlinux_Linux'#010+ - '**1u_undefines',' the symbol '#010+ + '**1u_undefines the symbol '#010+ '**1U_unit options:'#010+ '**2Un_don'#039't check the unit name'#010+ '**2Ur_generate release unit files'#010+ - '**2Us_compile a system unit'#010+ + '**2Us_compile a system un','it'#010+ '**1v_Be verbose. is a combination of the following letters:'#010+ - '**2*_e : Show errors (default) 0 : Sho','w nothing (except errors'+ - ')'#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*_n : Show notes t : Sho','w tried/used files'#010+ '**2*_h : Show hints c : Show conditionals'#010+ - '**2*_i : Show general info ',' d : Show debug info'#010+ + '**2*_i : Show general info d : Show debug info'#010+ '**2*_l : Show linenumbers r : Rhide/GCC compatibility mode'#010+ - '**2*_a : Show everything x : Executable info (Win32 only)'#010+ + '**2*_a : Show everything ',' x : Executable info (Win32 only'+ + ')'#010+ '**2*_v : write fpcdebug.txt with p : Write tree.log with parse tre'+ 'e'#010+ - '**2*_ ',' lots of debugging info'#010+ + '**2*_ lots of debugging info'#010+ '3*1W_Win32-like target options'#010+ '3*2WB_Set Image base to Hexadecimal value'#010+ - '3*2WC_Specify console type application'#010+ + '3*2WC_Specify cons','ole type application'#010+ '3*2WD_Use DEFFILE to export functions of DLL or EXE'#010+ - '3*2WF_Specify full-screen type applicatio','n (OS/2 only)'#010+ + '3*2WF_Specify full-screen type application (OS/2 only)'#010+ '3*2WG_Specify graphic type application'#010+ '3*2WN_Do not generate relocation code (necessary for debugging)'#010+ - '3*2WR_Generate relocation code'#010+ + '3*2WR_Gen','erate relocation code'#010+ 'P*2WC_Specify console type application (MacOS only)'#010+ - 'P*2WG_Specify graphic type application (','MacOS only)'#010+ + 'P*2WG_Specify graphic type application (MacOS only)'#010+ 'P*2WT_Specify tool type application (MPW tool, MacOS only)'#010+ '**1X_executable options:'#010+ - '**2Xc_pass --shared to the linker (Unix only)'#010+ + '**2Xc_pass --shared to the lin','ker (Unix only)'#010+ '**2Xd_don'#039't use standard library search path (needed for cross com'+ 'pile)'#010+ - '**2XD_try to link units dy','namic (defines FPC_LINK_DYNAMIC)'#010+ + '**2XD_try to link units dynamic (defines FPC_LINK_DYNAMIC)'#010+ '**2XP_prepend the binutils names with the prefix '#010+ - '**2Xr_set library search path to (needed for cross compile)'#010+ + '**2Xr_set library search ','path to (needed for cross compile)'#010+ '**2Xs_strip all symbols from executable'#010+ - '**2XS_try to link units static (def','ault) (defines FPC_LINK_STATIC)'#010+ + '**2XS_try to link units static (default) (defines FPC_LINK_STATIC)'#010+ '**2Xt_link with static libraries (-static is passed to linker)'#010+ - '**2XX_try to link units smart (defines FPC_LINK_SMART)'#010+ + '**2XX_try to link units smart ',' (defines FPC_LINK_SMART)'#010+ '**1*_'#010+ '**1?_shows this help'#010+ '**1h_shows this help without waiting'#000 diff --git a/compiler/nadd.pas b/compiler/nadd.pas index 2d1c7e6220..a2501d075e 100644 --- a/compiler/nadd.pas +++ b/compiler/nadd.pas @@ -137,8 +137,8 @@ implementation resulttypepass(left); resulttypepass(right); { both left and right need to be valid } - set_varstate(left,vs_used,true); - set_varstate(right,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); + set_varstate(right,vs_used,[vsf_must_be_valid]); if codegenerror then exit; @@ -1304,9 +1304,9 @@ implementation hsym, ctypeconvnode.create_internal(right,methodpointertype)); end; - if (ld.deftype=procvardef) and + if (ld.deftype=procvardef) and (not tprocvardef(ld).is_addressonly) then - begin + begin left:=csubscriptnode.create( hsym, ctypeconvnode.create_internal(left,methodpointertype)); @@ -2191,7 +2191,10 @@ begin end. { $Log$ - Revision 1.142 2005-03-14 20:18:22 peter + Revision 1.143 2005-03-25 22:20:18 peter + * add hint when passing an uninitialized variable to a var parameter + + Revision 1.142 2005/03/14 20:18:22 peter * for methodpointers compare only proc field Revision 1.141 2005/02/17 17:52:39 peter diff --git a/compiler/ncal.pas b/compiler/ncal.pas index 854e01cd95..552392c592 100644 --- a/compiler/ncal.pas +++ b/compiler/ncal.pas @@ -479,7 +479,7 @@ type floatdef : inserttypeconv(left,s64floattype); end; - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); resulttype:=left.resulttype; { also update parasym type to get the correct parameter location for the new types } @@ -488,7 +488,7 @@ type else if (vo_is_hidden_para in parasym.varoptions) then begin - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); resulttype:=left.resulttype; end else @@ -625,10 +625,14 @@ type if do_count then begin - if parasym.varspez in [vs_var,vs_out] then - set_varstate(left,vs_used,false) - else - set_varstate(left,vs_used,true); + case parasym.varspez of + vs_out : + set_varstate(left,vs_used,[]); + vs_var : + set_varstate(left,vs_used,[vsf_must_be_valid,vsf_use_hints]); + else + set_varstate(left,vs_used,[vsf_must_be_valid]); + end; end; { must only be done after typeconv PM } resulttype:=parasym.vartype; @@ -1488,7 +1492,6 @@ type paraidx, cand_cnt : integer; i : longint; - method_must_be_valid, is_const : boolean; label errorexit; @@ -1525,7 +1528,7 @@ type { procedure variable ? } if assigned(right) then begin - set_varstate(right,vs_used,true); + set_varstate(right,vs_used,[vsf_must_be_valid]); resulttypepass(right); if codegenerror then exit; @@ -1832,10 +1835,9 @@ type ) ) ) then - method_must_be_valid:=false + set_varstate(methodpointer,vs_used,[]) else - method_must_be_valid:=true; - set_varstate(methodpointer,vs_used,method_must_be_valid); + set_varstate(methodpointer,vs_used,[vsf_must_be_valid]); { The object is already used if it is called once } if (hpt.nodetype=loadn) and @@ -2516,7 +2518,10 @@ begin end. { $Log$ - Revision 1.280 2005-03-14 20:18:46 peter + Revision 1.281 2005-03-25 22:20:18 peter + * add hint when passing an uninitialized variable to a var parameter + + Revision 1.280 2005/03/14 20:18:46 peter * fix empty varargs codegeneration for x86_64 Revision 1.279 2005/02/17 17:50:26 peter diff --git a/compiler/ncnv.pas b/compiler/ncnv.pas index 07462920a0..a6b08b98fe 100644 --- a/compiler/ncnv.pas +++ b/compiler/ncnv.pas @@ -2434,8 +2434,8 @@ implementation resulttypepass(left); resulttypepass(right); - set_varstate(left,vs_used,true); - set_varstate(right,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); + set_varstate(right,vs_used,[vsf_must_be_valid]); if codegenerror then exit; @@ -2546,8 +2546,8 @@ implementation resulttypepass(right); resulttypepass(left); - set_varstate(right,vs_used,true); - set_varstate(left,vs_used,true); + set_varstate(right,vs_used,[vsf_must_be_valid]); + set_varstate(left,vs_used,[vsf_must_be_valid]); if codegenerror then exit; @@ -2654,7 +2654,10 @@ begin end. { $Log$ - Revision 1.179 2005-03-11 21:55:43 florian + Revision 1.180 2005-03-25 22:20:18 peter + * add hint when passing an uninitialized variable to a var parameter + + Revision 1.179 2005/03/11 21:55:43 florian + array -> dyn. array type cast Revision 1.178 2005/03/05 16:09:20 jonas diff --git a/compiler/nflw.pas b/compiler/nflw.pas index 7435f29726..c6aad4776f 100644 --- a/compiler/nflw.pas +++ b/compiler/nflw.pas @@ -367,7 +367,7 @@ implementation { loop instruction } if assigned(right) then resulttypepass(right); - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); if codegenerror then exit; @@ -541,7 +541,7 @@ implementation { else path } if assigned(t1) then resulttypepass(t1); - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); if codegenerror then exit; @@ -802,7 +802,7 @@ implementation cloadnode.create(current_procinfo.procdef.funcretsym,current_procinfo.procdef.funcretsym.owner), left); resulttypepass(left); - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); end; resulttype:=voidtype; end; @@ -1122,7 +1122,7 @@ implementation begin { first para must be a _class_ } resulttypepass(left); - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); if codegenerror then exit; if not(is_class(left.resulttype.def)) then @@ -1251,16 +1251,16 @@ implementation resulttype:=voidtype; resulttypepass(left); - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); resulttypepass(right); - set_varstate(right,vs_used,true); + set_varstate(right,vs_used,[vsf_must_be_valid]); { special finally block only executed when there was an exception } if assigned(t1) then begin resulttypepass(t1); - set_varstate(t1,vs_used,true); + set_varstate(t1,vs_used,[vsf_must_be_valid]); end; end; @@ -1391,7 +1391,10 @@ begin end. { $Log$ - Revision 1.111 2005-03-24 23:06:43 peter + Revision 1.112 2005-03-25 22:20:19 peter + * add hint when passing an uninitialized variable to a var parameter + + Revision 1.111 2005/03/24 23:06:43 peter * don't remove repeat until node in repeat until true; Revision 1.110 2005/02/23 20:38:09 florian diff --git a/compiler/ninl.pas b/compiler/ninl.pas index b64a486774..bb38b27204 100644 --- a/compiler/ninl.pas +++ b/compiler/ninl.pas @@ -411,7 +411,7 @@ implementation left := filepara.right; filepara.right := nil; { the file para is a var parameter, but it must be valid already } - set_varstate(filepara.left,vs_used,true); + set_varstate(filepara.left,vs_used,[vsf_must_be_valid]); { check if we should make a temp to store the result of a complex } { expression (better heuristics, anyone?) (JM) } if (filepara.left.nodetype <> loadn) then @@ -1314,7 +1314,7 @@ implementation result:=hp; goto myexit; end; - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); if not is_integer(left.resulttype.def) then CGMessage1(type_e_integer_expr_expected,left.resulttype.def.typename); case inlinenumber of @@ -1333,7 +1333,7 @@ implementation in_sizeof_x: begin - set_varstate(left,vs_used,false); + set_varstate(left,vs_used,[]); if paramanager.push_high_param(vs_value,left.resulttype.def,current_procinfo.procdef.proccalloption) then begin hightree:=load_high_value_node(tparavarsym(tloadnode(left).symtableentry)); @@ -1354,7 +1354,7 @@ implementation in_typeof_x: begin - set_varstate(left,vs_used,false); + set_varstate(left,vs_used,[]); resulttype:=voidpointertype; end; @@ -1367,7 +1367,7 @@ implementation result:=hp; goto myexit; end; - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); case left.resulttype.def.deftype of orddef : begin @@ -1431,7 +1431,7 @@ implementation in_chr_byte: begin { convert to explicit char() } - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); hp:=ctypeconvnode.create_internal(left,cchartype); left:=nil; result:=hp; @@ -1439,7 +1439,7 @@ implementation in_length_x: begin - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); case left.resulttype.def.deftype of stringdef : @@ -1546,7 +1546,7 @@ implementation in_typeinfo_x: begin - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); resulttype:=voidpointertype; end; @@ -1570,7 +1570,7 @@ implementation end; { otherwise handle separately, because there could be a procvar, which } { is 2*sizeof(pointer), while we must only check the first pointer } - set_varstate(tcallparanode(left).left,vs_used,true); + set_varstate(tcallparanode(left).left,vs_used,[vsf_must_be_valid]); resulttype:=booltype; end; @@ -1579,7 +1579,7 @@ implementation in_seg_x : begin - set_varstate(left,vs_used,false); + set_varstate(left,vs_used,[]); result:=cordconstnode.create(0,s32inttype,false); goto myexit; end; @@ -1587,7 +1587,7 @@ implementation in_pred_x, in_succ_x: begin - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); resulttype:=left.resulttype; if not is_ordinal(resulttype.def) then CGMessage(type_e_ordinal_expr_expected) @@ -1630,7 +1630,7 @@ implementation begin { first param must be var } valid_for_var(tcallparanode(left).left); - set_varstate(tcallparanode(left).left,vs_used,true); + set_varstate(tcallparanode(left).left,vs_used,[vsf_must_be_valid]); if (left.resulttype.def.deftype in [enumdef,pointerdef]) or is_ordinal(left.resulttype.def) or @@ -1641,7 +1641,7 @@ implementation { two paras ? } if assigned(tcallparanode(left).right) then begin - set_varstate(tcallparanode(tcallparanode(left).right).left,vs_used,true); + set_varstate(tcallparanode(tcallparanode(left).right).left,vs_used,[vsf_must_be_valid]); inserttypeconv_internal(tcallparanode(tcallparanode(left).right).left,tcallparanode(left).left.resulttype); if assigned(tcallparanode(tcallparanode(left).right).right) then CGMessage(parser_e_illegal_expression); @@ -1698,13 +1698,13 @@ implementation { parameters (JM) } { first param must be var } valid_for_var(tcallparanode(left).left); - set_varstate(tcallparanode(left).left,vs_used,true); + set_varstate(tcallparanode(left).left,vs_used,[vsf_must_be_valid]); { check type } if (left.resulttype.def.deftype=setdef) then begin { insert a type conversion } { to the type of the set elements } - set_varstate(tcallparanode(tcallparanode(left).right).left,vs_used,true); + set_varstate(tcallparanode(tcallparanode(left).right).left,vs_used,[vsf_must_be_valid]); inserttypeconv(tcallparanode(tcallparanode(left).right).left, tsetdef(left.resulttype.def).elementtype); end @@ -1715,7 +1715,7 @@ implementation in_low_x, in_high_x: begin - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); case left.resulttype.def.deftype of orddef, enumdef: @@ -1792,7 +1792,7 @@ implementation end else begin - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); inserttypeconv(left,pbestrealtype^); resulttype:=pbestrealtype^; end; @@ -1813,7 +1813,7 @@ implementation end else begin - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); inserttypeconv(left,pbestrealtype^); resulttype:=s64inttype; end; @@ -1834,7 +1834,7 @@ implementation end else begin - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); inserttypeconv(left,pbestrealtype^); resulttype:=s64inttype; end; @@ -1846,7 +1846,7 @@ implementation setconstrealvalue(frac(getconstrealvalue)) else begin - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); inserttypeconv(left,pbestrealtype^); resulttype:=pbestrealtype^; end; @@ -1858,7 +1858,7 @@ implementation setconstrealvalue(int(getconstrealvalue)) else begin - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); inserttypeconv(left,pbestrealtype^); resulttype:=pbestrealtype^; end; @@ -1878,7 +1878,7 @@ implementation setconstrealvalue(cos(getconstrealvalue)) else begin - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); inserttypeconv(left,pbestrealtype^); resulttype:=pbestrealtype^; end; @@ -1890,7 +1890,7 @@ implementation setconstrealvalue(sin(getconstrealvalue)) else begin - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); inserttypeconv(left,pbestrealtype^); resulttype:=pbestrealtype^; end; @@ -1902,7 +1902,7 @@ implementation setconstrealvalue(arctan(getconstrealvalue)) else begin - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); inserttypeconv(left,pbestrealtype^); resulttype:=pbestrealtype^; end; @@ -1914,7 +1914,7 @@ implementation setconstrealvalue(abs(getconstrealvalue)) else begin - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); inserttypeconv(left,pbestrealtype^); resulttype:=pbestrealtype^; end; @@ -1926,7 +1926,7 @@ implementation setconstrealvalue(sqr(getconstrealvalue)) else begin - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); inserttypeconv(left,pbestrealtype^); resulttype:=pbestrealtype^; end; @@ -1944,7 +1944,7 @@ implementation end else begin - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); inserttypeconv(left,pbestrealtype^); resulttype:=pbestrealtype^; end; @@ -1962,7 +1962,7 @@ implementation end else begin - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); inserttypeconv(left,pbestrealtype^); resulttype:=pbestrealtype^; end; @@ -1982,11 +1982,11 @@ implementation resulttype:=voidtype; if assigned(left) then begin - set_varstate(tcallparanode(left).left,vs_used,true); + set_varstate(tcallparanode(left).left,vs_used,[vsf_must_be_valid]); { check type } if is_boolean(left.resulttype.def) then begin - set_varstate(tcallparanode(tcallparanode(left).right).left,vs_used,true); + set_varstate(tcallparanode(tcallparanode(left).right).left,vs_used,[vsf_must_be_valid]); { must always be a string } inserttypeconv(tcallparanode(tcallparanode(left).right).left,cshortstringtype); end @@ -2479,7 +2479,10 @@ begin end. { $Log$ - Revision 1.162 2005-03-25 21:46:06 jonas + Revision 1.163 2005-03-25 22:20:19 peter + * add hint when passing an uninitialized variable to a var parameter + + Revision 1.162 2005/03/25 21:46:06 jonas * terrornode.create -> cerrornode.create Revision 1.161 2005/03/16 21:24:43 peter diff --git a/compiler/nld.pas b/compiler/nld.pas index 38e62f92a6..009a1599b9 100644 --- a/compiler/nld.pas +++ b/compiler/nld.pas @@ -574,8 +574,8 @@ implementation end; resulttypepass(right); - set_varstate(left,vs_assigned,false); - set_varstate(right,vs_used,true); + set_varstate(left,vs_assigned,[]); + set_varstate(right,vs_used,[vsf_must_be_valid]); if codegenerror then exit; @@ -819,8 +819,8 @@ implementation result:=nil; resulttypepass(left); resulttypepass(right); - set_varstate(left,vs_used,true); - set_varstate(right,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); + set_varstate(right,vs_used,[vsf_must_be_valid]); if codegenerror then exit; resulttype:=left.resulttype; @@ -884,7 +884,7 @@ implementation while assigned(hp) do begin resulttypepass(hp.left); - set_varstate(hp.left,vs_used,true); + set_varstate(hp.left,vs_used,[vsf_must_be_valid]); if (htype.def=nil) then htype:=hp.left.resulttype else @@ -1189,7 +1189,10 @@ begin end. { $Log$ - Revision 1.146 2005-03-18 16:41:27 peter + Revision 1.147 2005-03-25 22:20:19 peter + * add hint when passing an uninitialized variable to a var parameter + + Revision 1.146 2005/03/18 16:41:27 peter don't check size differences for booleans Revision 1.145 2005/02/14 17:13:06 peter diff --git a/compiler/nmat.pas b/compiler/nmat.pas index def98bbc31..fef1dd8b81 100644 --- a/compiler/nmat.pas +++ b/compiler/nmat.pas @@ -106,8 +106,8 @@ implementation result:=nil; resulttypepass(left); resulttypepass(right); - set_varstate(left,vs_used,true); - set_varstate(right,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); + set_varstate(right,vs_used,[vsf_must_be_valid]); if codegenerror then exit; @@ -433,8 +433,8 @@ implementation result:=nil; resulttypepass(left); resulttypepass(right); - set_varstate(right,vs_used,true); - set_varstate(left,vs_used,true); + set_varstate(right,vs_used,[vsf_must_be_valid]); + set_varstate(left,vs_used,[vsf_must_be_valid]); if codegenerror then exit; @@ -542,7 +542,7 @@ implementation begin result:=nil; resulttypepass(left); - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); if codegenerror then exit; @@ -675,7 +675,7 @@ implementation begin result:=nil; resulttypepass(left); - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[]); if codegenerror then exit; @@ -855,7 +855,10 @@ begin end. { $Log$ - Revision 1.66 2005-02-14 17:13:06 peter + Revision 1.67 2005-03-25 22:20:19 peter + * add hint when passing an uninitialized variable to a var parameter + + Revision 1.66 2005/02/14 17:13:06 peter * truncate log } diff --git a/compiler/nmem.pas b/compiler/nmem.pas index 4c33226657..2436994508 100644 --- a/compiler/nmem.pas +++ b/compiler/nmem.pas @@ -416,7 +416,7 @@ implementation { this is like the function addr } inc(parsing_para_level); - set_varstate(left,vs_used,false); + set_varstate(left,vs_used,[]); dec(parsing_para_level); end; @@ -462,7 +462,7 @@ implementation begin result:=nil; resulttypepass(left); - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); if codegenerror then exit; @@ -627,8 +627,11 @@ implementation valid:=is_dynamic_array(left.resulttype.def) or is_ansistring(left.resulttype.def) or is_widestring(left.resulttype.def); - set_varstate(left,vs_used,valid); - set_varstate(right,vs_used,true); + if valid then + set_varstate(left,vs_used,[vsf_must_be_valid]) + else + set_varstate(left,vs_used,[]); + set_varstate(right,vs_used,[vsf_must_be_valid]); if codegenerror then exit; @@ -869,8 +872,7 @@ implementation resulttype:=voidtype; resulttypepass(withrefnode); - //unset_varstate(withrefnode); - set_varstate(withrefnode,vs_used,true); + set_varstate(withrefnode,vs_used,[vsf_must_be_valid]); if codegenerror then exit; @@ -931,7 +933,10 @@ begin end. { $Log$ - Revision 1.94 2005-02-14 17:13:06 peter + Revision 1.95 2005-03-25 22:20:19 peter + * add hint when passing an uninitialized variable to a var parameter + + Revision 1.94 2005/02/14 17:13:06 peter * truncate log } diff --git a/compiler/nset.pas b/compiler/nset.pas index 85cc54fd14..3c8785cd9b 100644 --- a/compiler/nset.pas +++ b/compiler/nset.pas @@ -143,7 +143,7 @@ implementation resulttypepass(left); if assigned(right) then resulttypepass(right); - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); if codegenerror then exit; @@ -212,7 +212,7 @@ implementation result:=nil; resulttype:=booltype; resulttypepass(right); - set_varstate(right,vs_used,true); + set_varstate(right,vs_used,[vsf_must_be_valid]); if codegenerror then exit; @@ -239,7 +239,7 @@ implementation end; resulttypepass(left); - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); if codegenerror then exit; @@ -337,8 +337,8 @@ implementation result:=nil; resulttypepass(left); resulttypepass(right); - set_varstate(left,vs_used,true); - set_varstate(right,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); + set_varstate(right,vs_used,[vsf_must_be_valid]); if codegenerror then exit; { both types must be compatible } @@ -588,7 +588,7 @@ implementation expectloc:=LOC_VOID; { evalutes the case expression } firstpass(left); - set_varstate(left,vs_used,true); + set_varstate(left,vs_used,[vsf_must_be_valid]); if codegenerror then exit; registersint:=left.registersint; @@ -801,7 +801,10 @@ begin end. { $Log$ - Revision 1.57 2005-02-14 17:13:06 peter + Revision 1.58 2005-03-25 22:20:19 peter + * add hint when passing an uninitialized variable to a var parameter + + Revision 1.57 2005/02/14 17:13:06 peter * truncate log } diff --git a/compiler/pexpr.pas b/compiler/pexpr.pas index 974e2baf30..d81a776944 100644 --- a/compiler/pexpr.pas +++ b/compiler/pexpr.pas @@ -684,7 +684,7 @@ implementation p2:=nil; repeat p1:=comp_expr(true); - set_varstate(p1,vs_used,true); + set_varstate(p1,vs_used,[vsf_must_be_valid]); if not((p1.resulttype.def.deftype=stringdef) or ((p1.resulttype.def.deftype=orddef) and (torddef(p1.resulttype.def).typ=uchar))) then @@ -2536,7 +2536,10 @@ implementation end. { $Log$ - Revision 1.185 2005-03-05 16:37:42 florian + Revision 1.186 2005-03-25 22:20:19 peter + * add hint when passing an uninitialized variable to a var parameter + + Revision 1.185 2005/03/05 16:37:42 florian * fixed copy(dyn. array,...); Revision 1.184 2005/03/04 09:56:35 jonas diff --git a/compiler/pinline.pas b/compiler/pinline.pas index 12d3f6b049..c1c39b9b0b 100644 --- a/compiler/pinline.pas +++ b/compiler/pinline.pas @@ -80,9 +80,9 @@ implementation p:=comp_expr(true); { calc return type } if is_new then - set_varstate(p,vs_assigned,false) + set_varstate(p,vs_assigned,[]) else - set_varstate(p,vs_used,true); + set_varstate(p,vs_used,[vsf_must_be_valid]); { constructor,destructor specified } if try_to_consume(_COMMA) then begin @@ -419,7 +419,7 @@ implementation ppn:=tcallparanode(paras); while assigned(ppn.right) do begin - set_varstate(ppn.left,vs_used,true); + set_varstate(ppn.left,vs_used,[vsf_must_be_valid]); inserttypeconv(ppn.left,sinttype); inc(dims); ppn:=tcallparanode(ppn.right); @@ -435,7 +435,7 @@ implementation destppn:=ppn.left; inc(parsing_para_level); valid_for_var(destppn); - set_varstate(destppn,vs_assigned,false); + set_varstate(destppn,vs_assigned,[]); dec(parsing_para_level); { first param must be a string or dynamic array ...} isarray:=is_dynamic_array(destppn.resulttype.def); @@ -741,7 +741,10 @@ implementation end. { $Log$ - Revision 1.42 2005-03-25 21:55:43 jonas + Revision 1.43 2005-03-25 22:20:19 peter + * add hint when passing an uninitialized variable to a var parameter + + Revision 1.42 2005/03/25 21:55:43 jonas * removed some unused variables Revision 1.41 2005/03/05 16:37:42 florian diff --git a/compiler/pstatmnt.pas b/compiler/pstatmnt.pas index 0fd98cdf55..0f22953d33 100644 --- a/compiler/pstatmnt.pas +++ b/compiler/pstatmnt.pas @@ -126,7 +126,7 @@ implementation caseexpr:=comp_expr(true); { determines result type } do_resulttypepass(caseexpr); - set_varstate(caseexpr,vs_used,true); + set_varstate(caseexpr,vs_used,[vsf_must_be_valid]); casedeferror:=false; casedef:=caseexpr.resulttype.def; if (not assigned(casedef)) or @@ -413,11 +413,11 @@ implementation needs to be done before the instruction block is parsed to have a valid hloopvar } resulttypepass(hfrom); - set_varstate(hfrom,vs_used,true); + set_varstate(hfrom,vs_used,[vsf_must_be_valid]); resulttypepass(hto); - set_varstate(hto,vs_used,true); + set_varstate(hto,vs_used,[vsf_must_be_valid]); resulttypepass(hloopvar); - set_varstate(hloopvar,vs_used,false); + set_varstate(hloopvar,vs_used,[]); { ... now the instruction block } hblock:=statement; @@ -1182,7 +1182,10 @@ implementation end. { $Log$ - Revision 1.155 2005-02-14 17:13:07 peter + Revision 1.156 2005-03-25 22:20:19 peter + * add hint when passing an uninitialized variable to a var parameter + + Revision 1.155 2005/02/14 17:13:07 peter * truncate log Revision 1.154 2005/02/11 16:24:59 peter