<html><body><div style="font-family: arial, helvetica, sans-serif; font-size: 12pt; color: #000000"><div><br></div><div><br></div><hr id="zwchr" data-marker="__DIVIDER__"><div data-marker="__HEADERS__"><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><b>From: </b>"Brian Goetz" <brian.goetz@oracle.com><br><b>To: </b>"Tagir Valeev" <amaembo@gmail.com>, "Angelos Bimpoudis" <angelos.bimpoudis@oracle.com><br><b>Cc: </b>"amber-spec-experts" <amber-spec-experts@openjdk.java.net><br><b>Sent: </b>Wednesday, February 22, 2023 4:45:38 PM<br><b>Subject: </b>Re: Draft JLS Spec about unnamed patterns and variables<br></blockquote></div><div data-marker="__QUOTED_TEXT__"><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><font size="4"><font face="monospace">It's a tricky question,
        because there's lots of ways to come at it.  For example, we do
        make a distinction between dead *statements* and dead code in
        general, and in particular conditionals can have lots of dead
        code.<br><br>
        For example, in<br><br>
            if (true || destroyTheWorld()) { ... }<br><br>
        we don't remark that `destroyTheWorld()` is dead code (though
        fine IDEs will call our attention with tasteful highlighting). 
        We're pretty aggressive about avoiding _unreachable statements_,
        but considerably less aggressive about dead code in general.  <br><br>
        Thought experiment: what if we had union type patterns?  Then
        the case label `case String _, Integer _` would be like matching
        the the union type pattern `(String|Integer) _`:<br><br>
            case Number n: ...<br>
            case (String|Integer) _: ...<br><br>
        Would javac then complain that `String|Integer` could be
        simplified to just `String` on the bsais of flow analysis? 
        (IntelliJ would, of course.)  </font></font></blockquote><div><br></div><div>At least, the compiler complains in a try/catch, by example<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>try {<br data-mce-bogus="1"></div><div>  ioCall();<br data-mce-bogus="1"></div><div>} catch(IOException e) {<br></div><div>  ...<br data-mce-bogus="1"></div><div>} catch(FileNotFoundException | RuntimeException e) {<br data-mce-bogus="1"></div><div> ... <br data-mce-bogus="1"></div><div>}<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>does not compile.<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><font size="4"><font face="monospace"><br>
        I initially thought as Tagir did, but then Gavin turned me
        around and reminded me that it was not dead code, but
        unreachable statements that we try to avoid.  So now I am
        torn...<br></font></font></blockquote><div><br></div><div>RĂ©mi<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><font size="4"><font face="monospace"><br></font></font><br>
    <div class="moz-cite-prefix">On 2/22/2023 10:26 AM, Tagir Valeev
      wrote:<br>
    </div>
    <blockquote cite="mid:CAE+3fjbe1CUQN5u0xR76cJtx3zyEZ7KZjcoMWkEF08nK6OtAAQ@mail.gmail.com">
      
      <div dir="auto">Hello!
        <div dir="auto"><br>
        </div>
        <div dir="auto">I think we should consider dead patterns as dead
          code, so this sample should not compile.</div>
        <div dir="auto"><br>
        </div>
        <div dir="auto">With best regards,</div>
        <div dir="auto">Tagir Valeev </div>
      </div>
      <br>
      <div class="gmail_quote">
        <div dir="ltr" class="gmail_attr">On Wed, Feb 22, 2023, 15:34
          Angelos Bimpoudis <<a href="mailto:angelos.bimpoudis@oracle.com" class="moz-txt-link-freetext" target="_blank">angelos.bimpoudis@oracle.com</a>>
          wrote:<br>
        </div>
        <blockquote class="gmail_quote" style="margin:0 0 0
          .8ex;border-left:1px #ccc solid;padding-left:1ex">
          <div dir="ltr">
            <div style="font-family:"Segoe UI","Segoe UI
              ","Helvetica
Neue",sans-serif;font-size:11pt;color:rgb(0,0,0);background-color:rgb(255,255,255)">
              <p 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">
                Coming back to the topic of dominance for a moment
                before I circulate a revised draft spec.</p>
              <p 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">
                Dominance is the way of pattern matching to detect<em>dead
                  code</em>(meaning that code on the RHS
                of a dominated case will never be executed, provably).</p>
              <p 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">
                Assume the example where<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">Number</code>dominates<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">Integer</code>--all
                values of<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">Integer</code>are
                going to be matched by a proceeding case,<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">Number</code>.
                This is a compile-time error. Additionally notice that
                all binding variables happen to be unused.</p>
              <pre 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">switch (o) {
      case Number n -> 1;
      case String s -> 2;
      case Integer i -> 2;
}
</code></pre>
              <p 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 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">switch (o) {
      case Number _ -> 1;
      case String _, Integer _-> 2;
}
</code></pre>
              <p 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,<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">->
                  2</code>, is not dead anymore. It can be reached via<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">*case
                  String _*, Integer _-> 2</code>. As a result, the
                code above is correct. It just happens that the
                sub-pattern<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">Integer
                  _</code>will never be reachable. This
                can be a warning but the overall case is correct.</p>
              <p 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<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">case</code>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">Integer
                  _</code>). That case could be rejected (symmetrically
                to the first example). This seems restrictive but also a
                valid direction.</p>
              <p 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>
              <p 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 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 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%">
            <div id="m_-6873757209971852382divRplyFwdMsg" dir="ltr"><font style="font-size:11pt" face="Calibri, sans-serif" color="#000000"><b>From:</b> Brian Goetz <<a href="mailto:brian.goetz@oracle.com" target="_blank" rel="noreferrer" class="moz-txt-link-freetext">brian.goetz@oracle.com</a>><br><b>Sent:</b> 26 January 2023 20:33<br><b>To:</b> Angelos Bimpoudis <<a href="mailto:angelos.bimpoudis@oracle.com" target="_blank" rel="noreferrer" class="moz-txt-link-freetext">angelos.bimpoudis@oracle.com</a>>;
                amber-spec-experts <<a href="mailto:amber-spec-experts@openjdk.java.net" target="_blank" rel="noreferrer" class="moz-txt-link-freetext">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>
                <p>A<code style="white-space:pre-wrap;font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code>label
                  has either one or more<code style="white-space:pre-wrap;font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code>constants,
                  or<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><code style="white-space:pre-wrap;font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code>pattern<strong style="background-color:rgb(208,255,208);font-weight:inherit;text-decoration:underline">s</strong>.
                  Every<code style="white-space:pre-wrap;font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code>constant
                  must be either (1) the<code style="white-space:pre-wrap;font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">null</code>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)" target="_blank" rel="noreferrer">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)" target="_blank" rel="noreferrer">8.9.1</a>); otherwise a
                  compile-time error occurs. A<code style="white-space:pre-wrap;font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code>label
                  that has a<code style="white-space:pre-wrap;font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">null</code><code style="white-space:pre-wrap;font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code>constant
                  may have an optional<code style="white-space:pre-wrap;font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">default</code>.</p>
                <div>
                  <p style="padding:0pt;margin:0pt 0em 1ex">It is a
                    compile-time error if for any<code style="white-space:pre-wrap;font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code>label
                    with more than one<code style="white-space:pre-wrap;font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code>patterns,
                    any of its<code style="white-space:pre-wrap;font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code>patterns
                    declares one or more pattern variables.</p>
                </div>
              </blockquote>
              <br>
              I suggest:<br>
              <br>
              A<code style="white-space:pre-wrap;font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code>label
              has either one or more<code style="white-space:pre-wrap;font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code>constants,
              or<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><code style="white-space:pre-wrap;font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code>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<code style="white-space:pre-wrap;font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code>constant
              must be either (1) the<code style="white-space:pre-wrap;font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">null</code>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)" target="_blank" rel="noreferrer">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)" target="_blank" rel="noreferrer">8.9.1</a>);
              otherwise a compile-time error occurs. A<code style="white-space:pre-wrap;font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code>label
              that has a<code style="white-space:pre-wrap;font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">null</code><code style="white-space:pre-wrap;font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code>constant
              may have an optional<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<code style="white-space:pre-wrap;font-family:"DejaVu Sans Mono","Bitstream Vera Sans Mono","Luxi Mono","Courier New",monospace">case</code>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>On 1/26/2023 5:36 AM, Angelos Bimpoudis wrote:<br>
              </div>
              <blockquote>
                <div>Dear experts,</div>
                <div>
                  <div><br>
                  </div>
                  <div>The first draft of the JLS spec about unnamed
                    patterns and variables (<a href="https://openjdk.org/jeps/8294349" target="_blank" rel="noreferrer" class="moz-txt-link-freetext">https://openjdk.org/jeps/8294349</a>)
                    is available at:</div>
                  <div><br>
                  </div>
                  <div><a href="https://cr.openjdk.java.net/~abimpoudis/unnamed/latest/" target="_blank" rel="noreferrer" class="moz-txt-link-freetext">https://cr.openjdk.java.net/~abimpoudis/unnamed/latest/</a><br data-mce-bogus="1"></div>
                  <div><br>
                  </div>
                  <div>Comments very much welcomed!</div>
                  Angelos<br>
                </div>
              </blockquote>
              <br>
            </div>
          </div>
        </blockquote>
      </div>
    </blockquote>
    <br><br></blockquote></div></div></body></html>