diff --git a/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java b/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java index db2db2285d8..d173ae49f74 100644 --- a/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java +++ b/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java @@ -1486,12 +1486,6 @@ public Set getSmallestVariableSet(BoundSet bounds, Set> collectDependencies(BoundSet bounds, boolean maySkipSuperBound, boolean[] hasSkippedSuperBound) { // Implements the definition of dependencies from JLS §18.4: Map> dependsOn = new LinkedHashMap<>(); - // "An inference variable α depends on the resolution of itself." - for (InferenceVariable iv : this.inferenceVariables) { - Set selfSet = new LinkedHashSet<>(); - selfSet.add(iv); - dependsOn.put(iv, selfSet); - } for (TypeBound typeBound : bounds.flatten()) { // "Given a bound of one of the following forms:" (ecj may represent some using :> rather than <:) // α = T @@ -1580,6 +1574,15 @@ Map> collectDependencies(BoundSet bound } } } while (hasChange); + // "An inference variable α depends on the resolution of itself." + // https://github.com/eclipse-jdt/eclipse.jdt.core/issues/4846 + for (InferenceVariable iv : this.inferenceVariables) { + if (!dependsOn.containsKey(iv)) { + Set selfSet = new LinkedHashSet<>(); + selfSet.add(iv); + dependsOn.put(iv, selfSet); + } + } return dependsOn; } diff --git a/org.eclipse.jdt.core.tests.compiler/META-INF/MANIFEST.MF b/org.eclipse.jdt.core.tests.compiler/META-INF/MANIFEST.MF index fac3896ca24..5b4a64c99a3 100644 --- a/org.eclipse.jdt.core.tests.compiler/META-INF/MANIFEST.MF +++ b/org.eclipse.jdt.core.tests.compiler/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.jdt.core.tests.compiler;singleton:=true -Bundle-Version: 3.13.1100.qualifier +Bundle-Version: 3.13.1200.qualifier Bundle-Vendor: %providerName Bundle-Localization: plugin Export-Package: org.eclipse.jdt.core.tests.compiler, diff --git a/org.eclipse.jdt.core.tests.compiler/pom.xml b/org.eclipse.jdt.core.tests.compiler/pom.xml index 970f8759212..21ba83b32e7 100644 --- a/org.eclipse.jdt.core.tests.compiler/pom.xml +++ b/org.eclipse.jdt.core.tests.compiler/pom.xml @@ -19,7 +19,7 @@ ../tests-pom/ org.eclipse.jdt.core.tests.compiler - 3.13.1100-SNAPSHOT + 3.13.1200-SNAPSHOT eclipse-test-plugin diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java index de5fdf4918e..f5bc427f534 100644 --- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java +++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java @@ -10964,4 +10964,56 @@ > void foo2(Y y1) { "The method bar(One>) in the type Bug is not applicable for the arguments (One>)\n" + "----------\n"); } + // https://github.com/eclipse-jdt/eclipse.jdt.core/issues/4846 + public void testGH4846() { + if (this.complianceLevel < ClassFileConstants.JDK9) { + return; + } + runConformTest( + new String[] { + "Pairs.java", + """ + import java.util.Map; + import java.util.function.Function; + + public class Pairs { + + public void addMapEntries(Function> extractor) { + add(extractor.andThen(Map::entrySet), Map.Entry::getKey, Map.Entry::getValue); + } + + public void add(Function> elementsExtractor, PairExtractor pairExtractor) { + add(elementsExtractor, pairExtractor::getName, pairExtractor::getValue); + } + + public void add(Function> elementsExtractor, Function nameExtractor, + Function valueExtractor) { + } + + interface PairExtractor { + N getName(E element); + V getValue(E element); + static PairExtractor of(Function nameExtractor, Function valueExtractor) { + return new PairExtractor<>() { + + @Override + @SuppressWarnings("unchecked") + public N getName(T instance) { + return (N) nameExtractor.apply(instance); + } + + @Override + @SuppressWarnings("unchecked") + public V getValue(T instance) { + return (V) valueExtractor.apply(instance); + } + + }; + } + } + + } + """ + }); + } }