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):