This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/groovy.git
The following commit(s) were added to refs/heads/master by this push:
new ccdd40b2d1 GROOVY-8488: STC: `float` or `double` can accept a
`BigDecimal` literal
ccdd40b2d1 is described below
commit ccdd40b2d147c5ce6466f4fd83f84ad164dcfaed
Author: Eric Milles <[email protected]>
AuthorDate: Fri Nov 3 10:54:21 2023 -0500
GROOVY-8488: STC: `float` or `double` can accept a `BigDecimal` literal
---
.../transform/stc/StaticTypeCheckingSupport.java | 9 ++++--
.../groovy/transform/stc/MethodCallsSTCTest.groovy | 36 ++++++++++++++++++++++
2 files changed, 42 insertions(+), 3 deletions(-)
diff --git
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
index 4f2edcacca..da3f79e2f3 100644
---
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -194,8 +194,8 @@ public abstract class StaticTypeCheckingSupport {
Short_TYPE, 1,
int_TYPE, 2,
Integer_TYPE, 2,
- Long_TYPE, 3,
long_TYPE, 3,
+ Long_TYPE, 3,
float_TYPE, 4,
Float_TYPE, 4,
double_TYPE, 5,
@@ -469,8 +469,11 @@ public abstract class StaticTypeCheckingSupport {
if (type == toBeAssignedTo || type == UNKNOWN_PARAMETER_TYPE) return
true;
if (isPrimitiveType(type)) type = getWrapper(type);
if (isPrimitiveType(toBeAssignedTo)) toBeAssignedTo =
getWrapper(toBeAssignedTo);
- if (NUMBER_TYPES.containsKey(type.redirect()) &&
NUMBER_TYPES.containsKey(toBeAssignedTo.redirect())) {
- return NUMBER_TYPES.get(type.redirect()) <=
NUMBER_TYPES.get(toBeAssignedTo.redirect());
+ Integer source= NUMBER_TYPES.get(type), target=
NUMBER_TYPES.get(toBeAssignedTo);
+ if (source != null && target != null) { return
(source.compareTo(target) <= 0); }
+ // GROOVY-8325, GROOVY-8488: float or double can be assigned a
BigDecimal literal
+ if (isBigDecimalType(type) &&
isFloatingCategory(getUnwrapper(toBeAssignedTo))) {
+ return true;
}
if (type.isArray() && toBeAssignedTo.isArray()) {
ClassNode sourceComponent = type.getComponentType(),
targetComponent = toBeAssignedTo.getComponentType();
diff --git a/src/test/groovy/transform/stc/MethodCallsSTCTest.groovy
b/src/test/groovy/transform/stc/MethodCallsSTCTest.groovy
index 67dfe953b9..0d05b66df4 100644
--- a/src/test/groovy/transform/stc/MethodCallsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/MethodCallsSTCTest.groovy
@@ -1356,6 +1356,42 @@ class MethodCallsSTCTest extends
StaticTypeCheckingTestCase {
'Cannot call closure that accepts [java.lang.String, java.lang.String,
java.lang.String] with '
}
+ // GROOVY-8488
+ void testBigDecimalLiteralArgument() {
+ assertScript '''
+ def m1(double d) { Double.valueOf(d) }
+ def m2(float f) { Float.valueOf(f) }
+ assert m1(1.0) == 1.0d
+ assert m2(1.0) == 1.0f
+ '''
+
+ shouldFailWithMessages '''
+ class C {
+ def m1(long l) { Long.valueOf(l) }
+ def m2(int i) { new Integer(i) }
+ void test() {
+ m1(1.0)
+ m2(1.0)
+ }
+ }
+ ''',
+ 'Cannot find matching method C#m1(java.math.BigDecimal)',
+ 'Cannot find matching method C#m2(java.math.BigDecimal)'
+
+ shouldFailWithMessages '''
+ class C {
+ def m1(long l) { Long.valueOf(l) }
+ def m2(int i) { new Integer(i) }
+ void test() {
+ m1(1g)
+ m2(1g)
+ }
+ }
+ ''',
+ 'Cannot find matching method C#m1(java.math.BigInteger)',
+ 'Cannot find matching method C#m2(java.math.BigInteger)'
+ }
+
void testBoxingShouldCostMore() {
assertScript '''
int foo(int x) { 1 }