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/11/19 14:45:57 UTC

[groovy] branch GROOVY_4_0_X updated: GROOVY-10847: STC: `T t = new C<>()` where `T` extends a type parameter

This is an automated email from the ASF dual-hosted git repository.

emilles pushed a commit to branch GROOVY_4_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/GROOVY_4_0_X by this push:
     new 88cf2640ac GROOVY-10847: STC: `T t = new C<>()` where `T` extends a type parameter
88cf2640ac is described below

commit 88cf2640ac9bb22b625183a8dac15c246e9bbaa4
Author: Eric Milles <er...@thomsonreuters.com>
AuthorDate: Sat Nov 19 08:19:39 2022 -0600

    GROOVY-10847: STC: `T t = new C<>()` where `T` extends a type parameter
---
 .../transform/stc/StaticTypeCheckingVisitor.java     |  5 +++--
 src/test/groovy/transform/stc/GenericsSTCTest.groovy | 20 +++++++++++++++++++-
 2 files changed, 22 insertions(+), 3 deletions(-)

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 70c06d038c..b0f18982a0 100644
--- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -1107,9 +1107,10 @@ public class StaticTypeCheckingVisitor extends ClassCodeVisitorSupport {
                 }
                 inferredType = type;
             }
-            if (inferredType.isGenericsPlaceHolder()) // GROOVY-10344: "T t = new C<>()"
+            // GROOVY-10344, GROOVY-10847: "T t = new C<>()" where "T" may extend another type parameter
+            while (inferredType.isGenericsPlaceHolder() && asBoolean(inferredType.getGenericsTypes())) {
                 inferredType = getCombinedBoundType(inferredType.getGenericsTypes()[0]);
-
+            }
             adjustGenerics(inferredType, cceType);
             storeType(cce, cceType);
         }
diff --git a/src/test/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
index 9be6113b81..3ecce489e4 100644
--- a/src/test/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/transform/stc/GenericsSTCTest.groovy
@@ -1585,8 +1585,26 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
         '''
     }
 
-    // GROOVY-10674
+    // GROOVY-10847
     void testDiamondInferrenceFromConstructor35() {
+        assertScript '''
+            class A<T, U> {
+            }
+            class B {
+              def <X extends A<Character, Boolean>, Y extends X> Object m(X x, Y y) {
+              }
+            }
+
+            @ASTTest(phase=INSTRUCTION_SELECTION, value={
+                def type = node.rightExpression.arguments[1].getNodeMetaData(INFERRED_TYPE)
+                assert type.toString(false) == 'A<java.lang.Character, java.lang.Boolean>'
+            })
+            def c = new B().m(null, new A<>())
+        '''
+    }
+
+    // GROOVY-10674
+    void testDiamondInferrenceFromConstructor36() {
         assertScript '''
             class Foo<BB extends Bar<Byte>, X extends BB> {
                 X x