Thodoris Sotiropoulos created GROOVY-11437:
----------------------------------------------
Summary: incorrect typing in nested ternary operator leads to type
unsafety
Key: GROOVY-11437
URL: https://issues.apache.org/jira/browse/GROOVY-11437
Project: Groovy
Issue Type: Bug
Components: Static Type Checker
Reporter: Thodoris Sotiropoulos
I have the following program, which leads to an unexpected typing result during
an LUB operation.
{code:java}
import java.time.*;
import java.time.chrono.*;
class Test {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
int x = 1;
((false ? 1 :
(false ? x : (ChronoLocalDateTime<LocalDate>) now)) >= x)
}
}{code}
h3.
Actual behavior
The code compiles, but I receive the following ClassCastException
{code:java}
Exception in thread "main" java.lang.IllegalArgumentException: Cannot compare
java.time.LocalDateTime with value '2024-07-08T17:00:53.307529' and
java.lang.Integer with value '1'
at
org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.compareToWithEqualityCheck(DefaultTypeTransformation.java:815)
at
org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.compareTo(DefaultTypeTransformation.java:750)
at
org.codehaus.groovy.runtime.ScriptBytecodeAdapter.compareTo(ScriptBytecodeAdapter.java:802)
at
org.codehaus.groovy.runtime.ScriptBytecodeAdapter.compareGreaterThanEqual(ScriptBytecodeAdapter.java:915)
at Test.main(test.groovy:9)
Caused by: java.lang.ClassCastException: class java.lang.Integer cannot be cast
to class java.time.chrono.ChronoLocalDateTime (java.lang.Integer and
java.time.chrono.ChronoLocalDateTime are in module java.base of loader
'bootstrap')
at java.base/java.time.LocalDateTime.compareTo(LocalDateTime.java:135)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native
Method)
at
java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at
java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:338)
at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:274)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1227)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1006)
at
org.codehaus.groovy.runtime.InvokerHelper.invokePojoMethod(InvokerHelper.java:623)
at
org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:614)
at
org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.compareToWithEqualityCheck(DefaultTypeTransformation.java:801)
... 4 more {code}
h3. Expected behavior
The code should have been rejected.
Tested against master (commit: c773e04ce402816b8f92c0318d08bde32e723eed)
--
This message was sent by Atlassian Jira
(v8.20.10#820010)