diff options
author | Stephan Herrmann | 2019-06-24 22:06:44 +0000 |
---|---|---|
committer | Stephan Herrmann | 2019-06-25 10:53:15 +0000 |
commit | 4ac2904e518928fb9f4aa2fc7f5f3e9b92d231e5 (patch) | |
tree | 3852c8acf7e86f4bc0e4b9d20af63867f64cf83b | |
parent | dcc5dc9c9c6be1356e6fcc76cf06c9912feb98ea (diff) | |
download | eclipse.jdt.core-4ac2904e518928fb9f4aa2fc7f5f3e9b92d231e5.tar.gz eclipse.jdt.core-4ac2904e518928fb9f4aa2fc7f5f3e9b92d231e5.tar.xz eclipse.jdt.core-4ac2904e518928fb9f4aa2fc7f5f3e9b92d231e5.zip |
Bug 548589 - [1.8][inference] Cannot infer type argument(s) for <R>
map(Function<? super T,? extends R>)
Change-Id: I4f583c8491f730858fcaa94d16494b78aa5cbb92
3 files changed, 36 insertions, 1 deletions
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 d2fd242153..1abf4f930e 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 @@ -9926,4 +9926,33 @@ public void testBug508834_comment0() { "}\n" }); } + public void testBug548589() { + runConformTest( + new String[] { + "InferenceCheck.java", + "import java.util.*;\n" + + "import java.util.function.*;\n" + + "\n" + + "public class InferenceCheck {\n" + + "\n" + + " public interface P<T> {\n" + + "\n" + + " public boolean apply(T value); \n" + + " }\n" + + "\n" + + " public static <T> P<T> compilation_failed(P<T> predicate) {\n" + + " List<P<T>> list = Collections.emptyList();\n" + + " list.stream().map(InferenceCheck::compilation_failed);\n" + + " return null;\n" + + " } \n" + + "\n" + + " public static <T> P<T> compilation_ok(P<T> predicate) {\n" + + " List<P<T>> list = Collections.emptyList();\n" + + " Function<P<T>, P<T>> f = InferenceCheck::compilation_ok;\n" + + " list.stream().map(f);\n" + + " return null;\n" + + " } \n" + + "}\n" + }); + } } diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ConstraintExpressionFormula.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ConstraintExpressionFormula.java index c47c7249d8..ccf6562ba2 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ConstraintExpressionFormula.java +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ConstraintExpressionFormula.java @@ -318,6 +318,8 @@ class ConstraintExpressionFormula extends ConstraintFormula { InferenceContext18 innerContext = null; try { innerContext = reference.getInferenceContext((ParameterizedMethodBinding) compileTimeDecl); + if (innerContext != null) + innerContext.pushBoundsTo(inferenceContext); int innerInferenceKind = determineInferenceKind(compileTimeDecl, argumentTypes, innerContext); inferInvocationApplicability(inferenceContext, original, argumentTypes, original.isConstructor()/*mimic a diamond?*/, innerInferenceKind); if (!inferenceContext.computeB3(reference, r, original)) diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java index 613512c4f1..ae20f29820 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java @@ -488,7 +488,11 @@ public class InferenceContext18 { // --- not per JLS: emulate how javac passes type bounds from inner to outer: --- /** Not per JLS: push current bounds to outer inference if outer is ready for it. */ private void pushBoundsToOuter() { - InferenceContext18 outer = this.outerContext; + pushBoundsTo(this.outerContext); + } + + /** Not per JLS: invent more bubbling up of inner bounds. */ + public void pushBoundsTo(InferenceContext18 outer) { if (outer != null && outer.stepCompleted >= APPLICABILITY_INFERRED) { boolean deferred = outer.currentInvocation instanceof Invocation; // need to wait till after overload resolution? BoundSet toPush = deferred ? this.currentBounds.copy() : this.currentBounds; |