diff options
2 files changed, 32 insertions, 0 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 0b7af701e4..18ae2dd83b 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 @@ -9825,4 +9825,34 @@ public void testBug508834_comment0() { "}\n" }); } + public void testBug545420() { + runConformTest( + new String[] { + "Main.java", + "public class Main {\n" + + " public static void main(String[] args) { \n" + + " System.out.println(new Main().getDetailCellCssFactory().getReturn());\n" + + " }\n" + + "\n" + + " public FIReturnType getDetailCellCssFactory() {\n" + + " \n" + + " return method1(()-> {\n" + + " return () ->{\n" + + " return \"something\";\n" + + " };\n" + + " });\n" + + " }\n" + + " \n" + + " public <X> X method1(FIWithGenerics<X> init) {\n" + + " return init.init(); \n" + + " }\n" + + "}\n" + + "interface FIReturnType {\n" + + " String getReturn();\n" + + "}\n" + + "interface FIWithGenerics<X> {\n" + + " X init();\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 4e5e921e3d..c47c7249d8 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 @@ -157,6 +157,8 @@ class ConstraintExpressionFormula extends ConstraintFormula { } else if (this.left instanceof LambdaExpression) { LambdaExpression lambda = (LambdaExpression) this.left; BlockScope scope = lambda.enclosingScope; + if (this.right instanceof InferenceVariable) + return TRUE; // assume inner inference will handle the fine print if (!this.right.isFunctionalInterface(scope)) return FALSE; |