You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by em...@apache.org on 2022/12/17 20:00:49 UTC

[groovy] branch master updated: GROOVY-10869: STC: primitive distance for `boolean`, `char`, etc.

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 ea6ba7c6fc GROOVY-10869: STC: primitive distance for `boolean`, `char`, etc.
ea6ba7c6fc is described below

commit ea6ba7c6fcfefe3d8abdfbb6e20a44b1ebb8823e
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sat Dec 17 13:51:59 2022 -0600

    GROOVY-10869: STC: primitive distance for `boolean`, `char`, etc.
---
 .../groovy/transform/stc/StaticTypeCheckingSupport.java   |  7 +++++--
 src/test/groovy/transform/stc/BugsSTCTest.groovy          | 15 ++++++++++++---
 2 files changed, 17 insertions(+), 5 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 b96e37015b..c480669090 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -915,8 +915,11 @@ public abstract class StaticTypeCheckingSupport {
         return false;
     }
 
-    static int getPrimitiveDistance(ClassNode primA, ClassNode primB) {
-        return Math.abs(NUMBER_TYPES.get(primA) - NUMBER_TYPES.get(primB));
+    private static final Integer NON_NUMBER_DEFAULT = 9; // GROOVY-10869: boolean, char, ...
+
+    static int getPrimitiveDistance(final ClassNode primA, final ClassNode primB) {
+        return Math.abs(NUMBER_TYPES.getOrDefault(primA, NON_NUMBER_DEFAULT)
+                      - NUMBER_TYPES.getOrDefault(primB, NON_NUMBER_DEFAULT));
     }
 
     static int getDistance(final ClassNode receiver, final ClassNode compare) {
diff --git a/src/test/groovy/transform/stc/BugsSTCTest.groovy b/src/test/groovy/transform/stc/BugsSTCTest.groovy
index 15fedb03a7..dfc61454b0 100644
--- a/src/test/groovy/transform/stc/BugsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/BugsSTCTest.groovy
@@ -1187,12 +1187,21 @@ Printer
         '''
     }
 
+    // GROOVY-10869
+    void testBigDecimalCompareNullPointerException1() {
+        assertScript '''
+            class C<T> {
+                C(T x) { }
+                <T extends Short> T m(T x) { x }
+            }
+            C<Integer> obj = new C<Integer>(-76)
+            boolean cond = 5.0 > obj.m(new C<Integer>(95).m(null))
+        '''
+    }
+
     // GROOVY-9999
     void testMathSqrt() {
         assertScript '''
-            import groovy.transform.TypeChecked
-
-            @TypeChecked
             def test() {
                Math.sqrt(Math.PI*2)
             }