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