summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsergei <sergei@3ad0048d-3df7-0310-abae-a5850022a9f2>2014-04-05 01:17:36 +0000
committersergei <sergei@3ad0048d-3df7-0310-abae-a5850022a9f2>2014-04-05 01:17:36 +0000
commitdabcb8836c109ef9e89f75fb5f028d069e4e8783 (patch)
tree3f46f9630e4043fd28eb7e4e54dcfb0b83ec9b07
parent1d2efbaa8d11a5abc85a303227e65ed077809daf (diff)
downloadfpc-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.pas6
-rw-r--r--compiler/symsym.pas3
-rw-r--r--tests/tbs/tb0468a.pas27
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.
+