diff --git a/compiler/pdecsub.pas b/compiler/pdecsub.pas index 4a46089cd0..9e40846f6c 100644 --- a/compiler/pdecsub.pas +++ b/compiler/pdecsub.pas @@ -409,6 +409,7 @@ implementation st : tsymtable; srsymtable : tsymtable; storepos,procstartfilepos : tfileposinfo; + searchagain : boolean; i: longint; begin { Save the position where this procedure really starts } @@ -521,64 +522,80 @@ implementation (options in [potype_constructor,potype_destructor]) then Message(parser_e_constructors_always_objects); - akttokenpos:=procstartfilepos; - aktprocsym:=tprocsym(symtablestack.search(sp)); + repeat + searchagain:=false; + akttokenpos:=procstartfilepos; + aktprocsym:=tprocsym(symtablestack.search(sp)); - if not(parse_only) then - begin - {The procedure we prepare for is in the implementation - part of the unit we compile. It is also possible that we - are compiling a program, which is also some kind of - implementaion part. - - We need to find out if the procedure is global. If it is - global, it is in the global symtable.} - if not assigned(aktprocsym) and - (symtablestack.symtabletype=staticsymtable) and - assigned(symtablestack.next) and - (symtablestack.next.unitid=0) then - begin - {Search the procedure in the global symtable.} - aktprocsym:=tprocsym(symtablestack.next.search(sp)); - if assigned(aktprocsym) then - begin - {Check if it is a procedure.} - if aktprocsym.typ<>procsym then - DuplicateSym(aktprocsym); - {The procedure has been found. So it is - a global one. Set the flags to mark this.} - procinfo.flags:=procinfo.flags or pi_is_global; - end; - end; - end; - end; - - if assigned(aktprocsym) then - begin - { Check if overloaded is a procsym } - if aktprocsym.typ<>procsym then - begin - { when the other symbol is a unit symbol then hide the unit - symbol. Only in tp mode because it's bad programming } - if (m_duplicate_names in aktmodeswitches) and - (aktprocsym.typ=unitsym) then + if not(parse_only) then begin - aktprocsym.owner.rename(aktprocsym.name,'hidden'+aktprocsym.name); - end - else - begin - { we use a different error message for tp7 so it looks more compatible } - if (m_fpc in aktmodeswitches) then - Message1(parser_e_overloaded_no_procedure,aktprocsym.realname) - else - DuplicateSym(aktprocsym); - { rename the name to an unique name to avoid an - error when inserting the symbol in the symtable } - orgsp:=orgsp+'$'+tostr(aktfilepos.line); + {The procedure we prepare for is in the implementation + part of the unit we compile. It is also possible that we + are compiling a program, which is also some kind of + implementaion part. + + We need to find out if the procedure is global. If it is + global, it is in the global symtable.} + if not assigned(aktprocsym) and + (symtablestack.symtabletype=staticsymtable) and + assigned(symtablestack.next) and + (symtablestack.next.unitid=0) then + begin + {Search the procedure in the global symtable.} + aktprocsym:=tprocsym(symtablestack.next.search(sp)); + if assigned(aktprocsym) then + begin + {Check if it is a procedure.} + if aktprocsym.typ<>procsym then + begin + { when the other symbol is a unit symbol then hide the unit + symbol. Only in tp mode because it's bad programming } + if (m_duplicate_names in aktmodeswitches) and + (aktprocsym.typ=unitsym) then + begin + aktprocsym.owner.rename(aktprocsym.name,'hidden'+aktprocsym.name); + searchagain:=true; + end + else + DuplicateSym(aktprocsym); + end; + {The procedure has been found. So it is + a global one. Set the flags to mark this.} + procinfo.flags:=procinfo.flags or pi_is_global; + end; + end; end; - { generate a new aktprocsym } - aktprocsym:=nil; - end; + + if (not searchagain) and + assigned(aktprocsym) then + begin + { Check if overloaded is a procsym } + if aktprocsym.typ<>procsym then + begin + { when the other symbol is a unit symbol then hide the unit + symbol. Only in tp mode because it's bad programming } + if (m_duplicate_names in aktmodeswitches) and + (aktprocsym.typ=unitsym) then + begin + aktprocsym.owner.rename(aktprocsym.name,'hidden'+aktprocsym.name); + searchagain:=true; + end + else + begin + { we use a different error message for tp7 so it looks more compatible } + if (m_fpc in aktmodeswitches) then + Message1(parser_e_overloaded_no_procedure,aktprocsym.realname) + else + DuplicateSym(aktprocsym); + { rename the name to an unique name to avoid an + error when inserting the symbol in the symtable } + orgsp:=orgsp+'$'+tostr(aktfilepos.line); + end; + { generate a new aktprocsym } + aktprocsym:=nil; + end; + end; + until not searchagain; end; { test again if assigned, it can be reset to recover } @@ -2079,7 +2096,10 @@ const end. { $Log$ - Revision 1.93 2002-12-24 21:21:06 peter + Revision 1.94 2002-12-25 01:26:56 peter + * duplicate procsym-unitsym fix + + Revision 1.93 2002/12/24 21:21:06 peter * remove code that skipped the _ prefix for win32 imports Revision 1.92 2002/12/23 21:24:22 peter diff --git a/compiler/psub.pas b/compiler/psub.pas index ab6ce76ff1..206cb66e2d 100644 --- a/compiler/psub.pas +++ b/compiler/psub.pas @@ -657,7 +657,9 @@ implementation begin Message1(parser_p_procedure_start, aktprocdef.fullprocname); - aktprocdef.aliasnames.insert(aktprocdef.mangledname); + + if assigned(aktprocsym.owner) then + aktprocdef.aliasnames.insert(aktprocdef.mangledname); { set _FAIL as keyword if constructor } if (aktprocdef.proctypeoption=potype_constructor) then tokeninfo^[_FAIL].keyword:=m_all; @@ -687,6 +689,12 @@ implementation prevdef.nextoverloaded:=stdef; end; {$endif notused} + { release procsym when it was not stored in the symtable } + if not assigned(aktprocsym.owner) then + begin + aktprocsym.free; + aktprocdef.procsym:=nil; + end; aktprocsym:=oldprocsym; aktprocdef:=oldprocdef; procinfo:=oldprocinfo; @@ -810,7 +818,10 @@ implementation end. { $Log$ - Revision 1.81 2002-12-15 13:37:15 peter + Revision 1.82 2002-12-25 01:26:56 peter + * duplicate procsym-unitsym fix + + Revision 1.81 2002/12/15 13:37:15 peter * don't include uf_init for library. The code is already called and does not need to be in the initfinal table diff --git a/compiler/symtable.pas b/compiler/symtable.pas index e21edb4300..8406111333 100644 --- a/compiler/symtable.pas +++ b/compiler/symtable.pas @@ -1663,8 +1663,17 @@ implementation hsym:=tsym(next.search(sym.name)); if assigned(hsym) then begin - DuplicateSym(hsym); - exit; + { Delphi you can have a symbol with the same name as the + unit, the unit can then not be accessed anymore using + ., so we can hide the symbol } + if (m_duplicate_names in aktmodeswitches) and + (hsym.typ=symconst.unitsym) then + hsym.owner.rename(hsym.name,'hidden'+hsym.name) + else + begin + DuplicateSym(hsym); + exit; + end; end; end; @@ -1821,8 +1830,17 @@ implementation hsym:=tsym(next.search(sym.name)); if assigned(hsym) then begin - DuplicateSym(hsym); - exit; + { Delphi you can have a symbol with the same name as the + unit, the unit can then not be accessed anymore using + ., so we can hide the symbol } + if (m_duplicate_names in aktmodeswitches) and + (hsym.typ=symconst.unitsym) then + hsym.owner.rename(hsym.name,'hidden'+hsym.name) + else + begin + DuplicateSym(hsym); + exit; + end; end; end; @@ -2341,7 +2359,10 @@ implementation end. { $Log$ - Revision 1.86 2002-12-21 13:07:34 peter + Revision 1.87 2002-12-25 01:26:56 peter + * duplicate procsym-unitsym fix + + Revision 1.86 2002/12/21 13:07:34 peter * type redefine fix for tb0437 Revision 1.85 2002/12/07 14:27:10 carl