Jochen Kemnade created GROOVY-12428:
---------------------------------------

             Summary: STC: instanceof narrowing leaks from one switch case into 
subsequent cases
                 Key: GROOVY-12428
                 URL: https://issues.apache.org/jira/browse/GROOVY-12428
             Project: Groovy
          Issue Type: Bug
          Components: Static Type Checker
    Affects Versions: 6.0.0, 5.0.3
            Reporter: Jochen Kemnade


h3. Reproducer 1

{code:groovy}
import groovy.transform.CompileStatic

@CompileStatic
void check(String type, Object value) {
    switch (type) {
        case 'text':
            assert value instanceof String
            break
        case 'integer':
            assert value instanceof Integer
            break
        case 'boolean':
            assert value instanceof Boolean
            break
    }
}

check('integer', 42)
{code}

With Groovy 6.0.0 this fails to compile:
{noformat}
Incompatible instanceof types: java.lang.String and java.lang.Integer
 @ line 10, column 20.
Incompatible instanceof types: java.lang.String and java.lang.Boolean
 @ line 13, column 20.
{noformat}

h3. Reproducer 2

{code:groovy}
import groovy.transform.CompileStatic

@CompileStatic
void check(String type, Object value) {
    switch (type) {
        case 'text':
            assert value instanceof String
            break
        case 'integer':
            println value.toUpperCase()
            break
    }
}

check('integer', 42)
{code}

With Groovy 5.1.3 and 6.0.0 this compiles and fails at runtime:
{noformat}
java.lang.ClassCastException: class java.lang.Integer cannot be cast to class 
java.lang.String
{noformat}

h3. Expected result

Each case ends with {{break}}, so the narrowing of {{value}} to {{String}} in 
the first case should not apply to the other cases. Reproducer 1 should 
compile. Reproducer 2 should be rejected with "Cannot find matching method 
java.lang.Object#toUpperCase()".



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to