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()) {
