Bug 561528 - [14] Records - Eclipse hangs for records with recursive
type parameters

Change-Id: Ibecaca2ae156d2feddf1c6ae296ccdec5332cec1
Signed-off-by: Kalyan Prasad Tatavarthi <kalyan_prasad@in.ibm.com>
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RecordsRestrictedClassTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RecordsRestrictedClassTest.java
index 8714d6b..64399e3 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RecordsRestrictedClassTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RecordsRestrictedClassTest.java
@@ -2373,4 +2373,92 @@
 		"Cannot make a static reference to the non-static field nsi\n" + 
 		"----------\n");
 }
+public void testBug561528_001() {
+	runConformTest(
+			new String[] {
+					"X.java",
+					"class X {\n"+
+					"  public static void main(String[] args){\n"+
+					"     System.out.println(0);\n" +
+					"  }\n"+
+					"}\n"+
+					"interface Node<N> {}\n\n"+
+					"record R <N extends Node<?>> (N value){\n"+
+					"}\n"
+			},
+		"0");
+}
+public void testBug561528_002() {
+	runConformTest(
+			new String[] {
+					"X.java",
+					"class X {\n"+
+					"  public static void main(String[] args){\n"+
+					"     System.out.println(0);\n" +
+					"  }\n"+
+					"}\n"+
+					"interface Node<N> {}\n\n"+
+					"record R <N extends Node<N>> (R<N> parent, N element){\n"+
+					"}\n"
+			},
+		"0");
+}
+public void testBug561528_003() {
+	runConformTest(
+			new String[] {
+					"X.java",
+					"class X {\n"+
+					"  public static void main(String[] args){\n"+
+					"     System.out.println(0);\n" +
+					"  }\n"+
+					"}\n"+
+					"interface Node<N> {}\n\n"+
+					"interface AB<N> {}\n\n"+
+					"record R <N extends Node<AB<N>>> (N value){\n"+
+					"}\n"
+			},
+		"0");
+}
+public void testBug561528_004() {
+	runConformTest(
+			new String[] {
+					"X.java",
+					"class X {\n"+
+					"  public static void main(String[] args){\n"+
+					"     System.out.println(0);\n" +
+					"  }\n"+
+					"}\n"+
+					"interface Node<N> {}\n\n"+
+					"interface AB<N> {}\n\n"+
+					"interface CD<N> {}\n\n"+
+					"record R <N extends Node<AB<CD<N>>>> (N value){\n"+
+					"}\n"
+			},
+		"0");
+}
+public void testBug561528_005() {
+	this.runNegativeTest(
+			new String[] {
+					"X.java",
+					"class X {\n"+
+					"  public static void main(String[] args){\n"+
+					"     System.out.println(0);\n" +
+					"  }\n"+
+					"}\n"+
+					"interface Node<N> {}\n\n"+
+					"interface AB<N> {}\n\n"+
+					"interface CD<N> {}\n\n"+
+					"record R <N extends Node<AB<CD<N>>>>> (N value){\n"+
+					"}\n"
+			},
+		"----------\n" +
+		"1. ERROR in X.java (at line 12)\n" +
+		"	record R <N extends Node<AB<CD<N>>>>> (N value){\n" +
+		"	                                ^^^\n" +
+		"Syntax error on token \">>>\", >> expected\n" +
+		"----------\n",
+		null,
+		true
+	);
+}
 }
\ No newline at end of file
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Scanner.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Scanner.java
index 9397609..668deea 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Scanner.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/Scanner.java
@@ -5310,12 +5310,18 @@
 	int count = 1;
 	try {
 		int token;
-		while ((token = this.vanguardScanner.getNextToken()) != TokenNameEOF) {
+		while ((token = this.vanguardScanner.getNextToken()) != TokenNameNotAToken) {
+			if (token == TokenNameEOF)
+				break;
 			if (token == TokenNameLESS)
 				++count;
 			if (token == TokenNameGREATER)
 				--count;
-			if (count == 0)
+			if (token == TokenNameRIGHT_SHIFT)
+				count= count -2;
+			if (token == TokenNameUNSIGNED_RIGHT_SHIFT)
+				count= count -3;
+			if (count <= 0)
 				return this.vanguardScanner.getNextToken();
 		}
 	} catch (InvalidInputException e) {