# HG changeset patch # User Christian Kamm # Date 1238246783 -3600 # Node ID 08c1c3bfea5ad20424d3466a50f19a72442bcabb # Parent ee8db0b7bb620908682f39e5cecd51d66a884c59 Fix goto inside synchronized functions. diff -r ee8db0b7bb62 -r 08c1c3bfea5a dmd/func.c --- 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);