/*******************************************************************************
 * Copyright (c) 2014, 2015 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.core.tests.compiler.regression;

import junit.framework.Test;

@SuppressWarnings({ "rawtypes" })
public class LambdaShapeTests extends AbstractRegressionTest {
static {
//		TESTS_NAMES = new String[] { "testWhileThis"};
//		TESTS_NUMBERS = new int[] { 50 };
//		TESTS_RANGE = new int[] { 11, -1 };
}
public LambdaShapeTests(String name) {
	super(name);
}
public static Test suite() {
	return buildMinimalComplianceTestSuite(testClass(), F_1_8);
}
public void test001() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface VoidI {\n" + 
			"	void foo(String s);\n" + 
			"}\n" + 
			"class Test {\n" + 
			"	public String gooVoid(VoidI i){return \"\";}\n" + 
			"}\n" + 
			"public class X {\n" + 
			"	public static void main(String[] args) {\n" + 
			"		Test test = new Test();\n" + 
			"		test.gooVoid((x) -> {\n" + 
			"			if (false) {\n" + 
			"				x += \"a\";\n" + 
			"			}\n" + 
			"		});\n" + 
			"		test.gooVoid((x) -> {\n" + 
			"			if (true);\n" + 
			"		});\n" + 
			"		test.gooVoid((x) -> {\n" + 
			"			if (true) {\n" + 
			"				x += \"a\";\n" + 
			"			}\n" + 
			"		});\n" + 
			"		test.gooVoid((x) -> {\n" + 
			"			final boolean val = true;\n" +
			"			if (val) {\n" + 
			"				x += \"a\";\n" + 
			"			}\n" + 
			"		});\n" + 
			"		test.gooVoid((x) -> {\n" + 
			"			final boolean val = true;\n" +
			"			if (val);\n" + 
			"		});\n" + 
			"		test.gooVoid((x) -> {\n" + 
			"			final boolean val = false;\n" +
			"			if (val) {\n" + 
			"				x += \"a\";\n" + 
			"			}\n" + 
			"		});\n" + 
			"		test.gooVoid((x) -> {\n" + 
			"			if (x != null) {\n" + 
			"				x += \"a\";\n" + 
			"			}\n" + 
			"		});\n" + 
			"		test.gooVoid((x) -> {\n" + 
			"			final boolean val = true;\n" +
			"			if (x != null);\n" + 
			"		});\n" + 
			"		test.gooVoid((x) -> {\n" + 
			"			if (false) {\n" + 
			"				x += \"a\";\n" + 
			"			} else {\n" + 
			"				x += \"b\";\n" + 
			"			}\n" + 
			"		});\n" + 
			"		test.gooVoid((x) -> {\n" + 
			"			if (false) {\n" + 
			"				x += \"a\";\n" + 
			"			} else;\n" + 
			"		});\n" + 
			"		test.gooVoid((x) -> {\n" + 
			"			final boolean val = false;\n" +
			"			if (val) {\n" + 
			"				x += \"a\";\n" + 
			"			} else {\n" + 
			"				x += \"b\";\n" + 
			"			}\n" + 
			"		});\n" + 
			"		test.gooVoid((x) -> {\n" + 
			"			final boolean val = false;\n" +
			"			if (val) {\n" + 
			"				x += \"a\";\n" + 
			"			} else;\n" + 
			"		});\n" + 
			"		test.gooVoid((x) -> {\n" + 
			"			if (x != null) {\n" + 
			"				x += \"a\";\n" + 
			"			} else {\n" + 
			"				x += \"b\";\n" + 
			"			}\n" + 
			"		});\n" + 
			"		test.gooVoid((x) -> {\n" + 
			"			if (x != null) {\n" + 
			"				x += \"a\";\n" + 
			"			} else;\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n",
		});
}
public void test002() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" + 
			"	String foo(int x); \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test() {\n" + 
			"		final boolean FALSE = false;\n" + 
			"		goo((x) -> {\n" + 
			"			if(true) return \"\";\n" + 
			"			else return null;\n" + 
			"		});\n" + 
			"		goo((x) -> {\n" + 
			"			if(false) return \"\";\n" + 
			"			else return null;\n" + 
			"		});\n" + 
			"		goo((x) -> {\n" + 
			"			if(x > 0) return \"\";\n" + 
			"			else return null;\n" + 
			"		});\n" + 
			"		goo((x) -> {\n" + 
			"			if(FALSE) return \"\";\n" + 
			"			else return null;\n" + 
			"		});\n" + 
			"		goo((x) -> {\n" + 
			"			if(!FALSE) return \"\";\n" + 
			"			else return null;\n" + 
			"		});\n" + 
			"		goo((x) -> {\n" + 
			"			if(!FALSE) return \"\";\n" + 
			"			else return null;\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n"
		});
}
public void test003() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface VoidI {\n" + 
			"	void foo(String s);\n" + 
			"}\n" + 
			"class Test {\n" + 
			"	public String gooVoid(VoidI i){return \"\";}\n" + 
			"}\n" + 
			"public class X {\n" + 
			"	public static void main(String[] args) {\n" + 
			"		Test test = new Test();\n" + 
			"		test.gooVoid((x) -> {\n" + 
			"			if (true) {\n" + 
			"				return 0;\n" + 
			"			}\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 10)\n" + 
		"	test.gooVoid((x) -> {\n" + 
		"	     ^^^^^^^\n" + 
		"The method gooVoid(VoidI) in the type Test is not applicable for the arguments ((<no type> x) -> {})\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 12)\n" + 
		"	return 0;\n" + 
		"	^^^^^^^^^\n" + 
		"Void methods cannot return a value\n" + 
		"----------\n");
}
public void test004() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface VoidI {\n" + 
			"	void foo(String s);\n" + 
			"}\n" + 
			"class Test {\n" + 
			"	public String gooVoid(VoidI i){return \"\";}\n" + 
			"}\n" + 
			"public class X {\n" + 
			"	public static void main(String[] args) {\n" + 
			"		Test test = new Test();\n" + 
			"		test.gooVoid((x) -> {\n" + 
			"			final boolean val = true;\n" + 
			"			if (val) {\n" + 
			"				return x;\n" + 
			"			}\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 10)\n" + 
		"	test.gooVoid((x) -> {\n" + 
		"	     ^^^^^^^\n" + 
		"The method gooVoid(VoidI) in the type Test is not applicable for the arguments ((<no type> x) -> {})\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 13)\n" + 
		"	return x;\n" + 
		"	^^^^^^^^^\n" + 
		"Void methods cannot return a value\n" + 
		"----------\n");
}
public void test005() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface VoidI {\n" + 
			"	void foo(String s);\n" + 
			"}\n" + 
			"class Test {\n" + 
			"	public String gooVoid(VoidI i){return \"\";}\n" + 
			"}\n" + 
			"public class X {\n" + 
			"	public static void main(String[] args) {\n" + 
			"		Test test = new Test();\n" + 
			"		test.gooVoid((x) -> {\n" + 
			"			if (x != null) {\n" + 
			"				return 0;\n" + 
			"			}\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 10)\n" + 
		"	test.gooVoid((x) -> {\n" + 
		"	     ^^^^^^^\n" + 
		"The method gooVoid(VoidI) in the type Test is not applicable for the arguments ((<no type> x) -> {})\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 12)\n" + 
		"	return 0;\n" + 
		"	^^^^^^^^^\n" + 
		"Void methods cannot return a value\n" + 
		"----------\n");
}
public void test006() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface VoidI {\n" + 
			"	void foo(String s);\n" + 
			"}\n" + 
			"class Test {\n" + 
			"	public String gooVoid(VoidI i){return \"\";}\n" + 
			"}\n" + 
			"public class X {\n" + 
			"	public static void main(String[] args) {\n" + 
			"		Test test = new Test();\n" + 
			"		test.gooVoid((x) -> {\n" + 
			"			if (false) {\n" + 
			"				x += \"a\";\n" + 
			"			} else {\n" + 
			"				return 0;\n" + 
			"			}\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 10)\n" + 
		"	test.gooVoid((x) -> {\n" + 
		"	     ^^^^^^^\n" + 
		"The method gooVoid(VoidI) in the type Test is not applicable for the arguments ((<no type> x) -> {})\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 14)\n" + 
		"	return 0;\n" + 
		"	^^^^^^^^^\n" + 
		"Void methods cannot return a value\n" + 
		"----------\n");
}
public void test007() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface VoidI {\n" + 
			"	void foo(String s);\n" + 
			"}\n" + 
			"class Test {\n" + 
			"	public String gooVoid(VoidI i){return \"\";}\n" + 
			"}\n" + 
			"public class X {\n" + 
			"	public static void main(String[] args) {\n" + 
			"		Test test = new Test();\n" + 
			"		test.gooVoid((x) -> {\n" + 
			"			final boolean val = false;\n" + 
			"			if (val) {\n" + 
			"				x += \"a\";\n" + 
			"			} else {\n" + 
			"				return 0;\n" + 
			"			}\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 10)\n" + 
		"	test.gooVoid((x) -> {\n" + 
		"	     ^^^^^^^\n" + 
		"The method gooVoid(VoidI) in the type Test is not applicable for the arguments ((<no type> x) -> {})\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 15)\n" + 
		"	return 0;\n" + 
		"	^^^^^^^^^\n" + 
		"Void methods cannot return a value\n" + 
		"----------\n");
}
public void test008() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface VoidI {\n" + 
			"	void foo(String s);\n" + 
			"}\n" + 
			"class Test {\n" + 
			"	public String gooVoid(VoidI i){return \"\";}\n" + 
			"}\n" + 
			"public class X {\n" + 
			"	public static void main(String[] args) {\n" + 
			"		Test test = new Test();\n" + 
			"		test.gooVoid((x) -> {\n" + 
			"			if (x != null) {\n" + 
			"				x += \"a\";\n" + 
			"			} else {\n" + 
			"				return 0;\n" + 
			"			}\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 10)\n" + 
		"	test.gooVoid((x) -> {\n" + 
		"	     ^^^^^^^\n" + 
		"The method gooVoid(VoidI) in the type Test is not applicable for the arguments ((<no type> x) -> {})\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 14)\n" + 
		"	return 0;\n" + 
		"	^^^^^^^^^\n" + 
		"Void methods cannot return a value\n" + 
		"----------\n");
}
public void test009() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" + 
			"	String foo(int x); \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test() {\n" + 
			"		final boolean FALSE = false;\n" + 
			"		goo((x) -> {\n" + 
			"			if(FALSE) return \"\";\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 8)\n" + 
		"	goo((x) -> {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n");
}
public void test010() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" + 
			"	String foo(int x); \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test() {\n" + 
			"		goo((x) -> {\n" + 
			"			if(true);\n" + 
			"			else return \"\";\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 9)\n" + 
		"	else return \"\";\n" + 
		"	     ^^^^^^^^^^\n" + 
		"Dead code\n" + 
		"----------\n");
}
public void test011() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" + 
			"	String foo(int x); \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test() {\n" + 
			"		goo((x) -> {\n" + 
			"			if(false) return null;\n" + 
			"			else;\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 8)\n" + 
		"	if(false) return null;\n" + 
		"	          ^^^^^^^^^^^^\n" + 
		"Dead code\n" + 
		"----------\n" + 
		"3. WARNING in X.java (at line 9)\n" + 
		"	else;\n" + 
		"	    ^\n" + 
		"Statement unnecessarily nested within else clause. The corresponding then clause does not complete normally\n" + 
		"----------\n");
}
public void test012() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" + 
			"	String foo(int x); \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test() {\n" + 
			"		goo((x) -> {\n" + 
			"			if(x > 0) return \"\";\n" + 
			"			else;\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 9)\n" + 
		"	else;\n" + 
		"	    ^\n" + 
		"Statement unnecessarily nested within else clause. The corresponding then clause does not complete normally\n" + 
		"----------\n");
}
public void test013() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" + 
			"	String foo(int x); \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test() {\n" + 
			"		goo((x) -> {\n" + 
			"			if(x > 0);\n" + 
			"			else return \"\";\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n");
}
public void test014() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" + 
			"	String foo(int x); \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test() {\n" + 
			"		goo((x) -> {\n" + 
			"			if(x < 0) return null;\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n");
}
public void test015() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" + 
			"	String foo(int x); \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test() {\n" + 
			"		final boolean FALSE = false;\n" + 
			"		goo((x) -> {\n" + 
			"			if(!FALSE) return \"\";\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 8)\n" + 
		"	goo((x) -> {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n");
}
public void test016() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" + 
			"	String foo(int x) throws Exception;\n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test() {\n" + 
			"		final boolean FALSE = false;\n" + 
			"		goo((x) -> {while (FALSE) throw new Exception();});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 8)\n" + 
		"	goo((x) -> {while (FALSE) throw new Exception();});\n" + 
		"	    ^^^^^^\n" + 
		"This lambda expression must return a result of type String\n" + 
		"----------\n");
}
public void test017() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" + 
			"	String foo(int x) throws Exception;\n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test() {\n" + 
			"		goo((x) -> {while (false) return \"\";});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {while (false) return \"\";});\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {while (false) return \"\";});\n" + 
		"	                          ^^^^^^^^^^\n" + 
		"Unreachable code\n" + 
		"----------\n");
}
public void test018() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" + 
			"	String foo(int x) throws Exception;\n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test() {\n" + 
			"		goo((x) -> {while (x > 0) {\n" + 
			"			if(x > 0) {return \"\";} else {break;}\n" + 
			"			}});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {while (x > 0) {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 8)\n" + 
		"	if(x > 0) {return \"\";} else {break;}\n" + 
		"	                            ^^^^^^^^\n" + 
		"Statement unnecessarily nested within else clause. The corresponding then clause does not complete normally\n" + 
		"----------\n");
}
public void test019() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" + 
			"	String foo(int x) throws Exception;\n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test() {\n" + 
			"		goo((x) -> {while (x > 0) {\n" + 
			"			if(x > 0) {return \"\";}\n" + 
			"		}});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {while (x > 0) {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n");
}
public void test020() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" + 
			"	String foo(int x) throws Exception;\n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test() {\n" + 
			"		final boolean TRUE = true;\n" + 
			"		goo((x) -> {while (TRUE) {\n" + 
			"			if(x > 0) {System.out.println();}\n" + 
			"			}});\n" + 
			"		goo((x) -> {while (true) {\n" + 
			"			if(x > 0) {System.out.println();}\n" + 
			"			}});\n" + 
			"	}\n" + 
			"}\n"
		});
}
public void test021() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" + 
			"	String foo(int x) throws Exception;\n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test() {\n" + 
			"		goo((x) -> {\n" + 
			"			int i = 100;\n" + 
			"			outer: while(x > 0) {\n" + 
			"				inner: while(i > 0) {\n" + 
			"				if(--i > 50) {\n" + 
			"					return \"\";\n" + 
			"				}\n" + 
			"				if(i > 90) {\n" + 
			"					break outer;\n" + 
			"				}\n" + 
			"				return \"\";\n" + 
			"				}\n" + 
			"			}});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 10)\n" + 
		"	inner: while(i > 0) {\n" + 
		"	^^^^^\n" + 
		"The label inner is never explicitly referenced\n" + 
		"----------\n");
}
public void test022() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" + 
			"	void foo(String s) throws Exception;\n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void zoo(I i) {}\n" + 
			"	void test() {\n" + 
			"		final boolean FALSE = false;\n" + 
			"		final boolean TRUE = true;\n" + 
			"		zoo((x) -> {while (TRUE) throw new Exception();});\n" + 
			"		zoo((x) -> {while (!FALSE) return ;});\n" + 
			"		zoo((x) -> {while (x.length() > 0) {\n" + 
			"			if(x.length() > 0) {return ;} else {break;}\n" + 
			"			}});\n" + 
			"		zoo((x) -> {while (x.length() > 0) {\n" + 
			"			if(x.length() > 0) {return ;}\n" + 
			"			}});\n" + 
			"		zoo((x) -> {while (true) {\n" + 
			"			if(x.length() > 0) {System.out.println();}\n" + 
			"			}});\n" + 
			"		zoo((x) -> {while (TRUE) {\n" + 
			"			if(x.length() > 0) {System.out.println();}\n" + 
			"			}});\n" + 
			"		zoo((x) -> {\n" + 
			"			int i = 100;\n" + 
			"			outer: while(x.length() > 0) {\n" + 
			"				inner: while(i > 0) {\n" + 
			"				if(--i > 50) {\n" + 
			"					break inner ;\n" + 
			"				}\n" + 
			"				if(i > 90) {\n" + 
			"					break outer;\n" + 
			"				}\n" + 
			"				return ;\n" + 
			"				}\n" + 
			"			}});\n" + 
			"	}\n" + 
			"}\n"
		});
}
public void test023() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" + 
			"	String foo(int x) throws Exception;\n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test() {\n" + 
			"		final boolean FALSE = false;\n" + 
			"		final boolean TRUE = true;\n" + 
			"		goo((x) -> {do {throw new Exception();}while (FALSE);});\n" + 
			"		goo((x) -> {do { return \"\";}while (false);});\n" + 
			"		goo((x) -> {do {\n" + 
			"			if(x > 0) {System.out.println();}\n" + 
			"			}while (true);});\n" + 
			"		goo((x) -> {do {\n" + 
			"			if(x > 0) {System.out.println();}\n" + 
			"			}while (TRUE);});\n" + 
			"	}\n" + 
			"}\n"
		});
}
public void test024() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" + 
			"	String foo(int x) throws Exception;\n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test() {\n" + 
			"		goo((x) -> {do {\n" + 
			"			if(x > 0) {return \"\";} else {break;}\n" + 
			"			}while (x > 0);});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {do {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 8)\n" + 
		"	if(x > 0) {return \"\";} else {break;}\n" + 
		"	                            ^^^^^^^^\n" + 
		"Statement unnecessarily nested within else clause. The corresponding then clause does not complete normally\n" + 
		"----------\n");
}
public void test025() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" + 
			"	String foo(int x) throws Exception;\n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test() {\n" + 
			"		goo((x) -> {do {\n" + 
			"			if(x > 0) {return \"\";}\n" + 
			"			}while (x > 0);});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {do {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n");
}
public void test026() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" + 
			"	String foo(int x) throws Exception;\n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test() {\n" + 
			"		goo((x) -> {\n" + 
			"			int i = 100;\n" + 
			"			outer: do {\n" + 
			"				inner: do {\n" + 
			"				if(--i > 50) {\n" + 
			"					return \"\";\n" + 
			"				}\n" + 
			"				if(i > 90) {\n" + 
			"					break outer;\n" + 
			"				}\n" + 
			"				return \"\";\n" + 
			"				}while(i > 0);\n" + 
			"			}while(x > 0);});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 10)\n" + 
		"	inner: do {\n" + 
		"	^^^^^\n" + 
		"The label inner is never explicitly referenced\n" + 
		"----------\n");
}
public void test027() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" + 
			"	void foo(String s) throws Exception;\n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void zoo(I i) {}\n" + 
			"	void test() {\n" + 
			"		zoo((x) -> {do {\n" + 
			"			if(x.length() > 0) {System.out.println();}\n" + 
			"			}while (true);});\n" + 
			"		zoo((x) -> {do {throw new Exception();}while (false);});\n" + 
			"		zoo((x) -> {do { return ;}while (false);});\n" + 
			"		zoo((x) -> {do { continue ;}while (true);});\n" + 
			"		zoo((x) -> {do {\n" + 
			"			if(x.length() > 0) {return ;} else {break;}\n" + 
			"			}while (x.length() > 0);\n" + 
			"		});\n" + 
			"		zoo((x) -> {do {\n" + 
			"			if(x.length() > 0) {return ;}\n" + 
			"			}while (x.length() > 0);\n" + 
			"		});\n" + 
			"		zoo((x) -> {\n" + 
			"		int i = 100;\n" + 
			"		outer: do {\n" + 
			"			inner: do {\n" + 
			"			if(--i > 50) {\n" + 
			"				break inner ;\n" + 
			"			}\n" + 
			"			if(i > 90) {\n" + 
			"				break outer;\n" + 
			"			}\n" + 
			"			return ;\n" + 
			"			}while(i > 0);\n" + 
			"		}while(x.length() > 0);});\n" + 
			"	}\n" + 
			"}\n"
		});
}
public void test028() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I { \n" + 
			"	String foo(int x) throws Exception; \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test() {\n" + 
			"		final boolean FALSE = false; \n" + 
			"		final boolean TRUE = true; \n" + 
			"		goo((x) -> {\n" + 
			"			for(;TRUE;){\n" + 
			"			}});\n" + 
			"		goo((x) -> {\n" + 
			"			for(int i = 0;i < 100; i+= 10){\n" + 
			"				switch(i) {\n" + 
			"				case 90: {\n" + 
			"					System.out.println();\n" + 
			"					break;\n" + 
			"				}\n" + 
			"				case 80: {\n" + 
			"					if(x > 10) return null;\n" + 
			"					break;\n" + 
			"				}\n" + 
			"				default:\n" + 
			"					return \"\";\n" + 
			"				}\n" + 
			"			}\n" + 
			"			return \"\";\n" + 
			"		});\n" + 
			"		\n" + 
			"		goo((x) -> {\n" + 
			"			for(;TRUE;){\n" + 
			"				if(x < 100) return \"\";\n" + 
			"				else return null;\n" + 
			"		}});\n" + 
			"		goo((x) -> {\n" + 
			"			for(;x > 0;){\n" + 
			"				if(x < 100) return \"\";\n" + 
			"				else return null;\n" + 
			"			}\n" + 
			"			return null;\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n"
		});
}
public void test029() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I { \n" + 
			"	String foo(int x) throws Exception; \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test() {\n" + 
			"		final boolean FALSE = false; \n" + 
			"		goo((x) -> {\n" + 
			"			for(;FALSE;){\n" + 
			"			}});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 8)\n" + 
		"	goo((x) -> {\n" + 
		"	    ^^^^^^\n" + 
		"This lambda expression must return a result of type String\n" + 
		"----------\n");
}
public void test030() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I { \n" + 
			"	String foo(int x) throws Exception; \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test() {\n" + 
			"		goo((x) -> {\n" + 
			"			for(;x > 0;){\n" + 
			"				if(x < 100) return \"\";\n" + 
			"				else return null;\n" + 
			"		}});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 10)\n" + 
		"	else return null;\n" + 
		"	     ^^^^^^^^^^^^\n" + 
		"Statement unnecessarily nested within else clause. The corresponding then clause does not complete normally\n" + 
		"----------\n");
}
public void test031() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I { \n" + 
			"	String foo(int x) throws Exception; \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test() {\n" + 
			"		goo((x) -> {\n" + 
			"			for(int i = 0;i < 100; i+= 10){\n" + 
			"				switch(i) {\n" + 
			"				case 90: {\n" + 
			"					System.out.println();\n" + 
			"					break;\n" + 
			"				}\n" + 
			"				case 80: {\n" + 
			"					if(x > 10) return null;\n" + 
			"					break;\n" + 
			"				}\n" + 
			"				default:\n" + 
			"					return \"\";\n" + 
			"				}\n" + 
			"			}\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n");
}
public void test032() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I { \n" + 
			"	String foo(int x) throws Exception; \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test() {\n" + 
			"		goo((x) -> {\n" + 
			"			outer: for(int i = 0;i < 100; i+= 10){\n" + 
			"				inner : for(int j = x; j > 0; j--) {\n" + 
			"					switch(i) {\n" + 
			"					case 90: {\n" + 
			"						System.out.println();\n" + 
			"						break inner;\n" + 
			"					}\n" + 
			"					case 80: {\n" + 
			"						if(x > 10) return null;\n" + 
			"						break outer;\n" + 
			"					}\n" + 
			"					default:\n" + 
			"						return \"\";\n" + 
			"					}\n" + 
			"				}\n" + 
			"				\n" + 
			"			}\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 9)\n" + 
		"	inner : for(int j = x; j > 0; j--) {\n" + 
		"	                              ^^^\n" + 
		"Dead code\n" + 
		"----------\n");
}
public void test033() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I { \n" + 
			"	String foo(int x) throws Exception; \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test(String[] strs) {\n" + 
			"		goo((x) -> {\n" + 
			"			for(String str : strs){\n" + 
			"				if(str.length() > 0) {\n" + 
			"					return \"yes\";\n" + 
			"				} else {\n" + 
			"					return \"no\";\n" + 
			"				}\n" + 
			"			}\n" + 
			"			return null;\n" + 
			"		});\n" + 
			"		goo((x) -> {\n" + 
			"			for(String str : strs){\n" + 
			"				return \"no\";\n" + 
			"			}\n" + 
			"			return \"\";\n" + 
			"		});\n" + 
			"		\n" + 
			"		goo((x) -> {\n" + 
			"			for(String str : strs){\n" + 
			"				if(str.length() > 0) break;\n" + 
			"				System.out.println();\n" + 
			"			}\n" + 
			"			return \"\";\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n"
		});
}
public void test034() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I { \n" + 
			"	String foo(int x) throws Exception; \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test(String[] strs) {\n" + 
			"		goo((x) -> {\n" + 
			"			for(String str : strs){\n" + 
			"				if(str.length() > 0) {\n" + 
			"					return \"yes\";\n" + 
			"				} else {\n" + 
			"					return \"no\";\n" + 
			"				}\n" + 
			"			}\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 11)\n" + 
		"	} else {\n" + 
		"					return \"no\";\n" + 
		"				}\n" + 
		"	       ^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Statement unnecessarily nested within else clause. The corresponding then clause does not complete normally\n" + 
		"----------\n");
}
public void test035() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I { \n" + 
			"	String foo(int x) throws Exception; \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test(String[] strs) {\n" + 
			"		goo((x) -> {\n" + 
			"			for(String str : strs){\n" + 
			"				return \"no\";\n" + 
			"			}\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n");
}
public void test036() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I { \n" + 
			"	String foo(int x) throws Exception; \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test(String[] strs) {\n" + 
			"		goo((x) -> {\n" + 
			"			for(String str : strs){\n" + 
			"				switch(str.length()) {\n" + 
			"				case 9: {\n" + 
			"					System.out.println();\n" + 
			"					return \"nine\";\n" + 
			"				}\n" + 
			"				case 1: {\n" + 
			"					if(x > 10) return null;\n" + 
			"					return \"one\";\n" + 
			"				}\n" + 
			"				default:\n" + 
			"					return \"\";\n" + 
			"				}\n" + 
			"			}\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n");
}
public void test037() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I { \n" + 
			"	String foo(int x) throws Exception; \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test(String[] strs) {\n" + 
			"		goo((x) -> {\n" + 
			"			outer: for(String str : strs){\n" + 
			"				inner : for(int j = x; j > 0; j--) {\n" + 
			"					switch(str.length()) {\n" + 
			"					case 9: {\n" + 
			"						System.out.println();\n" + 
			"						break inner;\n" + 
			"					}\n" + 
			"					case 8: {\n" + 
			"						if(x > 10) return null;\n" + 
			"						break outer;\n" + 
			"					}\n" + 
			"					default:\n" + 
			"						return \"\";\n" + 
			"					}\n" + 
			"				}\n" + 
			"			}\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 9)\n" + 
		"	inner : for(int j = x; j > 0; j--) {\n" + 
		"	                              ^^^\n" + 
		"Dead code\n" + 
		"----------\n");
}
public void test038() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I { \n" + 
			"	String foo(int x) throws Exception; \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test(String[] strs) {\n" + 
			"		goo((x) -> {\n" + 
			"			switch(x) {\n" + 
			"			case 0 : if(x > 10) return \">10\";\n" + 
			"			case 1: return \"1\";\n" + 
			"			default: return \"-1\";\n" + 
			"			}\n" + 
			"		});\n" + 
			"		goo((x) -> {\n" + 
			"			String str = \"\";\n" + 
			"			switch(x) {\n" + 
			"			case 0 : if(x > 10) break; else {str = \"0\"; break;}\n" + 
			"			case 1: str = \"1\";break;\n" + 
			"			default: break;\n" + 
			"			}\n" + 
			"			return str;\n" + 
			"		});\n" + 
			"		goo((x) -> {\n" + 
			"			String str = \"\";\n" + 
			"			switch(x){}\n" + 
			"			return str;\n" + 
			"		});\n" +  
			"	}\n" + 
			"}\n"
		});
}
public void test039() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I { \n" + 
			"	String foo(int x) throws Exception; \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test(String[] strs) {\n" + 
			"		goo((x) -> {\n" + 
			"			switch(x) {\n" + 
			"			case 0 : if(x > 10) return \">10\";\n" + 
			"			case 1: return \"1\";\n" + 
			"			}\n" + 
			"		});\n" +  
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n");
}
public void test040() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I { \n" + 
			"	String foo(int x) throws Exception; \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test(String[] strs) {\n" + 
			"		goo((x) -> {\n" + 
			"			String str = \"\";\n" + 
			"			switch(x) {\n" + 
			"			case 0 : if(x > 10) break; else {str = \"0\"; break;}\n" + 
			"			case 1: str = \"1\";break;\n" + 
			"			default: break;\n" + 
			"			}\n" + 
			"		});\n" +
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments ((<no type> x) -> {})\n" + 
		"----------\n");
}
public void test041() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I { \n" + 
			"	String foo(int x) throws Exception; \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test(String[] strs) {\n" + 
			"		goo((x) -> {\n" + 
			"			try {\n" + 
			"				return \"\";\n" + 
			"			} finally {\n" + 
			"				\n" + 
			"			}\n" + 
			"		});\n" + 
			"		goo((x) -> {\n" + 
			"				try {\n" + 
			"					throw new Exception();\n" + 
			"				} finally {\n" + 
			"				}\n" + 
			"		});\n" + 
			"		goo((x) -> {\n" + 
			"				try {\n" + 
			"					if(x > 0) \n" + 
			"						throw new RuntimeException();\n" + 
			"				} catch (NullPointerException e) {return null;} \n" + 
			"				catch(ClassCastException c) {\n" + 
			"				}\n" + 
			"				finally {\n" + 
			"					return \"\";\n" + 
			"				}\n" + 
			"		});\n" + 
			"		\n" + 
			"	}\n" + 
			"}\n"
		});
}
public void test042() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I { \n" + 
			"	String foo(int x) throws Exception; \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test(String[] strs) {\n" +  
			"		goo((x) -> {\n" + 
			"			try {\n" + 
			"				if(x > 0) {\n" + 
			"					return \"\";\n" + 
			"				}\n" + 
			"			} finally {}\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n");
}
public void test043() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I { \n" + 
			"	String foo(int x) throws Exception; \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test(String[] strs) {\n" +  
			"		goo((x) -> {\n" + 
			"			try {\n" + 
			"				return \"\";\n" + 
			"			}catch (Exception e) {}\n" + 
			"			finally {\n" + 
			"				\n" + 
			"			}\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n");
}
public void test044() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I { \n" + 
			"	String foo(int x) throws Exception; \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test(String[] strs) {\n" +  
			"		goo((x) -> {\n" + 
			"			try {\n" + 
			"				//if(x > 0) \n" + 
			"					throw new RuntimeException();\n" + 
			"			} catch (NullPointerException e) {return null;} \n" + 
			"			catch(ClassCastException c) {\n" + 
			"			}\n" + 
			"		});\n" + 
			"		goo((x) -> {\n" + 
			"			try {\n" + 
			"				if(x > 0) \n" + 
			"					throw new RuntimeException();\n" + 
			"			} catch (NullPointerException e) {return null;} \n" + 
			"			catch(ClassCastException c) {\n" + 
			"			}\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 15)\n" + 
		"	goo((x) -> {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n");
}
public void test045() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I { \n" + 
			"	String foo(int x) throws Exception; \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test(String[] strs) {\n" +  
			"		goo((x) -> {\n" + 
			"			try {\n" + 
			"				if(x > 0) \n" + 
			"					throw new RuntimeException();\n" + 
			"			} catch (NullPointerException e) {return null;} \n" + 
			"			catch(ClassCastException c) {\n" + 
			"			}\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n");
}
public void test046() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I { \n" + 
			"	String foo(int x) throws Exception; \n" + 
			"}\n" + 
			"public class X {\n" + 
			"	void goo(I i) {}\n" + 
			"	void test(String[] strs) {\n" +  
			"		goo((x) -> {\n" + 
			"			if (true) {\n" + 
			"				try {\n" + 
			"					if(x > 0)\n" + 
			"						throw new Exception();\n" + 
			"				} finally {\n" + 
			"					return \"\";\n" + 
			"				}\n" + 
			"			}\n" + 
			"		});\n" + 
			"	}\n" + 
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo((x) -> {\n" + 
		"	    ^^^^^^\n" + 
		"This method must return a result of type String\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 12)\n" + 
		"	} finally {\n" + 
		"					return \"\";\n" + 
		"				}\n" + 
		"	          ^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"finally block does not complete normally\n" + 
		"----------\n");
}
public void testSwitch() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			switch (args.length) {\n" +
			"			case 0:\n" +
			"				System.out.println(0);\n" +
			"				throw new RuntimeException();\n" +
			"			case 1:\n" +
			"				System.out.println(1);\n" +
			"				throw new RuntimeException();\n" +
			"			case 2:\n" +
			"				System.out.println(2);\n" +
			"				throw new RuntimeException();\n" +
			"			default: \n" +
			"				System.out.println(\"default\");\n" +
			"				throw new RuntimeException();\n" +
			"			}\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"goo(I)");
}
public void testSwitch2() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			switch (args.length) {\n" +
			"			case 0:\n" +
			"				System.out.println(0);\n" +
			"				break;\n" +
			"			case 1:\n" +
			"				System.out.println(1);\n" +
			"				throw new RuntimeException();\n" +
			"			case 2:\n" +
			"				System.out.println(2);\n" +
			"				throw new RuntimeException();\n" +
			"			default: \n" +
			"				System.out.println(\"default\");\n" +
			"				throw new RuntimeException();\n" +
			"			}\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 9)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testSwitch3() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			switch (args.length) {\n" +
			"			case 0:\n" +
			"				System.out.println(0);\n" +
			"				throw new RuntimeException();\n" +
			"			case 1:\n" +
			"				System.out.println(1);\n" +
			"				throw new RuntimeException();\n" +
			"			case 2:\n" +
			"				System.out.println(2);\n" +
			"				throw new RuntimeException();\n" +
			"			default: \n" +
			"			}\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 9)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testSwitch4() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			switch (args.length) {\n" +
			"			case 0:\n" +
			"				System.out.println(0);\n" +
			"				throw new RuntimeException();\n" +
			"			case 1:\n" +
			"				System.out.println(1);\n" +
			"				throw new RuntimeException();\n" +
			"			case 2:\n" +
			"				System.out.println(2);\n" +
			"				throw new RuntimeException();\n" +
			"			default: \n" +
			"			    break;\n" +
			"			}\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 9)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testSwitch5() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	String foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {}\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			switch (args.length){\n" +
			"			case 1:\n" +
			"				if (args == null)\n" +
			"					break;\n" +
			"				else\n" +
			"					break;\n" +
			"			}\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testSwitch6() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	String foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {}\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			switch (args.length){\n" +
			"			case 1:\n" +
			"				if (args == null)\n" +
			"					break;\n" +
			"           throw new RuntimeException();\n" +
			"			}\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testWhileThis() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			boolean t = true;\n" +
			"			while (t) {\n" +
			"				System.out.println();\n" +
			"				throw new RuntimeException();\n" +
			"			}\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 9)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testWhile2() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			final boolean t = true;\n" +
			"			while (t) {\n" +
			"				System.out.println();\n" +
			"				throw new RuntimeException();\n" +
			"			}\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"goo(I)");
}
public void testWhile3() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			final boolean t = true;\n" +
			"			while (t && !!t) {\n" +
			"				System.out.println();\n" +
			"				throw new RuntimeException();\n" +
			"			}\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"goo(I)");
}
public void testWhile4() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			final boolean t = true;\n" +
			"			while (t && !!!t) {\n" +
			"				System.out.println();\n" +
			"				throw new RuntimeException();\n" +
			"			}\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 9)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testDo() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			boolean t = true;\n" +
			"			do {\n" +
			"				System.out.println();\n" +
			"				throw new RuntimeException();\n" +
			"			} while (t);\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"goo(I)");
}
public void testDo2() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			final boolean t = true;\n" +
			"			do {\n" +
			"				System.out.println();\n" +
			"				throw new RuntimeException();\n" +
			"			} while (t);\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"goo(I)");
}
public void testDo3() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			final boolean t = true;\n" +
			"			do { \n" +
			"				System.out.println();\n" +
			"				throw new RuntimeException();\n" +
			"			} while (t && !!t);\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"goo(I)");
}
public void testDo4() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			final boolean t = true;\n" +
			"			do {\n" +
			"				System.out.println();\n" +
			"			} while (t && !!!t);\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 9)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testDo5() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			do {\n" +
			"				break;\n" +
			"			} while (false);\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 9)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testDo6() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			do {\n" +
			"				if (args == null) break;\n" +
			"			} while (false);\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 9)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testDo7() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			do {\n" +
			"				if (args == null) throw new RuntimeException();\n" +
			"			} while (false);\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 9)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testDo8() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			do {\n" +
			"				throw new RuntimeException();\n" +
			"			} while (false);\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"goo(I)");
}
public void testDo9() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	String foo();\n" +
			"}\n" +
			"interface J {\n" +
			"	void foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"		System.out.println(\"I\");\n" +
			"	}\n" +
			"	static void goo(J i) {\n" +
			"		System.out.println(\"J\");\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			do {\n" +
			"				continue;\n" +
			"			} while (false);\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"J");
}
public void testDo10() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	String foo();\n" +
			"}\n" +
			"interface J {\n" +
			"	void foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"		System.out.println(\"I\");\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			do {\n" +
			"               if (true) \n" +
			"				    continue;\n" +
			"			} while (false);\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 12)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testDo11() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	String foo();\n" +
			"}\n" +
			"interface J {\n" +
			"	void foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"		System.out.println(\"I\");\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			do {\n" +
			"               if (true) \n" +
			"				    continue;\n" +
			"               else \n" +
			"                   continue;\n" +
			"			} while (false);\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 12)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testDo12() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	String foo();\n" +
			"}\n" +
			"interface J {\n" +
			"	void foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"		System.out.println(\"I\");\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			do {\n" +
			"               if (true) \n" +
			"				    continue;\n" +
			"               else \n" +
			"                   throw new RuntimeException();\n" +
			"			} while (false);\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 12)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testDo13() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	String foo();\n" +
			"}\n" +
			"interface J {\n" +
			"	void foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"		System.out.println(\"I\");\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			do {\n" +
			"               if (true) \n" +
			"                   throw new RuntimeException();\n" +
			"               else \n" +
			"                   throw new RuntimeException();\n" +
			"			} while (false);\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"I");
}
public void testDo14() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	String foo();\n" +
			"}\n" +
			"interface J {\n" +
			"	void foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"		System.out.println(\"I\");\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			do {\n" +
			"               if (true) { \n" +
			"                   System.out.println();\n" +
			"				    continue;\n" +
			"               }\n" +
			"               else {\n" +
			"                   continue;\n" +
			"               }\n" +
			"			} while (false);\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 12)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testDo15() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	String foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"		System.out.println(\"I\");\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			label:\n" +
			"			do {\n" +
			"				continue label;\n" +
			"			} while (false);\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 9)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testDo16() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	String foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"		System.out.println(\"I\");\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			do {\n" +
			"				blah:\n" +
			"				continue;\n" +
			"			} while (false);\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 9)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testDo17() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	String foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"		System.out.println(\"I\");\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			do {\n" +
			"				synchronized(args) {\n" +
			"				    continue;\n" +
			"               }\n" +
			"			} while (false);\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 9)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testDo18() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	String foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"		System.out.println(\"I\");\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			do {\n" +
			"				try {\n" +
			"					continue;\n" +
			"				} finally {\n" +
			"					throw new RuntimeException();\n" +
			"				}\n" +
			"			} while (false);\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"I");
}
public void testDo19() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	String foo();\n" +
			"}\n" +
			"interface J {\n" +
			"	void foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"		System.out.println(\"I\");\n" +
			"	}\n" +
			"	static void goo(J i) {\n" +
			"		System.out.println(\"J\");\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			do {\n" +
			"				try {\n" +
			"					continue;\n" +
			"				} finally {\n" +
			"				}\n" +
			"			} while (false);	\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"J");
}
public void testDo20() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	String foo();\n" +
			"}\n" +
			"interface J {\n" +
			"	void foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"		System.out.println(\"I\");\n" +
			"	}\n" +
			"	static void goo(J i) {\n" +
			"		System.out.println(\"J\");\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			do {\n" +
			"				switch (args.length){\n" +
			"				default:\n" +
			"					continue;\n" +
			"				}\n" +
			"			} while (false);	\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"J");
}
public void testDo21() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	String foo();\n" +
			"}\n" +
			"interface J {\n" +
			"	void foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"		System.out.println(\"I\");\n" +
			"	}\n" +
			"	static void goo(J i) {\n" +
			"		System.out.println(\"J\");\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			do {\n" +
			"				while (true) {\n" +
			"					continue;\n" +
			"				}\n" +
			"			} while (false);	\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"I");
}
public void testDo22() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	String foo();\n" +
			"}\n" +
			"interface J {\n" +
			"	void foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"		System.out.println(\"I\");\n" +
			"	}\n" +
			"	static void goo(J i) {\n" +
			"		System.out.println(\"J\");\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			label:\n" +
			"			do {\n" +
			"				while (true) {\n" +
			"					continue label;\n" +
			"				}\n" +
			"			} while (false);	\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"J");
}
public void testDo23() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	String foo();\n" +
			"}\n" +
			"interface J {\n" +
			"	void foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"		System.out.println(\"I\");\n" +
			"	}\n" +
			"	static void goo(J i) {\n" +
			"		System.out.println(\"J\");\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			label:\n" +
			"			while (true) {\n" +
			"				while (true) {\n" +
			"					continue label;\n" +
			"				}\n" +
			"			}	\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"I");
}
public void testDo24() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	String foo();\n" +
			"}\n" +
			"interface J {\n" +
			"	void foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"		System.out.println(\"I\");\n" +
			"	}\n" +
			"	static void goo(J i) {\n" +
			"		System.out.println(\"J\");\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			label:\n" +
			"			do {\n" +
			"				for (;;) {\n" +
			"					continue label;\n" +
			"				}\n" +
			"			} while (false);	\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"J");
}
public void testDo25() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	String foo();\n" +
			"}\n" +
			"interface J {\n" +
			"	void foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"		System.out.println(\"I\");\n" +
			"	}\n" +
			"	static void goo(J i) {\n" +
			"		System.out.println(\"J\");\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			label:\n" +
			"			do {\n" +
			"				do {\n" +
			"					continue label;\n" +
			"				} while (true);\n" +
			"			} while (false);	\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"J");
}
public void testDo26() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	String foo();\n" +
			"}\n" +
			"interface J {\n" +
			"	void foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"		System.out.println(\"I\");\n" +
			"	}\n" +
			"	static void goo(J i) {\n" +
			"		System.out.println(\"J\");\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			do {\n" +
			"				label:\n" +
			"					while (true) {\n" +
			"						continue label;\n" +
			"					}\n" +
			"			} while (false);\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"I");
}
public void testForeach() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			final boolean t = true;\n" +
			"			for (String s: args) {\n" +
			"				System.out.println();\n" +
			"			}\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 9)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testForeach2() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			final boolean t = true;\n" +
			"			for (String s: args) {\n" +
			"				System.out.println();\n" +
			"			do {\n" +
			"				System.out.println();\n" +
			"				switch (args.length) {\n" +
			"				case 0:\n" +
			"					System.out.println(0);\n" +
			"					break;\n" +
			"				case 1:\n" +
			"					System.out.println(1);\n" +
			"					throw new RuntimeException();\n" +
			"				case 2:\n" +
			"					System.out.println(2);\n" +
			"					throw new RuntimeException();\n" +
			"				default: \n" +
			"					System.out.println(\"default\");\n" +
			"					throw new RuntimeException();\n" +
			"				}\n" +
			"			} while (t);\n" +
			"			}\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 9)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testForeach3() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			final boolean t = true;\n" +
			"			for (String s: args) {\n" +
			"				System.out.println();\n" +
			"			do {\n" +
			"				System.out.println();\n" +
			"				switch (args.length) {\n" +
			"				case 0:\n" +
			"					System.out.println(0);\n" +
			"					throw new RuntimeException();\n" +
			"				case 1:\n" +
			"					System.out.println(1);\n" +
			"					throw new RuntimeException();\n" +
			"				case 2:\n" +
			"					System.out.println(2);\n" +
			"					throw new RuntimeException();\n" +
			"				default: \n" +
			"					System.out.println(\"default\");\n" +
			"					throw new RuntimeException();\n" +
			"				}\n" +
			"			} while (t);\n" +
			"			}\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 9)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testForeach4() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			final boolean t = true;\n" +
			"			for (String s: args) {\n" +
			"				System.out.println();\n" +
			"				throw new RuntimeException();\n" +
			"			}\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 9)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testIf() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			final boolean t = true;\n" +
			"			if (t) \n" +
			"               throw new RuntimeException();\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 9)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testIf2() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			final boolean t = true;\n" +
			"			if (true) \n" +
			"               throw new RuntimeException();\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 9)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testIf3() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			final boolean t = true;\n" +
			"			if (true) \n" +
			"               throw new RuntimeException();\n" +
			"           else \n" +
			"               throw new RuntimeException();\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"goo(I)");
}
public void testCFor() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			boolean t = true;\n" +
			"			for (; t ;) { \n" +
			"               throw new RuntimeException();\n" +
			"           }\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 9)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testCFor2() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			final boolean t = true;\n" +
			"			for (; t ;) { \n" +
			"               throw new RuntimeException();\n" +
			"           }\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"goo(I)");
}
public void testTry() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"           try {\n" +
			"           } finally {\n" +
			"               throw new RuntimeException();\n" +
			"           }\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"goo(I)");
}
public void testTry2() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"           try {\n" +
			"           } finally {\n" +
			"           }\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 9)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testTry3() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"           try {\n" +
			"           } catch (RuntimeException e) {\n" +
			"               throw new RuntimeException();\n" +
			"           }\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 9)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testTry4() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"   static void goo(I i) {\n" +
			"		System.out.println(\"goo(I)\");\n" +
			"   }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"           try {\n" +
			"               throw new RuntimeException();\n" +
			"           } catch (RuntimeException e) {\n" +
			"               throw new RuntimeException();\n" +
			"           }\n" +
			"		});\n" +
			"	}\n" +
			"}\n"
		},
		"goo(I)");
}
public void testWhileTrue() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"            System.out.println(\"goo(I)\");\n" +
			"        }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			while (true) {\n" +
			"			}\n" +
			"		});\n" +
			"	}\n" +
			"}\n" 
		},
		"goo(I)");
}
public void testWhileTrue2() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"            System.out.println(\"goo(I)\");\n" +
			"        }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			while (true) {\n" +
			"			    while (true) {\n" +
			"                   if (args == null) break;\n" +
			"			    }\n" +
			"			}\n" +
			"		});\n" +
			"	}\n" +
			"}\n" 
		},
		"goo(I)");
}
public void testWhileTrue3() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	int foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"            System.out.println(\"goo(I)\");\n" +
			"        }\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			while (true) {\n" +
			"                   if (args == null) break;\n" +
			"			}\n" +
			"		});\n" +
			"	}\n" +
			"}\n" 
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 9)\n" + 
		"	goo(() -> {\n" + 
		"	^^^\n" + 
		"The method goo(I) in the type X is not applicable for the arguments (() -> {})\n" + 
		"----------\n");
}
public void testLabeledStatement() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	String foo();\n" +
			"}\n" +
			"interface J {\n" +
			"	void foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"		System.out.println(\"I\");\n" +
			"	}\n" +
			"	static void goo(J i) {\n" +
			"		System.out.println(\"J\");\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			label: \n" +
			"			while (true) {\n" +
			"				while (true) {\n" +
			"					break label;\n" +
			"				}\n" +
			"			}\n" +
			"		});\n" +
			"	}\n" +
			"}\n" 
		},
		"J");
}
public void testLabeledStatement2() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	String foo();\n" +
			"}\n" +
			"interface J {\n" +
			"	void foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"		System.out.println(\"I\");\n" +
			"	}\n" +
			"	static void goo(J i) {\n" +
			"		System.out.println(\"J\");\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			outerlabel: \n" +
			"			label: \n" +
			"			while (true) {\n" +
			"				while (true) {\n" +
			"					break outerlabel;\n" +
			"				}\n" +
			"			}\n" +
			"		});\n" +
			"	}\n" +
			"}\n" 
		},
		"J");
}
public void testLabeledStatement3() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	String foo();\n" +
			"}\n" +
			"interface J {\n" +
			"	void foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"		System.out.println(\"I\");\n" +
			"	}\n" +
			"	static void goo(J i) {\n" +
			"		System.out.println(\"J\");\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			outerlabel: \n" +
			"			label: \n" +
			"			while (true) {\n" +
			"				while (true) {\n" +
			"					break outerlabel;\n" +
			"				}\n" +
			"			}\n" +
			"		});\n" +
			"	}\n" +
			"}\n" 
		},
		"J");
}
public void testLabeledStatement4() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	String foo();\n" +
			"}\n" +
			"interface J {\n" +
			"	void foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"		System.out.println(\"I\");\n" +
			"	}\n" +
			"	static void goo(J i) {\n" +
			"		System.out.println(\"J\");\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			outerlabel: \n" +
			"			label: \n" +
			"			while (true) {\n" +
			"				while (true) {\n" +
			"					break label;\n" +
			"				}\n" +
			"			}\n" +
			"		});\n" +
			"	}\n" +
			"}\n" 
		},
		"J");
}
public void testLabeledStatement5() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I {\n" +
			"	String foo();\n" +
			"}\n" +
			"interface J {\n" +
			"	void foo();\n" +
			"}\n" +
			"public class X {\n" +
			"	static void goo(I i) {\n" +
			"		System.out.println(\"I\");\n" +
			"	}\n" +
			"	static void goo(J i) {\n" +
			"		System.out.println(\"J\");\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		goo(() -> {\n" +
			"			outerlabel: \n" +
			"			label: \n" +
			"			while (true) {\n" +
			"				while (true) {\n" +
			"					break;\n" +
			"				}\n" +
			"			}\n" +
			"		});\n" +
			"	}\n" +
			"}\n" 
		},
		"I");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=470232 NPE at org.eclipse.jdt.internal.compiler.ast.WhileStatement.doesNotCompleteNormally
public void testBug470232_While() {
	this.runConformTest(
		new String[] {
			"While.java",
			"import java.util.function.Consumer;\n" + 
			"class While {\n" + 
			"    void m() {\n" + 
			"        t(Long.class, value -> {\n" + 
			"            int x = 1;\n" + 
			"            while (--x >= 0)\n" + 
			"                ;\n" + 
			"        });\n" + 
			"    }\n" + 
			"    <T> void t(Class<T> clazz, Consumer<T> object) {\n" + 
			"    }\n" + 
			"}\n"
		});
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=470232 NPE at org.eclipse.jdt.internal.compiler.ast.WhileStatement.doesNotCompleteNormally
public void testBug470232_Do() {
	this.runConformTest(
		new String[] {
			"While.java",
			"import java.util.function.Consumer;\n" + 
			"class While {\n" + 
			"    void m() {\n" + 
			"        t(Long.class, value -> {\n" + 
			"            int x = 1;\n" + 
			"            do {\n" + 
			"            }while (--x >= 0);\n" + 
			"        });\n" + 
			"    }\n" + 
			"    <T> void t(Class<T> clazz, Consumer<T> object) {\n" + 
			"    }\n" + 
			"}\n"
		});
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=470232 NPE at org.eclipse.jdt.internal.compiler.ast.WhileStatement.doesNotCompleteNormally
public void testBug470232_For() {
	this.runConformTest(
		new String[] {
			"While.java",
			"import java.util.function.Consumer;\n" + 
			"class While {\n" + 
			"    void m() {\n" + 
			"        t(Long.class, value -> {\n" + 
			"            int x = 1;\n" + 
			"            for(;--x >= 0;)\n" + 
			"            	;\n" + 
			"        });\n" + 
			"    }\n" + 
			"    <T> void t(Class<T> clazz, Consumer<T> object) {\n" + 
			"    }\n" + 
			"}\n"
		});
}
public static Class testClass() {
	return LambdaShapeTests.class;
}
}
