<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
</head>
<body style="overflow-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;">
Good catch Robbe! Guards should not assign to variables declared outside the guard, otherwise the DA/DU analysis becomes very challenging, and we will end up removing the possibility of optimising switches.
<div><br>
</div>
<div>Thanks,</div>
<div>Gavin<br>
<div><br>
<blockquote type="cite">
<div>On 25 Mar 2023, at 21:45, Robbe Pincket <robbepincket@live.be> wrote:</div>
<br class="Apple-interchange-newline">
<div>
<div class="WordSection1" style="page: WordSection1; caret-color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">Hi all</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;"><o:p> </o:p></div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">It seems that the following code still compiles in Java 20.</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;"><o:p> </o:p></div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">```java</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">class Test {</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">    public static void main(String[] args) {</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">        System.out.println("Got: " + Test(17));</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">    }</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;"><o:p> </o:p></div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">    static boolean log(Object o) {</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">        System.out.println("Log:" + o);</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">        return false;</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">    }</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;"><o:p> </o:p></div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">    static String test(Object o) {</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">        final String s;</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;"><o:p> </o:p></div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">        switch (o) {</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">            case Integer i when (s = "a") != null && log(s) -> {</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">                return s;</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">            }</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">            case Integer i when (s = "b") != null && log(s) -> {</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">                return s;</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">            }</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">            case Integer i when (s = "c") != null && log(s) -> {</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">                return s;</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">            }</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">            case Object o1 when (s = "d") != null && log(s) || true -> {</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">                return s;</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">            }</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">            default -> {</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">                throw new IllegalStateException("Unreachable");</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">            }</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">        }</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">    }</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">}</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">```</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;"><o:p> </o:p></div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">The code above reassigns the final variable `s` multiple times and prints:</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;"><o:p> </o:p></div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">```</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">Log: a</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">Log: b</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">Log: c</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">Log: d</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">Got: d</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">```</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;"><o:p> </o:p></div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">Similarly  the following code:</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;"><o:p> </o:p></div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">```java</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">class Test {</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">    public static void main(String[] args) {</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">        System.out.println("Got: " + new Test(17).s);</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">    }</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;"><o:p> </o:p></div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">    boolean log(Object o) {</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">        System.out.println("Log: " + o + ", " + this.s);</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">        return false;</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">    }</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;"><o:p> </o:p></div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">    final String s;</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;"><o:p> </o:p></div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">    Test(Object o) {</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">        switch (o) {</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">            case Integer i when(s = "a") != null && log(s) -> {</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;"><o:p> </o:p></div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">            }</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">            case Integer i when(s = "b") != null && log(s) -> {</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;"><o:p> </o:p></div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">            }</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">            case Integer i when(s = "c") != null && log(s) -> {</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;"><o:p> </o:p></div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">            }</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">            case Object o1 when(s = "d") != null && log(s) || true -> {</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;"><o:p> </o:p></div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">            }</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">            default -> {</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">                throw new IllegalStateException("Unreachable");</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">            }</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">        }</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">    }</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">}</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">```</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;"><o:p> </o:p></div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">Also compiles and produces the following</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;"><o:p> </o:p></div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">```</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">Log: a, a</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">Log: b, b</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">Log: c, c</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">Log: d, d</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">Got: d</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">```</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;"><o:p> </o:p></div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">Showing the final field being reassigned multiple times.</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;"><o:p> </o:p></div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">Right before sending this email, I just remembered that</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">the first example shouldn't compile, as in each `return s;`</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">the `s` variable shouldn't be considered to be<span class="Apple-converted-space"> </span></div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">definite assigned.</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;"><o:p> </o:p></div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">Kind regards</div>
<div style="margin: 0cm; font-size: 11pt; font-family: Calibri, sans-serif;">Robbe Pincket</div>
</div>
</div>
</blockquote>
</div>
<br>
</div>
</body>
</html>