* fix calling convention problem when parsing default value before

the semicolon
This commit is contained in:
peter 2004-04-11 12:38:16 +00:00
parent 2824f0b208
commit 51452c1e1b

View File

@ -48,7 +48,7 @@ implementation
fmodule,
{ pass 1 }
node,pass_1,
nmat,nadd,ncal,nset,ncnv,ninl,ncon,nld,nflw,nmem,nutils,
nmat,nadd,ncal,nset,ncnv,ninl,ncon,nld,nflw,nmem,
{ codegen }
ncgutil,
{ parser }
@ -660,6 +660,7 @@ implementation
{ c var }
newtype : ttypesym;
is_dll,
hasdefaultvalue,
is_gpc_name,is_cdecl,
extern_var,export_var : boolean;
old_current_object_option : tsymoptions;
@ -748,6 +749,7 @@ implementation
(tt.def.needs_inittable and not is_class(tt.def)) then
Message(parser_e_cant_use_inittable_here);
ignore_equal:=false;
hasdefaultvalue:=false;
symdone:=false;
if is_gpc_name then
begin
@ -851,54 +853,56 @@ implementation
pt.free;
symdone:=true;
end;
{ Process procvar directives before = and ; }
if (tt.def.deftype=procvardef) and
(tt.def.typesym=nil) and
is_proc_directive(token,true) then
begin
newtype:=ttypesym.create('unnamed',tt);
parse_var_proc_directives(tsym(newtype));
newtype.restype.def:=nil;
tt.def.typesym:=nil;
newtype.free;
end;
{ try to parse the hint directives }
dummysymoptions:=[];
try_consume_hintdirective(dummysymoptions);
{ Records and objects can't have default values }
if is_record or is_object then
begin
{ try to parse the hint directives }
dummysymoptions:=[];
try_consume_hintdirective(dummysymoptions);
{ for a record there doesn't need to be a ; before the END or ) }
if not(token in [_END,_RKLAMMER]) then
consume(_SEMICOLON);
end
else
begin
{ Process procvar directives before = and ; }
if (tt.def.deftype=procvardef) and
(tt.def.typesym=nil) and
is_proc_directive(token,true) then
begin
newtype:=ttypesym.create('unnamed',tt);
parse_var_proc_directives(tsym(newtype));
newtype.restype.def:=nil;
tt.def.typesym:=nil;
newtype.free;
end;
{ try to parse the hint directives }
dummysymoptions:=[];
try_consume_hintdirective(dummysymoptions);
{ Handling of Delphi typed const = initialized vars ! }
{ When should this be rejected ?
- in parasymtable
- in record or object
- ... (PM) }
{ Handling of Delphi typed const = initialized vars }
if (token=_EQUAL) and
not(m_tp7 in aktmodeswitches) and
not(symtablestack.symtabletype in [parasymtable]) and
not is_record and
not is_object then
(symtablestack.symtabletype<>parasymtable) then
begin
if (tt.def.deftype=procvardef) and
(tt.def.typesym=nil) then
begin
{ Add calling convention for procvar }
handle_calling_convention(tprocvardef(tt.def));
calc_parast(tprocvardef(tt.def));
end;
read_default_value(sc,tt,is_threadvar);
{ for locals we've created typedconstsym with a different name }
if symtablestack.symtabletype<>localsymtable then
symdone:=true;
hasdefaultvalue:=true;
end;
consume(_SEMICOLON);
end;
{ Add calling convention for procvars }
if (tt.def.deftype=procvardef) and
{ Support calling convention for procvars after semicolon }
if not(hasdefaultvalue) and
(tt.def.deftype=procvardef) and
(tt.def.typesym=nil) then
begin
{ Parse procvar directives after ; }
@ -913,18 +917,19 @@ implementation
{ Add calling convention for procvar }
handle_calling_convention(tprocvardef(tt.def));
calc_parast(tprocvardef(tt.def));
{ Handling of Delphi typed const = initialized vars ! }
{ Handling of Delphi typed const = initialized vars }
if (token=_EQUAL) and
not(is_record or is_object) and
not(m_tp7 in aktmodeswitches) and
not(symtablestack.symtabletype in [parasymtable]) and
not is_record and
not is_object then
(symtablestack.symtabletype<>parasymtable) then
begin
read_default_value(sc,tt,is_threadvar);
consume(_SEMICOLON);
symdone:=true;
hasdefaultvalue:=true;
end;
end;
{ Check for variable directives }
if not symdone and (token=_ID) then
begin
@ -1172,7 +1177,11 @@ implementation
end.
{
$Log$
Revision 1.72 2004-03-23 22:34:49 peter
Revision 1.73 2004-04-11 12:38:16 peter
* fix calling convention problem when parsing default value before
the semicolon
Revision 1.72 2004/03/23 22:34:49 peter
* constants ordinals now always have a type assigned
* integer constants have the smallest type, unsigned prefered over
signed