Bug 511071 - [1.8] NPE in analyseCode caused by missing type detected in
lambda

Change-Id: I32c80a5a60ac961d41a9cce53e15a5fa152bfe53
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 6831c3a..c196a9e 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
@@ -7853,4 +7853,55 @@
 				"}\n"
 			});
 	}
+	public void testBug511071() {
+		runNegativeTest(
+			new String[] {
+				"test/ATestClass.java",
+				"package test;\n" +
+				"\n" +
+				"interface Functional<T> {\n" +
+				"	void test(T t);\n" +
+				"}\n" +
+				"\n" +
+				"public abstract class ATestClass {\n" +
+				"	abstract void f(Functional<? super ClassWithMethodWithMissingArgType> predicate);\n" +
+				"\n" +
+				"	public void m() {\n" +
+				"		f(e -> e.matches(\"\"));\n" +
+				"	}\n" +
+				"}\n" +
+				"",
+				"test/ClassWithMethodWithMissingArgType.java",
+				"package test;\n" +
+				"\n" +
+				"import java.util.List;\n" +
+				"\n" +
+				"import missing.Type;\n" +
+				"\n" +
+				"public class ClassWithMethodWithMissingArgType {\n" +
+				"	public void matches(Type arg) {\n" +
+				"		arg.hashCode();\n" +
+				"	}\n" +
+				"}\n" +
+				"",
+			}, 
+			"----------\n" + 
+			"1. ERROR in test\\ATestClass.java (at line 11)\n" + 
+			"	f(e -> e.matches(\"\"));\n" + 
+			"	         ^^^^^^^\n" + 
+			"The method matches(Type) from the type ClassWithMethodWithMissingArgType refers to the missing type Type\n" + 
+			"----------\n" + 
+			"----------\n" + 
+			"1. ERROR in test\\ClassWithMethodWithMissingArgType.java (at line 5)\n" + 
+			"	import missing.Type;\n" + 
+			"	       ^^^^^^^\n" + 
+			"The import missing cannot be resolved\n" + 
+			"----------\n" + 
+			"2. ERROR in test\\ClassWithMethodWithMissingArgType.java (at line 8)\n" + 
+			"	public void matches(Type arg) {\n" + 
+			"	                    ^^^^\n" + 
+			"Type cannot be resolved to a type\n" + 
+			"----------\n"
+		);
+	}
 }
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java
index be3d0db..20fd791 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java
@@ -52,6 +52,7 @@
 import java.util.Iterator;
 
 import org.eclipse.jdt.core.compiler.CharOperation;
+import org.eclipse.jdt.internal.compiler.IErrorHandlingPolicy;
 import org.eclipse.jdt.internal.compiler.ast.ASTNode;
 import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;
 import org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration;
@@ -69,6 +70,7 @@
 import org.eclipse.jdt.internal.compiler.classfmt.ExternalAnnotationProvider;
 import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 import org.eclipse.jdt.internal.compiler.impl.Constant;
+import org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
 import org.eclipse.jdt.internal.compiler.problem.ProblemSeverities;
 import org.eclipse.jdt.internal.compiler.util.SimpleLookupTable;
 import org.eclipse.jdt.internal.compiler.util.Util;
@@ -1809,8 +1811,18 @@
 	}
 	return null; // should never reach this point
 }
+
 public MethodBinding resolveTypesFor(MethodBinding method) {
-	
+	ProblemReporter problemReporter = this.scope.problemReporter();
+	IErrorHandlingPolicy suspendedPolicy = problemReporter.suspendTempErrorHandlingPolicy();
+	try {
+		return resolveTypesWithSuspendedTempErrorHandlingPolicy(method);
+	} finally {
+		problemReporter.resumeTempErrorHandlingPolicy(suspendedPolicy);
+	}
+}
+
+private MethodBinding resolveTypesWithSuspendedTempErrorHandlingPolicy(MethodBinding method) {
 	if (!isPrototype())
 		return this.prototype.resolveTypesFor(method);