3.1 maintenance - regression tests for 108783
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ForeachStatementTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ForeachStatementTest.java
index bf38f98..91ddc1d 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ForeachStatementTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/ForeachStatementTest.java
@@ -38,11 +38,11 @@
 }
 	// Static initializer to specify tests subset using TESTS_* static variables
 	// All specified tests which does not belong to the class are skipped...
-//	static {
+	static {
 //		TESTS_NAMES = new String[] { "test000" };
-//		TESTS_NUMBERS = new int[] { 31 };
+//		TESTS_NUMBERS = new int[] { 36, 37};
 //		TESTS_RANGE = new int[] { 21, 50 };
-//	}
+	}
 	public static Test suite() {
 		Test suite = buildTestSuite(testClass());
 		TESTS_COUNTERS.put(testClass().getName(), new Integer(suite.countTestCases()));
@@ -1883,6 +1883,157 @@
 		assertTrue(false);
 	}		
 }
+//https://bugs.eclipse.org/bugs/show_bug.cgi?id=108783
+public void test036() { 
+	this.runConformTest(
+		new String[] {
+			"X.java",
+			"import java.util.Arrays;\n" +
+			"import java.util.Iterator;\n" +
+			"import java.util.List;\n" +
+			"\n" +
+			"public class X implements Iterable<String>, Runnable {\n" +
+			"	public <T extends Runnable & Iterable<String>> void foo(T t) {\n" +
+			"		for (String s : t)\n" +
+			"			System.out.print(s);\n" +
+			"	}\n" +
+			"	public void run() {	/* */ }\n" +
+			"	private List<String> list = Arrays.asList(new String[] { \"a\", \"b\" });\n" +
+			"	public Iterator<String> iterator() {\n" +
+			"		return this.list.iterator();\n" +
+			"	}\n" +
+			"	public static void main(String... args) {\n" +
+			"		X x = new X();\n" +
+			"		x.foo(x);\n" +
+			"	}\n" +
+			"}",
+		},
+		"ab");
+	String expectedOutput =
+		"  // Method descriptor #37 (Ljava/lang/Runnable;)V\n" + 
+		"  // Signature: <T::Ljava/lang/Runnable;:Ljava/lang/Iterable<Ljava/lang/String;>;>(TT;)V\n" + 
+		"  // Stack: 2, Locals: 4\n" + 
+		"  public void foo(Runnable t);\n" + 
+		"     0  aload_1 [t]\n" + 
+		"     1  invokeinterface java.lang.Iterable.iterator() : java.util.Iterator  [42] [nargs: 1]\n" + 
+		"     6  astore_3\n" + 
+		"     7  goto 27\n" + 
+		"    10  aload_3\n" + 
+		"    11  invokeinterface java.util.Iterator.next() : java.lang.Object  [48] [nargs: 1]\n" + 
+		"    16  checkcast java.lang.String [19]\n" + 
+		"    19  astore_2 [s]\n" + 
+		"    20  getstatic java.lang.System.out : java.io.PrintStream [54]\n" + 
+		"    23  aload_2 [s]\n" + 
+		"    24  invokevirtual java.io.PrintStream.print(java.lang.String) : void  [60]\n" + 
+		"    27  aload_3\n" + 
+		"    28  invokeinterface java.util.Iterator.hasNext() : boolean  [64] [nargs: 1]\n" + 
+		"    33  ifne 10\n" + 
+		"    36  return\n" + 
+		"      Line numbers:\n" + 
+		"        [pc: 0, line: 7]\n" + 
+		"        [pc: 20, line: 8]\n" + 
+		"        [pc: 27, line: 7]\n" + 
+		"        [pc: 36, line: 9]\n" + 
+		"      Local variable table:\n" + 
+		"        [pc: 0, pc: 37] local: this index: 0 type: X\n" + 
+		"        [pc: 0, pc: 37] local: t index: 1 type: java.lang.Runnable\n" + 
+		"        [pc: 20, pc: 36] local: s index: 2 type: java.lang.String\n" + 
+		"      Local variable type table:\n" + 
+		"        [pc: 0, pc: 37] local: t index: 1 type: T\n";
+	
+	try {
+		File f = new File(OUTPUT_DIR + File.separator + "X.class");
+		byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
+		ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
+		String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
+		int index = result.indexOf(expectedOutput);
+		if (index == -1 || expectedOutput.length() == 0) {
+			System.out.println(Util.displayString(result, 3));
+		}
+		if (index == -1) {
+			assertEquals("Wrong contents", expectedOutput, result);
+		}
+	} catch (org.eclipse.jdt.core.util.ClassFormatException e) {
+		assertTrue(false);
+	} catch (IOException e) {
+		assertTrue(false);
+	}
+}
+//https://bugs.eclipse.org/bugs/show_bug.cgi?id=108783
+public void test037() { 
+	this.runConformTest(
+		new String[] {
+			"X.java",
+			"import java.util.Arrays;\n" +
+			"import java.util.Iterator;\n" +
+			"import java.util.List;\n" +
+			"import java.util.ArrayList;\n" +
+			"\n" +
+			"public class X {\n" +
+			"	public static <T extends ArrayList<String>> void foo(T t) {\n" +
+			"		for (String s : t)\n" +
+			"			System.out.print(s);\n" +
+			"	}\n" +
+			"	private static ArrayList<String> list = new ArrayList<String>();\n" +
+			"	static {\n" +
+			"		list.addAll(Arrays.asList(new String[] { \"a\", \"b\" }));\n" +
+			"	}\n" +
+			"	public static void main(String... args) {\n" +
+			"		foo(list);\n" +
+			"	}\n" +
+			"}",
+		},
+		"ab");
+
+	String expectedOutput =
+		"  // Method descriptor #43 (Ljava/util/ArrayList;)V\n" + 
+		"  // Signature: <T:Ljava/util/ArrayList<Ljava/lang/String;>;>(TT;)V\n" + 
+		"  // Stack: 2, Locals: 3\n" + 
+		"  public static void foo(ArrayList t);\n" + 
+		"     0  aload_0 [t]\n" + 
+		"     1  invokevirtual java.util.ArrayList.iterator() : java.util.Iterator  [48]\n" + 
+		"     4  astore_2\n" + 
+		"     5  goto 25\n" + 
+		"     8  aload_2\n" + 
+		"     9  invokeinterface java.util.Iterator.next() : java.lang.Object  [54] [nargs: 1]\n" + 
+		"    14  checkcast java.lang.String [20]\n" + 
+		"    17  astore_1 [s]\n" + 
+		"    18  getstatic java.lang.System.out : java.io.PrintStream [60]\n" + 
+		"    21  aload_1 [s]\n" + 
+		"    22  invokevirtual java.io.PrintStream.print(java.lang.String) : void  [66]\n" + 
+		"    25  aload_2\n" + 
+		"    26  invokeinterface java.util.Iterator.hasNext() : boolean  [70] [nargs: 1]\n" + 
+		"    31  ifne 8\n" + 
+		"    34  return\n" + 
+		"      Line numbers:\n" + 
+		"        [pc: 0, line: 8]\n" + 
+		"        [pc: 18, line: 9]\n" + 
+		"        [pc: 25, line: 8]\n" + 
+		"        [pc: 34, line: 10]\n" + 
+		"      Local variable table:\n" + 
+		"        [pc: 0, pc: 35] local: t index: 0 type: java.util.ArrayList\n" + 
+		"        [pc: 18, pc: 34] local: s index: 1 type: java.lang.String\n" + 
+		"      Local variable type table:\n" + 
+		"        [pc: 0, pc: 35] local: t index: 0 type: T\n";
+	
+	try {
+		File f = new File(OUTPUT_DIR + File.separator + "X.class");
+		byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
+		ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
+		String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
+		int index = result.indexOf(expectedOutput);
+		if (index == -1 || expectedOutput.length() == 0) {
+			System.out.println(Util.displayString(result, 3));
+		}
+		if (index == -1) {
+			assertEquals("Wrong contents", expectedOutput, result);
+		}
+	} catch (org.eclipse.jdt.core.util.ClassFormatException e) {
+		assertTrue(false);
+	} catch (IOException e) {
+		assertTrue(false);
+	}
+}
 public static Class testClass() {
 	return ForeachStatementTest.class;
 }