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 db9ca93  GROOVY-8974: STC: missesGenericsTypes(ClassNode) true for 
unresolved <>
db9ca93 is described below

commit db9ca932f4e20280ffd50f39cde7d54586215ea3
Author: Eric Milles <[email protected]>
AuthorDate: Sun May 2 09:29:12 2021 -0500

    GROOVY-8974: STC: missesGenericsTypes(ClassNode) true for unresolved <>
---
 .../groovy/transform/stc/StaticTypeCheckingSupport.java       |  2 +-
 .../groovy/transform/stc/StaticTypeCheckingVisitor.java       |  7 +++----
 src/test/groovy/transform/stc/GenericsSTCTest.groovy          | 11 +++++++++++
 3 files changed, 15 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 287b72c..b71aed3 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -2148,7 +2148,7 @@ public abstract class StaticTypeCheckingSupport {
         while (cn.isArray()) cn = cn.getComponentType();
         GenericsType[] cnGenerics = cn.getGenericsTypes();
         GenericsType[] rnGenerics = cn.redirect().getGenericsTypes();
-        return cnGenerics == null ? rnGenerics != null : 
GenericsUtils.hasUnresolvedGenerics(cn);
+        return cnGenerics == null || cnGenerics.length == 0 ? rnGenerics != 
null : GenericsUtils.hasUnresolvedGenerics(cn);
     }
 
     /**
diff --git 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index f520295..6893a97 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -796,6 +796,9 @@ public class StaticTypeCheckingVisitor extends 
ClassCodeVisitorSupport {
             if (resultType == null) {
                 resultType = lType;
             } else if (isAssignment(op)) {
+                if (rightExpression instanceof ConstructorCallExpression) {
+                    inferDiamondType((ConstructorCallExpression) 
rightExpression, lType);
+                }
                 if (lType.isUsingGenerics() && 
missesGenericsTypes(resultType)) {
                     // unchecked assignment
                     // List<Type> list = new LinkedList()
@@ -837,10 +840,6 @@ public class StaticTypeCheckingVisitor extends 
ClassCodeVisitorSupport {
 
             boolean isEmptyDeclaration = (expression instanceof 
DeclarationExpression && rightExpression instanceof EmptyExpression);
             if (!isEmptyDeclaration && isAssignment(op)) {
-                if (rightExpression instanceof ConstructorCallExpression) {
-                    inferDiamondType((ConstructorCallExpression) 
rightExpression, lType);
-                }
-
                 ClassNode originType = 
getOriginalDeclarationType(leftExpression);
                 typeCheckAssignment(expression, leftExpression, originType, 
rightExpression, resultType);
                 // if assignment succeeds but result type is not a subtype of 
original type, then we are in a special cast handling
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy 
b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index 8aa76c3..c6a3b13 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -396,6 +396,17 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
         '''
     }
 
+    // GROOVY-8974
+    void testReturnTypeInferenceWithMethodGenerics12() {
+        assertScript '''
+            def <T> T identity(T t) { t }
+            List<String> list = identity(new ArrayList<>())
+            list.add('foo')
+            def foo = list[0]
+            assert foo.toUpperCase() == 'FOO'
+        '''
+    }
+
     void testDiamondInferrenceFromConstructor1() {
         assertScript '''
             class Foo<U> {

Reply via email to