[ https://issues.apache.org/jira/browse/GROOVY-9424?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17051912#comment-17051912 ]
Vaidotas Valuckas edited comment on GROOVY-9424 at 3/5/20, 8:52 AM: -------------------------------------------------------------------- It looks like this change [https://github.com/apache/groovy/commit/cd2b0e42fcf418e16776f34a66ed5cacc7711630#diff-3557aa86d96d4931ca9f64e88bd5f85fR480] introduced a regression in compiling switch statements with clauses containing only a break. A simple reproducer: {code:java} int i = 42 switch(i) { case 1: break case 2: println 2 } {code} This yields the following with the latest Groovy 2.5.10-SNAPSHOT: {code:java} java.lang.ClassCastException: class org.codehaus.groovy.ast.stmt.ReturnStatement cannot be cast to class org.codehaus.groovy.ast.stmt.BlockStatement (org.codehaus.groovy .ast.stmt.ReturnStatement and org.codehaus.groovy.ast.stmt.BlockStatement are in unnamed module of loader org.gradle.internal.classloader.VisitableURLClassLoader @135490 40) at org.codehaus.groovy.classgen.FinalVariableAnalyzer.fallsThrough(FinalVariableAnalyzer.java:480) {code} Adding anything between the first case and break makes it compile again: {code:java} int i = 42 switch(i) { case 1: true break case 2: println 2 } {code} was (Author: rieske): It looks like this change [https://github.com/apache/groovy/commit/cd2b0e42fcf418e16776f34a66ed5cacc7711630#diff-3557aa86d96d4931ca9f64e88bd5f85fR480] introduced a regression in compiling switch statements with clauses containing only a break. A simple reproducer: {code:java} int i = 42 switch(i) { case 1: break case 2: println 2 } {code} This yields the following with the latest Groovy 2.5.10-SNAPSHOT: {code:java} java.lang.ClassCastException: class org.codehaus.groovy.ast.stmt.ReturnStatement cannot be cast to class org.codehaus.groovy.ast.stmt.BlockStatement (org.codehaus.groovy .ast.stmt.ReturnStatement and org.codehaus.groovy.ast.stmt.BlockStatement are in unnamed module of loader org.gradle.internal.classloader.VisitableURLClassLoader @135490 40) at org.codehaus.groovy.classgen.FinalVariableAnalyzer.fallsThrough(FinalVariableAnalyzer.java:480) {code} Adding anything between the first case and break makes it compile again: {code:java} int i = 42 switch(i) { case 1: true break case 2: println 2 } {code} > Incorrect handling of final variables within switch > --------------------------------------------------- > > Key: GROOVY-9424 > URL: https://issues.apache.org/jira/browse/GROOVY-9424 > Project: Groovy > Issue Type: Bug > Reporter: Daniel Wilmer > Assignee: Paul King > Priority: Major > Fix For: 2.5.10, 3.0.2 > > Time Spent: 0.5h > Remaining Estimate: 0h > > The following code runs on groovy 2.4.18 but not on groovy 3.0.1. > {code} > static void main(String[] args) { > final String result > switch (2) { > case 1: result = "a"; break; > case 2: result = "b"; break; > default: result = "x" > } > println result > } > {code} > *Error: Groovyc: The variable [result] is declared final but is reassigned.* > Since we use final in our codebase a lot (although it seems to be ignored by > groovy 2.4), > we will have to adjust a lot of places to make our code groovy 3.0 compatible. -- This message was sent by Atlassian Jira (v8.3.4#803005)