RFR: JDK-8214529: Exception while using Anonymous class in switch expression
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Mon Dec 3 12:55:56 UTC 2018
Looks good - I agree the program should compile.
Maurizio
On 03/12/2018 12:37, Jan Lahoda wrote:
> Hi,
>
> In:
> https://bugs.openjdk.java.net/browse/JDK-8214529
>
> This is a report that anonymous class' bodies are lost if the
> anonymous class is the break value. This was due to a mistake in
> desugaring, and has been fixed alongside with JDK-8214031, which
> removes the desugaring. But when writing a test for this case, it
> turned out that "return" statements inside the anonymous class are
> reported as errors:
>
> ---
> interface TestIntf {
> default int fun() {
> return 1;
> }
> }
>
> public class SwitchTest {
>
> public static void main(String[] args) {
> int x = 10;
> var y = switch(x) {
> case 0 -> new TestIntf(){ public int fun() { return 0; }};
> default -> new TestIntf(){};
> };
>
> System.out.println(y.fun());
> }
> }
> ---
> ---
> $ javac --enable-preview --source 12 /tmp/SwitchTest.java
> /tmp/SwitchTest.java:12: error: return outside of enclosing switch
> expression
> case 0 -> new TestIntf(){ public int fun() { return 0; }};
> ^
> Note: /tmp/SwitchTest.java uses preview language features.
> Note: Recompile with -Xlint:preview for details.
> 1 error
> ---
>
> This is not appropriate, to my knowledge. The proposed fix is to clear
> the breakResult when creating methodEnv, as is already done for
> lambdaEnv. The breakResult is (also) used to detect inappropriate
> returns nested inside the switch expression, so clearing it eliminates
> the error.
>
> Webrev:
> http://cr.openjdk.java.net/~jlahoda/8214529/webrev.00/
>
> How does this look?
>
> Thanks,
> Jan
>
More information about the compiler-dev
mailing list