Bug 507256 - [null] Errors following external annotations of
java.lang.reflect.Type

Change-Id: Ibe6ba50d1e2260c444558a0508b56015c7c6b848
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ExternalAnnotations18Test.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ExternalAnnotations18Test.java
index bc2e744..fb358e8 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ExternalAnnotations18Test.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ExternalAnnotations18Test.java
@@ -1839,4 +1839,41 @@
 		assertProblems(problems, new String[] {
 				"Pb(149) Dead code"
 			}, new int[] { 7 });
-	}}
+	}
+	public void testBug507256() throws Exception {
+		myCreateJavaProject("TestLibs");
+		addLibraryWithExternalAnnotations(this.project, "lib1.jar", "annots", new String[] {
+				"/UnannotatedLib/libs/Lib1.java",
+				"package libs;\n" + 
+				"\n" + 
+				"public interface Lib1 {\n" + 
+				"	void methodWithParamAfterWildcard(Class<?> c, Object s);\n" + 
+				"}\n"
+			}, null);
+		// annotations directly on a wildcard (*, +, -)
+		createFileInProject("annots/libs", "Lib1.eea",
+				"class libs/Lib1\n" + 
+				"\n" + 
+				"methodWithParamAfterWildcard\n" + 
+				" (Ljava/lang/Class<*>;Ljava/lang/Object;)V\n" + 
+				" (L1java/lang/Class<*>;L1java/lang/Object;)V\n" +
+				"\n" + 
+				"\n");
+		IPackageFragment fragment = this.project.getPackageFragmentRoots()[0].createPackageFragment("tests", true, null);
+		ICompilationUnit unit = fragment.createCompilationUnit("Test1.java", 
+				"package tests;\n" + 
+				"import libs.Lib1;\n" + 
+				"\n" + 
+				"public class Test1 {\n" + 
+				"	void test1(Lib1 lib) {\n" + 
+				"		 lib.methodWithParamAfterWildcard(Object.class, null);\n" + // error, second param must not be null
+				"	}\n" + 
+				"}\n",
+				true, new NullProgressMonitor()).getWorkingCopy(new NullProgressMonitor());
+		CompilationUnit reconciled = unit.reconcile(AST.JLS8, true, null, new NullProgressMonitor());
+		IProblem[] problems = reconciled.getProblems();
+		assertProblems(problems, new String[] {
+				"Pb(910) Null type mismatch: required '@NonNull Object' but the provided value is null"
+			}, new int[] { 6 });
+	}
+}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/ExternalAnnotationProvider.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/ExternalAnnotationProvider.java
index cf7b55c..fd6da1b 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/ExternalAnnotationProvider.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/classfmt/ExternalAnnotationProvider.java
@@ -586,7 +586,8 @@
 				if (an == NULLABLE || an == NONNULL)
 					start++;
 			}
-			int end = wrapperWithStart(start).computeEnd();
+			SignatureWrapper wrapper1 = wrapperWithStart(start);
+			int end = wrapper1.skipAngleContents(wrapper1.computeEnd());
 			return end;
 		}