<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <br>
    <blockquote type="cite" cite="mid:SA2PR10MB46675D8D0413CDB8D7CD009582AA9@SA2PR10MB4667.namprd10.prod.outlook.com">
      <div style="font-family: "Segoe UI", "Segoe UI Web
        (West European)", "Helvetica Neue", sans-serif;
        font-size: 11pt; color: rgb(0, 0, 0); background-color: rgb(255,
        255, 255);" class="elementToProof">
        <p data-line="16" class="code-line ContentPasted0" dir="auto" style="margin-top:0px;margin-bottom:0.7em;font-family:-apple-system,
          "system-ui", "Segoe WPC", "Segoe
          UI", system-ui, Ubuntu, "Droid Sans",
          sans-serif;font-size:14px">
          Under this JEP this code could be rewritten blindly into:</p>
        <pre data-line="18" class="code-line" dir="auto" style="margin-top:0px;padding:16px;border-radius:3px;overflow:auto;background-color:rgba(220, 220, 220, 0.4);font-size:14px"><code style="font-family:"SF Mono", Monaco, Menlo, Consolas, "Ubuntu Mono", "Liberation Mono", "DejaVu Sans Mono", "Courier New", monospace;font-size:1em;line-height:1.357em;tab-size:4" class="ContentPasted0">switch (o) {
      case Number _ -> 1;
      case String _, Integer _-> 2;
}
</code></pre>
        <p data-line="23" class="code-line ContentPasted0" dir="auto" style="margin-top:0px;margin-bottom:0.7em;font-family:-apple-system,
          "system-ui", "Segoe WPC", "Segoe
          UI", system-ui, Ubuntu, "Droid Sans",
          sans-serif;font-size:14px">
          Under the definition of dead code above, the common case that
          was grouped together,<span class="ContentPasted0"> </span><code style="font-family:"SF Mono", Monaco, Menlo,
            Consolas, "Ubuntu Mono", "Liberation
            Mono", "DejaVu Sans Mono", "Courier
            New", monospace;font-size:1em;line-height:1.357em" class="ContentPasted0">-> 2</code>, is not dead anymore.
          It can be reached via<span class="ContentPasted0"> </span><code style="font-family:"SF Mono", Monaco, Menlo,
            Consolas, "Ubuntu Mono", "Liberation
            Mono", "DejaVu Sans Mono", "Courier
            New", monospace;font-size:1em;line-height:1.357em" class="ContentPasted0">*case String _*, Integer _-> 2</code>.
          As a result, the code above is correct. It just happens that
          the sub-pattern<span class="ContentPasted0"> </span><code style="font-family:"SF Mono", Monaco, Menlo,
            Consolas, "Ubuntu Mono", "Liberation
            Mono", "DejaVu Sans Mono", "Courier
            New", monospace;font-size:1em;line-height:1.357em" class="ContentPasted0">Integer _</code><span class="ContentPasted0"> </span>will never be reachable. This
          can be a warning but the overall case is correct.</p>
        <p data-line="29" class="code-line ContentPasted0" dir="auto" style="margin-top:0px;margin-bottom:0.7em;font-family:-apple-system,
          "system-ui", "Segoe WPC", "Segoe
          UI", system-ui, Ubuntu, "Droid Sans",
          sans-serif;font-size:14px">
          An alternative interpretation would be to treat sub-patterns
          as "dead code". Under that interpretation the second<span class="ContentPasted0"> </span><code style="font-family:"SF Mono", Monaco, Menlo,
            Consolas, "Ubuntu Mono", "Liberation
            Mono", "DejaVu Sans Mono", "Courier
            New", monospace;font-size:1em;line-height:1.357em" class="ContentPasted0">case</code><span class="ContentPasted0"> </span>of the second example would
          be dominated because there is at least one preceding
          sub-pattern (or whole case label with one pattern as in this
          case) that dominates at least one of its sub-patterns (<code style="font-family:"SF Mono", Monaco, Menlo,
            Consolas, "Ubuntu Mono", "Liberation
            Mono", "DejaVu Sans Mono", "Courier
            New", monospace;font-size:1em;line-height:1.357em" class="ContentPasted0">Integer _</code>). That case could be
          rejected (symmetrically to the first example). This seems
          restrictive but also a valid direction.</p>
        <p data-line="36" class="code-line code-active-line
          ContentPasted0" dir="auto" style="margin-top:0px;margin-bottom:0.7em;font-family:-apple-system,
          "system-ui", "Segoe WPC", "Segoe
          UI", system-ui, Ubuntu, "Droid Sans",
          sans-serif;font-size:14px">
          So, my question is what would be the pros and cons of each
          approach?</p>
      </div>
    </blockquote>
    <p>Actually, it seems to me that you can rewrite the above as
      follows, even w/o this JEP:</p>
    <p><br>
    </p>
    <pre data-line="18" class="code-line" dir="auto" style="margin-top:0px;padding:16px;border-radius:3px;overflow:auto;background-color:rgba(220, 220, 220, 0.4);font-size:14px"><code style="font-family:"SF Mono", Monaco, Menlo, Consolas, "Ubuntu Mono", "Liberation Mono", "DejaVu Sans Mono", "Courier New", monospace;font-size:1em;line-height:1.357em;tab-size:4" class="ContentPasted0">switch (o) {
      case Number n -> 1;
      case String s, Integer i-> 2;
}</code></pre>
    <p>If you do, the compiler complains, but not because `Integer i` is
      unreacheable. But simply because we have fall-through between
      patterns.</p>
    <p><br>
    </p>
    <p>This is defined in 14.11.1:</p>
    <p>
      <blockquote type="cite">t is a compile-time error if there is a
        statement in a switch block that consists of switch-labeled
        statement groups for which both of the following are true:
        <ol type="1">
          <li>
            <p>It is labeled with a switch label that introduces a
              pattern variable.</p>
          </li>
          <li>
            <p>There is a statement preceding it in the switch block and
              that statement can complete normally (<a href="https://docs.oracle.com/javase/specs/jls/se18/html/jls-14.html#jls-14.22">14.22</a>).</p>
          </li>
        </ol>
        <p>This condition is required to exclude the possibility of a
          switch labeled statement being reached for which a pattern
          variable declared in its switch label is in scope but without
          the pattern matching having succeeded. For example, the
          statement labeled by the switch label supporting the type
          pattern <code>Integer i</code> could be reached from the
          preceding statement group, and so the pattern variable <code>i</code>
          will not be initialized:</p>
        <pre><code></code></pre>
      </blockquote>
      Now, you could make a case that the above restriction is
      unnecessary if we have unnamed pattern binding variables... and
      _if_ you go down that path, yes, you do end up with an issue when
      it comes to dominance.</p>
    <p><br>
    </p>
    <p>But do we want to change the fall-through restriction?</p>
    <p><br>
    </p>
    <p>Cheers<br>
      Maurizio<br>
    </p>
    <p><br>
    </p>
    <blockquote type="cite" cite="mid:SA2PR10MB46675D8D0413CDB8D7CD009582AA9@SA2PR10MB4667.namprd10.prod.outlook.com">
      <div style="font-family: "Segoe UI", "Segoe UI Web
        (West European)", "Helvetica Neue", sans-serif;
        font-size: 11pt; color: rgb(0, 0, 0); background-color: rgb(255,
        255, 255);" class="elementToProof">
        <p data-line="36" class="code-line code-active-line
          ContentPasted0" dir="auto" style="margin-top:0px;margin-bottom:0.7em;font-family:-apple-system,
          "system-ui", "Segoe WPC", "Segoe
          UI", system-ui, Ubuntu, "Droid Sans",
          sans-serif;font-size:14px">
          <br>
        </p>
        <p data-line="36" class="code-line code-active-line
          ContentPasted0" dir="auto" style="margin-top:0px;margin-bottom:0.7em;font-family:-apple-system,
          "system-ui", "Segoe WPC", "Segoe
          UI", system-ui, Ubuntu, "Droid Sans",
          sans-serif;font-size:14px">
          Many, thanks,</p>
        <p data-line="36" class="code-line code-active-line
          ContentPasted0" dir="auto" style="margin-top:0px;margin-bottom:0.7em;font-family:-apple-system,
          "system-ui", "Segoe WPC", "Segoe
          UI", system-ui, Ubuntu, "Droid Sans",
          sans-serif;font-size:14px">
          Aggelos</p>
        <br>
      </div>
      <hr style="display:inline-block;width:98%" tabindex="-1">
      <div id="divRplyFwdMsg" dir="ltr"><font style="font-size:11pt" face="Calibri, sans-serif" color="#000000"><b>From:</b> Brian
          Goetz <a class="moz-txt-link-rfc2396E" href="mailto:brian.goetz@oracle.com"><brian.goetz@oracle.com></a><br>
          <b>Sent:</b> 26 January 2023 20:33<br>
          <b>To:</b> Angelos Bimpoudis
          <a class="moz-txt-link-rfc2396E" href="mailto:angelos.bimpoudis@oracle.com"><angelos.bimpoudis@oracle.com></a>; amber-spec-experts
          <a class="moz-txt-link-rfc2396E" href="mailto:amber-spec-experts@openjdk.java.net"><amber-spec-experts@openjdk.java.net></a><br>
          <b>Subject:</b> Re: Draft JLS Spec about unnamed patterns and
          variables</font>
        <div> </div>
      </div>
      <div><font size="4"><font face="monospace">Small wording nit... 
            in "an unnamed declaration can be used in place of the
            following declarations"<br>
            <br>
            I'm not sure "in place of" is the right wording; I think you
            may just want to say "in", since the grammar permits it in
            all of these places.  (What you're really doing here is
            signalling that there are places the grammar allows it, but
            the semantics do not; you are going to call these out
            individually in the appropriate places.)<br>
            <br>
            Similar for the second "in place of" in this section.<br>
            <br>
            In 14.11.1, I might refactor the text a little further.  The
            second sentence of the first paragraph below is about case
            constants only, but now comes after you talk about case
            patterns or case constants:<br>
            <br>
          </font></font>
        <blockquote type="cite">
          <p style="">A<span> </span><code style="white-space:pre-wrap; font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code><span> </span>label
            has either one or more<span> </span><code style="white-space:pre-wrap; font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code><span> </span>constants,
            or<span> </span><del style="background-color:rgb(255,224,224);
              text-decoration:line-through">a</del><strong style="background-color:rgb(208,255,208);
              font-weight:inherit; text-decoration:underline">one or
              more</strong><span> </span><code style="white-space:pre-wrap; font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code><span> </span>pattern<strong style="background-color:rgb(208,255,208);
              font-weight:inherit; text-decoration:underline">s</strong>.
            Every<span> </span><code style="white-space:pre-wrap; font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code><span> </span>constant
            must be either (1) the<span> </span><code style="white-space:pre-wrap; font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">null</code><span> </span>literal,
            (2) a constant expression (<a href="https://docs.oracle.com/javase/specs/jls/se19/html/jls-15.html#jls-15.29" style="text-decoration:none; color:rgb(74,103,130)" moz-do-not-send="true">15.29</a>), or (3) the name of an
            enum constant (<a href="https://docs.oracle.com/javase/specs/jls/se19/html/jls-8.html#jls-8.9.1" style="text-decoration:none; color:rgb(74,103,130)" moz-do-not-send="true">8.9.1</a>); otherwise a
            compile-time error occurs. A<span> </span><code style="white-space:pre-wrap; font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code><span> </span>label
            that has a<span> </span><code style="white-space:pre-wrap; font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">null</code><span> </span><code style="white-space:pre-wrap; font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code><span> </span>constant
            may have an optional<span> </span><code style="white-space:pre-wrap; font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">default</code>.</p>
          <div class="x_inserted" style="">
            <p style="padding:0pt; margin:0pt 0em 1ex">It is a
              compile-time error if for any<span> </span><code style="white-space:pre-wrap; font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code><span> </span>label
              with more than one<span> </span><code style="white-space:pre-wrap; font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code><span> </span>patterns,
              any of its<span> </span><code style="white-space:pre-wrap; font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code><span> </span>patterns
              declares one or more pattern variables.</p>
          </div>
        </blockquote>
        <br>
        I suggest:<br>
        <br>
        A<span> </span><code style="white-space:pre-wrap; font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code><span> </span>label
        has either one or more<span> </span><code style="white-space:pre-wrap; font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code><span> </span>constants,
        or<span> </span><del style="background-color:rgb(255,224,224);
          text-decoration:line-through">a</del><strong style="background-color:rgb(208,255,208); font-weight:inherit;
          text-decoration:underline">one or more</strong><span> </span><code style="white-space:pre-wrap; font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code><span> </span>pattern<strong style="background-color:rgb(208,255,208); font-weight:inherit;
          text-decoration:underline">s</strong>.
        <br>
        <br>
        <i>For a case label with case constants, </i>every<span> </span><code style="white-space:pre-wrap; font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code><span> </span>constant
        must be either (1) the<span> </span><code style="white-space:pre-wrap; font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">null</code><span> </span>literal,
        (2) a constant expression (<a href="https://docs.oracle.com/javase/specs/jls/se19/html/jls-15.html#jls-15.29" style="text-decoration:none; color:rgb(74,103,130)" moz-do-not-send="true">15.29</a>), or (3) the name of an enum
        constant (<a href="https://docs.oracle.com/javase/specs/jls/se19/html/jls-8.html#jls-8.9.1" style="text-decoration:none; color:rgb(74,103,130)" moz-do-not-send="true">8.9.1</a>); otherwise a compile-time
        error occurs. A<span> </span><code style="white-space:pre-wrap; font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code><span> </span>label
        that has a<span> </span><code style="white-space:pre-wrap; font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">null</code><span> </span><code style="white-space:pre-wrap; font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code><span> </span>constant
        may have an optional<span> </span><code style="white-space:pre-wrap; font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">default</code>.<br>
        <br>
        <i>For a case label with case patterns</i>, it is a compile-time
        error if any of its<span> </span><code style="white-space:pre-wrap; font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code><span> </span>patterns
        declares one or more pattern variables.<br>
        <br>
        I am not sure about the definition of dominance here.  If I
        have:<br>
        <br>
            case Integer _, String _:  A;<br>
            case Number _ : B;<br>
        <br>
        Number dominates Integer, but it doesn't dominate
        Integer|String.  I think you mean "if at least one of pi..pn
        dominates *all* of the patterns ri..rm, no? 
        <br>
        <br>
        But I'm not even sure if this is the right formulation, because:<br>
        <br>
            sealed interface I permits A, B { }<br>
            record A() implements I {}<br>
            record B() implements I {}<br>
        <br>
            case A _, B _: ...<br>
            case I i: ...<br>
        <br>
        The first case label dominates I.  So I think you have to appeal
        to exhaustiveness:<br>
        <br>
        "A case label with case patterns p1...pm dominates another case
        label with case patterns q1...qm if the set of patterns { p1..pm
        } dominates each qi", no?<br>
        <br>
        You probably have to slightly refactor the second statement
        about "compile time error if dominance" accordingly.<br>
        <br>
        <br>
        <br>
        <br>
        <div class="x_moz-cite-prefix">On 1/26/2023 5:36 AM, Angelos
          Bimpoudis wrote:<br>
        </div>
        <blockquote type="cite">
          <style type="text/css" style="display:none">p
        {margin-top:0;
        margin-bottom:0}</style>
          <div class="x_elementToProof x_ContentPasted0" style="">Dear
            experts,</div>
          <div class="x_elementToProof x_ContentPasted0" style="">
            <div><br class="x_ContentPasted0">
            </div>
            <div class="x_ContentPasted0">The first draft of the JLS
              spec about unnamed patterns and variables (<a class="x_moz-txt-link-freetext moz-txt-link-freetext" href="https://openjdk.org/jeps/8294349" moz-do-not-send="true">https://openjdk.org/jeps/8294349</a>)
              is available at:</div>
            <div><br class="x_ContentPasted0">
            </div>
            <div class="x_ContentPasted0"><a class="x_moz-txt-link-freetext moz-txt-link-freetext" href="https://cr.openjdk.java.net/~abimpoudis/unnamed/latest/" moz-do-not-send="true">https://cr.openjdk.java.net/~abimpoudis/unnamed/latest/</a></div>
            <div><br class="x_ContentPasted0">
            </div>
            <div class="x_ContentPasted0">Comments very much welcomed!</div>
            Angelos<br>
          </div>
        </blockquote>
        <br>
      </div>
    </blockquote>
  </body>
</html>