* delay parsing of the closing SEMICOLON of a uses clause till the

unit map is updated to avoid symbols not being found, resolves #8611

git-svn-id: trunk@23886 -
This commit is contained in:
florian 2013-03-17 11:06:04 +00:00
parent 1c652eb8f9
commit 784641ec46
3 changed files with 39 additions and 5 deletions

1
.gitattributes vendored
View File

@ -13897,6 +13897,7 @@ tests/webtbs/tw8523.pp svneol=native#text/plain
tests/webtbs/tw8525.pp svneol=native#text/plain
tests/webtbs/tw8573.pp svneol=native#text/plain
tests/webtbs/tw8580.pp svneol=native#text/plain
tests/webtbs/tw8611.pp svneol=native#text/pascal
tests/webtbs/tw8615.pp svneol=native#text/plain
tests/webtbs/tw8633.pp svneol=native#text/plain
tests/webtbs/tw8660.pp svneol=native#text/plain

View File

@ -502,8 +502,6 @@ implementation
end;
pu:=tused_unit(pu.next);
end;
consume(_SEMICOLON);
end;
@ -542,7 +540,10 @@ implementation
procedure parse_implementation_uses;
begin
if token=_USES then
loadunits;
begin
loadunits;
consume(_SEMICOLON);
end;
end;
@ -743,6 +744,7 @@ type
i,j : longint;
finishstate:pfinishstate;
globalstate:pglobalstate;
consume_semicolon_after_uses:boolean;
begin
result:=true;
@ -847,7 +849,10 @@ type
{ has it been compiled at a higher level ?}
if current_module.state=ms_compiled then
exit;
end;
consume_semicolon_after_uses:=true;
end
else
consume_semicolon_after_uses:=false;
{ move the global symtable from the temporary local to global }
current_module.globalsymtable:=current_module.localsymtable;
@ -857,6 +862,11 @@ type
needs to be added implicitly }
current_module.updatemaps;
{ consume the semicolon after maps have been updated else conditional compiling expressions
might cause internal errors, see tw8611 }
if consume_semicolon_after_uses then
consume(_SEMICOLON);
{ create whole program optimisation information (may already be
updated in the interface, e.g., in case of classrefdef typed
constants }
@ -1889,6 +1899,7 @@ type
force_init_final : boolean;
resources_used : boolean;
program_name : ansistring;
consume_semicolon_after_uses : boolean;
begin
DLLsource:=islibrary;
Status.IsLibrary:=IsLibrary;
@ -2004,11 +2015,21 @@ type
{Load the units used by the program we compile.}
if token=_USES then
loadunits;
begin
loadunits;
consume_semicolon_after_uses:=true;
end
else
consume_semicolon_after_uses:=false;
{ All units are read, now give them a number }
current_module.updatemaps;
{ consume the semicolon after maps have been updated else conditional compiling expressions
might cause internal errors, see tw8611 }
if consume_semicolon_after_uses then
consume(_SEMICOLON);
{Insert the name of the main program into the symbol table.}
if current_module.realmodulename^<>'' then
tabstractunitsymtable(current_module.localsymtable).insertunit(tunitsym.create(current_module.realmodulename^,current_module));

12
tests/webtbs/tw8611.pp Normal file
View File

@ -0,0 +1,12 @@
program ie200501152;
{$mode objfpc}
uses
Classes;
{$if declared(TObject)}
{$endif}
begin
end.