Joan Karadimov created GROOVY-8202:
--------------------------------------

             Summary: void tail calls in closures break @CompileStatic type 
inference
                 Key: GROOVY-8202
                 URL: https://issues.apache.org/jira/browse/GROOVY-8202
             Project: Groovy
          Issue Type: Bug
          Components: Static compilation
    Affects Versions: 2.4.10
            Reporter: Joan Karadimov
            Priority: Minor


Consider this piece of code:

{code:java}
class Example {
        @CompileStatic
        static void test1() {
                Closure<String> x = {
                        if (true) {
                                "asd"
                        } else {
                                f()
                                null
                        }
                }
        }

        @CompileStatic
        static void test2() {
                Closure<String> x = { // [Static type checking] - Incompatible 
generic argument types. Cannot assign groovy.lang.Closure <java.lang.Object> 
to: groovy.lang.Closure <String>
                        if (true) {
                                "asd"
                        } else {
                                f()
                        }
                }
        }

        @CompileStatic
        static String test3() {
                if (true) {
                        "asd"
                } else {
                        f()
                }
        }

        @CompileStatic
        static void f() {
        }
}
{code}

The code in _*test1*_ compiles correctly. The type of the closure in _*test2*_ 
is inferred as _*Closure<Object>*_. There is an inconsistency here - in 
_*test3*_ the type inference yields _*String*_.

Basically - _*null*_ s are not considered when the type is inferred. Calls to 
void methods should not be either.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to