On Fri, Oct 03, 2014 at 10:50:39AM -0700, Andrei Alexandrescu via Digitalmars-d wrote: > On 10/2/14, 8:23 PM, Ali Çehreli wrote: > >"A scope(exit) or scope(success) statement may not exit with a throw, > >goto, break, continue, or return; nor may it be entered with a goto." > > Seems to me all these restrictions should be lifted. -- Andrei
Please don't. It will lead to pathological behaviour. For example: int func() { scope(exit) return 1; return 0; } What does func() return? Better yet: int func() { scope(exit) return 1; scope(exit) return 2; return 0; } Worse yet: // What does this function do? What *should* it do?? int func() { scope(success) throw new Exception(""); scope(failure) return 1; return 0; } And: int func() { hahaha: scope(exit) goto hahaha; return 1; } Or: int func() { foreach (i; 0..10) { scope(exit) break; scope(exit) continue; return i; // hahahahahaha } return i; } And do we really want to get into this one: struct S { void opApply(scope void delegate(int) loopBody) { foreach (i; 0..10) { scope(success) continue; auto rc = loopBody(i); if (rc != 0) return rc; // ORLY?! } } } void main() { foreach (i; S.init) { scope(failure) continue; // what does this do? throw new Exception(""); } } T -- Береги платье снову, а здоровье смолоду.