Final field update in unreachable for loop update section

Dan Smith daniel.smith at oracle.com
Thu Feb 15 20:16:04 UTC 2018


Thanks for the interesting test case.

You're pushing on this part of the language spec:
https://docs.oracle.com/javase/specs/jls/se9/html/jls-16.html#jls-16.2.12 <https://docs.oracle.com/javase/specs/jls/se9/html/jls-16.html>
https://docs.oracle.com/javase/specs/jls/se9/html/jls-16.html#jls-16.2.13 <https://docs.oracle.com/javase/specs/jls/se9/html/jls-16.html#jls-16.2.13>

> On Feb 7, 2018, at 7:49 PM, Tagir Valeev <amaembo at gmail.com> wrote:
> 
> public class Sample1 {
>  final int x;
> 
>  Sample1() {
>    for(;;x=1) {
>      x=2;
>      break;
>    }
>  }
> }


An error should only occur if 'x' is assigned to where it is definitely unassigned ("DU").

The rules say that:

- x is DU before the for loop

- x is DU after the (empty) initialization

- assuming x is DU before the (empty) condition:
	- x is DU before the loop body*
	- x is DU after the 'break' (because this is unreachable)
	- x is DU after the loop body

- thus, x is DU before the (empty) condition

- x is DU before 'x=2'

- x is DU after the 'break'

- x is DU after the loop body

- x is DU before the incrementation statement

- x is DU before 'x=1'

(*The connection between the start of the condition and the start of the loop body is a little confusing in the spec, because when the condition is empty, it refers to the initialization instead. But you get the same answer either way.)

So, the compiler is wrong: there is no error in Sample1.

> public class Sample2 {
>  final int x;
> 
>  Sample2() {
>    x=2;
>    for(;;x=1) {
>      break;
>    }
>  }
> }

No error here, which is fine. 'x=1' is unreachable, so it doesn't matter that it performs an assignment.

(You get the same behavior if you do 'if (false) x = 1'.)

—Dan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20180215/ddbc8b72/attachment.html>


More information about the compiler-dev mailing list