Bug 496591 - Incorrectly marking return types as incompatible

Change-Id: I3bccb599d0bff04e2eb57707ac3e683be8c135d1
Signed-off-by: Till Brychcy <register.eclipse@brychcy.de>
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 05e71f8..3324c22 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
@@ -12289,4 +12289,60 @@
 		""
 	);
 }
+public void testBug496591() {
+	runConformTestWithLibs(
+		new String[] {
+			"test2/Descriptors.java",
+			"package test2;\n" +
+			"\n" +
+			"public final class Descriptors {\n" +
+			"	public static final class FieldDescriptor implements FieldSet.FieldDescriptorLite<FieldDescriptor> { }\n" +
+			"}\n" +
+			"",
+			"test2/FieldSet.java",
+			"package test2;\n" +
+			"\n" +
+			"public final class FieldSet<F1 extends FieldSet.FieldDescriptorLite<F1>> {\n" +
+			"	public interface FieldDescriptorLite<F2 extends FieldDescriptorLite<F2>> { }\n" +
+			"\n" +
+			"	void f(final Map.Entry<F1> entry) { }\n" +
+			"}\n" +
+			"",
+			"test2/Map.java",
+			"package test2;\n" +
+			"\n" +
+			"public class Map<K> {\n" +
+			"	interface Entry<K1> { }\n" +
+			"}\n" +
+			"",
+			"test2/MessageOrBuilder.java",
+			"package test2;\n" +
+			"\n" +
+			"public interface MessageOrBuilder {\n" +
+			"	Map<Descriptors.FieldDescriptor> getAllFields();\n" +
+			"}\n" +
+			"",
+		}, 
+		getCompilerOptions(),
+		""
+	);
+	runConformTestWithLibs(
+		new String[] {
+			"test1/GeneratedMessage.java",
+			"package test1;\n" +
+			"\n" +
+			"import test2.Descriptors.FieldDescriptor;\n" +
+			"import test2.Map;\n" +
+			"import test2.MessageOrBuilder;\n" +
+			"\n" +
+			"public abstract class GeneratedMessage implements MessageOrBuilder {\n" +
+			"	@Override\n" +
+			"	public abstract Map<FieldDescriptor> getAllFields();\n" +
+			"}\n" +
+			"",
+		}, 
+		getCompilerOptions(),
+		""
+	);
+}	
 }
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.java
index eb9ff9b..8c7c2c7 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/TypeSystem.java
@@ -168,7 +168,11 @@
 			urb = (UnresolvedReferenceBinding) type;
 			ReferenceBinding resolvedType = urb.resolvedType;
 			if (resolvedType != null) {
-				type = this.environment.convertToRawType(resolvedType, false);				
+				if(CharOperation.indexOf('$', type.sourceName()) > 0) {
+					type = this.environment.convertToRawType(resolvedType, false);
+				} else {
+					type = resolvedType;
+				}
 			} else if (CharOperation.indexOf('$', type.sourceName()) > 0) {
 				boolean mayTolerateMissingType = this.environment.mayTolerateMissingType;
 				this.environment.mayTolerateMissingType = true;