<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <font size="4"><font face="monospace">Hit "send" a little too soon. 
        <br>
        <br>
        The assertion that governs "no use of `this` in a super/this
        call" is in 8.8.7.1:<br>
        <br>
        <blockquote type="cite">An explicit constructor invocation
          statement introduces a static context (§8.1.3),<br>
          which limits the use of constructs that refer to the current
          object. Notably, the<br>
          keywords this and super are prohibited in a static context
          (§15.8.3, §15.11.2),<br>
          as are unqualified references to instance variables, instance
          methods, and type<br>
          parameters of lexically enclosing declarations (§6.5.5.1,
          §6.5.6.1, §15.12.3).</blockquote>
        <br>
        This needs to be generalized to speak about the use of `this`
        throughout the constructor body; basically, that you can never
        use `this` (explicitly or implicitly) prior to to the super/this
        call.  <br>
        <br>
        There are a few ways you could do this:<br>
        <br>
         - A full-blown treatment of DA/DU for `this`;<br>
         - An extension of the "introduces a static context" used in
        this section, that covers the entire initial segment of the
        constructor body up through and including the this/super-call.<br>
        <br>
        Similarly, you'll need a way to restate the "if it doesn't start
        with `this/super`, you get an implicit super" to the more
        flexible notion being outlined here.  This is tricky because the
        obvious way to do this is to run DA/DU on the explicit body of
        the constructor and ask if `this` is DA at all points where the
        constructor could complete normally, and if not, prepend a
        super() call and rerun DA/DU.  This moves us from a strictly
        syntactic rule to one that appeals to a complex analysis.  <br>
        <br>
        We can simplify this analysis a lot by lowering the target, from
        one that is based on DA to funneling through a single super/this
        choke point, where a ctor body with an explicit super/this looks
        like:<br>
        <br>
            statement*<br>
            super/this call<br>
            statement*<br>
        <br>
        This would rule out constructs like:<br>
        <br>
            Foo() { <br>
                if (bar) <br>
                    this(f(bar));<br>
                else<br>
                    this(g(bar), 0);<br>
            }<br>
        <br>
        but is a lot simpler to specify and still offers the "stuff
        before super" benefit.  <br>
        <br>
        <br>
        <br>
        <br>
      </font></font><br>
    <div class="moz-cite-prefix">On 1/24/2023 6:01 PM, Brian Goetz
      wrote:<br>
    </div>
    <blockquote type="cite" cite="mid:8ac4afe5-3e70-324d-6ce9-2609f7e6b83c@oracle.com">
      
      The basic design seems sound enough.  Probably time to dig to the
      next level, which is assessing the spec impact.  <br>
      <br>
      The places to start are Ch16 (definite assignment) and 8.8.7
      (constructor bodies).  <br>
      <br>
      <div class="moz-cite-prefix">On 1/24/2023 4:24 PM, Archie Cobbs
        wrote:<br>
      </div>
      <blockquote type="cite" cite="mid:CANSoFxsw4z0YUvn0qPQzD9--RN_-1Er1rhRpPM38LCjLvHzNYg@mail.gmail.com">
        <div dir="ltr">
          <div dir="ltr">On Tue, Jan 24, 2023 at 2:21 PM Brian Goetz
            <<a href="mailto:brian.goetz@oracle.com" moz-do-not-send="true" class="moz-txt-link-freetext">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> <br>
                <blockquote type="cite">
                  <div dir="ltr">
                    <div class="gmail_quote">
                      <div>This made me realize there is another missing
                        requirement:</div>
                      <div>
                        <ul>
                          <li>Upon normal return from a constructor, the
                            `this` reference must be DA <br>
                          </li>
                        </ul>
                      </div>
                    </div>
                  </div>
                </blockquote>
                <br>
                So, I think this is true by definition; on normal return
                from a super/this/implicit super call, then `this` *is*
                DA.  <br>
                <br>
                You can simplify the rule about try blocks to:<br>
                <br>
                 - if `this` is DU on entry to a try block, it must be
                DU on normal completion of the try block.  <br>
                <br>
                Can you simplify further, while still preventing `this`
                calls inside a try block?  I don't think so, since we
                might want to allow a try block before the super/this
                call.<br>
              </div>
            </blockquote>
            <div><br>
            </div>
            <div>Ok thanks. I admit I'm getting a little out of my
              league here.<br>
            </div>
            <div><br>
            </div>
            <div>Does this sound correct?</div>
            <div style="margin-left:40px"><br>
            </div>
            <div>
              <div style="margin-left:40px"> The JLS will be modified as
                follows:<br>
                 <br>
                 * Remove the requirement that `super()` or `this()`
                appear as the first statement in a constructor<br>
                 * Add superclass initialization to the existing
                constructor dataflow analysis as follows:<br>
                     * The `this` reference is considered DU on entry to
                the constructor<br>
                     * Before a `this()` or `super()` call, the `this`
                reference must be DU<br>
                     * After a `this()` or `super()` call, the `this`
                reference is considered DA<br>
                     * Before normal completion of the constructor, the
                `this` reference must be DA<br>
                     * If `this` is DU on entry to a `try` block, it
                must be DU on normal completion of the `try` block<br>
                     * If no explicit `this()` or `super()` appears in a
                constructor, it is treated as if the first line of the
                constructor were `super()`<br>
                 * Add the following restrictions on constructors:<br>
                     * No access to `this`, other than assignments to
                fields, may occur unless `this` is DA<br>
                     * `super()` and `this()` may not appear within any
                `try { }` block<br>
                 * Clarify that non-static field initializers and
                initialization blocks are executed immediately after
                `super()` invocation, wherever it occurs (see
                "Initialization Order" below)<br>
              </div>
               <br>
            </div>
            <div><br>
            </div>
            <div>Thanks,</div>
            <div> -Archie</div>
          </div>
          <br>
          -- <br>
          <div dir="ltr" class="gmail_signature">Archie L. Cobbs<br>
          </div>
        </div>
      </blockquote>
      <br>
    </blockquote>
    <br>
  </body>
</html>