diff dmd/func.c @ 1158:08c1c3bfea5a

Fix goto inside synchronized functions.
author Christian Kamm <kamm incasoftware de>
date Sat, 28 Mar 2009 14:26:23 +0100
parents 1860414bf3b7
children a8b9fc41c34b
line wrap: on
line diff
--- a/dmd/func.c	Sat Mar 28 10:50:44 2009 +0100
+++ b/dmd/func.c	Sat Mar 28 14:26:23 2009 +0100
@@ -1267,13 +1267,19 @@
 		    sync = new VarExp(loc, vthis);
 		}
                 
-		// is is ok to not rerun semantic on the whole fbody here; only the enclosingScopeExit
-		// value will differ and as it is impossible to goto out of this synchronized statement,
-		// that should not lead to errors
+		// we do not want to rerun semantics on the whole function, so we
+		// manually adjust all labels in the function that currently don't
+		// have an enclosingScopeExit to use the new SynchronizedStatement
 		SynchronizedStatement* s = new SynchronizedStatement(loc, sync, NULL);
 		s->semantic(sc2);
 		s->body = fbody;
 		
+		// LDC
+		LabelMap::iterator it, end = labmap.end();
+		for (it = labmap.begin(); it != end; ++it)
+		    if (it->second->enclosingScopeExit == NULL)
+			it->second->enclosingScopeExit = s;
+		
 		a = new Statements;
 		a->push(s);
 		fbody = new CompoundStatement(0, a);