diff options
author | sergei <sergei@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2014-04-05 01:17:36 +0000 |
---|---|---|
committer | sergei <sergei@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2014-04-05 01:17:36 +0000 |
commit | dabcb8836c109ef9e89f75fb5f028d069e4e8783 (patch) | |
tree | 3f46f9630e4043fd28eb7e4e54dcfb0b83ec9b07 | |
parent | 1d2efbaa8d11a5abc85a303227e65ed077809daf (diff) | |
download | fpc-dabcb8836c109ef9e89f75fb5f028d069e4e8783.tar.gz |
* Calling tlabelsym.mangledname should not define the label. This was causing "already defined" errors if a label was referenced before it was defined.
+ Test.
+ Check duplicate labels in assembler blocks. This was impossible due to above bug and duplicate labels were detected only at assembling stage where no location information could be provided.
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@27472 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r-- | compiler/rautils.pas | 6 | ||||
-rw-r--r-- | compiler/symsym.pas | 3 | ||||
-rw-r--r-- | tests/tbs/tb0468a.pas | 27 |
3 files changed, 33 insertions, 3 deletions
diff --git a/compiler/rautils.pas b/compiler/rautils.pas index 334aad6030..ae6f6d46e1 100644 --- a/compiler/rautils.pas +++ b/compiler/rautils.pas @@ -1513,7 +1513,11 @@ Begin current_asmdata.getjumplabel(tlabelsym(sym).asmblocklabel); hl:=tlabelsym(sym).asmblocklabel; if emit then - tlabelsym(sym).defined:=true + begin + if tlabelsym(sym).defined then + Message(sym_e_label_already_defined); + tlabelsym(sym).defined:=true + end else tlabelsym(sym).used:=true; SearchLabel:=true; diff --git a/compiler/symsym.pas b/compiler/symsym.pas index 02dbae09dd..7c5e434761 100644 --- a/compiler/symsym.pas +++ b/compiler/symsym.pas @@ -625,9 +625,8 @@ implementation function tlabelsym.mangledname:TSymStr; begin - if not(defined) then + if (asmblocklabel=nil) then begin - defined:=true; if nonlocal then current_asmdata.getglobaljumplabel(asmblocklabel) else diff --git a/tests/tbs/tb0468a.pas b/tests/tbs/tb0468a.pas new file mode 100644 index 0000000000..adbebc8ca6 --- /dev/null +++ b/tests/tbs/tb0468a.pas @@ -0,0 +1,27 @@ +{ %OPT=-Sg } + +procedure foo; +begin +end; + +procedure test; +label + a,b,c,d; +const + x: array[0..3] of pointer=(@a,@b,@c,@d); +begin + foo; +a: + foo; +b: + foo; +c: + foo; +d: + foo; +end; + + +begin +end. + |