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

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

commit 308270cc972cc761301f0c304c937fa4beeda11f
Author: Paul King <[email protected]>
AuthorDate: Mon Mar 30 11:09:48 2026 +1000

    GROOVY-11888: STC: method resolution fails for UnionTypeClassNode due to 
premature covariant elimination
---
 .../groovy/transform/stc/StaticTypeCheckingSupport.java     | 13 +++++++------
 1 file changed, 7 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 c7676a2ba4..2122c91778 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingSupport.java
@@ -953,11 +953,11 @@ public abstract class StaticTypeCheckingSupport {
 
         // GROOVY-8965: type disjunction
         boolean duckType = receiver instanceof UnionTypeClassNode;
-        if (!duckType && methods.size() > 1 && !first(methods).isConstructor())
-            methods = removeCovariantsAndInterfaceEquivalents(methods, false);
-
-        if (!duckType && argumentTypes == null) {
-            return asList(methods); // GROOVY-11683: no covariants or 
equivalents
+        if (!duckType) {
+            if (methods.size() > 1 && !first(methods).isConstructor())
+                methods = removeCovariantsAndInterfaceEquivalents(methods, 
false);
+            if (argumentTypes == null)
+                return asList(methods); // GROOVY-11683: no covariants or 
equivalents
         }
 
         Set<MethodNode> bestMethods = new HashSet<>(); // choose best 
method(s) for each possible receiver
@@ -965,8 +965,9 @@ public abstract class StaticTypeCheckingSupport {
             var view = methods;
             if (duckType) {
                 view = methods.stream().filter(m -> 
implementsInterfaceOrSubclassOf(rcvr, m.getDeclaringClass())).toList();
-                if (view.size() > 1 && !first(view).isConstructor())
+                if (view.size() > 1) { // GROOVY-11888
                     view = removeCovariantsAndInterfaceEquivalents(view, true);
+                }
             }
             view = chooseBestMethods(rcvr, view, argumentTypes);
             if (view.isEmpty()) {

Reply via email to