<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>"Vicente Romero" <vicente.romero@oracle.com><br><b>To: </b>"Maurizio Cimadamore" <maurizio.cimadamore@oracle.com>, "SUNDARARAJAN.ATHIJEGANNATHAN" <sundararajan.athijegannathan@oracle.com>, "Remi Forax" <forax@univ-mlv.fr>, "compiler-dev" <compiler-dev@openjdk.org><br><b>Sent: </b>Tuesday, October 24, 2023 7:24:35 PM<br><b>Subject: </b>Re: Regression: accessing a private method through a type variable<br></blockquote></div><div><style style="display:none;">P {margin-top:0;margin-bottom:0;}</style></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;">Hi Remi,<br>
    <br>
    Thanks again for the report, we have already fixed it, see [1] for
    more details,<br>
    <br>
    Vicente</blockquote><div><br></div><div>Hello Vincente,<br data-mce-bogus="1"></div><div>thanks for fixing that issue, for the anecdote, this issue was found doing mob programming [1] with my students.<br data-mce-bogus="1"></div><div>I think next week, we will study how the regression was introduced and and how you and Maurizio fix it :)<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><div>Rémi<br data-mce-bogus="1"></div><div>[1] https://en.wikipedia.org/wiki/Team_programming#Mob_programming<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;"><br>
    <br>
    <div class="moz-cite-prefix">On 10/16/23 11:46, Vicente Romero
      wrote:<br>
    </div>
    <blockquote cite="mid:a4a85d7f-e8df-4f3b-8a3e-b9f0bbe714d3@oracle.com">
      
      Thanks for the report, we have created [1]. I'm taking a look at
      it,<br>
      <br>
      Vicente<br>
      <br>
      [1] <span style="font-family:"Aptos",sans-serif"><a href="https://bugs.openjdk.org/browse/JDK-8318160" class="moz-txt-link-freetext" target="_blank">https://bugs.openjdk.org/browse/JDK-8318160</a></span><br>
      <br>
      <div class="moz-cite-prefix">On 10/16/23 07:15, Maurizio
        Cimadamore wrote:<br>
      </div>
      <blockquote cite="mid:c1fbee53-765a-441e-92b3-d39b5709cb06@oracle.com">
        
        <p>I recall fixing this a long time ago:</p>
        <p><br>
        </p>
        <p><a class="moz-txt-link-freetext" href="https://bugs.openjdk.org/browse/JDK-6711619" target="_blank">https://bugs.openjdk.org/browse/JDK-6711619</a><br data-mce-bogus="1"></p>
        <p><br>
        </p>
        <p>Now, the test case mentioned in that bug is still correctly
          rejected by javac. Furhermore, a similar test:</p>
        <p><br>
          ```<br>
          class X<E extends X<E>> {<br>
                       private static int m() { return 1; }<br>
                       int f() {<br>
                               return E.m();<br>
                       }<br>
              }<br>
          ```<br>
        </p>
        <p><br>
        </p>
        <p>Also fails to compile with 21/22.</p>
        <p><br>
        </p>
        ```<br>
        Test.java:5: error: m() has private access in X<br>
                             return E.m();<br>
                                     ^<br>
        1 error<br>
        <p>```</p>
        <p><br>
        </p>
        <p>Trying to manipulate Remi's example, it seems the regression
          only has to do with method refreences whose receiver is a type
          variable.<br>
        </p>
        <p><br>
        </p>
        <p>Here's a minimal reproducer:</p>
        <p><br>
        </p>
        <p>```<br>
          import java.util.function.*;<br>
          <br>
          class Test {<br>
            private String asString() {<br>
              return "bar";<br>
            }<br>
          <br>
            static <T extends Test> Function<T, String>
          foo() {<br>
              return T::asString;<br>
            }<br>
          }<br>
          ```</p>
        <p>I filed a bug:</p>
        <p><br>
        </p>
        <p><a class="moz-txt-link-freetext" href="https://bugs.openjdk.org/browse/JDK-6711619" target="_blank">https://bugs.openjdk.org/browse/JDK-6711619</a><br data-mce-bogus="1"></p>
        <p><br>
        </p>
        <p>Thanks<br>
          Maurizio<br>
        </p>
        <p><br>
        </p>
        <div class="moz-cite-prefix">On 16/10/2023 10:40, Sundararajan
          Athijegannathan wrote:<br>
        </div>
        <blockquote cite="mid:DM6PR10MB29541241C314FCEEA2C7B32FEAD7A@DM6PR10MB2954.namprd10.prod.outlook.com">
          
          <div style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof"> fwiw, this compile from at least JDK
            11 onwards:</div>
          <div style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof"> <br>
          </div>
          <div style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0"> import java.util.*;
            <div class="ContentPasted0">import java.util.stream.*;</div>
            <div><br class="ContentPasted0">
            </div>
            <div class="ContentPasted0">public class TDotToString {</div>
            <div class="ContentPasted0">  class Bar {</div>
            <div class="ContentPasted0">    private String asString() {</div>
            <div class="ContentPasted0">      return "bar";</div>
            <div class="ContentPasted0">    }</div>
            <div class="ContentPasted0">  }</div>
            <div><br class="ContentPasted0">
            </div>
            <div class="ContentPasted0">  static <T extends Bar>
              String foo(List<T> list) {</div>
            <div class="ContentPasted0">    return
              list.stream().map(T::asString).collect(Collectors.joining());</div>
            <div class="ContentPasted0">  }</div>
            }<br>
          </div>
          <div style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0"> <br>
          </div>
          <div style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0"> javac from 1.8.0 does
            issue error as mentioned by Remi.</div>
          <div style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0"> <br>
          </div>
          <div style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0"> <br>
          </div>
          <div style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);" class="elementToProof ContentPasted0"> -Sundar</div>
          <hr style="display:inline-block;width:98%">
          <div id="divRplyFwdMsg" dir="ltr"><font style="font-size:11pt" face="Calibri, sans-serif" color="#000000"><b>From:</b>
              compiler-dev <a class="moz-txt-link-rfc2396E" href="mailto:compiler-dev-retn@openjdk.org" target="_blank"><compiler-dev-retn@openjdk.org></a>
              on behalf of Remi Forax <a class="moz-txt-link-rfc2396E" href="mailto:forax@univ-mlv.fr" target="_blank"><forax@univ-mlv.fr></a><br><b>Sent:</b> 16 October 2023 13:57<br><b>To:</b> compiler-dev <a class="moz-txt-link-rfc2396E" href="mailto:compiler-dev@openjdk.org" target="_blank"><compiler-dev@openjdk.org></a><br><b>Subject:</b> Regression: accessing a private method
              through a type variable</font>
            <div> </div>
          </div>
          <div class="BodyFragment"><font size="2"><span style="font-size:11pt;"><div class="PlainText">Hello,<br>
                  There is a regression in recent versions of javac.<br>
                  javac 21 allows to access a private method through a
                  type variable, here T::asString.<br>
                  <br>
                  public class TDotToString {<br>
                    class Bar() {<br>
                      private String asString() {<br>
                        return "bar";<br>
                      }<br>
                    }<br>
                  <br>
                    static <T extends Bar> String
                  foo(List<T> list) {<br>
                      return
                  list.stream().map(T::asString).collect(Collectors.joining());<br>
                    }<br>
                  }<br>
                  <br>
                  Both IntelliJ and Eclipse emit an error in this case.<br>
                  <br>
                  And javac 8 emits<br>
                    TDotToString.java:12: error: invalid method
                  reference<br>
                      return
                  list.stream().map(T::asString).collect(Collectors.joining());<br>
                                               ^<br>
                    cannot find symbol<br>
                      symbol:   method asString()<br>
                      location: bound of type variable T<br>
                    where T is a type-variable:<br>
                      T extends TDotToString.Bar declared in method
                  <T>foo(List<T>)<br>
                  1 error<br>
                  <br>
                  regards,<br>
                  Rémi<br>
                </div></span></font></div>
        </blockquote>
      </blockquote>
      <br>
    </blockquote>
    <br><br></blockquote></div></div></body></html>