Bug 514091 - [1.8][null] Bogus null annotation mismatch for lambda
parameters when SAM is accessed via BTB
Change-Id: I3ed29640af0ce30b6a7d50b12da25aacbc110f24
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullTypeAnnotationTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullTypeAnnotationTest.java
index 6c4e613..8d5ea9a 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullTypeAnnotationTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/NullTypeAnnotationTest.java
@@ -15203,4 +15203,38 @@
""
);
}
+public void testBug514091() {
+ runConformTestWithLibs(
+ new String[] {
+ "test1/SAM.java",
+ "package test1;\n" +
+ "\n" +
+ "@org.eclipse.jdt.annotation.NonNullByDefault\n" +
+ "interface SAM<A> {\n" +
+ " void f(A[] a);\n" +
+ "}\n" +
+ ""
+ },
+ getCompilerOptions(),
+ ""
+ );
+ runConformTestWithLibs(
+ new String[] {
+ "test1/LambdaNN.java",
+ "package test1;\n" +
+ "\n" +
+ "import org.eclipse.jdt.annotation.*;\n" +
+ "\n" +
+ "public class LambdaNN {\n" +
+ " void g1() {\n" +
+ " SAM<? super Number> sam = (Number @NonNull [] a) -> {};\n" +
+ " sam.f(new Number[0]);\n" +
+ " }\n" +
+ "}\n" +
+ "",
+ },
+ getCompilerOptions(),
+ ""
+ );
+}
}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FunctionalExpression.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FunctionalExpression.java
index bbe252b..e2cf5d4 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FunctionalExpression.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FunctionalExpression.java
@@ -35,7 +35,6 @@
import org.eclipse.jdt.internal.compiler.impl.ReferenceContext;
import org.eclipse.jdt.internal.compiler.lookup.BlockScope;
import org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope;
-import org.eclipse.jdt.internal.compiler.lookup.ImplicitNullAnnotationVerifier;
import org.eclipse.jdt.internal.compiler.lookup.IntersectionTypeBinding18;
import org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment;
import org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
@@ -202,7 +201,6 @@
}
LookupEnvironment environment = blockScope.environment();
if (environment.globalOptions.isAnnotationBasedNullAnalysisEnabled) {
- ImplicitNullAnnotationVerifier.ensureNullnessIsKnown(sam, blockScope);
NullAnnotationMatching.checkForContradictions(sam, this, blockScope);
}
return this.resolvedType = this.expectedType;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java
index 48935ef..d5a1149 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ReferenceBinding.java
@@ -1997,6 +1997,9 @@
if (contractsCount == contractsLength) {
System.arraycopy(contracts, 0, contracts = new MethodBinding[contractsLength += 16], 0, contractsCount);
}
+ if(environment.globalOptions.isAnnotationBasedNullAnalysisEnabled) {
+ ImplicitNullAnnotationVerifier.ensureNullnessIsKnown(method, scope);
+ }
contracts[contractsCount++] = method;
}
// check mutual overriding of inherited methods (i.e., not from current type):