Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephan Herrmann2019-06-24 22:06:44 +0000
committerStephan Herrmann2019-06-25 10:53:15 +0000
commit4ac2904e518928fb9f4aa2fc7f5f3e9b92d231e5 (patch)
tree3852c8acf7e86f4bc0e4b9d20af63867f64cf83b
parentdcc5dc9c9c6be1356e6fcc76cf06c9912feb98ea (diff)
downloadeclipse.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
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_1_8.java29
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ConstraintExpressionFormula.java2
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/InferenceContext18.java6
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;

Back to the top