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 5374e521b1 GROOVY-11616: STC: combine multiple type witnesses for type 
parameter
5374e521b1 is described below

commit 5374e521b1f38d1472292310fdb8023d02c24e4c
Author: Eric Milles <[email protected]>
AuthorDate: Thu May 8 11:21:34 2025 -0500

    GROOVY-11616: STC: combine multiple type witnesses for type parameter
---
 .../groovy/transform/stc/StaticTypeCheckingSupport.java     |  9 ++++++++-
 .../groovy/transform/stc/StaticTypeCheckingVisitor.java     |  2 +-
 src/test/groovy/groovy/transform/stc/GenericsSTCTest.groovy | 13 +++++++++++++
 3 files changed, 22 insertions(+), 2 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 e075f7eb0a..2a57b95f6e 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -1951,7 +1951,14 @@ public abstract class StaticTypeCheckingSupport {
         // GROOVY-11028, et al.: empty list / map for gt1 or gt2?
         if (gt2.isPlaceholder() && gt2.getName().startsWith("#")) return gt1;
         if (gt1.isPlaceholder() && gt1.getName().startsWith("#")) return gt2;
-        // GROOVY-10315, GROOVY-10317, GROOVY-10339, ...
+        // GROOVY-10315, GROOVY-10317, GROOVY-10339, GROOVY-11616
+        if (!gt1.isPlaceholder() && !gt1.isWildcard()
+                && !gt2.isPlaceholder() && !gt2.isWildcard()) {
+            ClassNode lub = lowestUpperBound(gt1.getType(), gt2.getType());
+            if (!(lub instanceof 
WideningCategories.LowestUpperBoundClassNode)) {
+                return new GenericsType(lub);
+            }
+        }
         ClassNode cn1 = GenericsUtils.makeClassSafe0(CLASS_Type, gt1);
         ClassNode cn2 = GenericsUtils.makeClassSafe0(CLASS_Type, gt2);
         ClassNode lub = lowestUpperBound(cn1, cn2);
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 2d72a17e0f..f375a1ea7d 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -5620,7 +5620,7 @@ trying: for (ClassNode[] signature : signatures) {
                         }
 
                         connections.forEach((gtn, gt) -> 
resolvedPlaceholders.merge(gtn, gt, (gt1, gt2) -> {
-                            // GROOVY-10339: incorporate another witness
+                            // GROOVY-10339, GROOVY-11616: incorporate another 
type witness
                             return getCombinedGenericsType(gt1, gt2);
                         }));
                     }
diff --git a/src/test/groovy/groovy/transform/stc/GenericsSTCTest.groovy 
b/src/test/groovy/groovy/transform/stc/GenericsSTCTest.groovy
index 6f75b44d11..332490a0cb 100644
--- a/src/test/groovy/groovy/transform/stc/GenericsSTCTest.groovy
+++ b/src/test/groovy/groovy/transform/stc/GenericsSTCTest.groovy
@@ -250,6 +250,19 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase {
             def list = Arrays.asList()
             assert list.size() == 0
         '''
+
+        // GROOVY-11616:
+        assertScript '''
+            class A {}
+            class B extends A {}
+            class C extends B {}
+            @ASTTest(phase=INSTRUCTION_SELECTION, value={
+                def type = node.getNodeMetaData(INFERRED_TYPE)
+                assert type.toString(false) == 'java.util.List<A>'
+            })
+            def list = Arrays.asList(new A(), new B(), new C())
+            assert list.size() == 3
+        '''
     }
 
     // GROOVY-10062

Reply via email to