<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <tt>Stepping back, I think there's two ways to look at this:<br>
      <br>
       - break expression and break label are totally different
      statements, that happen to be spelled similarly<br>
       - break is the same statement all around, but just as return
      requires a value in a value-returning method and requires no value
      in a void method, the meaning of break must agree with the innermost
      breaky context.<br>
      <br>
      I think the latter is far easier for users to reason about, while
      giving up relatively little flexibility.  So doing a "break label"
      in an e-switch is the same error as doing "return 3" in a void
      method.  <br>
    </tt><br>
    <div class="moz-cite-prefix">On 3/23/2018 5:42 PM, Brian Goetz
      wrote:<br>
    </div>
    <blockquote type="cite"
      cite="mid:8cc71e72-438d-60fd-8279-2d29be7bb1e0@oracle.com">
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
      <br>
      <blockquote type="cite"
        cite="mid:CBA7D034-E67C-4DFC-B4EA-CF26F9BB104F@oracle.com">
        <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>
      </blockquote>
      <br>
      Right.  To avoid ambiguity with other breaky contexts, we let the
      innermost breaky context determine the allowable break modes.  <br>
      <br>
      <blockquote type="cite"
        cite="mid:CBA7D034-E67C-4DFC-B4EA-CF26F9BB104F@oracle.com">
        <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>
        </div>
      </blockquote>
      <br>
      It could be allowed (since you can't break-e from the switch), but
      it seems safer to call it a compile error.  After all, you can
      always alpha-rename the label.<br>
      <br>
      <blockquote type="cite"
        cite="mid:CBA7D034-E67C-4DFC-B4EA-CF26F9BB104F@oracle.com">
        <div class="">
          <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>
        </div>
      </blockquote>
      <br>
      Or, make it the same rule.  If in "break x", x could resolve as
      either a label or an expression, call it an ambiguity.  (In either
      case, depending on whether you rename the variable or the label,
      you could then get a different error, which is "we don't serve
      that kind of break round these parts.")  But I think its the same
      game either way.<br>
    </blockquote>
    <br>
  </body>
</html>