<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">On Mar 23, 2018, at 1:33 PM, Brian Goetz <<a href="mailto:brian.goetz@oracle.com" class="">brian.goetz@oracle.com</a>> wrote:<br class=""><div><blockquote type="cite" class=""><br class="Apple-interchange-newline"><div class=""><div class=""><blockquote type="cite" style="font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;" class="">i just realized that the X-heavy first column also means that I can't<br class="">make use of statement labels *anywhere inside* of e-switch, even<br class="">if I just copy-and-pasted self-contained code from elsewhere.<br class=""></blockquote><br style="font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">No, you can do this:</span><br style="font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><br style="font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">    e-switch {</span><br style="font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">        LABEL:</span><br style="font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">        s-switch {</span><br style="font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">            s-switch { break LABEL; }</span><br style="font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">        }</span><br style="font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""><span style="font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">    }</span><br style="font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""></div></div></blockquote><div><br class=""></div><div>(Looking again at the table.)  Yes, I see; the break-l has a P.  OK, I was</div><div>reading the table wrong.</div><br class=""><blockquote type="cite" class=""><div class=""><div class=""><span style="font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">You just can't "throw" *across* an e-switch boundary.  The X means</span></div></div></blockquote><blockquote type="cite" class=""><div class=""><div class=""><span style="font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">if a nested construct doesn't handle it, there's a problem.</span></div></div></blockquote></div><br class=""><div class="">On that we all agree:  e-switch, like any other e, can complete</div><div class="">normally with a value, or else can complete with a throw.</div><div class="">It *cannot* complete with a branch to some location other</div><div class="">than a catch statement (which location would be defined</div><div class="">by a label, loop, or switch outside the switch, if it were</div><div class="">anywhere, but it isn't).</div><div class=""><br class=""></div><div class="">OK, so half of my discomfort was a temporary misunderstanding.</div><div class="">You can paste locally consistent control flow in and out of</div><div class="">switch-e's, even if the control flow uses statement labels.</div><div class="">Good.</div><div class=""><br class=""></div><div class="">The rest of it is about where to put the sharp edges:  Can I</div><div class="">break-e from a switch-e wherever I might consider doing return</div><div class="">from a method/lambda?  Or does break-e have extra restrictions</div><div class="">to prevent certain ambiguities?  Your answer is the latter.</div><div class=""><br class=""></div><div class="">Speaking of ambiguities, should this be illegal, even</div><div class="">though under your rules it happens to be unambiguous?</div><div class="">Or is it just a puzzler we tolerate?</div><div class=""><br class=""></div><div class=""><div><div class=""><span class="" style="float: none; display: inline !important;">    e-switch {</span><br class=""><span class="" style="float: none; display: inline !important;">        LABEL:</span><br class=""><span class="" style="float: none; display: inline !important;">        s-switch {</span><br class=""><span class="" style="float: none; display: inline !important;">           { int LABEL = 2; break LABEL; }</span><br class=""><span class="" style="float: none; display: inline !important;">        }</span><br class=""><span class="" style="float: none; display: inline !important;">    }</span><br class=""></div><div class=""><span class="" style="float: none; display: inline !important;"><br class=""></span></div><div class=""><span class="" style="float: none; display: inline !important;">Also the other way:</span></div><div class=""><span class="" style="float: none; display: inline !important;"><br class=""></span></div><div class=""><span class="" style="float: none; display: inline !important;">    LABEL:</span></div><div class=""><span class="" style="float: none; display: inline !important;">    s-switch {</span><br class=""><span class="" style="float: none; display: inline !important;">        e-switch { int LABEL = 2; break LABEL; }</span><br class=""><span class="" style="float: none; display: inline !important;">    }</span><br class=""></div><div class=""><span class="" style="float: none; display: inline !important;"><br class=""></span></div><div class=""><span class="" style="float: none; display: inline !important;">You want "break LABEL" to be immediately recognized as</span></div><div class=""><span class="" style="float: none; display: inline !important;">either a break-l or a break-e.  The above cases seem to</span></div><div class="">make it hard to do so.  We could declare such code</div><div class="">pathological and demand a relabel in either case,</div><div class="">just as we declare local variable shadowing pathological</div><div class="">in most cases, demanding a renaming of one of the</div><div class="">variables.  Local variable shadowing is more likely</div><div class="">to occur than label shadowing, given that labels</div><div class="">are a rare construct, so maybe we just let the</div><div class="">above be a puzzler, rather than add a rule.</div><div class=""><br class=""></div><div class="">— John</div></div></div></body></html>