mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-11-03 16:29:27 +01:00
* more vs_invisible fixes
This commit is contained in:
parent
a4af1a61e1
commit
ffb79851e6
@ -579,6 +579,170 @@ type
|
||||
count_ref:=true;
|
||||
end;
|
||||
{$endif def extdebug}
|
||||
{ Be sure to have the resulttype }
|
||||
if not assigned(left.resulttype.def) then
|
||||
resulttypepass(left);
|
||||
|
||||
{ Handle varargs and hidden paras directly, no typeconvs or }
|
||||
{ typechecking needed }
|
||||
if (nf_varargs_para in flags) or
|
||||
(paraitem.paratyp = vs_hidden) then
|
||||
begin
|
||||
if (paraitem.paratyp <> vs_hidden) then
|
||||
begin
|
||||
{ convert pascal to C types }
|
||||
case left.resulttype.def.deftype of
|
||||
stringdef :
|
||||
inserttypeconv(left,charpointertype);
|
||||
floatdef :
|
||||
inserttypeconv(left,s64floattype);
|
||||
end;
|
||||
end;
|
||||
set_varstate(left,true);
|
||||
resulttype:=left.resulttype;
|
||||
end
|
||||
else
|
||||
begin
|
||||
|
||||
{ Do we need arrayconstructor -> set conversion, then insert
|
||||
it here before the arrayconstructor node breaks the tree
|
||||
with its conversions of enum->ord }
|
||||
if (left.nodetype=arrayconstructorn) and
|
||||
(paraitem.paratype.def.deftype=setdef) then
|
||||
inserttypeconv(left,paraitem.paratype);
|
||||
|
||||
{ set some settings needed for arrayconstructor }
|
||||
if is_array_constructor(left.resulttype.def) then
|
||||
begin
|
||||
if is_array_of_const(paraitem.paratype.def) then
|
||||
begin
|
||||
if assigned(aktcallprocdef) and
|
||||
(aktcallprocdef.proccalloption in [pocall_cppdecl,pocall_cdecl]) then
|
||||
include(left.flags,nf_cargs);
|
||||
{ force variant array }
|
||||
include(left.flags,nf_forcevaria);
|
||||
end
|
||||
else
|
||||
begin
|
||||
include(left.flags,nf_novariaallowed);
|
||||
{ now that the resultting type is know we can insert the required
|
||||
typeconvs for the array constructor }
|
||||
tarrayconstructornode(left).force_type(tarraydef(paraitem.paratype.def).elementtype);
|
||||
end;
|
||||
end;
|
||||
|
||||
{ check if local proc/func is assigned to procvar }
|
||||
if left.resulttype.def.deftype=procvardef then
|
||||
test_local_to_procvar(tprocvardef(left.resulttype.def),paraitem.paratype.def);
|
||||
|
||||
{ generate the high() value tree }
|
||||
if paramanager.push_high_param(paraitem.paratype.def,aktcallprocdef.proccalloption) then
|
||||
gen_high_tree(is_open_string(paraitem.paratype.def));
|
||||
|
||||
{ test conversions }
|
||||
if not(is_shortstring(left.resulttype.def) and
|
||||
is_shortstring(paraitem.paratype.def)) and
|
||||
(paraitem.paratype.def.deftype<>formaldef) then
|
||||
begin
|
||||
{ Process open parameters }
|
||||
if paramanager.push_high_param(paraitem.paratype.def,aktcallprocdef.proccalloption) then
|
||||
begin
|
||||
{ insert type conv but hold the ranges of the array }
|
||||
oldtype:=left.resulttype;
|
||||
inserttypeconv(left,paraitem.paratype);
|
||||
left.resulttype:=oldtype;
|
||||
end
|
||||
else
|
||||
begin
|
||||
{ for ordinals, floats and enums, verify if we might cause
|
||||
some range-check errors. }
|
||||
if (left.resulttype.def.deftype in [enumdef,orddef,floatdef]) and
|
||||
(left.nodetype in [vecn,loadn,calln]) then
|
||||
begin
|
||||
if (left.resulttype.def.size>paraitem.paratype.def.size) then
|
||||
begin
|
||||
if (cs_check_range in aktlocalswitches) then
|
||||
Message(type_w_smaller_possible_range_check)
|
||||
else
|
||||
Message(type_h_smaller_possible_range_check);
|
||||
end;
|
||||
end;
|
||||
inserttypeconv(left,paraitem.paratype);
|
||||
end;
|
||||
if codegenerror then
|
||||
begin
|
||||
dec(parsing_para_level);
|
||||
exit;
|
||||
end;
|
||||
end;
|
||||
|
||||
{ check var strings }
|
||||
if (cs_strict_var_strings in aktlocalswitches) and
|
||||
is_shortstring(left.resulttype.def) and
|
||||
is_shortstring(paraitem.paratype.def) and
|
||||
(paraitem.paratyp in [vs_out,vs_var]) and
|
||||
not(is_open_string(paraitem.paratype.def)) and
|
||||
not(equal_defs(left.resulttype.def,paraitem.paratype.def)) then
|
||||
begin
|
||||
aktfilepos:=left.fileinfo;
|
||||
CGMessage(type_e_strict_var_string_violation);
|
||||
end;
|
||||
|
||||
{ Handle formal parameters separate }
|
||||
if (paraitem.paratype.def.deftype=formaldef) then
|
||||
begin
|
||||
{ load procvar if a procedure is passed }
|
||||
if (m_tp_procvar in aktmodeswitches) and
|
||||
(left.nodetype=calln) and
|
||||
(is_void(left.resulttype.def)) then
|
||||
load_procvar_from_calln(left);
|
||||
|
||||
case paraitem.paratyp of
|
||||
vs_var,
|
||||
vs_out :
|
||||
begin
|
||||
if not valid_for_formal_var(left) then
|
||||
CGMessagePos(left.fileinfo,parser_e_illegal_parameter_list);
|
||||
end;
|
||||
vs_const :
|
||||
begin
|
||||
if not valid_for_formal_const(left) then
|
||||
CGMessagePos(left.fileinfo,parser_e_illegal_parameter_list);
|
||||
end;
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
{ check if the argument is allowed }
|
||||
if (paraitem.paratyp in [vs_out,vs_var]) then
|
||||
valid_for_var(left);
|
||||
end;
|
||||
|
||||
if paraitem.paratyp in [vs_var,vs_const] then
|
||||
begin
|
||||
{ Causes problems with const ansistrings if also }
|
||||
{ done for vs_const (JM) }
|
||||
if paraitem.paratyp = vs_var then
|
||||
set_unique(left);
|
||||
make_not_regable(left);
|
||||
end;
|
||||
|
||||
{ ansistrings out paramaters doesn't need to be }
|
||||
{ unique, they are finalized }
|
||||
if paraitem.paratyp=vs_out then
|
||||
make_not_regable(left);
|
||||
|
||||
if do_count then
|
||||
begin
|
||||
{ not completly proper, but avoids some warnings }
|
||||
if (paraitem.paratyp in [vs_var,vs_out]) then
|
||||
set_funcret_is_valid(left);
|
||||
set_varstate(left,not(paraitem.paratyp in [vs_var,vs_out]));
|
||||
end;
|
||||
{ must only be done after typeconv PM }
|
||||
resulttype:=paraitem.paratype;
|
||||
end;
|
||||
|
||||
if assigned(right) then
|
||||
begin
|
||||
{ if we are a para that belongs to varargs then keep
|
||||
@ -588,169 +752,7 @@ type
|
||||
else
|
||||
tcallparanode(right).insert_typeconv(tparaitem(paraitem.next),do_count)
|
||||
end;
|
||||
{ Be sure to have the resulttype }
|
||||
if not assigned(left.resulttype.def) then
|
||||
resulttypepass(left);
|
||||
|
||||
{ Handle varargs and hidden paras directly, no typeconvs or }
|
||||
{ typechecking needed }
|
||||
if (nf_varargs_para in flags) or
|
||||
(paraitem.paratyp = vs_hidden) then
|
||||
begin
|
||||
if (paraitem.paratyp <> vs_hidden) then
|
||||
begin
|
||||
{ convert pascal to C types }
|
||||
case left.resulttype.def.deftype of
|
||||
stringdef :
|
||||
inserttypeconv(left,charpointertype);
|
||||
floatdef :
|
||||
inserttypeconv(left,s64floattype);
|
||||
end;
|
||||
end;
|
||||
set_varstate(left,true);
|
||||
resulttype:=left.resulttype;
|
||||
dec(parsing_para_level);
|
||||
exit;
|
||||
end;
|
||||
|
||||
|
||||
{ Do we need arrayconstructor -> set conversion, then insert
|
||||
it here before the arrayconstructor node breaks the tree
|
||||
with its conversions of enum->ord }
|
||||
if (left.nodetype=arrayconstructorn) and
|
||||
(paraitem.paratype.def.deftype=setdef) then
|
||||
inserttypeconv(left,paraitem.paratype);
|
||||
|
||||
{ set some settings needed for arrayconstructor }
|
||||
if is_array_constructor(left.resulttype.def) then
|
||||
begin
|
||||
if is_array_of_const(paraitem.paratype.def) then
|
||||
begin
|
||||
if assigned(aktcallprocdef) and
|
||||
(aktcallprocdef.proccalloption in [pocall_cppdecl,pocall_cdecl]) then
|
||||
include(left.flags,nf_cargs);
|
||||
{ force variant array }
|
||||
include(left.flags,nf_forcevaria);
|
||||
end
|
||||
else
|
||||
begin
|
||||
include(left.flags,nf_novariaallowed);
|
||||
{ now that the resultting type is know we can insert the required
|
||||
typeconvs for the array constructor }
|
||||
tarrayconstructornode(left).force_type(tarraydef(paraitem.paratype.def).elementtype);
|
||||
end;
|
||||
end;
|
||||
|
||||
{ check if local proc/func is assigned to procvar }
|
||||
if left.resulttype.def.deftype=procvardef then
|
||||
test_local_to_procvar(tprocvardef(left.resulttype.def),paraitem.paratype.def);
|
||||
|
||||
{ generate the high() value tree }
|
||||
if paramanager.push_high_param(paraitem.paratype.def,aktcallprocdef.proccalloption) then
|
||||
gen_high_tree(is_open_string(paraitem.paratype.def));
|
||||
|
||||
{ test conversions }
|
||||
if not(is_shortstring(left.resulttype.def) and
|
||||
is_shortstring(paraitem.paratype.def)) and
|
||||
(paraitem.paratype.def.deftype<>formaldef) then
|
||||
begin
|
||||
{ Process open parameters }
|
||||
if paramanager.push_high_param(paraitem.paratype.def,aktcallprocdef.proccalloption) then
|
||||
begin
|
||||
{ insert type conv but hold the ranges of the array }
|
||||
oldtype:=left.resulttype;
|
||||
inserttypeconv(left,paraitem.paratype);
|
||||
left.resulttype:=oldtype;
|
||||
end
|
||||
else
|
||||
begin
|
||||
{ for ordinals, floats and enums, verify if we might cause
|
||||
some range-check errors. }
|
||||
if (left.resulttype.def.deftype in [enumdef,orddef,floatdef]) and
|
||||
(left.nodetype in [vecn,loadn,calln]) then
|
||||
begin
|
||||
if (left.resulttype.def.size>paraitem.paratype.def.size) then
|
||||
begin
|
||||
if (cs_check_range in aktlocalswitches) then
|
||||
Message(type_w_smaller_possible_range_check)
|
||||
else
|
||||
Message(type_h_smaller_possible_range_check);
|
||||
end;
|
||||
end;
|
||||
inserttypeconv(left,paraitem.paratype);
|
||||
end;
|
||||
if codegenerror then
|
||||
begin
|
||||
dec(parsing_para_level);
|
||||
exit;
|
||||
end;
|
||||
end;
|
||||
|
||||
{ check var strings }
|
||||
if (cs_strict_var_strings in aktlocalswitches) and
|
||||
is_shortstring(left.resulttype.def) and
|
||||
is_shortstring(paraitem.paratype.def) and
|
||||
(paraitem.paratyp in [vs_out,vs_var]) and
|
||||
not(is_open_string(paraitem.paratype.def)) and
|
||||
not(equal_defs(left.resulttype.def,paraitem.paratype.def)) then
|
||||
begin
|
||||
aktfilepos:=left.fileinfo;
|
||||
CGMessage(type_e_strict_var_string_violation);
|
||||
end;
|
||||
|
||||
{ Handle formal parameters separate }
|
||||
if (paraitem.paratype.def.deftype=formaldef) then
|
||||
begin
|
||||
{ load procvar if a procedure is passed }
|
||||
if (m_tp_procvar in aktmodeswitches) and
|
||||
(left.nodetype=calln) and
|
||||
(is_void(left.resulttype.def)) then
|
||||
load_procvar_from_calln(left);
|
||||
|
||||
case paraitem.paratyp of
|
||||
vs_var,
|
||||
vs_out :
|
||||
begin
|
||||
if not valid_for_formal_var(left) then
|
||||
CGMessagePos(left.fileinfo,parser_e_illegal_parameter_list);
|
||||
end;
|
||||
vs_const :
|
||||
begin
|
||||
if not valid_for_formal_const(left) then
|
||||
CGMessagePos(left.fileinfo,parser_e_illegal_parameter_list);
|
||||
end;
|
||||
end;
|
||||
end
|
||||
else
|
||||
begin
|
||||
{ check if the argument is allowed }
|
||||
if (paraitem.paratyp in [vs_out,vs_var]) then
|
||||
valid_for_var(left);
|
||||
end;
|
||||
|
||||
if paraitem.paratyp in [vs_var,vs_const] then
|
||||
begin
|
||||
{ Causes problems with const ansistrings if also }
|
||||
{ done for vs_const (JM) }
|
||||
if paraitem.paratyp = vs_var then
|
||||
set_unique(left);
|
||||
make_not_regable(left);
|
||||
end;
|
||||
|
||||
{ ansistrings out paramaters doesn't need to be }
|
||||
{ unique, they are finalized }
|
||||
if paraitem.paratyp=vs_out then
|
||||
make_not_regable(left);
|
||||
|
||||
if do_count then
|
||||
begin
|
||||
{ not completly proper, but avoids some warnings }
|
||||
if (paraitem.paratyp in [vs_var,vs_out]) then
|
||||
set_funcret_is_valid(left);
|
||||
set_varstate(left,not(paraitem.paratyp in [vs_var,vs_out]));
|
||||
end;
|
||||
{ must only be done after typeconv PM }
|
||||
resulttype:=paraitem.paratype;
|
||||
dec(parsing_para_level);
|
||||
{$ifdef extdebug}
|
||||
if do_count then
|
||||
@ -874,8 +876,6 @@ type
|
||||
right:=temp;
|
||||
if (tparaitem(paraitem.next).paratyp <> vs_hidden) then
|
||||
internalerror(200304071);
|
||||
tcallparanode(right).paraitem := tparaitem(paraitem.next);
|
||||
tcallparanode(right).firstcallparan(false);
|
||||
|
||||
include(flags,nf_hightree_generated);
|
||||
end;
|
||||
@ -2411,7 +2411,10 @@ begin
|
||||
end.
|
||||
{
|
||||
$Log$
|
||||
Revision 1.133 2003-04-07 10:40:21 jonas
|
||||
Revision 1.134 2003-04-07 11:58:22 jonas
|
||||
* more vs_invisible fixes
|
||||
|
||||
Revision 1.133 2003/04/07 10:40:21 jonas
|
||||
* fixed VS_HIDDEN for high parameter so it works again
|
||||
|
||||
Revision 1.132 2003/04/04 15:38:56 peter
|
||||
|
||||
Loading…
Reference in New Issue
Block a user