From 99168f443fe006a03831f305312f77ee00db3858 Mon Sep 17 00:00:00 2001 From: Christian Kamm Date: Sat, 28 Mar 2009 14:26:23 +0100 Subject: [PATCH] Fix goto inside synchronized functions. --- dmd/func.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/dmd/func.c b/dmd/func.c index f7afe37c..3b93eb56 100644 --- a/dmd/func.c +++ b/dmd/func.c @@ -1267,13 +1267,19 @@ void FuncDeclaration::semantic3(Scope *sc) 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);