<div dir="ltr"><div dir="ltr">On Thu, Feb 2, 2023 at 9:20 AM Brian Goetz <<a href="mailto:brian.goetz@oracle.com">brian.goetz@oracle.com</a>> wrote:</div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">

  
  <div><font size="4"><font face="monospace">And
        when you extend to statements before the super, there's no
        reason they should not be in scope there.</font></font></div></blockquote><div><br></div><div>Here's a plausible if a bit contrived example of needing a type parameter prior to <span style="font-family:monospace">super()</span>:<br></div><div><br></div><div style="margin-left:40px"><span style="font-family:monospace">import java.util.*;<br>import java.util.concurrent.atomic.*;</span></div><div style="margin-left:40px"><span style="font-family:monospace"><br></span></div><div style="margin-left:40px"><span style="font-family:monospace">public class TypeParamCtorPrologue<T> extends AtomicReference<T> {<br><br>    /**<br>     * Initialize using the list element with the smallest hash code.<br>     */<br>    public TypeParamCtorPrologue(List<T> objs) {<br>        final T choice = objs.stream()<br>          .sorted(Comparator.comparingInt(T::hashCode))<br>          .findFirst();<br>          .orElse(null);<br>        super(choice);<br>    }<br>}</span></div><div><br></div><div>The "choice" calculation could have also been inlined into the <span style="font-family:monospace">super()</span> call, so this is not a new problem with the spec.</div><div><br></div><div>Because of the reported compiler bug, that variant is (incorrectly) allowed by the current compiler:</div><div><br></div><div style="margin-left:40px"><span style="font-family:monospace">import java.util.*;<br>import java.util.concurrent.atomic.*;<br>public class TypeParamCtorPrologue<T> extends AtomicReference<T> {<br><br>    /**<br>     * Choose the object in the list with the smallest hash code.<br>     */<br>    public TypeParamCtorPrologue(List<T> objs) {<br>        super(objs.stream()<br>          .sorted(Comparator.comparingInt(T::hashCode))<br>          .findFirst()<br>          .orElse(null));<br>    }<br>}</span></div><div style="margin-left:40px"><span style="font-family:monospace"><br></span></div><div>So the current situation is one of two wrongs making a right.<br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><font size="4"><font face="monospace">I think the cure here is to simply update the constructor-body
        logic to say that this region is not a static context, but a
        restricted context in which you can't use this, super, instance
        members, etc.  This is a small and localized change (to spec
        language we're already touching anyway.)<br></font></font></div></blockquote><div><br></div><div>This would correct both wrongs at once and automatically fix the reported bug. So I'm all for it :)</div><div><br></div><div>-Archie<br></div></div><div class="gmail_quote"><br></div>-- <br><div dir="ltr" class="gmail_signature">Archie L. Cobbs<br></div></div>