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 2021/08/19 15:43:38 UTC
[groovy] 01/05: GROOVY-10107: STC: check assign null before type
parameter compatibility
This is an automated email from the ASF dual-hosted git repository.
emilles pushed a commit to branch GROOVY_3_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git
commit bd5076773d3f81b22cd9ada6da266ca6847c881e
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Fri Jun 4 09:48:39 2021 -0500
GROOVY-10107: STC: check assign null before type parameter compatibility
Conflicts:
src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
---
.../groovy/transform/stc/StaticTypeCheckingSupport.java | 11 +++++------
src/test/groovy/transform/stc/GenericsSTCTest.groovy | 14 ++++++++++++++
2 files changed, 19 insertions(+), 6 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 2a5fd0d..ddc4419 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -644,6 +644,10 @@ public abstract class StaticTypeCheckingSupport {
}
public static boolean checkCompatibleAssignmentTypes(final ClassNode left, final ClassNode right, final Expression rightExpression, final boolean allowConstructorCoercion) {
+ if (!isPrimitiveType(left) && isNullConstant(rightExpression)) {
+ return true;
+ }
+
ClassNode leftRedirect = left.redirect();
ClassNode rightRedirect = right.redirect();
if (leftRedirect == rightRedirect) return true;
@@ -666,13 +670,8 @@ public abstract class StaticTypeCheckingSupport {
}
}
- boolean rightExpressionIsNull = isNullConstant(rightExpression);
- if (rightExpressionIsNull && !isPrimitiveType(left)) {
- return true;
- }
-
// anything can be assigned to an Object, String, [Bb]oolean or Class receiver; except null to boolean
- if (isWildcardLeftHandSide(leftRedirect) && !(boolean_TYPE.equals(left) && rightExpressionIsNull)) return true;
+ if (isWildcardLeftHandSide(leftRedirect) && !(boolean_TYPE.equals(left) && isNullConstant(rightExpression))) return true;
if (leftRedirect == char_TYPE && rightRedirect == Character_TYPE) return true;
if (leftRedirect == Character_TYPE && rightRedirect == char_TYPE) return true;
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index 6631867..0779304 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -1014,6 +1014,7 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
assertScript '''
Map<String, Integer> foo = null
Integer result = foo?.get('a')
+ assert result == null
'''
}
@@ -1021,6 +1022,7 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
assertScript '''
List<Integer> foo = null
Integer result = foo?.get(0)
+ assert result == null
'''
}
@@ -1029,8 +1031,20 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
List<Integer> foo = [1]
foo = null
Integer result = foo?.get(0)
+ assert result == null
'''
+ }
+ // GROOVY-10107
+ void testAssignNullTypeParameterWithUpperBounds() {
+ assertScript '''
+ class C<T extends Number> {
+ void m() {
+ T n = null
+ }
+ }
+ new C<Long>().m()
+ '''
}
void testMethodCallWithArgumentUsingNestedGenerics() {