This is an automated email from the ASF dual-hosted git repository. emilles pushed a commit to branch GROOVY-11664 in repository https://gitbox.apache.org/repos/asf/groovy.git
commit 06dc049d444281b16ea28d8133d81afdb3e30231 Author: Eric Milles <[email protected]> AuthorDate: Thu May 22 12:04:18 2025 -0500 GROOVY-11664: STC: combine generics of same-type witnesses --- .../groovy/transform/stc/StaticTypeCheckingSupport.java | 8 ++++++++ src/test/groovy/groovy/transform/stc/GenericsSTCTest.groovy | 13 +++++++++++++ 2 files changed, 21 insertions(+) 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 2a57b95f6e..7d8a8edca0 100644 --- a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java +++ b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java @@ -1537,6 +1537,14 @@ public abstract class StaticTypeCheckingSupport { } return true; // incompatible } + if (!fixedPlaceHolders.contains(entry.getKey()) + && !resolved.isPlaceholder() && !resolved.isWildcard() + && !candidate.isPlaceholder() && !candidate.isWildcard()) { + // resolved "T=Object" and candidate "T=Object" or "T=String"; or + // GROOVY-11664: resolved "T=Class<A>" and candidate "T=Class<B>" + ClassNode oldT = resolved.getType(), newT = candidate.getType(); + resolvedMethodGenerics.put(entry.getKey(), new GenericsType(lowestUpperBound(oldT, newT))); + } } connections.keySet().removeAll(fixedPlaceHolders); // GROOVY-10337 diff --git a/src/test/groovy/groovy/transform/stc/GenericsSTCTest.groovy b/src/test/groovy/groovy/transform/stc/GenericsSTCTest.groovy index 332490a0cb..4e7ebc3833 100644 --- a/src/test/groovy/groovy/transform/stc/GenericsSTCTest.groovy +++ b/src/test/groovy/groovy/transform/stc/GenericsSTCTest.groovy @@ -263,6 +263,19 @@ class GenericsSTCTest extends StaticTypeCheckingTestCase { def list = Arrays.asList(new A(), new B(), new C()) assert list.size() == 3 ''' + + // GROOVY-11664: + 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<java.lang.Class<? extends A>>' + }) + def list = Arrays.asList(A.class, B.class, C.class) + assert list.size() == 3 + ''' } // GROOVY-10062
