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)