/*******************************************************************************
 * Copyright (c) 2006, 2018 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
 *     Stephan Herrmann - Contribution for
 *								Bug 388800 - [1.8] adjust tests to 1.8 JRE
 *     Keigo Imai - Contribution for  bug 388903 - Cannot extend inner class as an anonymous class when it extends the outer class
 *******************************************************************************/
package org.eclipse.jdt.core.tests.compiler.regression;

import java.io.File;
import java.util.Map;

import junit.framework.Test;

import org.eclipse.jdt.core.Flags;
import org.eclipse.jdt.core.ToolFactory;
import org.eclipse.jdt.core.tests.util.Util;
import org.eclipse.jdt.core.util.ClassFileBytesDisassembler;
import org.eclipse.jdt.core.util.IClassFileReader;
import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;

@SuppressWarnings({ "unchecked", "rawtypes" })
public class InnerEmulationTest extends AbstractRegressionTest {
static {
//		TESTS_NAMES = new String[] { "Bug58069" };
//		TESTS_NUMBERS = new int[] { 173, 174 };
//		TESTS_RANGE = new int[] { 144, -1 };
}
public InnerEmulationTest(String name) {
	super(name);
}
protected Map getCompilerOptions() {
	Map options = super.getCompilerOptions();
	options.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.IGNORE);
	options.put(CompilerOptions.OPTION_ReportUnusedLocal, CompilerOptions.IGNORE);
	options.put(CompilerOptions.OPTION_ReportUnusedParameter, CompilerOptions.IGNORE);
	options.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.IGNORE);
	return options;
}
public static Test suite() {
	return buildAllCompliancesTestSuite(testClass());
}
/**
 * Protected access emulation : should be performed onto implicit field and method accesses
 */
public void test001() {
	this.runConformTest(
		new String[] {
			/* p1.A */
			"p1/A.java",
			"package p1;								\n"+
			"import p2.*;								\n"+
			"public class A {							\n"+
			"	protected int value = 0;				\n"+
			"	protected A delegatee;					\n"+
			"	public A(A del, int val) {				\n"+
			"		this.delegatee = del;				\n"+
			"		this.value = val;					\n"+
			"	}										\n"+
			"	protected void foo() {					\n"+
			"		value += 3;							\n"+
			"	}										\n"+
			"	public static void main(String[] argv){	\n"+
			"		int result = new B(					\n"+
			"					  new B(null, 10), 20)  \n"+
			"					 .value; 				\n"+
			"		int expected = 30; 					\n"+
			"		System.out.println( 				\n"+
			"			result == expected 				\n"+
			"				? \"SUCCESS\"  				\n"+
			"				: \"FAILED : got \"+result+\" instead of \"+ expected); \n"+
			"	}										\n"+
			"}											\n",
			/* p2.B */
			"p2/B.java",
			"package p2;								\n"+
			"import p1.*;								\n"+
			"public class B extends A {					\n"+
			"	public B(B del, int val){				\n"+
			"		super(del, val);					\n"+
			"		Runnable r = new Runnable () {		\n"+
			"			public void run() {				\n"+
			"				foo(); 						\n"+
			"				if (delegatee != null) 		\n"+
			"					value += 7;				\n"+
			"			}								\n"+
			"		};									\n"+
			"		r.run();							\n"+
			"	}										\n"+
			"}											\n"
		},
		"SUCCESS"
	);
}
/**
 * 1FN4S4Z: The compiler doesn't detect a illegal constructor invocation which leads to a VerifyError
 */
public void test002() {
	this.runNegativeTest(
		new String[] {
			/* A.java */
			"A.java",
			"class B { \n"+
			"} \n"+
			"public class A { \n"+
			"	B b; \n"+
			"	class C extends B { \n"+
			"		public C() { \n"+
			"		} \n"+
			"	} \n"+
			"	public A() { \n"+
			"		this(new C()); \n"+
			"	} \n"+
			"	public A(C c) { \n"+
			"		this.b = c; \n"+
			"	} \n"+
			"	public static void main(String[] args) { \n"+
			"		A a = new A(); \n"+
			"		System.out.println(a); \n"+
			"	} \n"+
			"} \n"
		},
		"----------\n" +
		"1. ERROR in A.java (at line 10)\n" +
		"	this(new C()); \n" +
		"	     ^^^^^^^\n" +
		"No enclosing instance of type A is available due to some intermediate constructor invocation\n" +
		"----------\n"

	);
}
/**
 * 1FZ2G7R: use of non static inner class in constuctor
 */
public void test003() {
	String errMessage = isMinimumCompliant(ClassFileConstants.JDK11) ?
			"----------\n" +
			"1. ERROR in A.java (at line 8)\n" +
			"	super(getRunnable(), new B().toString()); \n" +
			"	                     ^^^^^^^\n" +
			"No enclosing instance of type A is available due to some intermediate constructor invocation\n" +
			"----------\n"
			:
			"----------\n" +
			"1. WARNING in A.java (at line 8)\n" +
			"	super(getRunnable(), new B().toString()); \n" +
			"	                     ^^^^^^^\n" +
			"Access to enclosing constructor A.B() is emulated by a synthetic accessor method\n" +
			"----------\n" +
			"2. ERROR in A.java (at line 8)\n" +
			"	super(getRunnable(), new B().toString()); \n" +
			"	                     ^^^^^^^\n" +
			"No enclosing instance of type A is available due to some intermediate constructor invocation\n" +
			"----------\n";			
	this.runNegativeTest(
		new String[] {
			/* A.java */
			"A.java",
			"public class A extends Thread { \n" +
			"	private class B { \n" +
			"	} \n" +
			"	private static Runnable getRunnable() { \n" +
			"		return null; \n" +
			"	} \n" +
			"	public A() { \n" +
			"		super(getRunnable(), new B().toString()); \n" +
			"	} \n" +
			"} \n"
		},
		errMessage);
}
/**
 * 1F995V9: Walkback in innerclass emulation when mixing source and binaries
 */
public void test004() {


	/* first compile A3.java */

	this.runConformTest(
		new String[] {
			/* A3.java */
			"A3.java",
			"class A3 { \n"+
			"	class B {} \n"+
			"} \n"
		}); // no specific success output string

	/* then compile with previous input */

	this.runConformTest(
		new String[] {
			/* A4.java */
			"A4.java",
			"class A4 { \n"+
			"	void foo(){ \n"+
			"		new A3().new B(){}; \n"+
			"	} \n"+
			"} \n"
		},
		null, // no specific success output string
		null, // use default class-path
		false,
		null); // do not flush previous output dir content

}
/**
 * 1FK9ALJ: Cannot invoke private super constructor ...
 */
public void test005() {
	this.runConformTest(
		new String[] {
			/* X.java */
			"X.java",
			"public class X { \n"+
			"	private X(){} \n"+
			"	class Y extends X { \n"+
			"	} \n"+
			"	public static void main(String[] argv){	\n"+
			"		new X().new Y();	 				 \n"+
			"		System.out.println(\"SUCCESS\");	 \n"+
			"	}										\n"+
			"} \n"
		},
		"SUCCESS"
	);
}
/**
 * 1FKLXDL: Verification error due to incorrect private access emulation
 */
public void test006() {
	this.runConformTest(
		new String[] {
			/* X.java */
			"X.java",
			"public class X { \n"+
			"	public static void main(String[] argv){ \n"+
			"		new B(); \n"+
			"		System.out.println(\"SUCCESS\"); \n"+
			"	} \n"+
			"	private static void foo(int i, int j) { \n"+
			"		System.out.println(\"private foo\"); \n"+
			"	} \n"+
			"	static class B { \n"+
			"		{ \n"+
			"			foo(1, 2); \n"+
			"		} \n"+
			"	} \n"+
			"}		 \n"
		},
		"private foo\n" +
		"SUCCESS"
	);
}
/**
 * 1PQCT5T: Missing emulation for access to sibling local types
 */
public void test007() {
	this.runConformTest(
		new String[] {
			/* Y.java */
			"Y.java",
			"public class Y { \n" +
			"	public static void main(String[] argv){ \n" +
			"		if (new Y().bar() == 3) \n" +
			"			System.out.println(\"SUCCESS\"); \n" +
			"		else \n" +
			"			System.out.println(\"FAILED\"); \n" +
			"	} \n" +
			"	int bar() { \n" +
			"		final int i = \"xxx\".length(); \n" +
			"		class X { \n" +
			"			class AX { \n" +
			"				int foo() { \n" +
			"					return new BX().foo(); \n" +
			"				} \n" +
			"			} \n" +
			"			class BX { \n" +
			"				int foo() { \n" +
			"					return new CX().foo(); \n" +
			"				} \n" +
			"			} \n" +
			"			class CX { \n" +
			"				int foo() { \n" +
			"					return i; \n" +
			"				} \n" +
			"			} \n" +
			"		} \n" +
			"		return new X().new AX().foo(); \n" +
			"	} \n"+
			"} \n"
		},
		"SUCCESS"
	);
}
/**
 * 1PQCT5T: Missing emulation for access to sibling local types
 */
public void test008() {
	this.runConformTest(
		new String[] {
			/* Y2.java */
			"Y2.java",
			"public class Y2 { \n" +
			"	public static void main(String[] argv){ \n" +
			"		if (new Y2().foo(45) == 45) \n" +
			"			System.out.println(\"SUCCESS\"); \n" +
			"		else \n" +
			"			System.out.println(\"FAILED\"); \n" +
			"	} \n" +
			"	int foo(final int i){ \n"+
			"		class B { \n"+
			"			int foo(){ \n"+
			"				return new C().foo(); \n"+
			"			} \n"+
			"			class C { \n"+
			"				int foo(){ return i; } \n"+
			"			} \n"+
			"		}; \n"+
			"		return new B().foo(); \n"+
			"	} \n"+
			"} \n"
		},
		"SUCCESS"
	);
}
/**
 * 1PQCT5T: Missing emulation for access to sibling local types
 */
public void test009() {
	this.runConformTest(
		new String[] {
			/* Y3.java */
			"Y3.java",
			"public class Y3 { \n" +
			"	public static void main(String[] argv){ \n" +
			"		if (new Y3().bar() == 8) \n" +
			"			System.out.println(\"SUCCESS\"); \n" +
			"		else \n" +
			"			System.out.println(\"FAILED\"); \n" +
			"	} \n" +
			"	int bar() { \n" +
			"		final int i = \"xxx\".length(); \n" +
			"		final String s = this.toString(); \n" +
			"		class X { \n" +
			"			class AX { \n" +
			"				int foo() { \n" +
			"					return i + new CX().foo(); \n" +
			"				} \n" +
			"			} \n" +
			"			class BX { \n" +
			"				int foo() { \n" +
			"					return new AX().foo(); \n" +
			"				} \n" +
			"			} \n" +
			"			class CX { \n" +
			"				int foo() { \n" +
			"					return 5; \n" +
			"				} \n" +
			"			} \n" +
			"		} \n" +
			"		return new X().new AX().foo(); \n" +
			"	} \n" +
			"} \n"
		},
		"SUCCESS"
	);
}
/**
 * 1PQCT5T: Missing emulation for access to sibling local types
 */
public void test010() {
	this.runConformTest(
		new String[] {
			/* Y4.java */
			"Y4.java",
			"public class Y4 { \n" +
			"	public static void main(String[] argv){ \n" +
			"		if (new Y4().bar() == 3) \n" +
			"			System.out.println(\"SUCCESS\"); \n" +
			"		else \n" +
			"			System.out.println(\"FAILED\"); \n" +
			"	} \n" +
			"	int bar() { \n" +
			"		final int i = \"xxx\".length(); \n" +
			"		final String s = this.toString(); \n" +
			"		class X { \n" +
			"			class AX { \n" +
			"				int bar() { \n" +
			"					class BX { \n" +
			"						int foo() { \n" +
			"							return new AX().foo(); \n" +
			"						} \n" +
			"					} \n" +
			"					return new BX().foo(); \n" +
			"				} \n" +
			"				int foo() { \n" +
			"					return i; \n" +
			"				} \n" +
			"			} \n" +
			"		} \n" +
			"		return new X().new AX().bar(); \n" +
			"	} \n" +
			"} \n"
		},
		"SUCCESS"
	);
}
/**
 * 1PQCT5T: Missing emulation for access to sibling local types
 */
public void test011() {
	this.runConformTest(
		new String[] {
			/* Y5.java */
			"Y5.java",
			"public class Y5 { \n" +
			"	public static void main(String[] argv){ \n" +
			"		if (new Y5().bar(5) == 5) \n" +
			"			System.out.println(\"SUCCESS\"); \n" +
			"		else \n" +
			"			System.out.println(\"FAILED\"); \n" +
			"	} \n" +
			"	int bar(final int i) { \n" +
			"		class X { \n" +
			"			int bar() { \n" +
			"				return new Object(){  \n" +
			"						int foo(){ \n" +
			"							return i; \n" +
			"						} \n" +
			"					}.foo(); \n" +
			"			} \n" +
			"		} \n" +
			"		return new X().bar(); \n" +
			"	} \n" +
			"} \n"
		},
		"SUCCESS"
	);
}
/**
 * 1F3AH7N: GPF on innerclass emulation for double anonymous type
 */
public void test012() {
	this.runConformTest(
		new String[] {
			/* A.java */
			"A.java",
			"public class A { \n" +
			"	public static void main(String[] argv){ \n" +
			"		if (new A().foo() == 5) \n" +
			"			System.out.println(\"SUCCESS\"); \n" +
			"		else \n" +
			"			System.out.println(\"FAILED\"); \n" +
			"	} \n" +
			"	int foo() { \n" +
			"		return new A() { \n" +
			"			int foo() { \n" +
			"				final int i = \"hello\".length(); \n" +
			"				return new A() { \n" +
			"					int foo() { \n" +
			"						return i; \n" +
			"					} \n" +
			"				} \n" +
			"				.foo(); \n" +
			"			} \n" +
			"		} \n" +
			"		.foo(); \n" +
			"	} \n" +
			"} \n"
		},
		"SUCCESS"
	);
}
/**
 * 1F26XE2: Bug in inner class emulation
 */
public void test013() {
	this.runConformTest(
		new String[] {
			/* Inner.java */
			"Inner.java",
			"public class Inner { \n" +
			"	public static void main(String[] argv){ \n" +
			"		new B().new C(\"hello\"); \n" +
			"		System.out.println(\"SUCCESS\"); \n" +
			"	} \n" +
			"  class A { 	\n"+
			"    public A(String s){ this.s=s; }	\n"+
			"    String s;	\n"+
			"  }	\n"+
			"}	\n"+
			"class B {	\n"+
			"  class C extends Inner.A {	\n"+
			"    public C(String s){  B.this.inner.super(s); }   	\n"+
			"  }	\n"+
			"  Inner inner=new Inner();	\n"+
			"}	\n"
		},
		"SUCCESS"
	);
}
/**
 * 1EX5I8Z: Inner class emulation bug
 */
public void test014() {
	this.runConformTest(
		new String[] {
			/* Z1.java */
			"Z1.java",
			"public class Z1 { \n" +
			"	public static void main(String[] argv){ \n" +
			"		new Z1().new W(); \n" +
			"		System.out.println(\"SUCCESS\"); \n" +
			"	} \n" +
			"	class W extends Y { \n" +
			"		W() { \n" +
			"			super(new Object(), foo()); \n" +
			"		} \n" +
			"	} \n" +
			"	String foo() { \n" +
			"		return \"\"; \n" +
			"	} \n" +
			"} \n" +
			"class Y { \n" +
			"	Y(Object o, String s) { \n" +
			"	} \n" +
			"}	\n"
		},
		"SUCCESS"
	);
}
/**
 * 1EUC39Y: Incorrect Synthetic Emulation
 */
public void test015() {
	this.runConformTest(
		new String[] {
			/* AAA.java */
			"AAA.java",
			"public class AAA {  \n"+
			"	public static void main(String argv[]){  \n"+
			"		if (new AAA().foo(5) == 15);  \n"+
			"		System.out.println(\"SUCCESS\"); \n" +
			"	}  \n"+
			"	int foo(final int loc){  \n"+
			"		class I {  \n"+
			"			int i = loc;  \n"+
			"			{  \n"+
			"				System.out.println(\"loc=\"+ loc );	  \n"+
			"			}  \n"+
			"			int foo(){   \n"+
			"				System.out.println(\"I:i=\"+ i );	  \n"+
			"				return i;}   \n"+
			"		}    \n"+
			"		class J extends I {  \n"+
			"			I obj = new I(){  \n"+
			"				int foo() {  \n"+
			"					System.out.println(\"J\");  \n"+
			"					return super.foo() + 10; }};  \n"+
			"		}  \n"+
			"		return new J().obj.foo();  \n"+
			"	}  \n"+
			" }  \n"
		},
		"loc=5\n" +
		"loc=5\n" +
		"J\n" +
		"I:i=5\n" +
		"SUCCESS"
	);
}
/**
 * 1EUC39Y: Incorrect Synthetic Emulation
 */
public void test016() {
	this.runConformTest(
		new String[] {
			/* AAA.java */
			"AAA.java",
			"public class AAA {  \n"+
			"	public static void main(String argv[]){  \n"+
			"		if (new AAA().foo(5) == 15);  \n"+
			"		System.out.println(\"SUCCESS\"); \n" +
			"	}  \n"+
			"	class B{} \n"+
			"	int foo(final int loc){ \n"+
			"		class I extends B { \n"+
			"			int i = loc; \n"+
			"			{ \n"+
			"				System.out.println(\"loc=\"+ loc );	 \n"+
			"			} \n"+
			"			int foo(){  \n"+
			"				System.out.println(\"I:i=\"+ i );	 \n"+
			"				return i;}  \n"+
			"		}   \n"+
			"		class J extends I { \n"+
			"			I obj = new I(){ \n"+
			"				int foo() { \n"+
			"					System.out.println(\"J\"); \n"+
			"					return super.foo() + 10; }}; \n"+
			"		} \n"+
			"		return new J().obj.foo(); \n"+
			"	} \n"+
			" }  \n"
		},
		"loc=5\n" +
		"loc=5\n" +
		"J\n" +
		"I:i=5\n" +
		"SUCCESS"
	);
}
/**
 * Complex multi-threaded test involving inner classes
 */
public void test017() {
	this.runConformTest(
		new String[] {
			/* MultiComplex.java */
			"MultiComplex.java",
			"public class MultiComplex {\n" +
			"	// should just be an interface, once supported...\n" +
			"	abstract class AbstractTask implements Runnable {\n" +
			"		public void run() {\n" +
			"			MultiComplex.this.notifyCompletion(this,0); \n" +
			"		}\n" +
			"		abstract public String taskName();		\n" +
			"	}\n" +
			"	public static void main(String argv[]){\n" +
			"		try {\n" +
			"			new MultiComplex().performTasks(3);\n" +
			"		}\n" +
			"		catch(InterruptedException e){};\n" +
			"	}  \n" +
			"	void notifyCompleted(AbstractTask task) {\n" +
			"	}\n" +
			"	void notifyCompletion(AbstractTask task, int percentage) {\n" +
			"	}\n" +
			"	void notifyExecutionEnd() {\n" +
			"		System.out.println(\"EXECUTION FINISHED\");\n" +
			"	}\n" +
			"	void notifyExecutionStart() {\n" +
			"		System.out.println(\"EXECUTION STARTING\");\n" +
			"	}\n" +
			"	void performTasks(final int maxTasks) throws InterruptedException {\n" +
			"		Thread workers[] = new Thread[maxTasks];\n" +
			"		AbstractTask tasks[] = new AbstractTask[maxTasks];\n" +
			"		final int maxIteration = 5;\n" +
			" \n" +
			"		// Local Task \n" +
			"		class Task extends AbstractTask { \n" +
			"				String taskName; \n" +
			"				Task(String aName) {\n" +
			"					taskName = aName;\n" +
			"				}\n" +
			"				public String taskName() { \n" +
			"					return taskName; \n" +
			"				}\n" +
			"	\n" +
			"				public void run() {\n" +
			"					super.run();\n" +
			"					for(int j = 0; j < maxIteration; j++)\n" +
			"						MultiComplex.this.notifyCompletion(this,  (int)((float) (j + 1) / maxIteration * 100));\n" +
			"				}\n" +
			"		};\n" +
			"		notifyExecutionStart();\n" +
			"		\n" +
			"		// Creating and launching the tasks\n" +
			"		for (int ii = 0; ii < maxTasks; ii++) {\n" +
			"			final int i = ii;\n" +
			"			tasks[i] = new Task(String.valueOf(i + 1)) {			\n" +
			"				public String taskName() { \n" +
			"					return super.taskName() +  \" of \" + maxTasks; }\n" +
			"				public void run() {\n" +
			"					super.run();\n" +
			"					MultiComplex.this.notifyCompleted(this);\n" +
			"				}		\n" +
			"			};\n" +
			"			workers[i] = new Thread(tasks[i],tasks[i].taskName());\n" +
			"			workers[i].start();\n" +
			"		}\n" +
			"		// Waiting for *all* tasks to be ended\n" +
			"		for (int i = 0; i < tasks.length; i++)\n" +
			"			workers[i].join();\n" +
			"		notifyExecutionEnd();\n" +
			"	}\n" +
			"}\n"
		},
		"EXECUTION STARTING\n" +
		"EXECUTION FINISHED"
	);
}
/**
 * Complex multi-threaded test involving inner classes
 */
public void test018() {
	this.runConformTest(
		new String[] {
			/* MultiAnonymous.java */
			"MultiAnonymous.java",
			"public class MultiAnonymous {\n" +
			"	public static void main(String argv[]){\n" +
			"		try {\n" +
			"			new MultiAnonymous().performTasks(3);\n" +
			"		}\n" +
			"		catch(InterruptedException e){};\n" +
			"	}\n" +
			"	void notifyExecutionEnd() {\n" +
			"		System.out.println(\"EXECUTION FINISHED\");\n" +
			"	}\n" +
			"	void notifyExecutionStart() {\n" +
			"		System.out.println(\"EXECUTION STARTING\");\n" +
			"	}\n" +
			"	void performTasks(final int maxTasks) throws java.lang.InterruptedException {\n" +
			"		Thread workers[] = new Thread[maxTasks];\n" +
			"		Runnable tasks[] = new Runnable[maxTasks];\n" +
			"		final int maxIteration = 5;\n" +
			"		notifyExecutionStart();\n" +
			"		\n" +
			"		// Creating and launching the tasks\n" +
			"		for (int ii = 0; ii < maxTasks; ii++) {\n" +
			"			final int i = ii;\n" +
			"			tasks[i] = new Runnable() {			\n" +
			"				public String toString() { return ((i + 1) + \" of \" + maxTasks); }\n" +
			"				public void run() {\n" +
			"					for(int j = 0; j < maxIteration; j++)\n" +
			"						notifyCompletion( (int)((float) (j + 1) / maxIteration * 100));\n" +
			"				}		\n" +
			"			\n" +
			"				void notifyCompletion(int percentage) {\n" +
			"				}\n" +
			"			};\n" +
			"			workers[i] = new Thread(tasks[i],\"Running task(\"+(tasks[i].toString())+\")\");\n" +
			"			workers[i].start();\n" +
			"		}\n" +
			"		// Waiting for *all* tasks to be ended\n" +
			"		for (int i = 0; i < tasks.length; i++)\n" +
			"			workers[i].join();\n" +
			"		notifyExecutionEnd();\n" +
			"	}\n" +
			"}\n"
		},
		"EXECUTION STARTING\n" +
		"EXECUTION FINISHED"
	);
}
/**
 * Complex multi-threaded test involving inner classes
 */
public void test019() {
	this.runConformTest(
		new String[] {
			/* MultiComplex2.java */
			"MultiComplex2.java",
			"public class MultiComplex2 {\n" +
			"	public interface AbstractTask extends Runnable {\n" +
			"		public void run();\n" +
			"		public String taskName();		\n" +
			"	}\n" +
			"	\n" +
			"	public static void main(String argv[]){\n" +
			"		try {\n" +
			"			new MultiComplex2().performTasks(3);\n" +
			"		}\n" +
			"		catch(InterruptedException e){};\n" +
			"	}\n" +
			"	void notifyCompleted(AbstractTask task) {\n" +
			"	}\n" +
			"	void notifyCompletion(AbstractTask task, int percentage) {\n" +
			"	}\n" +
			"	void notifyExecutionEnd() {\n" +
			"		System.out.println(\"EXECUTION FINISHED\");\n" +
			"	}\n" +
			"	void notifyExecutionStart() {\n" +
			"		System.out.println(\"EXECUTION STARTING\");\n" +
			"	}\n" +
			"		void performTasks(final int maxTasks) throws java.lang.InterruptedException {\n" +
			"		Thread workers[] = new Thread[maxTasks];\n" +
			"		AbstractTask tasks[] = new AbstractTask[maxTasks];\n" +
			"		final int maxIteration = 5;\n" +
			"		// Local Task\n" +
			"		class Task implements AbstractTask {\n" +
			"				String taskName;\n" +
			"				Task(String aName) {\n" +
			"					taskName = aName;\n" +
			"				}\n" +
			"				public String taskName() { \n" +
			"					return taskName; \n" +
			"				}\n" +
			"	\n" +
			"				public void run() {\n" +
			"					MultiComplex2.this.notifyCompletion(this,0); \n" +
			"					for(int j = 0; j < maxIteration; j++)\n" +
			"						MultiComplex2.this.notifyCompletion(this,  (int)((float) (j + 1) / maxIteration * 100));\n" +
			"				}\n" +
			"		};\n" +
			"		notifyExecutionStart();\n" +
			"		\n" +
			"		// Creating and launching the tasks\n" +
			"		for (int ii = 0; ii < maxTasks; ii++) {\n" +
			"			final int i = ii;\n" +
			"			tasks[i] = new Task(String.valueOf(i + 1)) {			\n" +
			"				public String taskName() { \n" +
			"					return super.taskName() +  \" of \" + maxTasks; }\n" +
			"				public void run() {\n" +
			"					super.run();\n" +
			"					MultiComplex2.this.notifyCompleted(this);\n" +
			"				}		\n" +
			"			};\n" +
			"			workers[i] = new Thread(tasks[i],tasks[i].taskName());\n" +
			"			workers[i].start();\n" +
			"		}\n" +
			"		// Waiting for *all* tasks to be ended\n" +
			"		for (int i = 0; i < tasks.length; i++)\n" +
			"			workers[i].join();\n" +
			"		notifyExecutionEnd();\n" +
			"	}\n" +
			"}\n"
		},
		"EXECUTION STARTING\n" +
		"EXECUTION FINISHED"
	);
}
/**
 * Complex multi-threaded test involving inner classes
 */
public void test020() {
	this.runConformTest(
		new String[] {
			/* MultiLocal.java */
			"MultiLocal.java",
			"public class MultiLocal {\n" +
			"	public static void main(String argv[]){\n" +
			"		class Task implements Runnable {\n" +
			"			private String taskName;\n" +
			"			private int maxIteration; \n" +
			"			public Task(String name, int value) {\n" +
			"				taskName = name; \n" +
			"				maxIteration = value;\n" +
			"			}\n" +
			"	\n" +
			"			public String toString() { return taskName; }\n" +
			"			public void run() {\n" +
			"				for(int i = 0; i < maxIteration; i++)\n" +
			"					notifyCompletion( (int)((float) (i + 1) / maxIteration * 100));\n" +
			"			}		\n" +
			"			\n" +
			"			void notifyCompletion(int percentage) {\n" +
			"			}\n" +
			"		};\n" +
			"		MultiLocal multi = new MultiLocal();\n" +
			"		int maxTasks = 3;\n" +
			"		Task tasks[] = new Task[maxTasks];\n" +
			"		for (int i = 0; i < maxTasks; i++) \n" +
			"			tasks[i] = new Task(String.valueOf(i),5);\n" +
			"		try {\n" +
			"			multi.performTasks(tasks);\n" +
			"		}\n" +
			"		catch(InterruptedException e){};\n" +
			"	}\n" +
			"	void notifyExecutionEnd() {\n" +
			"		System.out.println(\"EXECUTION FINISHED\");\n" +
			"	}\n" +
			"	void notifyExecutionStart() {\n" +
			"		System.out.println(\"EXECUTION STARTING\");\n" +
			"	}\n" +
			"	void performTasks(Runnable tasks[]) throws java.lang.InterruptedException {\n" +
			"		Thread workers[] = new Thread[tasks.length];\n" +
			"		notifyExecutionStart();\n" +
			"		\n" +
			"		// Launching the tasks\n" +
			"		for (int i = 0; i < tasks.length; i++) {\n" +
			"			workers[i] = new Thread(tasks[i],\"Running task(\"+(tasks[i].toString())+\")\");\n" +
			"			workers[i].start();\n" +
			"		}\n" +
			"		// Waiting for *all* tasks to be ended\n" +
			"		for (int i = 0; i < tasks.length; i++)\n" +
			"			workers[i].join();\n" +
			"		notifyExecutionEnd();\n" +
			"	}\n" +
			"}\n"
		},
		"EXECUTION STARTING\n" +
		"EXECUTION FINISHED"
	);
}
/**
 * Complex multi-threaded test involving inner classes
 */
public void test021() {
	this.runConformTest(
		new String[] {
			/* MultiLocal2.java */
			"MultiLocal2.java",
			"public class MultiLocal2 {\n" +
			"	public static void main(String argv[]){\n" +
			"		final int maxTasks = 3;\n" +
			"		class Task implements Runnable {\n" +
			"			private String taskName;\n" +
			"			private int maxIteration;\n" +
			"			public Task(String name, int value) {\n" +
			"				taskName = name; \n" +
			"				maxIteration = value;\n" +
			"			}\n" +
			"	\n" +
			"			public String toString() { return taskName + \" of \" + String.valueOf(maxTasks); }\n" +
			"			public void run() {\n" +
			"				for(int i = 0; i < maxIteration; i++)\n" +
			"					notifyCompletion( (int)((float) (i + 1) / maxIteration * 100));\n" +
			"			}		\n" +
			"			\n" +
			"			void notifyCompletion(int percentage) {\n" +
			"			}\n" +
			"		};\n" +
			"		MultiLocal2 multi = new MultiLocal2();\n" +
			"		Task tasks[] = new Task[maxTasks];\n" +
			"		for (int i = 0; i < maxTasks; i++) \n" +
			"			tasks[i] = new Task(String.valueOf(i+1),5);\n" +
			"		try {\n" +
			"			multi.performTasks(tasks);\n" +
			"		}\n" +
			"		catch(InterruptedException e){};\n" +
			"	}\n" +
			"	void notifyExecutionEnd() {\n" +
			"		System.out.println(\"EXECUTION FINISHED\");\n" +
			"	}\n" +
			"	void notifyExecutionStart() {\n" +
			"		System.out.println(\"EXECUTION STARTING\");\n" +
			"	}\n" +
			"	void performTasks(Runnable tasks[]) throws java.lang.InterruptedException {\n" +
			"		Thread workers[] = new Thread[tasks.length];\n" +
			"		notifyExecutionStart();\n" +
			"		\n" +
			"		// Launching the tasks\n" +
			"		for (int i = 0; i < tasks.length; i++) {\n" +
			"			workers[i] = new Thread(tasks[i],\"Running task(\"+(tasks[i].toString())+\")\");\n" +
			"			workers[i].start();\n" +
			"		}\n" +
			"		// Waiting for *all* tasks to be ended\n" +
			"		for (int i = 0; i < tasks.length; i++)\n" +
			"			workers[i].join();\n" +
			"		notifyExecutionEnd();\n" +
			"	}\n" +
			"}\n"
		},
		"EXECUTION STARTING\n" +
		"EXECUTION FINISHED"
	);
}
/**
 * Complex multi-threaded test involving inner classes
 */
public void test022() {
	this.runConformTest(
		new String[] {
			/* MultiMember.java */
			"MultiMember.java",
			"public class MultiMember {\n" +
			"	class Task implements Runnable {\n" +
			"		private String taskName; \n" +
			"		private int maxIteration;\n" +
			"		public Task(String name, int value) {\n" +
			"			taskName = name; \n" +
			"			maxIteration = value;\n" +
			"		}\n" +
			"		public String toString() { return taskName; }\n" +
			"		public void run() {\n" +
			"			for(int i = 0; i < maxIteration; i++)\n" +
			"				notifyCompletion( (int)((float) (i + 1) / maxIteration * 100));\n" +
			"		}		\n" +
			"		\n" +
			"		void notifyCompletion(int percentage) {\n" +
			"		}\n" +
			"	}\n" +
			"	public static void main(String argv[]){\n" +
			"		MultiMember multi = new MultiMember();\n" +
			"		int maxTasks = 3;\n" +
			"		Task tasks[] = new Task[maxTasks];\n" +
			"		for (int i = 0; i < maxTasks; i++) \n" +
			"			tasks[i] = multi.new Task(String.valueOf(i),5);\n" +
			"		try {\n" +
			"			multi.performTasks(tasks);\n" +
			"		}\n" +
			"		catch(InterruptedException e){};\n" +
			"	}\n" +
			"	void notifyExecutionEnd() {\n" +
			"		System.out.println(\"EXECUTION FINISHED\");\n" +
			"	}\n" +
			"	void notifyExecutionStart() {\n" +
			"		System.out.println(\"EXECUTION STARTING\");\n" +
			"	}\n" +
			"	void performTasks(Task tasks[]) throws java.lang.InterruptedException {\n" +
			"		Thread workers[] = new Thread[tasks.length];\n" +
			"		notifyExecutionStart();\n" +
			"		\n" +
			"		// Launching the tasks\n" +
			"		for (int i = 0; i < tasks.length; i++) {\n" +
			"			workers[i] = new Thread(tasks[i],\"Running task(\"+(tasks[i].toString())+\")\");\n" +
			"			workers[i].start();\n" +
			"		}\n" +
			"		// Waiting for *all* tasks to be ended\n" +
			"		for (int i = 0; i < tasks.length; i++)\n" +
			"			workers[i].join();\n" +
			"		notifyExecutionEnd();\n" +
			"	}\n" +
			"}\n"
		},
		"EXECUTION STARTING\n" +
		"EXECUTION FINISHED"
	);
}
/**
 * No need for protected access emulation
 */
public void test023() {
	this.runConformTest(
		new String[] {
			/* X.java */
			"p/X.java",
			"package p; \n" +
			"public class X extends q.Y { \n" +
			"	void bar(){ Object o = someObject; } \n"+
			"	public static void main(String[] argv){ \n" +
			"		new X().bar();\n"+
			"		System.out.println(\"SUCCESS\");\n"+
			"	}\n"+
			"}\n",
			/* Y.java */
			"q/Y.java",
			"package q; \n" +
			"public class Y { \n" +
			"	protected Object someObject; \n" +
			"}\n"
		},
		"SUCCESS"
	);
}
/**
 * No need for protected access emulation
 */
public void test024() {
	this.runConformTest(
		new String[] {
			/* X.java */
			"p/X.java",
			"package p; \n" +
			"public class X extends q.Y { \n" +
			"	void bar(){ foo(); } \n"+
			"	public static void main(String[] argv){ \n" +
			"		new X().bar();\n"+
			"		System.out.println(\"SUCCESS\");\n"+
			"	}\n"+
			"}\n",
			/* Y.java */
			"q/Y.java",
			"package q; \n" +
			"public class Y { \n" +
			"	protected Object foo(){ return null;} \n" +
			"}\n"
		},
		"SUCCESS"
	);
}

public void test025() {
	this.runConformTest(
		new String[] {
			/* PortReport.java */
			"PortReport.java",
			"import java.util.*; \n"+
			"public class PortReport { \n"+
			"	public static void main(String[] args) { \n"+
			"		Portfolio port = new Portfolio(\"foobar\"); \n"+
			"		System.out.println(\"SUCCESS\"); \n" +
			"	} \n"+
			"} \n",
			/* Portfolio.java */
			"Portfolio.java",
			"import java.util.*;	\n"+
			"public class Portfolio {	\n"+
			"	String name;	\n"+
			"	public Portfolio(String buf) {	\n"+
			"		TokenBuffer tbuf = new TokenBuffer();	\n"+
			"		switch (1) {	\n"+
			"			case TokenBuffer.T_NAME :	\n"+
			"				name = \"figi\";	\n"+
			"		}	\n"+
			"	}	\n"+
			"	String getName() {	\n"+
			"		return name;	\n"+
			"	}	\n"+
			"	class TokenBuffer {	\n"+
			"		static final int T_NAME = 3;	\n"+
			"	}	\n"+
			"}	\n"
		},
		"SUCCESS"
	);
}
/**
 * Compatability - Compiler does not comply with 1.1 standard.
 */
public void test026() {
	this.runConformTest(
		new String[] {
			/* Test.java */
			"p2/Test.java",
			"package p2;	\n"+
			"public class Test {	\n"+
			"	public static void main (String args[]){	\n"+
			"		new c2();	\n"+
			"	}	\n"+
			"}	\n",
			/* c1.java */
			"p1/c1.java",
			"package p1;	\n"+
			"public class c1 {	\n"+
			"	protected class c1a{	\n"+
			"		public c1a(){}	\n"+
			"		public void foo(){ System.out.println(\"Foo called\");	\n"+
			"		}	\n"+
			"	};	\n"+
			"}	\n",
			/* c2.java */
			"p2/c2.java",
			"package p2;	\n"+
			"import p1.*;	\n"+
			"public class c2 extends c1 {	\n"+
			"	public c1a myC1a;	\n"+
			"	{	\n"+
			"		myC1a = new c1a();	\n"+
			"		myC1a.foo();	\n"+
			"	}	\n"+
			"}	\n"
		},
		"Foo called"
	);
}
/**
 * Compatability - Compiler does not comply with 1.1 standard.
 */
public void test027() {
	this.runNegativeTest(
		new String[] {
			/* Test.java */
			"p2/Test.java",
			"package p2;	\n"+
			"public class Test {	\n"+
			"	public static void main (String args[]){	\n"+
			"		new c2();	\n"+
			"	}	\n"+
			"}	\n",
			/* c1.java */
			"p1/c1.java",
			"package p1;	\n"+
			"public class c1 {	\n"+
			"	public class c1m {	\n"+
			"		protected class c1a{	\n"+
			"			public c1a(){}	\n"+
			"			public void foo(){ System.out.println(\"Foo called\");	\n"+
			"			}	\n"+
			"		};	\n"+
			"	};	\n"+
			"}	\n",
			/* c2.java */
			"p2/c2.java",
			"package p2;	\n"+
			"import p1.*;	\n"+
			"public class c2 extends c1 {	\n"+
			"	public c1m.c1a myC1a;	\n"+
			"	{	\n"+
			"		myC1a = new c1m().new c1a();	\n"+
			"		myC1a.foo();	\n"+
			"	}	\n"+
			"}	\n"
		},
		"----------\n" +
		"1. ERROR in p2\\c2.java (at line 4)\n" +
		"	public c1m.c1a myC1a;	\n" +
		"	       ^^^^^^^\n" +
		"The type c1m.c1a is not visible\n" +
		"----------\n" +
		"2. ERROR in p2\\c2.java (at line 6)\n" +
		"	myC1a = new c1m().new c1a();	\n" +
		"	                      ^^^\n" +
		"The type c1.c1m.c1a is not visible\n" +
		"----------\n" +
		"3. ERROR in p2\\c2.java (at line 7)\n" +
		"	myC1a.foo();	\n" +
		"	^^^^^\n" +
		"The type c1.c1m.c1a is not visible\n" +
		"----------\n");
}
/**
 * Compatability - Compiler does not comply with 1.1 standard.
 */
public void test028() {
	this.runNegativeTest(
		new String[] {
			/* Test.java */
			"p2/Test.java",
			"package p2;	\n"+
			"public class Test {	\n"+
			"	public static void main (String args[]){	\n"+
			"		new c2();	\n"+
			"	}	\n"+
			"}	\n",
			/* c1.java */
			"p1/c1.java",
			"package p1;	\n"+
			"public class c1 {	\n"+
			"	protected class c1m {	\n"+
			"		protected class c1a{	\n"+
			"			public c1a(){}	\n"+
			"			public void foo(){ System.out.println(\"Foo called\");	\n"+
			"			}	\n"+
			"		};	\n"+
			"	};	\n"+
			"}	\n",
			/* c2.java */
			"p2/c2.java",
			"package p2;	\n"+
			"import p1.*;	\n"+
			"public class c2 extends c1 {	\n"+
			"	public c1m.c1a myC1a;	\n"+
			"	{	\n"+
			"		myC1a = new c1m().new c1a();	\n"+
			"		myC1a.foo();	\n"+
			"	}	\n"+
			"}	\n"
		},
		"----------\n" +
		"1. ERROR in p2\\c2.java (at line 4)\n" +
		"	public c1m.c1a myC1a;	\n" +
		"	       ^^^^^^^\n" +
		"The type c1m.c1a is not visible\n" +
		"----------\n" +
		"2. ERROR in p2\\c2.java (at line 6)\n" +
		"	myC1a = new c1m().new c1a();	\n" +
		"	        ^^^^^^^^^\n" +
		"The constructor c1.c1m() is not visible\n" +
		"----------\n" +
		"3. ERROR in p2\\c2.java (at line 6)\n" +
		"	myC1a = new c1m().new c1a();	\n" +
		"	                      ^^^\n" +
		"The type c1.c1m.c1a is not visible\n" +
		"----------\n" +
		"4. ERROR in p2\\c2.java (at line 7)\n" +
		"	myC1a.foo();	\n" +
		"	^^^^^\n" +
		"The type c1.c1m.c1a is not visible\n" +
		"----------\n");
}
/**
 * Compatability - Compiler does not comply with 1.1 standard.
 */
public void test029() {
	this.runConformTest(
		new String[] {
			/* Test.java */
			"p2/Test.java",
			"package p2;	\n"+
			"public class Test {	\n"+
			"	public static void main (String args[]){	\n"+
			"		new c2();	\n"+
			"	}	\n"+
			"}	\n",
			/* c1.java */
			"p1/c1.java",
			"package p1;	\n"+
			"public class c1 {	\n"+
			"	protected class c1a{	\n"+
			"		public c1a(){}	\n"+
			"		public void foo(){ System.out.println(\"Foo called\");	\n"+
			"		}	\n"+
			"	};	\n"+
			"}	\n",
			/* c2.java */
			"p2/c2.java",
			"package p2;	\n"+
			"import p1.*;	\n"+
			"public class c2 extends c1 {	\n"+
			"	public c1.c1a myC1a;\n"+
			"	{	\n"+
			"		myC1a = new c1a();	\n"+
			"		myC1a.foo();	\n"+
			"	}	\n"+
			"}	\n"
		},
		"Foo called");
}
/**
 * Compatability - Compiler does not comply with 1.1 standard.
 */
public void test030() {
	this.runNegativeTest(
		new String[] {
			/* Test.java */
			"p2/Test.java",
			"package p2;	\n"+
			"public class Test {	\n"+
			"	public static void main (String args[]){	\n"+
			"		new c2();	\n"+
			"	}	\n"+
			"}	\n",
			/* c1.java */
			"p1/c1.java",
			"package p1;	\n"+
			"public class c1 {	\n"+
			"	protected class c1a{	\n"+
			"		public c1a(){}	\n"+
			"		public void foo(){ System.out.println(\"Foo called\");	\n"+
			"		}	\n"+
			"	};	\n"+
			"}	\n",
			/* c2.java */
			"p2/c2.java",
			"package p2;	\n"+
			"import p1.*;	\n"+
			"public class c2 extends c1.c1a {// qualified acces does not work	\n"+
			"	public c1a myC1a; \n"+
			"	{	\n"+
			"		myC1a = new c1a();	\n"+
			"		myC1a.foo();	\n"+
			"	}	\n"+
			"}	\n"
		},
		"----------\n" +
		"1. ERROR in p2\\c2.java (at line 3)\n" +
		"	public class c2 extends c1.c1a {// qualified acces does not work	\n" +
		"	                        ^^^^^^\n" +
		"The type c1.c1a is not visible\n" +
		"----------\n" +
		"2. ERROR in p2\\c2.java (at line 4)\n" +
		"	public c1a myC1a; \n" +
		"	       ^^^\n" +
		"c1a cannot be resolved to a type\n" +
		"----------\n" +
		"3. ERROR in p2\\c2.java (at line 6)\n" +
		"	myC1a = new c1a();	\n" +
		"	^^^^^\n" +
		"c1a cannot be resolved to a type\n" +
		"----------\n" +
		"4. ERROR in p2\\c2.java (at line 6)\n" +
		"	myC1a = new c1a();	\n" +
		"	            ^^^\n" +
		"c1a cannot be resolved to a type\n" +
		"----------\n" +
		"5. ERROR in p2\\c2.java (at line 7)\n" +
		"	myC1a.foo();	\n" +
		"	^^^^^\n" +
		"c1a cannot be resolved to a type\n" +
		"----------\n");
}
/**
 * Compatibility - Compiler does not comply with 1.1 standard.
 */
public void test031() {
	this.runNegativeTest(
		new String[] {
			/* Test.java */
			"p2/Test.java",
			"package p2;	\n"+
			"public class Test {	\n"+
			"	public static void main (String args[]){	\n"+
			"		new c2();	\n"+
			"	}	\n"+
			"}	\n",
			/* c1.java */
			"p1/c1.java",
			"package p1;	\n"+
			"public class c1 {	\n"+
			"	protected class c1a{	\n"+
			"		public c1a(){}	\n"+
			"		public void foo(){ System.out.println(\"Foo called\");	\n"+
			"		}	\n"+
			"	};	\n"+
			"}	\n",
			/* c2.java */
			"p2/c2.java",
			"package p2;	\n"+
			"import p1.c1.*;	\n"+
			"public class c2 extends c1a {	\n"+
			"	public c1a myC1a; \n"+
			"	{	\n"+
			"		myC1a = new c1a();	\n"+
			"		myC1a.foo();	\n"+
			"	}	\n"+
			"}	\n"
		},
		"----------\n" +
		"1. ERROR in p2\\c2.java (at line 3)\n" +
		"	public class c2 extends c1a {	\n" +
		"	                        ^^^\n" +
		"The type c1a is not visible\n" +
		"----------\n" +
		"2. ERROR in p2\\c2.java (at line 4)\n" +
		"	public c1a myC1a; \n" +
		"	       ^^^\n" +
		"The type c1a is not visible\n" +
		"----------\n" +
		"3. ERROR in p2\\c2.java (at line 6)\n" +
		"	myC1a = new c1a();	\n" +
		"	            ^^^\n" +
		"The type c1a is not visible\n" +
		"----------\n" +
		"4. ERROR in p2\\c2.java (at line 7)\n" +
		"	myC1a.foo();	\n" +
		"	^^^^^\n" +
		"The type c1.c1a is not visible\n" +
		"----------\n");
}
/**
 * VerifyError using .class literal inside inner classes
 */
public void test032() {
	this.runConformTest(
		new String[] {
			"p/A.java",
			"package p;	\n"+
			"public class A {\n" +
			"		public class B {\n" +
			"				public B() {\n" +
			"				}\n" +
			"				public Class getCls() {\n" +
			"						return A.class;\n" +
			"				}\n" +
			"		}\n" +
			"		public A() {\n" +
			"				super();\n" +
			"				B b = new B();\n" +
			"				System.out.println(\"Class: \" + b.getCls());\n" +
			"		}\n" +
			"		public static void main(String[] args) {\n" +
			"				A a = new A();\n" +
			"		}\n" +
			"}\n"
		},
		"Class: class p.A");
}
/**
 * Missing implementation in the compiler compiling invalid code
 */
public void test033() {
	String errMessage = isMinimumCompliant(ClassFileConstants.JDK11) ?
			"----------\n" +
			"1. ERROR in p1\\A2.java (at line 20)\n" +
			"	(new D.E(null, null, null, new F(get()) {}) {}).execute();	\n" +
			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"No enclosing instance of type D is accessible. Must qualify the allocation with an enclosing instance of type D (e.g. x.new A() where x is an instance of D).\n" +
			"----------\n"
			:
			"----------\n" +
			"1. WARNING in p1\\A2.java (at line 18)\n" +
			"	private class C extends B {	\n" +
			"	              ^\n" +
			"Access to enclosing constructor A2.B() is emulated by a synthetic accessor method\n" +
			"----------\n" +
			"2. ERROR in p1\\A2.java (at line 20)\n" +
			"	(new D.E(null, null, null, new F(get()) {}) {}).execute();	\n" +
			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"No enclosing instance of type D is accessible. Must qualify the allocation with an enclosing instance of type D (e.g. x.new A() where x is an instance of D).\n" +
			"----------\n";
	this.runNegativeTest(
		new String[] {
			/* A2.java */
			"p1/A2.java",
			"package p1;	\n"+
			"class D {	\n"+
			"	class E {	\n"+
			"		E(Object o, Object o1, Object o2, F f) {}	\n"+
			"		void execute() {}	\n"+
			"	}	\n"+
			"}	\n"+
			"class F {	\n"+
			"	F(Object o) {	\n"+
			"	}	\n"+
			"}	\n"+
			"public class A2 {	\n"+
			"	private abstract class B {	\n"+
			"		public Object get() {	\n"+
			"			return null;	\n"+
			"		}	\n"+
			"	}	\n"+
			"	private class C extends B {	\n"+
			"		public void foo() {	\n"+
			"			(new D.E(null, null, null, new F(get()) {}) {}).execute();	\n"+
			"		}	\n"+
			"	}	\n"+
			"}\n"
		},
		errMessage);
}
/**
 * Missing implementation in the compiler compiling invalid code
 */
public void test034() {
	this.runConformTest(
		new String[] {
			/* A2.java */
			"p1/A2.java",
			"package p1;	\n"+
			"class D {	\n"+
			"	class E {	\n"+
			"		E(Object o, Object o1, Object o2, F f) {}	\n"+
			"		void execute() {}	\n"+
			"	}	\n"+
			"}	\n"+
			"class F {	\n"+
			"	F(Object o) {	\n"+
			"	}	\n"+
			"}	\n"+
			"public class A2 {	\n"+
			"	private abstract class B {	\n"+
			"		public Object get() {	\n"+
			"			return null;	\n"+
			"		}	\n"+
			"	}	\n"+
			"	private class C extends B {	\n"+
			"		public void foo() {	\n"+
			"			(new D().new E(null, null, null, new F(get()) {}) {}).execute();	\n"+
			"		}	\n"+
			"	}	\n"+
			"	public static void main(String[] argv){	\n"+
			"		new A2().new C().foo();	\n"+
			"		System.out.println(\"SUCCESS\");	\n"+
			"	}	\n"+
			"}	\n"
		},
		"SUCCESS"
	);
}
/**
 * Missing implementation in the compiler compiling invalid code
 */
public void test035() {
	String errMessage = isMinimumCompliant(ClassFileConstants.JDK11) ?
			"----------\n" +
			"1. ERROR in p1\\A2.java (at line 20)\n" +
			"	(new D.E(null, null, null, new F(get()) {})).execute();	\n" +
			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"No enclosing instance of type D is accessible. Must qualify the allocation with an enclosing instance of type D (e.g. x.new A() where x is an instance of D).\n" +
			"----------\n"
			:
			"----------\n" +
			"1. WARNING in p1\\A2.java (at line 18)\n" +
			"	private class C extends B {	\n" +
			"	              ^\n" +
			"Access to enclosing constructor A2.B() is emulated by a synthetic accessor method\n" +
			"----------\n" +
			"2. ERROR in p1\\A2.java (at line 20)\n" +
			"	(new D.E(null, null, null, new F(get()) {})).execute();	\n" +
			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"No enclosing instance of type D is accessible. Must qualify the allocation with an enclosing instance of type D (e.g. x.new A() where x is an instance of D).\n" +
			"----------\n";			
	this.runNegativeTest(new String[] {
			/* A2.java */
			"p1/A2.java",
			"package p1;	\n"+
			"class D {	\n"+
			"	class E {	\n"+
			"		E(Object o, Object o1, Object o2, F f) {}	\n"+
			"		void execute() {}	\n"+
			"	}	\n"+
			"}	\n"+
			"class F {	\n"+
			"	F(Object o) {	\n"+
			"	}	\n"+
			"}	\n"+
			"public class A2 {	\n"+
			"	private abstract class B {	\n"+
			"		public Object get() {	\n"+
			"			return null;	\n"+
			"		}	\n"+
			"	}	\n"+
			"	private class C extends B {	\n"+
			"		public void foo() {	\n"+
			"			(new D.E(null, null, null, new F(get()) {})).execute();	\n"+
			"		}	\n"+
			"	}	\n"+
			"}\n"},
		errMessage);
}
/**
 * ClassCastException during inner class emulation
 */
public void test036() {
	this.runConformTest(
		new String[] {
			/* A.java */
			"p1/A.java",
			"package p1;	\n"+
			"public class A {	\n"+
			"	public static void main(String[] argv){	\n"+
			"		new A().foo();	\n"+
			"		System.out.println(\"SUCCESS\");	\n"+
			"	}	\n"+
			"	public Object foo() {	\n"+
			"		B b = new B() {	\n"+
			"			protected Object bar() {	\n"+
			"				return new B.C() {};	\n"+
			"			}	\n"+
			"		};	\n"+
			"		return b;	\n"+
			"	}	\n"+
			"}	\n"+
			"class B {	\n"+
			"	class C {	\n"+
			"	}	\n"+
			"}	\n"
		},
		"SUCCESS"
	);
}
/**
 * ClassCastException during inner class emulation
 */
public void test037() {
	this.runConformTest(
		new String[] {
			/* A.java */
			"p1/A.java",
			"package p1;	\n"+
			"public class A {	\n"+
			"	public static void main(String[] argv){	\n"+
			"		new A().foo();	\n"+
			"		System.out.println(\"SUCCESS\");	\n"+
			"	}	\n"+
			"	public Object foo() {	\n"+
			"		I i = new I() {	\n"+
			"			protected Object bar() {	\n"+
			"				return new I.C() {};	\n"+
			"			}	\n"+
			"		};	\n"+
			"		return i;	\n"+
			"	}	\n"+
			"}	\n"+
			"interface I {	\n"+
			"	class C {	\n"+
			"	}	\n"+
			"}	\n"
		},
		"SUCCESS"
	);
}

/**
 * Enclosing instance comparison
 */
public void test038() {
	this.runConformTest(
		new String[] {
			/* X.java */
			"X.java",
			"public class X {	\n"+
			"	public static void main(String argv[]) {	\n"+
			"		if (new X().foo())	\n"+
			"			System.out.println(\"FAILED\");	\n"+
			"		System.out.println(\"SUCCESS\");	\n"+
			"	}	\n"+
			"	boolean bar() {	\n"+
			"		return false;	\n"+
			"	}	\n"+
			"	boolean foo() {	\n"+
			"		X x = new X() {	\n"+
			"			boolean test() {	\n"+
			"				return (X.this == this);	\n"+
			"			}	\n"+
			"		};	\n"+
			"		return x.bar();	\n"+
			"	}	\n"+
			"}	\n"
		},
		"SUCCESS"
	);
}

/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
 * Invalid error when compiling access to protected member inside innerclass
 */
public void test039() {
	this.runConformTest(
		new String[] {
			/* p1/X.java */
			"p1/X.java",
			"package p1;	\n"+
			"public class X {	\n"+
			"	protected void foo() {	\n"+
			"		System.out.println(\"SUCCESS\");	\n"+
			"	}	\n"+
			"	public static void main(String argv[]) {	\n"+
			"		new p2.Y().bar();	\n"+
			"	}	\n"+
			"}	\n",
			/* p2/Y.java */
			"p2/Y.java",
			"package p2;	\n"+
			"public class Y extends p1.X {	\n"+
			"	public void bar() {	\n"+
			"		new Object(){	\n"+
			"	      void doSomething(){	\n"+
			"	        Y.this.foo(); \n"+
			"	      }	\n"+
			"	    }.doSomething();	\n"+
			"	}	\n"+
			"}	\n",
		},
		"SUCCESS"
	);
}

/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
 * Invalid error when compiling access to protected member inside innerclass
 */
public void test040() {
	this.runConformTest(
		new String[] {
			/* p1/X.java */
			"p1/X.java",
			"package p1;	\n"+
			"public class X {	\n"+
			"	protected void foo() {	\n"+
			"		System.out.println(\"SUCCESS\");	\n"+
			"	}	\n"+
			"	public static void main(String argv[]) {	\n"+
			"		new p2.Y().bar();	\n"+
			"	}	\n"+
			"}	\n",
			/* p2/Y.java */
			"p2/Y.java",
			"package p2;	\n"+
			"public class Y extends p1.X {	\n"+
			"	public void bar() {	\n"+
			"		new Object(){	\n"+
			"	      void doSomething(){	\n"+
			"	        new Y().foo(); \n"+
			"	      }	\n"+
			"	    }.doSomething();	\n"+
			"	}	\n"+
			"}	\n",
		},
		"SUCCESS"
	);
}

/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
 * Invalid error when compiling access to protected member inside innerclass
 */
public void test041() {
	this.runConformTest(
		new String[] {
			/* p1/X.java */
			"p1/X.java",
			"package p1;	\n"+
			"public class X {	\n"+
			"	protected void foo() {	\n"+
			"		System.out.println(\"SUCCESS\");	\n"+
			"	}	\n"+
			"	public static void main(String argv[]) {	\n"+
			"		new p2.Y().bar();	\n"+
			"	}	\n"+
			"}	\n",
			/* p2/Y.java */
			"p2/Y.java",
			"package p2;	\n"+
			"public class Y extends p1.X {	\n"+
			"	public void bar() {	\n"+
			"		new Object(){	\n"+
			"	      void doSomething(){	\n"+
			"	        Y.super.foo(); \n"+
			"	      }	\n"+
			"	    }.doSomething();	\n"+
			"	}	\n"+
			"}	\n",
		},
		"SUCCESS"
	);
}

/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
 * Invalid error when compiling access to protected member inside innerclass
 */
public void test042() {
	this.runConformTest(
		new String[] {
			/* p1/X.java */
			"p1/X.java",
			"package p1;	\n"+
			"public class X {	\n"+
			"	protected String foo = \"SUCCESS\";	\n"+
			"	public static void main(String argv[]) {	\n"+
			"		new p2.Y().bar();	\n"+
			"	}	\n"+
			"}	\n",
			/* p2/Y.java */
			"p2/Y.java",
			"package p2;	\n"+
			"public class Y extends p1.X {	\n"+
			"	public void bar() {	\n"+
			"		new Object(){	\n"+
			"	      void doSomething(){	\n"+
			"	        System.out.println(Y.super.foo); \n"+
			"	      }	\n"+
			"	    }.doSomething();	\n"+
			"	}	\n"+
			"}	\n",
		},
		"SUCCESS"
	);
}

/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
 * Invalid error when compiling access to protected member inside innerclass
 */
public void test043() {
	this.runConformTest(
		new String[] {
			/* p1/X.java */
			"p1/X.java",
			"package p1;	\n"+
			"public class X {	\n"+
			"	protected String foo = \"SUCCESS\";	\n"+
			"	public static void main(String argv[]) {	\n"+
			"		new p2.Y().bar();	\n"+
			"	}	\n"+
			"}	\n",
			/* p2/Y.java */
			"p2/Y.java",
			"package p2;	\n"+
			"public class Y extends p1.X {	\n"+
			"	public void bar() {	\n"+
			"		new Object(){	\n"+
			"	      void doSomething(){	\n"+
			"	        System.out.println(Y.this.foo); \n"+
			"	      }	\n"+
			"	    }.doSomething();	\n"+
			"	}	\n"+
			"}	\n",
		},
		"SUCCESS"
	);
}

/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
 * Invalid error when compiling access to protected member inside innerclass
 */
public void test044() {
	this.runConformTest(
		new String[] {
			/* p1/X.java */
			"p1/X.java",
			"package p1;	\n"+
			"public class X {	\n"+
			"	protected String foo = \"SUCCESS\";	\n"+
			"	public static void main(String argv[]) {	\n"+
			"		new p2.Y().bar();	\n"+
			"	}	\n"+
			"}	\n",
			/* p2/Y.java */
			"p2/Y.java",
			"package p2;	\n"+
			"public class Y extends p1.X {	\n"+
			"	public void bar() {	\n"+
			"		new Object(){	\n"+
			"	      void doSomething(){	\n"+
			"	        System.out.println(new Y().foo); \n"+
			"	      }	\n"+
			"	    }.doSomething();	\n"+
			"	}	\n"+
			"}	\n",
		},
		"SUCCESS"
	);
}

/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
 * Invalid error when compiling access to protected member inside innerclass
 */
public void test045() {
	this.runConformTest(
		new String[] {
			/* p1/X.java */
			"p1/X.java",
			"package p1;	\n"+
			"public class X {	\n"+
			"	protected String foo = \"SUCCESS\";	\n"+
			"	public static void main(String argv[]) {	\n"+
			"		new p2.Y().bar();	\n"+
			"	}	\n"+
			"}	\n",
			/* p2/Y.java */
			"p2/Y.java",
			"package p2;	\n"+
			"public class Y extends p1.X {	\n"+
			"	public void bar() {	\n"+
			"		new Object(){	\n"+
			"	      void doSomething(){	\n"+
			"	        System.out.println(foo); \n"+
			"	      }	\n"+
			"	    }.doSomething();	\n"+
			"	}	\n"+
			"}	\n",
		},
		"SUCCESS"
	);
}

/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
 * Invalid error when compiling access to protected member inside innerclass
 */
public void test046() {
	this.runConformTest(
		new String[] {
			/* p1/X.java */
			"p1/X.java",
			"package p1;	\n"+
			"public class X {	\n"+
			"	protected String foo = \"SUCCESS\";	\n"+
			"	public static void main(String argv[]) {	\n"+
			"		new p2.Y().bar();	\n"+
			"	}	\n"+
			"}	\n",
			/* p2/Y.java */
			"p2/Y.java",
			"package p2;	\n"+
			"public class Y extends p1.X {	\n"+
			"   Y someY;	\n"+
			"	public void bar() {	\n"+
			"		someY = this;	\n"+
			"		new Object(){	\n"+
			"	      void doSomething(){	\n"+
			"	        System.out.println(someY.foo); \n"+
			"	      }	\n"+
			"	    }.doSomething();	\n"+
			"	}	\n"+
			"}	\n",
		},
		"SUCCESS"
	);
}
/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
 * Invalid error when compiling access to protected member inside innerclass
 */
public void test047() {
	this.runConformTest(
		new String[] {
			/* p1/X.java */
			"p1/X.java",
			"package p1;	\n"+
			"public class X {	\n"+
			"	protected String foo = \"FAILED\";	\n"+
			"	public static void main(String argv[]) {	\n"+
			"		new p2.Y().bar();	\n"+
			"	}	\n"+
			"}	\n",
			/* p2/Y.java */
			"p2/Y.java",
			"package p2;	\n"+
			"public class Y extends p1.X {	\n"+
			"	public void bar() {	\n"+
			"		new Object(){	\n"+
			"	      void doSomething(){	\n"+
			"	        System.out.println(Y.super.foo = \"SUCCESS\"); \n"+
			"	      }	\n"+
			"	    }.doSomething();	\n"+
			"	}	\n"+
			"}	\n",
		},
		"SUCCESS"
	);
}

/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
 * Invalid error when compiling access to protected member inside innerclass
 */
public void test048() {
	this.runConformTest(
		new String[] {
			/* p1/X.java */
			"p1/X.java",
			"package p1;	\n"+
			"public class X {	\n"+
			"	protected String foo = \"FAILED\";	\n"+
			"	public static void main(String argv[]) {	\n"+
			"		new p2.Y().bar();	\n"+
			"	}	\n"+
			"}	\n",
			/* p2/Y.java */
			"p2/Y.java",
			"package p2;	\n"+
			"public class Y extends p1.X {	\n"+
			"	public void bar() {	\n"+
			"		new Object(){	\n"+
			"	      void doSomething(){	\n"+
			"	        System.out.println(Y.this.foo = \"SUCCESS\"); \n"+
			"	      }	\n"+
			"	    }.doSomething();	\n"+
			"	}	\n"+
			"}	\n",
		},
		"SUCCESS"
	);
}

/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
 * Invalid error when compiling access to protected member inside innerclass
 */
public void test049() {
	this.runConformTest(
		new String[] {
			/* p1/X.java */
			"p1/X.java",
			"package p1;	\n"+
			"public class X {	\n"+
			"	protected String foo = \"FAILED\";	\n"+
			"	public static void main(String argv[]) {	\n"+
			"		new p2.Y().bar();	\n"+
			"	}	\n"+
			"}	\n",
			/* p2/Y.java */
			"p2/Y.java",
			"package p2;	\n"+
			"public class Y extends p1.X {	\n"+
			"	public void bar() {	\n"+
			"		new Object(){	\n"+
			"	      void doSomething(){	\n"+
			"	        System.out.println(new Y().foo = \"SUCCESS\"); \n"+
			"	      }	\n"+
			"	    }.doSomething();	\n"+
			"	}	\n"+
			"}	\n",
		},
		"SUCCESS"
	);
}

/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
 * Invalid error when compiling access to protected member inside innerclass
 */
public void test050() {
	this.runConformTest(
		new String[] {
			/* p1/X.java */
			"p1/X.java",
			"package p1;	\n"+
			"public class X {	\n"+
			"	protected String foo = \"FAILED\";	\n"+
			"	public static void main(String argv[]) {	\n"+
			"		new p2.Y().bar();	\n"+
			"	}	\n"+
			"}	\n",
			/* p2/Y.java */
			"p2/Y.java",
			"package p2;	\n"+
			"public class Y extends p1.X {	\n"+
			"	public void bar() {	\n"+
			"		new Object(){	\n"+
			"	      void doSomething(){	\n"+
			"	        System.out.println(foo = \"SUCCESS\"); \n"+
			"	      }	\n"+
			"	    }.doSomething();	\n"+
			"	}	\n"+
			"}	\n",
		},
		"SUCCESS"
	);
}

/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
 * Invalid error when compiling access to protected member inside innerclass
 */
public void test051() {
	this.runConformTest(
		new String[] {
			/* p1/X.java */
			"p1/X.java",
			"package p1;	\n"+
			"public class X {	\n"+
			"	protected String foo = \"FAILED\";	\n"+
			"	public static void main(String argv[]) {	\n"+
			"		new p2.Y().bar();	\n"+
			"	}	\n"+
			"}	\n",
			/* p2/Y.java */
			"p2/Y.java",
			"package p2;	\n"+
			"public class Y extends p1.X {	\n"+
			"   Y someY;	\n"+
			"	public void bar() {	\n"+
			"		someY = this;	\n"+
			"		new Object(){	\n"+
			"	      void doSomething(){	\n"+
			"	        System.out.println(someY.foo = \"SUCCESS\"); \n"+
			"	      }	\n"+
			"	    }.doSomething();	\n"+
			"	}	\n"+
			"}	\n",
		},
		"SUCCESS"
	);
}


public void test052() {
	this.runConformTest(
		new String[] {
			/* p2/Y.java */
			"p2/Y.java",
			"package p2;	\n"+
			"public class Y {	\n"+
			"	void bar(final int someVal){	\n"+
			"		class Local {	\n"+
			"			void localDo(final int localVal){	\n"+
			"				new Object(){	\n"+
			"					void doSomething(){	\n"+
			"						System.out.print(someVal + localVal);	\n"+
			"					}	\n"+
			"				}.doSomething();	\n"+
			"			}				\n"+
			"		};	\n"+
			"		Local loc = new Local();	\n"+
			"		loc.localDo(8);	\n"+
			"		class SubLocal extends Local {	\n"+
			"			void localDo(final int localVal){	\n"+
			"				super.localDo(localVal + 1);	\n"+
			"				new Object(){	\n"+
			"					void doSomething(){	\n"+
			"						SubLocal.super.localDo(localVal + 2);	\n"+
			"						System.out.print(someVal + localVal + 3);	\n"+
			"					}	\n"+
			"				}.doSomething();	\n"+
			"			}	\n"+
			"		};	\n"+
			"		SubLocal subloc = new SubLocal();	\n"+
			"		subloc.localDo(8);	\n"+
			"	}	\n"+
			"	public static void main(String[] arguments) {	\n"+
			"		new Y().bar(4);	\n"+
			"		System.out.println();	\n"+
			"	}	\n"+
			"}	\n",
		},
		"12131415"
	);
}

public void test053() {
	this.runConformTest(
		new String[] {
			/* p2/Z.java */
			"p2/Z.java",
			"package p2;	\n"+
			"import p1.X;	\n"+
			"public class Z {	\n"+
			"	class ZMember extends X {	\n"+
			"		ZMember(Object o){}	\n"+
			"		Z bar(){	\n"+
			"			System.out.println(foo = \"FAILED\");	\n"+
			"			return Z.this;	\n"+
			"		}	\n"+
			"	}	\n"+
			"	Z(final Object foo){	\n"+
			"		Object obj2 = new Object(){	\n"+
			"			Object doSomething(){	\n"+
			"				ZMember obj3 = new ZMember(foo){	\n"+
			"					Z bar(){	\n"+
			"						System.out.println(this.foo);	\n"+
			"						return Z.this;	\n"+
			"					} \n"+
			"				};	\n"+
			"				obj3.bar();	\n"+
			"				return this;	\n"+
			"			}	\n"+
			"		}.doSomething();	\n"+
			"	}		\n"+
			"	public static void main(String[] arguments) {	\n"+
			"		new Z(new Object());	\n"+
			"	}	\n"+
			"}	\n",
			/* p1/X.java */
			"p1/X.java",
			"package p1;	\n"+
			"public class X {	\n"+
			"	protected String foo = \"SUCCESS\";	\n"+
			"}	\n"
		},
		"SUCCESS"
	);
}
public void test055() {
	this.runNegativeTest(
		new String[] {
			/* p1/X.java */
			"p1/X.java",
			"package p1;	\n"+
			"public class X {	\n"+
			"	void foo() {	\n"+
			"		class L1 {	\n"+
			"			class LM1 {	\n"+
			"			}	\n"+
			"		}	\n"+
			"		class L2 extends L1.LM1 {	\n"+
			"		}	\n"+
			"		new L2();	\n"+
			"	}	\n"+
			"	public static void main(String[] arguments) {	\n"+
			"		new X().foo();	\n"+
			"	}	\n"+
			"}	\n",
		},
		"----------\n" +
		"1. ERROR in p1\\X.java (at line 8)\n" +
		"	class L2 extends L1.LM1 {	\n" +
		"	      ^^\n" +
		"No enclosing instance of type L1 is accessible to invoke the super constructor. Must define a constructor and explicitly qualify its super constructor invocation with an instance of L1 (e.g. x.super() where x is an instance of L1).\n" +
		"----------\n"

	);
}

public void test056() {
	this.runNegativeTest(
		new String[] {
			/* p1/X.java */
			"p1/X.java",
			"package p1;	\n"+
			"public class X {	\n"+
			"	void foo() {	\n"+
			"		class L1 {	\n"+
			"			class LM1 {	\n"+
			"			}	\n"+
			"		}	\n"+
			"		new L1().new LM1(){};	//ok\n"+
			"		new L1.LM1(){};	//ko\n"+
			"	}	\n"+
			"	public static void main(String[] arguments) {	\n"+
			"		new X().foo();	\n"+
			"	}	\n"+
			"}	\n",
		},
		"----------\n" +
		"1. ERROR in p1\\X.java (at line 9)\n" +
		"	new L1.LM1(){};	//ko\n" +
		"	^^^^^^^^^^^^^^\n" +
		"No enclosing instance of type L1 is accessible. Must qualify the allocation with an enclosing instance of type L1 (e.g. x.new A() where x is an instance of L1).\n" +
		"----------\n"
	);
}

/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=9813
 * VerifyError with Inner Class having private constructor
 */
public void test057() {
	this.runConformTest(
		new String[] {
			/* VE_Test.java */
			"VE_Test.java",
			"public class VE_Test {	\n"+
			"    class VE_Inner {	\n"+
			"        private VE_Inner() {}	\n"+
			"    }	\n"+
			"    private static void test(){	\n"+
			"        VE_Test ve_test = new VE_Test();	\n"+
			"        VE_Inner pi = ve_test.new VE_Inner();	\n"+
			"    }	\n"+
			"    public static void main(String[] args){	\n"+
			"        new VE_Test();	\n"+
			"        System.out.println(\"SUCCESS\");	\n"+
			"    }	\n"+
			"}	\n",
		},
		"SUCCESS"
	);
}

/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=11845
 * NPE during emulation
 */
public void test058() {
	this.runConformTest(
		new String[] {
			"p1/Test.java",
			"package p1;	\n"+
			"import p2.A;	\n"+
			"public class Test {	\n"+
			"    public static void main(String[] args){	\n"+
			"        new Test().a.bar();	\n"+
			"    }	\n"+
			"	private A a = new A() {	\n"+
			"		public void bar() {	\n"+
			"			new Object() {	\n"+
			"				protected void foo() {	\n"+
			"					init();	\n"+
			"				}	\n"+
			"			}.foo(); 	\n"+
			"		}	\n"+
			"	};	\n"+
			"	private void init() {	\n"+
			"		System.out.println(\"SUCCESS\");	\n"+
			"	}	\n" +
			"}	\n",
			"p2/A.java",
			"package p2;	\n"+
			"public class A {	\n"+
			"  public void bar() {	\n"+
			"  }	\n"+
			"  private void init() {	\n"+
			"		System.out.println(\"FAILED\");	\n"+
			"  }	\n"+
			"} 	\n"
		},
		"SUCCESS"
	);
}

/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=11845
 * variant for single name ref
 */
public void test059() {
	this.runConformTest(
		new String[] {
			"p1/Test.java",
			"package p1;	\n"+
			"import p2.A;	\n"+
			"public class Test {	\n"+
			"    public static void main(String[] args){	\n"+
			"        new Test().a.bar();	\n"+
			"    }	\n"+
			"	private A a = new A() {	\n"+
			"		public void bar() {	\n"+
			"			new Object() {	\n"+
			"				protected void foo() {	\n"+
			"					System.out.println(init);	\n"+
			"				}	\n"+
			"			}.foo(); 	\n"+
			"		}	\n"+
			"	};	\n"+
			"	private String init = \"SUCCESS\";	\n"+
			"}	\n",
			"p2/A.java",
			"package p2;	\n"+
			"public class A {	\n"+
			"  public void bar() {	\n"+
			"  }	\n"+
			"	private String init = \"FAILED\";	\n"+
			"} 	\n"
		},
		"SUCCESS"
	);
}
/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=11845
 * variant for qualified name ref
 */
public void test060() {
	this.runConformTest(
		new String[] {
			"p1/Test.java",
			"package p1;	\n"+
			"import p2.A;	\n"+
			"public class Test {	\n"+
			"    public static void main(String[] args){	\n"+
			"        new Test().a.bar();	\n"+
			"    }	\n"+
			"	private A a = new A() {	\n"+
			"		public void bar() {	\n"+
			"			class L {	\n"+
			"				Test next = Test.this;	\n"+
			"				protected void foo() {	\n"+
			"					System.out.println(next.init);	\n"+
			"				}	\n"+
			"			};	\n" +
			"			new L().foo(); 	\n"+
			"		}	\n"+
			"	};	\n"+
			"	private String init = \"SUCCESS\";	\n"+
			"}	\n",
			"p2/A.java",
			"package p2;	\n"+
			"public class A {	\n"+
			"  public void bar() {	\n"+
			"  }	\n"+
			"} 	\n"
		},
		"SUCCESS"
	);
}
/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=11845
 * variant for field name ref
 */
public void test061() {
	this.runConformTest(
		new String[] {
			"p1/Test.java",
			"package p1;	\n"+
			"import p2.A;	\n"+
			"public class Test {	\n"+
			"    public static void main(String[] args){	\n"+
			"        new Test().a.bar();	\n"+
			"    }	\n"+
			"	private A a = new A() {	\n"+
			"		public void bar() {	\n"+
			"			class L {	\n"+
			"				protected void foo() {	\n"+
			"					System.out.println(Test.this.init);	\n"+
			"				}	\n"+
			"			};	\n" +
			"			new L().foo(); 	\n"+
			"		}	\n"+
			"	};	\n"+
			"	private String init = \"SUCCESS\";	\n"+
			"}	\n",
			"p2/A.java",
			"package p2;	\n"+
			"public class A {	\n"+
			"  public void bar() {	\n"+
			"  }	\n"+
			"} 	\n"
		},
		"SUCCESS"
	);
}

public void test062() {
	this.runConformTest(
		new String[] {
			"p1/X.java",
			"package p1;	\n"+
			"public class X {	\n"+
			"    public static void main(String args[]) {	\n"+
			"		final String s = args.length == 0 ? \"SUCCESS\" : null;	\n"+
			"		final class Local {	\n"+
			"			private Local() {	\n"+
			"				new LocalMember();	\n"+
			"			}	\n"+
			"			class LocalMember {	\n"+
			"				{	\n"+
			"					new LocalMemberMember();	\n"+
			"				}	\n"+
			"				class LocalMemberMember {	\n"+
			"					{	\n"+
			"						System.out.println(s);	\n"+
			"					}	\n"+
			"				}	\n"+
			"			}	\n"+
			"		}	\n"+
			"		new Local();	\n"+
			"    }	\n"+
			"}	\n"
		},
		"SUCCESS"
	);
}

public void test062a() {
	this.runConformTest(
		new String[] {
			"p1/X.java",
			"package p1;	\n"+
			"public class X {	\n"+
			"    public static void main(String args[]) {	\n"+
			"		final String s = \"SUCCESS\";\n"+
			"		final class Local {	\n"+
			"			Local() {	\n"+
			"				new LocalMember();	\n"+
			"			}	\n"+
			"			class LocalMember {	\n"+
			"				{	\n"+
			"					new LocalMemberMember();	\n"+
			"				}	\n"+
			"				class LocalMemberMember {	\n"+
			"					{	\n"+
			"						System.out.println(s);	\n"+
			"					}	\n"+
			"				}	\n"+
			"			}	\n"+
			"		}	\n"+
			"		new Local();	\n"+
			"    }	\n"+
			"}	\n"
		},
		"SUCCESS"
	);
}

public void test063() {
	this.runConformTest(
		new String[] {
			"p1/X.java",
			"package p1;	\n"+
			"public class X {	\n"+
			"	String a = new Object(){	\n"+
			"			class LocalMember {	\n"+
			"				String s = \"SUCCESS\";	\n"+
			"			};	\n"+
			"			String get_a(){	\n"+
			"				return new LocalMember().s;	\n"+
			"			}	\n"+
			"	}.get_a();	\n"+
			"	public static void main(String argv[]) {	\n"+
			"		System.out.println(new X().a);	\n"+
			"	}	\n"+
			"}	\n"
		},
		"SUCCESS"
		);
}

/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=21447
 * should invoke Y.foo() at runtime
 */
public void test064(){
	this.runConformTest(
		new String[] {
			"p2/Y.java",
			"package p2;	\n"+
			"public class Y extends T {	\n"+
			"	public static void main(String argv[]) {	\n"+
			"		new Y().bar();	\n"+
			"	}	\n"+
			"	protected void foo() {	\n"+
			"		System.out.println(\"Y.foo()\");	\n"+
			"	}	\n"+
			"}	\n",
			"p1/X.java",
			"package p1;	\n"+
			"public class X {	\n"+
			"	protected void foo() {	\n"+
			"		System.out.println(\"X.foo()\");	\n"+
			"	}	\n"+
			"}	\n",
			"p2/T.java",
			"package p2;	\n"+
			"public class T extends p1.X {	\n"+
			"	public void bar() {	\n"+
			"		new Object(){	\n"+
			"			void doSomething(){	\n" +
			"				T.this.foo();	\n"+
			"			}	\n" +
			"		}.doSomething();	\n" +
			"	}	\n"+
			"}	\n",
		},
		"Y.foo()"
		);
}

/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=21447
 * variation - if T.foo() is defined
 */
public void test065(){
	this.runConformTest(
		new String[] {
			"p2/Y.java",
			"package p2;	\n"+
			"public class Y extends T {	\n"+
			"	public static void main(String argv[]) {	\n"+
			"		new Y().bar();	\n"+
			"	}	\n"+
			"	protected void foo() {	\n"+
			"		System.out.println(\"Y.foo()\");	\n"+
			"	}	\n"+
			"}	\n",
			"p1/X.java",
			"package p1;	\n"+
			"public class X {	\n"+
			"	protected void foo() {	\n"+
			"		System.out.println(\"X.foo()\");	\n"+
			"	}	\n"+
			"}	\n",
			"p2/T.java",
			"package p2;	\n"+
			"public class T extends p1.X {	\n"+
			"	public void bar() {	\n"+
			"		new Object(){	\n"+
			"			void doSomething(){	\n" +
			"				T.this.foo();	\n"+
			"			}	\n" +
			"		}.doSomething();	\n" +
			"	}	\n"+
			"	protected void foo() {	\n"+
			"		System.out.println(\"T.foo()\");	\n"+
			"	}	\n"+
			"}	\n",
		},
		"Y.foo()"
		);
}
/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=21447
 * should invoke Y.foo() and X.foo() at runtime (through 2 separate access methods)
 */
public void test066(){
	this.runConformTest(
		new String[] {
			"p2/Y.java",
			"package p2;	\n"+
			"public class Y extends T {	\n"+
			"	public static void main(String argv[]) {	\n"+
			"		new Y().bar();	\n"+
			"	}	\n"+
			"	protected void foo() {	\n"+
			"		System.out.print(\"Y.foo()-\");	\n"+
			"	}	\n"+
			"}	\n",
			"p1/X.java",
			"package p1;	\n"+
			"public class X {	\n"+
			"	protected void foo() {	\n"+
			"		System.out.println(\"X.foo()\");	\n"+
			"	}	\n"+
			"}	\n",
			"p2/T.java",
			"package p2;	\n"+
			"public class T extends p1.X {	\n"+
			"	public void bar() {	\n"+
			"		new Object(){	\n"+
			"			void doSomething(){	\n" +
			"				T.this.foo();	\n"+
			"				T.super.foo();	//need extra access method \n"+
			"			}	\n" +
			"		}.doSomething();	\n" +
			"	}	\n"+
			"}	\n",
		},
		"Y.foo()-X.foo()"
		);
}

/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=22093
 * test collision check for synthetic accessors to constructors
 */
public void test067(){
	this.runConformTest(
		new String[] {
			"p/Test.java",
			"package p;	\n"+
			"public class Test {	\n"+
			"	class Member {	\n"+
			"		private Member(){	\n"+
			"		}	\n"+
			"		private Member(Member other){	\n"+
			"		}	\n"+
			"	}	\n"+
			"	public static void main(String[] arguments) {	\n"+
			"		Test t = new Test();	\n"+
			"		Member m1 = t.new Member();	\n"+
			"		t.new Member(m1);	\n"+
			"		System.out.println(\"SUCCESS\");	\n"+
			"	}	\n"+
			"}	\n"
		},
		"SUCCESS");
}

// https://bugs.eclipse.org/bugs/show_bug.cgi?id=25229
public void test068(){
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {	\n"+
			"	public static void main(String[] arguments) {	\n"+
			"		new X().new X2().foo();	\n"+
			"	}	\n"+
			"	class X1 {	\n"+
			"		void baz1() {	\n"+
			"			System.out.print(\"-X1.baz1()\");	\n"+
			"		}	\n"+
			"	}	\n"+
			"	class X2 {	\n"+
			"		void foo(){	\n"+
			"			X.this.new X1(){	\n"+
			"				void bar(){	\n"+
			"					baz();	\n"+
			"					baz1();	\n"+
			"					baz2();	\n"+
			"				}	\n"+
			"			}.bar();	\n"+
			"		}		\n"+
			"		void baz2() {	\n"+
			"			System.out.println(\"-X2.baz2()\");	\n"+
			"		}	\n"+
			"	}	\n"+
			"	void baz() {	\n"+
			"		System.out.print(\"X.baz()\");	\n"+
			"	}	\n"+
			"}	\n"
		},
		"X.baz()-X1.baz1()-X2.baz2()");
}

// http://bugs.eclipse.org/bugs/show_bug.cgi?id=26122
// synthetic outer local variables must be appended after user arguments
public void test069() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {	\n"+
			"    X(String s, int j) {}	\n"+
			"    public static void main(String[] args) {	\n"+
			"        final int i;	\n"+
			"        new X(\"hello\", i = 1) {	\n"+ // val$i must be appended after i got assigned
			"            { 	\n"+
			"            	System.out.print(\"SUCCESS:\"+i); 	\n"+
			"            }	\n"+
			"        };	\n"+
			"    }	\n"+
			"}	\n"
		},
		"SUCCESS:1");
}
// variation on test069
public void test070() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {	\n"+
			"    X() {}	\n"+
			"    public static void main(String[] args) {	\n"+
			"        final int i;	\n"+
			"        new X().new Y(\"hello\", i = 1) {	\n"+ // val$i must be appended after i got assigned
			"            { 	\n"+
			"            	System.out.print(\"SUCCESS:\"+i); 	\n"+
			"            }	\n"+
			"        };	\n"+
			"    }	\n"+
			"	class Y {	\n" +
			"		Y(String s, int j) {}	\n" +
			"	}	\n" +
			"}	\n"
		},
		"SUCCESS:1");
}

// test too many synthetic arguments
public void test071() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {	\n"+
			"	void foo(int i) {	\n"+
			"		final long v0 = i, v1 = i, v2 = i, v3 = i, v4 = i, v5 = i, v6 = i;	\n"+
			"		final long v7 = i, v8 = i, v9 = i, v10 = i, v11 = i, v12 = i, v13 = i;	\n"+
			"		final long v14 = i, v15 = i, v16 = i, v17 = i, v18 = i, v19 = i, v20 = i;	\n"+
			"		final long v21 = i, v22 = i, v23 = i, v24 = i, v25 = i, v26 = i, v27 = i;	\n"+
			"		final long v28 = i, v29 = i, v30 = i, v31 = i, v32 = i, v33 = i, v34 = i;	\n"+
			"		final long v35 = i, v36 = i, v37 = i, v38 = i, v39 = i, v40 = i, v41 = i;	\n"+
			"		final long v42 = i, v43 = i, v44 = i, v45 = i, v46 = i, v47 = i, v48 = i;	\n"+
			"		final long v49 = i, v50 = i, v51 = i, v52 = i, v53 = i, v54 = i, v55 = i;	\n"+
			"		final long v56 = i, v57 = i, v58 = i, v59 = i, v60 = i, v61 = i, v62 = i;	\n"+
			"		final long v63 = i, v64 = i, v65 = i, v66 = i, v67 = i, v68 = i, v69 = i;	\n"+
			"		final long v70 = i, v71 = i, v72 = i, v73 = i, v74 = i, v75 = i, v76 = i;	\n"+
			"		final long v77 = i, v78 = i, v79 = i, v80 = i, v81 = i, v82 = i, v83 = i;	\n"+
			"		final long v84 = i, v85 = i, v86 = i, v87 = i, v88 = i, v89 = i, v90 = i;	\n"+
			"		final long v91 = i, v92 = i, v93 = i, v94 = i, v95 = i, v96 = i, v97 = i;	\n"+
			"		final long v98 = i, v99 = i, v100 = i, v101 = i, v102 = i, v103 = i, v104 = i;	\n"+
			"		final long v105 = i, v106 = i, v107 = i, v108 = i, v109 = i, v110 = i, v111 = i;	\n"+
			"		final long v112 = i, v113 = i, v114 = i, v115 = i, v116 = i, v117 = i, v118 = i;	\n"+
			"		final long v119 = i, v120 = i, v121 = i, v122 = i, v123 = i, v124 = i, v125 = i;	\n"+
			"		final long v126 = i;												\n"+
			"		final int v127 = i;	// int is already too many arg					\n"+
			"		new X() {															\n"+
			"			{																\n"+
			"				System.out.println(											\n"+
			"					v0 + v1 + v2 + v3 + v4 + v5 + v6						\n" +
			"					+ v7 + v8 + v9 + v10 + v11 + v12 + v13					\n" +
			"					+ v14 + v15 + v16 + v17 + v18 + v19 + v20				\n" +
			"					+ v21 + v22 + v23 + v24 + v25 + v26 + v27				\n" +
			"					+ v28 + v29 + v30 + v31 + v32 + v33 + v34				\n" +
			"					+ v35 + v36 + v37 + v38 + v39 + v40 + v41				\n" +
			"					+ v42 + v43 + v44 + v45 + v46 + v47 + v48				\n" +
			"					+ v49 + v50 + v51 + v52 + v53 + v54 + v55				\n" +
			"					+ v56 + v57 + v58 + v59 + v60 + v61 + v62				\n" +
			"					+ v63 + v64 + v65 + v66 + v67 + v68 + v69				\n" +
			"					+ v70 + v71 + v72 + v73 + v74 + v75 + v76				\n" +
			"					+ v77 + v78 + v79 + v80 + v81 + v82 + v83				\n" +
			"					+ v84 + v85 + v86 + v87 + v88 + v89 + v90				\n" +
			"					+ v91 + v92 + v93 + v94 + v95 + v96 + v97				\n" +
			"					+ v98 + v99 + v100 + v101 + v102 + v103 + v104			\n" +
			"					+ v105 + v106 + v107 + v108 + v109 + v110 + v111		\n" +
			"					+ v112 + v113 + v114 + v115 + v116 + v117 + v118		\n" +
			"					+ v119 + v120 + v121 + v122 + v123 + v124 + v125		\n" +
			"					+ v126);												\n"+
			"			}	\n"+
			"		};	\n"+
			"	}	\n" +
			"}	\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 23)\n" +
		"	new X() {															\n" +
		"	    ^^^\n" +
		"Too many synthetic parameters, emulated parameter val$v126 is exceeding the limit of 255 words eligible for method parameters\n" +
		"----------\n",
		JavacTestOptions.SKIP /* javac simply does not catch this case */);
}

// test too many synthetic arguments
public void test072() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {	\n"+
			"	void foo(int i) {	\n"+
			"		final long v0 = i, v1 = i, v2 = i, v3 = i, v4 = i, v5 = i, v6 = i;	\n"+
			"		final long v7 = i, v8 = i, v9 = i, v10 = i, v11 = i, v12 = i, v13 = i;	\n"+
			"		final long v14 = i, v15 = i, v16 = i, v17 = i, v18 = i, v19 = i, v20 = i;	\n"+
			"		final long v21 = i, v22 = i, v23 = i, v24 = i, v25 = i, v26 = i, v27 = i;	\n"+
			"		final long v28 = i, v29 = i, v30 = i, v31 = i, v32 = i, v33 = i, v34 = i;	\n"+
			"		final long v35 = i, v36 = i, v37 = i, v38 = i, v39 = i, v40 = i, v41 = i;	\n"+
			"		final long v42 = i, v43 = i, v44 = i, v45 = i, v46 = i, v47 = i, v48 = i;	\n"+
			"		final long v49 = i, v50 = i, v51 = i, v52 = i, v53 = i, v54 = i, v55 = i;	\n"+
			"		final long v56 = i, v57 = i, v58 = i, v59 = i, v60 = i, v61 = i, v62 = i;	\n"+
			"		final long v63 = i, v64 = i, v65 = i, v66 = i, v67 = i, v68 = i, v69 = i;	\n"+
			"		final long v70 = i, v71 = i, v72 = i, v73 = i, v74 = i, v75 = i, v76 = i;	\n"+
			"		final long v77 = i, v78 = i, v79 = i, v80 = i, v81 = i, v82 = i, v83 = i;	\n"+
			"		final long v84 = i, v85 = i, v86 = i, v87 = i, v88 = i, v89 = i, v90 = i;	\n"+
			"		final long v91 = i, v92 = i, v93 = i, v94 = i, v95 = i, v96 = i, v97 = i;	\n"+
			"		final long v98 = i, v99 = i, v100 = i, v101 = i, v102 = i, v103 = i, v104 = i;	\n"+
			"		final long v105 = i, v106 = i, v107 = i, v108 = i, v109 = i, v110 = i, v111 = i;	\n"+
			"		final long v112 = i, v113 = i, v114 = i, v115 = i, v116 = i, v117 = i, v118 = i;	\n"+
			"		final long v119 = i, v120 = i, v121 = i, v122 = i, v123 = i, v124 = i, v125 = i;	\n"+
			"		new X() {															\n"+
			"			{																\n"+
			"				System.out.println(											\n"+
			"					v0 + v1 + v2 + v3 + v4 + v5 + v6						\n" +
			"					+ v7 + v8 + v9 + v10 + v11 + v12 + v13					\n" +
			"					+ v14 + v15 + v16 + v17 + v18 + v19 + v20				\n" +
			"					+ v21 + v22 + v23 + v24 + v25 + v26 + v27				\n" +
			"					+ v28 + v29 + v30 + v31 + v32 + v33 + v34				\n" +
			"					+ v35 + v36 + v37 + v38 + v39 + v40 + v41				\n" +
			"					+ v42 + v43 + v44 + v45 + v46 + v47 + v48				\n" +
			"					+ v49 + v50 + v51 + v52 + v53 + v54 + v55				\n" +
			"					+ v56 + v57 + v58 + v59 + v60 + v61 + v62				\n" +
			"					+ v63 + v64 + v65 + v66 + v67 + v68 + v69				\n" +
			"					+ v70 + v71 + v72 + v73 + v74 + v75 + v76				\n" +
			"					+ v77 + v78 + v79 + v80 + v81 + v82 + v83				\n" +
			"					+ v84 + v85 + v86 + v87 + v88 + v89 + v90				\n" +
			"					+ v91 + v92 + v93 + v94 + v95 + v96 + v97				\n" +
			"					+ v98 + v99 + v100 + v101 + v102 + v103 + v104			\n" +
			"					+ v105 + v106 + v107 + v108 + v109 + v110 + v111		\n" +
			"					+ v112 + v113 + v114 + v115 + v116 + v117 + v118		\n" +
			"					+ v119 + v120 + v121 + v122 + v123 + v124 + v125);		\n" +
			"			}	\n"+
			"		};	\n"+
			"	}	\n" +
			"    public static void main(String[] args) {	\n"+
			"       System.out.print(\"SUCCESS\"); 	\n"+
			"    }	\n"+
			"}	\n"
		},
		"SUCCESS");
}

/**
 * verify error in synthetic access to constructor
 * (ordering of parameters after moving outerlocals after user args)
 */
public void test073() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {	\n" +
			"    public static void main(final String[] args) {	\n" +
			"		class Local {	\n" +
			"			private Local(String str){	\n" +
			"				Object o = args;	\n" +
			"				System.out.println(str);	\n" +
			"			}	\n" +
			"		};	\n" +
			"		new Local(\"SUCCESS\");	\n" +
			"	}	\n" +
			"}	\n"
	},
	"SUCCESS");
}

/**
 * verify error in synthetic access to constructor - test collisions
 * (ordering of parameters after moving outerlocals after user args)
 */
public void test074() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {	\n" +
			"    public static void main(final String[] args) {	\n" +
			"		class Local {	\n" +
			"			public Local(String str, Local loc, String str2){	\n" + // collision
			"			}	\n" +
			"			public Local(String str, Local loc){	\n" + // collision
			"			}	\n" +
			"			private Local(String str){	\n" +
			"				Object o = args;	\n" +
			"				System.out.println(str);	\n" +
			"			}	\n" +
			"		};	\n" +
			"		new Local(\"SUCCESS\");	\n" +
			"	}	\n" +
			"}	\n"
	},
	"SUCCESS");
}

/**
 * should not consider synthetic methods on binary types
 */
public void test075() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {	\n" +
			"   public static void main(final String[] args) {	\n" +
			"		System.out.println(\"SUCCESS\");	\n"+
			"	}	\n"+
			"	private static void foo() {	\n" +
			"	}	\n" +
			"    A a = new A();	\n" +
			"    class A {	\n" +
			"		private A() {}	\n" +
			"		A(String s) {	\n" +
			"			foo();	\n" +
			"		}	\n" +
			"		A(int s) {	\n" +
			"			foo();	\n" +
			"		}	\n" +
			"    }	\n" +
			"    class B extends A {	\n" +
			"    	B(){	\n" +
			"    		super();	\n" +
			"    	}	\n" +
			"    }	\n" +
			"}	\n"
		},
		"SUCCESS");

	this.runNegativeTest(
		new String[] {
			"Y.java",
			"public class Y {	\n" +
			"	void foo(){	\n" +
			"		new X().new A(null);	\n" +
			"		new X().access$0();	\n" +
			"	}	\n"+
 			"}	\n"
		},
		"----------\n" +
		"1. ERROR in Y.java (at line 4)\n" +
		"	new X().access$0();	\n" +
		"	        ^^^^^^^^\n" +
		"The method access$0() is undefined for the type X\n" +
		"----------\n",
		null, // use default class-path
		false); // do not flush previous output dir content

}
/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=27413
 * implicit enclosing instances
 */
public void test076() {
	CompilerOptions options = new CompilerOptions(getCompilerOptions());
	if (options.sourceLevel <= ClassFileConstants.JDK1_3) {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {	\n"+
				"	X(Object o){	\n"+
				"		class A { 	\n"+
				"			private A() {	\n"+ // implicit enclosing instance in non-static context
				"			}	\n"+
				"		}	\n"+
				"		class B extends X {	\n"+
				"			B() {	\n"+
				"				super(new A(){	\n"+
				"				});	\n"+
				"			}	\n"+
				"		}	\n"+
				"	}	\n"+
				"} 	\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 9)\n" +
			"	super(new A(){	\n" +
			"				});	\n" +
			"	      ^^^^^^^^^^^^^^^\n" +
			"No enclosing instance of type X is available due to some intermediate constructor invocation\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 9)\n" +
			"	super(new A(){	\n" +
			"	          ^^^\n" +
			"Access to enclosing constructor A() is emulated by a synthetic accessor method\n" +
			"----------\n");
		return;
	}
	if (options.sourceLevel <= ClassFileConstants.JDK1_4) {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {	\n"+
				"	X(Object o){	\n"+
				"		class A { 	\n"+
				"			private A() {	\n"+ // implicit enclosing instance in non-static context
				"			}	\n"+
				"		}	\n"+
				"		class B extends X {	\n"+
				"			B() {	\n"+
				"				super(new A(){	\n"+
				"				});	\n"+
				"			}	\n"+
				"		}	\n"+
				"	}	\n"+
				"} 	\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 9)\n" +
			"	super(new A(){	\n" +
			"				});	\n" +
			"	      ^^^^^^^^^^^^^^^\n" +
			"No enclosing instance of type X is available due to some intermediate constructor invocation\n" +
			"----------\n");
		return;
	}
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {	\n"+
			"	X(Object o){	\n"+
			"		class A { 	\n"+
			"			private A() {	\n"+ // implicit enclosing instance in non-static context
			"			}	\n"+
			"		}	\n"+
			"		class B extends X {	\n"+
			"			B() {	\n"+
			"				super(new A(){	\n"+
			"				});	\n"+
			"			}	\n"+
			"		}	\n"+
			"	}	\n"+
			"} 	\n"
		},
		"");
}

/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=27413
 * implicit enclosing instances
 */
public void test077() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {	\n"+
			"	public static void main(String[] args){	\n"+
			"		System.out.println(\"SUCCESS\");	\n"+
			"	}	\n" +
			"	X(Object o){	\n"+
			"	}	\n" +
			"	static void foo() {	\n"+
			"		class A { 	\n"+ // no implicit enclosing in STATIC context
			"			private A() {	\n"+
			"			}	\n"+
			"		}	\n"+
			"		class B extends X {	\n"+
			"			B() {	\n"+
			"				super(new A(){	\n"+
			"				});	\n"+
			"			}	\n"+
			"		}	\n"+
			"	}	\n"+
			"} 	\n"
		},
		"SUCCESS");
}

/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=27413
 * implicit enclosing instances
 */
public void test078() {
	CompilerOptions options = new CompilerOptions(getCompilerOptions());
	if (options.sourceLevel <= ClassFileConstants.JDK1_3) {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {	\n"+
				"	X(Object o){	\n"+
				"		class A { 	\n"+
				"			private A() {	\n"+ // implicit enclosing instance in non-static context
				"			}	\n"+
				"		}	\n"+
				"		class B extends X {	\n"+
				"			B() {	\n"+
				"				super(new A(){	\n"+
				"					void foo() { System.out.println(X.this);	} \n"+
				"				});	\n"+
				"			}	\n"+
				"		}	\n"+
				"	}	\n"+
				"} 	\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 9)\n" +
			"	super(new A(){	\n" +
			"					void foo() { System.out.println(X.this);	} \n" +
			"				});	\n" +
			"	      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"No enclosing instance of type X is available due to some intermediate constructor invocation\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 9)\n" +
			"	super(new A(){	\n" +
			"	          ^^^\n" +
			"Access to enclosing constructor A() is emulated by a synthetic accessor method\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 10)\n" +
			"	void foo() { System.out.println(X.this);	} \n" +
			"	                                ^^^^^^\n" +
			"No enclosing instance of the type X is accessible in scope\n" +
			"----------\n");
		return;
	}
	if (options.sourceLevel <= ClassFileConstants.JDK1_4) {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {	\n"+
				"	X(Object o){	\n"+
				"		class A { 	\n"+
				"			private A() {	\n"+ // implicit enclosing instance in non-static context
				"			}	\n"+
				"		}	\n"+
				"		class B extends X {	\n"+
				"			B() {	\n"+
				"				super(new A(){	\n"+
				"					void foo() { System.out.println(X.this);	} \n"+
				"				});	\n"+
				"			}	\n"+
				"		}	\n"+
				"	}	\n"+
				"} 	\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 9)\n" +
			"	super(new A(){	\n" +
			"					void foo() { System.out.println(X.this);	} \n" +
			"				});	\n" +
			"	      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"No enclosing instance of type X is available due to some intermediate constructor invocation\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 10)\n" +
			"	void foo() { System.out.println(X.this);	} \n" +
			"	                                ^^^^^^\n" +
			"No enclosing instance of the type X is accessible in scope\n" +
			"----------\n");
		return;
	}
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {	\n"+
			"	X(Object o){	\n"+
			"		class A { 	\n"+
			"			private A() {	\n"+ // implicit enclosing instance in non-static context
			"			}	\n"+
			"		}	\n"+
			"		class B extends X {	\n"+
			"			B() {	\n"+
			"				super(new A(){	\n"+
			"					void foo() { System.out.println(X.this);	} \n"+
			"				});	\n"+
			"			}	\n"+
			"		}	\n"+
			"	}	\n"+
			"} 	\n"
		},
		"");
}

/*
 * Check that X.this is actually bound to an X, and not innermost compatible type (Z)
 */
public void test079() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {	\n"+
			"	public static void main(String[] arguments) {	\n"+
			"		new X().new Y().new Z().bar();	\n"+
			"	}	\n"+
			"	String foo() { return \"X-foo\"; }	\n"+
			"	class Y extends X {	\n"+
			"		String foo() { return \"Y-foo\"; }	\n"+
			"		class Z extends Y {	\n"+
			"			Z(){	\n"+
			"				X.this.super();	\n"+
			"			}	\n"+
			"			String foo() { return \"Z-foo\"; }	\n"+
			"			void bar () {	\n"+
			"				System.out.println(X.this.foo());	\n"+
			"			}	\n"+
			"		}	\n"+
			"	}	\n"+
			"}	\n"
		},
		"X-foo");
}

public void test080() { // verified as conform
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {	\n"+
			"	public static void main(String[] arguments) { \n"+
			"		new X().new C();	\n"+
			"	}	\n"+
			"	int m() {	\n"+
			"		System.out.println(\"SUCCESS\");	\n"+
			"		return 1;	\n"+
			"	}	\n"+
			"	class C extends B {	\n"+
			"		C(int j){}	\n"+
			"		C(){	\n"+
			"			this(X.this.m());	\n"+
			"		}	\n"+
			"	}	\n"+
			"}	\n"+
			"class B extends X {	\n"+
			"}	\n"
		},
		"SUCCESS");
}

public void test081() {
	this.runConformTest(
		new String[] {
			"p/X.java",
			"package p;	\n"+
			"public class X {	\n"+
			"	public static void main(String[] arguments) { \n"+
			"		new X().new C();	\n"+
			"	}	\n"+
			"	int m() {	\n"+
			"		System.out.println(\"SUCCESS\");	\n"+
			"		return 1;	\n"+
			"	}	\n"+
			"	class C extends q.B {	\n"+
			"		C(int j){}	\n"+
			"		C(){	\n"+
			"			this(m());	\n"+ // only X.this can see m()
			"		}	\n"+
			"	}	\n"+
			"}	\n",
			"q/B.java",
			"package q;	\n"+
			"public class B extends p.X {	\n"+
			"}	\n"
		},
		"SUCCESS");
}

/*
 * Default constructor for Z, will use enclosing 'this' as default-value for enclosing instance for super().
 */
public void test083() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {	\n"+
			"	public static void main(String[] arguments) {	\n"+
			"		new X().new Y().new Z().bar();	\n"+
			"	}	\n"+
			"	String foo() { return \"X-foo\"; }	\n"+
			"	class Y extends X {	\n"+
			"		String foo() { return \"Y-foo\"; }	\n"+
			"		class Z {	\n"+
			"			Z(){	\n"+
			"				//X.this.super();	\n"+
			"			}	\n"+
			"			String foo() { return \"Z-foo\"; }	\n"+
			"			void bar () {	\n"+
			"				System.out.println(X.this.foo());	\n"+
			"			}	\n"+
			"		}	\n"+
			"	}	\n"+
			"}	\n"
		},
		"X-foo");
}

public void test084() {
	this.runConformTest(
		new String[] {
			"Foo.java",
			"public class Foo {	\n"+
			"	public static void main(String[] arguments) {	\n"+
			"		new Foo(null);	\n"+
			"	}	\n"+
			"	Foo(int i){}	\n"+
			"	Foo(Object o){		\n"+
			"		class A { 		\n"+
			"			private A() {	 	\n"+
			"			}		\n"+
			"		}		\n"+
			"		class B extends Foo {		\n"+
			"			B() {		\n"+
			"				super(0);	\n"+
			"				new A(){		\n"+
			"					void foo() { 	\n"+
			"						System.out.println(Foo.this.getClass().getName());		\n"+
			"					} 	\n"+
			"				}.foo();		\n"+
			"			}		\n"+
			"		}		\n"+
			"		new B();	\n"+
			"	}		\n"+
			"} 	\n",
		},
		"Foo");
}

public void test085() {
	CompilerOptions options = new CompilerOptions(getCompilerOptions());
	if (options.sourceLevel < ClassFileConstants.JDK1_5) {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {	\n"+
				"	int m() {		\n"+
				"		return 1;		\n"+
				"	}		\n"+
				"	class C extends B {		\n"+
				"		C(int j){}		\n"+
				"		C(){		\n"+
				"			this(	\n"+
				"				new B(){ 	\n"+
				"					X x = X.this; 	\n"+
				"					int m(){	\n"+
				"						return 1;	\n"+
				"					}	\n"+
				"				}.m());	\n"+
				"		}		\n"+
				"	}		\n"+
				"}		\n"+
				"class B extends X {		\n"+
				"}	\n"
			},
		"----------\n" +
		"1. ERROR in X.java (at line 10)\n" +
		"	X x = X.this; 	\n" +
		"	      ^^^^^^\n" +
		"No enclosing instance of the type X is accessible in scope\n" +
		"----------\n");
		return;
	}
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {	\n"+
			"	int m() {		\n"+
			"		return 1;		\n"+
			"	}		\n"+
			"	class C extends B {		\n"+
			"		C(int j){}		\n"+
			"		C(){		\n"+
			"			this(	\n"+
			"				new B(){ 	\n"+
			"					X x = X.this; 	\n"+
			"					int m(){	\n"+
			"						return 1;	\n"+
			"					}	\n"+
			"				}.m());	\n"+
			"		}		\n"+
			"	}		\n"+
			"}		\n"+
			"class B extends X {		\n"+
			"}	\n"
		},
		"");
}

public void test086() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {	\n"+
			"	public static void main(String[] arguments) { 	\n"+
			"		new X().new C();		\n"+
			"	}		\n"+
			"	int m() {		\n"+
			"		return 1;		\n"+
			"	}		\n"+
			"	class C extends B {		\n"+
			"		C(int j){}		\n"+
			"		C(){		\n"+
			"			this(	\n"+
			"				new B(){ 	\n"+
			"					int m(){	\n"+
			"						System.out.println(\"SUCCESS\");		\n"+
			"						return 1;	\n"+
			"					}	\n"+
			"				}.m());	\n"+
			"		}		\n"+
			"	}		\n"+
			"}		\n"+
			"class B extends X {		\n"+
			"}	\n"
		},
		"SUCCESS");
}

public void test087() {
	CompilerOptions options = new CompilerOptions(getCompilerOptions());
	if (options.complianceLevel <= ClassFileConstants.JDK1_4) {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {	\n"+
				"	public static void main(String[] arguments) {	\n"+
				"		new X().f();	\n"+
				"	}	\n"+
				"    void f () {	\n"+
				"        class C {	\n"+
				"        	C() {	\n"+
				"        		System.out.println(\"[\"+X.this.getClass().getName()+\"]\");	\n"+
				"        	}	\n"+
				"        }	\n"+
				"        class N extends X {	\n"+
				"            { new C(); } // selects N.this, not O.this	\n"+
				"        }	\n"+
				"        new N();	\n"+
				"    }	\n"+
				"}	\n"
			},
			"[X$1$N]");
		return;
	}
	this.runConformTest(
		true,
		new String[] {
			"X.java",
			"public class X {\n"+
			"	public static void main(String[] arguments) {\n"+
			"		new X().f();\n"+
			"	}\n"+
			"    void f () {\n"+
			"        class C {\n"+
			"        	C() {\n"+
			"        		System.out.println(\"[\"+X.this.getClass().getName()+\"]\");	\n"+
			"        	}\n"+
			"        }\n"+
			"        class N extends X {\n"+
			"            { new C(); } // selects N.this, not O.this	\n"+
			"        }\n"+
			"        new N();\n"+
			"    }	\n"+
			"}\n"
		},
		"",
		"[X$1N]", // should be [X] indeed
		"",
		JavacTestOptions.EclipseHasABug.EclipseBug235809);
}

public void test088() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {	\n"+
			"	class Middle {	\n"+
			"		class Inner {	\n"+
			"		}	\n"+
			"	} 	\n"+
			"	class M extends Middle.Inner {	\n"+
			"	}	\n"+
			"}	\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 6)\n" +
		"	class M extends Middle.Inner {	\n" +
		"	      ^\n" +
		"No enclosing instance of type X.Middle is accessible to invoke the super constructor. Must define a constructor and explicitly qualify its super constructor invocation with an instance of X.Middle (e.g. x.super() where x is an instance of X.Middle).\n" +
		"----------\n");
}

public void test089() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {	\n"+
			"	static class Middle {	\n"+
			"		static class Inner {	\n"+
			"		}	\n"+
			"	} 	\n"+
			"	class M extends Middle.Inner {	\n"+
			"	}	\n"+
			"	public static void main(String[] arguments) {	\n"+
			"		new X().new M();	\n" +
			"		System.out.println(\"SUCCESS\");	\n"+
			"	}	\n"+
			"}	\n"
		},
		"SUCCESS");
}

public void test090() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {	\n"+
			"	void foo() {	\n"+
			"		class Middle {	\n"+
			"			class Inner {	\n"+
			"			}	\n"+
			"		} 	\n"+
			"		class M extends Middle.Inner {	\n"+
			"			M() {	\n"+
			"				new Middle().super();	\n"+
			"			}	\n"+
			"		}	\n"+
			"	}	\n"+
			"	public static void main(String[] arguments) {	\n"+
			"		new X().foo();	\n" +
			"		System.out.println(\"SUCCESS\");	\n"+
			"	}	\n"+
			"}	\n"
		},
		"SUCCESS");
}

// ensure that local member empty constructor gets implicit constructor call
public void test091() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {	\n"+
			"	Object o = new Object() {	\n"+
			"		class Inner {	\n"+
			"			private Inner() {}	\n"+
			"		}	\n"+
			"	}.new Inner(){};	\n"+
			"	public static void main(String[] arguments) {	\n"+
			"		new X();	\n"+
			"		System.out.println(\"SUCCESS\");	\n"+
			"	}	\n"+
			"}	\n",
		},
		"SUCCESS");
}

/**
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=29636
 * ensure first anonymous is X$1(extends X), last is X$2(extends A)
 */
public void test092() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {	\n"+
			"	class A {	\n"+
			"	}	\n"+
			"	public static void main(String[] arguments) {	\n"+
			"		System.out.println(\"[\"+new X(){}.new A(){}.getClass().getName()+\"]\");	\n"+
			"	}	\n"+
			"}	\n",
		},
		"[X$2]");
}

public void test093() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {	\n"+
			"	public static void main(String[] arguments) {	\n"+
			"		System.out.println(X.this);	\n"+
			"	}	\n"+
			"}	\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	System.out.println(X.this);	\n" +
		"	                   ^^^^^^\n" +
		"Cannot use this in a static context\n" +
		"----------\n");
}

public void test094() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {	\n"+
			"	class Y {}	\n"+
			"	public static void main(String[] arguments) {	\n"+
			"		int i = 0;	\n"+
			"		i.new Y();	\n"+
			"	}	\n"+
			"}	\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	i.new Y();	\n" +
		"	^\n" +
		"Cannot use an expression of the type int as a valid enclosing instance\n" +
		"----------\n");
}
//http://bugs.eclipse.org/bugs/show_bug.cgi?id=30280
public void test095() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {	\n"+
			"	class Y {}	\n"+
			"	public static void main(String[] arguments) {	\n"+
			"		int i = 0;	\n"+
			"		i.new Y(){};	\n"+
			"	}	\n"+
			"}	\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	i.new Y(){};	\n" +
		"	^\n" +
		"Cannot use an expression of the type int as a valid enclosing instance\n" +
		"----------\n");
}
public void test096() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {	\n"+
			"	static class Y {}	\n"+
			"	void foo() {	\n"+
			"		new X().new Y(){};	\n"+
			"	}	\n"+
			"}	\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	new X().new Y(){};	\n" +
		"	^^^^^^^\n" +
		"Illegal enclosing instance specification for type X.Y\n" +
		"----------\n");
}
/**
 * http://bugs.eclipse.org/bugs/show_bug.cgi?id=35456
 */
public void test097() {
	this.runConformTest(
		new String[] {
			"apples/Base.java",
			"package apples;	\n" +
			"public class Base {	\n"+
			"	protected String foo = \"SUCCESS\";	\n" +
			"	public static void main(String[] args){	\n"+
			"		new oranges.Derived().new Inner(new oranges.Derived()).bug();	\n"+
			"	}	\n"+
			"}	\n",
			"oranges/Derived.java",
			"package oranges;	\n"+
			"import apples.*;	\n"+
			"public class Derived extends Base {	\n"+
			"    public class Inner {	\n"+
			"        Derived c = null;	\n"+
			"        public Inner(Derived c) {	\n"+
			"            this.c = c;	\n"+
			"        } 	\n"+
			"        public void bug() {	\n"+
			"            // The following reference to Base.foo causes the 	\n"+
			"            // VerifyError	\n"+
			"            System.out.println(c.foo);	\n"+
			"        }	\n"+
			"    }	\n"+
			"}	\n",
		},
		"SUCCESS");
}

/**
 * http://bugs.eclipse.org/bugs/show_bug.cgi?id=33751
 */
public void test098() {
	this.runConformTest(
		true,
		new String[] {
			"X.java",
			"public class X {	\n"+
			"	public static void main(String[] args) {	\n"+
			"		System.out.println(\"first inner class = \" + new Object() {}.getClass());	\n"+
			"		if (true) {	\n"+
			"			System.out.println(\"Always true\");	\n"+
			"		} else {	\n"+
			"		System.out.println(\"unreachable inner class = \" + new Object() {}.getClass());	\n"+
			"		}	\n"+
			"		System.out.println(\"last inner class = \" + new Object() {}.getClass());	\n"+
			"	}	\n"+
			"}	\n",
		},
		"----------\n" + 
		"1. WARNING in X.java (at line 6)\n" + 
		"	} else {	\n" + 
		"		System.out.println(\"unreachable inner class = \" + new Object() {}.getClass());	\n" + 
		"		}	\n" + 
		"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Dead code\n" + 
		"----------\n",
		"first inner class = class X$1\n" +
		"Always true\n" +
		"last inner class = class X$2",
		"",
		JavacTestOptions.SKIP /* optimization that we chose deliberately */);
}

/**
 * http://bugs.eclipse.org/bugs/show_bug.cgi?id=40240
 */
public void test099() {
	this.runConformTest(
		new String[] {
			"Y.java",
			"public class Y { \n" +
			"	public static void main(String[] args) {	\n" +
			"		class Local {} \n"+
			"		System.out.println(\"SUCCESS\");	\n" +
			"	} \n" +
			"} \n",
		},
		"SUCCESS");

	CompilerOptions options = new CompilerOptions(getCompilerOptions());
	if (options.complianceLevel <= ClassFileConstants.JDK1_4) {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X { \n" +
				"    public static void main(String argv[]) { \n" +
				"		Object a = new Y$1$Local();        // compile-time error \n" +
				"    } \n" +
				"} \n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	Object a = new Y$1$Local();        // compile-time error \n" +
			"	               ^^^^^^^^^\n" +
			"The nested type Y$1$Local cannot be referenced using its binary name\n" +
			"----------\n",
			null,
			false);
		return;
	}
	this.runNegativeTest(
		false,
		new String[] {
			"X.java",
			"public class X { \n" +
			"    public static void main(String argv[]) { \n" +
			"		Object a = new Y$1Local();        // compile-time error \n" +
			"    } \n" +
			"} \n",
		},
		null,
		null,
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	Object a = new Y$1Local();        // compile-time error \n" +
		"	               ^^^^^^^^\n" +
		"The nested type Y$1Local cannot be referenced using its binary name\n" +
		"----------\n",
		JavacTestOptions.JavacHasABug.JavacBug4094180);
}

/*
 * Check that member type allocation is granted access to compatible enclosing instance available as constructor argument
 */
public void test101() {
	this.runConformTest(
		new String[] {
			"X.java",
		"public class X {\n" +
		"	X(Object o) {\n" +
		"	}\n" +
		"	public static void main(String[] args) {\n" +
		"		new X(null).new M(null);\n" +
		"		System.out.println(\"SUCCESS\");\n" +
		"	}\n" +
		"	class M extends Top {\n" + // no issue if M is unrelated to X
		"		M() {\n" +
		"			super(null);\n" +
		"		}\n" +
		"		M(Object o) {\n" +
		"			super(new M(){});\n" +
		"		}\n" +
		"	}\n" +
		"	class Top {\n" +
		"		Top(Object o) {\n" +
		"		}\n" +
		"	}\n" +
		"}\n",
		},
		"SUCCESS");
}

/*
 * Check that direct member type allocation is denied access to compatible enclosing instance available as constructor argument
 */
public void test102() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	X(Object o) {\n" +
			"	}\n" +
			"	class M extends X {\n" +
			"		M() {\n" +
			"			super(null); //1\n" +
			"		}\n" +
			"		M(Object o) {\n" +
			"			super(new M());//2\n" +
			"		}\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 9)\n" +
		"	super(new M());//2\n" +
		"	      ^^^^^^^\n" +
		"No enclosing instance of type X is available due to some intermediate constructor invocation\n" +
		"----------\n");
}


/*
 * Check that indirect member type allocation is denied access to compatible enclosing instance available as constructor argument
 */
public void test104() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	X(Object o) {\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		new X(null).new M(null);\n" +
			"		System.out.println(\"SUCCESS\");\n" +
			"	}\n" +
			"	class N extends X {\n" +
			"		N() {\n" +
			"			super(null); //1\n" +
			"		}\n" +
			"		N(Object o) {\n" +
			"			super(new M());//2\n" +
			"		}\n" +
			"	}\n" +
			" 	class M extends X {\n" +
			"		M() {\n" +
			"			super(null); //3\n" +
			"		}\n" +
			"		M(Object o) {\n" +
			"			super(new M());//4\n" +
			"		}\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 13)\n" +
		"	super(new M());//2\n" +
		"	      ^^^^^^^\n" +
		"No enclosing instance of type X is available due to some intermediate constructor invocation\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 21)\n" +
		"	super(new M());//4\n" +
		"	      ^^^^^^^\n" +
		"No enclosing instance of type X is available due to some intermediate constructor invocation\n" +
		"----------\n");
}

public void test107() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X { \n" +
			"	public static class Y { \n" +
			"		public Y(Z z) {} \n" +
			"	} \n" +
			"	public interface Z {} \n" +
			"} \n" +
			"\n" +
			"class A { \n" +
			"	private static class B extends X.Y implements X.Z { \n" +
			"		B(A a) { \n" +
			"			super(B.this); \n" +
			"		} \n" +
			"	} \n" +
			"} ",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 11)\n" +
		"	super(B.this); \n" +
		"	      ^^^^^^\n" +
		"Cannot refer to \'this\' nor \'super\' while explicitly invoking a constructor\n" +
		"----------\n");
}

 // javac 1.4.2 incorrectly accepts it, jikes rejects it as we do
public void test108() {
	CompilerOptions options = new CompilerOptions(getCompilerOptions());
	if (options.sourceLevel == ClassFileConstants.JDK1_4) {	 // 1.3 and 1.5 both accept it
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	{\n" +
				"		class Local1 extends X {\n" +
				"		}\n" +
				"		class Local2 extends Local1 {\n" +
				"		}\n" +
				"	}\n" +
				"}",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	class Local2 extends Local1 {\n" +
			"	      ^^^^^^\n" +
			"No enclosing instance of type X is available due to some intermediate constructor invocation\n" +
			"----------\n");
		return;
	}
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	{\n" +
			"		class Local1 extends X {\n" +
			"		}\n" +
			"		class Local2 extends Local1 {\n" +
			"		}\n" +
			"	}\n" +
			"}",
		},
		"");
}

//https://bugs.eclipse.org/bugs/show_bug.cgi?id=44538
public void test109() {
	CompilerOptions options = new CompilerOptions(getCompilerOptions());
	if (options.sourceLevel == ClassFileConstants.JDK1_4) {		 // 1.3 and 1.5 both accept it
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public void bar() {\n" +
				"		class C extends X {\n" +
				"			public void foo() {\n" +
				"				\n" +
				"			}\n" +
				"		}\n" +
				"		X a= new X() {\n" +
				"			public void foo() {\n" +
				"				\n" +
				"			}\n" +
				"		};\n" +
				"		class D extends C {\n" +
				"			\n" +
				"		};\n" +
				"	}\n" +
				"}"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 13)\n" +
			"	class D extends C {\n" +
			"	      ^\n" +
			"No enclosing instance of type X is available due to some intermediate constructor invocation\n" +
			"----------\n");
		return;
	}
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public void bar() {\n" +
			"		class C extends X {\n" +
			"			public void foo() {\n" +
			"				\n" +
			"			}\n" +
			"		}\n" +
			"		X a= new X() {\n" +
			"			public void foo() {\n" +
			"				\n" +
			"			}\n" +
			"		};\n" +
			"		class D extends C {\n" +
			"			\n" +
			"		};\n" +
			"	}\n" +
			"}"
		},
		"");
}

//https://bugs.eclipse.org/bugs/show_bug.cgi?id=44715 - NPE when generating fake reachable local type
public void test110() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		if (true) {\n" +
			"			System.out.println(\"SUCCESS\");\n" +
			"			return;\n" +
			"		}\n" +
			"		class ShouldNotBeGenerated {\n" +
			"		}\n" +
			"	}\n" +
			"}"
		},
		"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=44715 - variation with anonymous type
public void test111() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		if (true) {\n" +
			"			System.out.println(\"SUCCESS\");\n" +
			"			return;\n" +
			"		}\n" +
			"		new Object() {}; \n" +
			"	}\n" +
			"}"
		},
		"SUCCESS");
}
public void test112() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"    private Object t;\n" +
			"    X(Object t) {\n" +
			"        this.t = t;\n" +
			"    }\n" +
			"    public static void main(String[] args) {\n" +
			"        new X(\"OUTER\").bar();\n" +
			"    }\n" +
			"    void bar() {\n" +
			"        new X(this) {\n" +
			"            void run() {\n" +
			"                new Object() {\n" +
			"                    void run() {\n" +
			"				        System.out.println(t);\n" +
			"                    }\n" +
			"                }.run();\n" +
			"            }\n" +
			"        }.run();\n" +
			"    }\n" +
			"}\n"
		},
		"OUTER");
}
public void test113() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"    private Object t;\n" +
			"    X(Object t) {\n" +
			"        this.t = t;\n" +
			"    }\n" +
			"    public static void main(String[] args) {\n" +
			"        new X(\"OUTER\").bar();\n" +
			"    }\n" +
			"    void bar() {\n" +
			"        new X(this) {\n" +
			"            void run() {\n" +
			"                new Object() {\n" +
			"                    void run() {\n" +
			"						try {	\n" +
			"							X x = (X) t;	\n" +
			"				        } catch(ClassCastException e){ \n" +
			"							System.out.println(\"SUCCESS\");\n" +
			"						} \n" +
			"                    }\n" +
			"                }.run();\n" +
			"            }\n" +
			"        }.run();\n" +
			"    }\n" +
			"}\n"
		},
		"SUCCESS");
}
public void test114() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	String s;\n" +
			"	X(String s) {\n" +
			"		this.s = s;\n" +
			"	}\n" +
			"	void foo() {\n" +
			"		class L extends X {\n" +
			"			L() {\n" +
			"				super(s);\n" +
			"				System.out.println(s);		\n" +
			"			}\n" +
			"		}\n" +
			"		new L();\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		new X(\"SUCCESS\").foo();		\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 9)\n" +
		"	super(s);\n" +
		"	      ^\n" +
		"Cannot refer to an instance field s while explicitly invoking a constructor\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=58606
public void test115() {
	this.runConformTest(
		new String[] {
			"p2/X2.java",
			"package p2;\n" +
			"public class X2 extends p1.X1 {\n" +
			"    private void foo() {\n" +
			"        new p1.X1.M1() {\n" +
			"            public void bar() {\n" +
			"                System.out.print(X2.this.field);\n" +
			"                X2.this.doit();\n" +
			"            }\n" +
			"        }.bar();\n" +
			"    }\n" +
			"    public static void main(String[] args) {\n" +
			"        X2 t2 = new X2();\n" +
			"        t2.foo();\n" +
			"    }\n" +
			"}",
			"p1/X1.java",
			"package p1;\n" +
			"public class X1 {\n" +
			"    public abstract class M1 {\n" +
			"        public abstract void bar();\n" +
			"    }\n" +
			"    protected static String field = \"SUCC\";\n" +
			"    protected static void doit() {\n" +
			"        System.out.println(\"ESS\");\n" +
			"    }\n" +
			"}",
			},
		"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=68698
public void test116() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"class Display {\n" +
			"  public interface Bla {\n" +
			"    void a();\n" +
			"  }\n" +
			"}\n" +
			"public class X {\n" +
			"  void aMethod() {\n" +
			"    Display display = null;\n" +
			"    display.new Bla() {\n" +
			"    };\n" +
			"  }\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 9)\n" +
		"	display.new Bla() {\n" +
		"	^^^^^^^\n" +
		"Illegal enclosing instance specification for type Display.Bla\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 9)\n" +
		"	display.new Bla() {\n" +
		"	            ^^^^^\n" +
		"The type new Display.Bla(){} must implement the inherited abstract method Display.Bla.a()\n" +
		"----------\n");
}

public void test117() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	\n" +
			"	public static void main(String[] args) {\n" +
			"		new X().bar();\n" +
			"	}\n" +
			"	void bar() {\n" +
			"		new X(){\n" +
			"			void baz() {\n" +
			"				new M();\n" +
			"			}\n" +
			"		}.baz();\n" +
			"	}\n" +
			"	class M {\n" +
			"		M() {\n" +
			"			System.out.println(\"SUCCESS\");\n" +
			"		}\n" +
			"	}\n" +
			"}\n",
		},
		"SUCCESS");
}

public void test118() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	void foo() {}\n" +
			"	class M {\n" +
			"		M(Object o) {}\n" +
			"		M() {\n" +
			"			this(new Object() {\n" +
			"				void baz() {\n" +
			"					foo();\n" +
			"					bar();\n" +
			"				}\n" +
			"			});\n" +
			"			new Object() {\n" +
			"				void baz() {\n" +
			"					foo();\n" +
			"					bar();\n" +
			"				}\n" +
			"			};\n" +
			"		}\n" +
			"		void bar() {}\n" +
			"		void baz() {\n" +
			"			new Object() {\n" +
			"				void baz() {\n" +
			"					foo();\n" +
			"					bar();\n" +
			"				}\n" +
			"			};\n" +
			"		}\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 9)\n" +
		"	bar();\n" +
		"	^^^\n" +
		"Cannot refer to an instance method while explicitly invoking a constructor\n" +
		"----------\n");
}
public void test119() {
	CompilerOptions options = new CompilerOptions(getCompilerOptions());
	if (options.sourceLevel < ClassFileConstants.JDK1_5) {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		new X().new M();\n" +
				"	}\n" +
				"	void foo(String s) { System.out.print(\"<foo:\"+s+\">\"); }\n" +
				"	class M {\n" +
				"		M(Runnable r) { r.run(); }\n" +
				"		M() {\n" +
				"			this(new Runnable() {\n" +
				"				public void run() {\n" +
				"					foo(\"0\");\n" +
				"					new Object() {\n" +
				"						void baz() {\n" +
				"//							foo(\"1\");\n" +
				"						}\n" +
				"					};\n" +
				"					class Local {\n" +
				"						void baz() {\n" +
				"//							foo(\"2\");\n" +
				"						}\n" +
				"					}				\n" +
				"					new Local();\n" +
				"				}\n" +
				"			});\n" +
				"			new Object() {\n" +
				"				void baz() {\n" +
				"					foo(\"3\");\n" +
				"					bar(\"3\");\n" +
				"				}\n" +
				"			}.baz();\n" +
				"		}\n" +
				"		void bar(String s) { System.out.print(\"<bar:\"+s+\">\"); }\n" +
				"		void baz() {\n" +
				"			new Object() {\n" +
				"				void baz() {\n" +
				"					foo(\"4\");\n" +
				"					bar(\"4\");\n" +
				"				}\n" +
				"			};\n" +
				"		}\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 11)\n" +
			"	foo(\"0\");\n" +
			"	^^^^^^^^\n" +
			"No enclosing instance of the type X is accessible in scope\n" +
			"----------\n");
		return;
	}
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		new X().new M();\n" +
			"	}\n" +
			"	void foo(String s) { System.out.print(\"<foo:\"+s+\">\"); }\n" +
			"	class M {\n" +
			"		M(Runnable r) { r.run(); }\n" +
			"		M() {\n" +
			"			this(new Runnable() {\n" +
			"				public void run() {\n" +
			"					foo(\"0\");\n" +
			"					new Object() {\n" +
			"						void baz() {\n" +
			"//							foo(\"1\");\n" +
			"						}\n" +
			"					};\n" +
			"					class Local {\n" +
			"						void baz() {\n" +
			"//							foo(\"2\");\n" +
			"						}\n" +
			"					}				\n" +
			"					new Local();\n" +
			"				}\n" +
			"			});\n" +
			"			new Object() {\n" +
			"				void baz() {\n" +
			"					foo(\"3\");\n" +
			"					bar(\"3\");\n" +
			"				}\n" +
			"			}.baz();\n" +
			"		}\n" +
			"		void bar(String s) { System.out.print(\"<bar:\"+s+\">\"); }\n" +
			"		void baz() {\n" +
			"			new Object() {\n" +
			"				void baz() {\n" +
			"					foo(\"4\");\n" +
			"					bar(\"4\");\n" +
			"				}\n" +
			"			};\n" +
			"		}\n" +
			"	}\n" +
			"}\n",
		},
		"<foo:0><foo:3><bar:3>");
}
public void test120() {
	CompilerOptions options = new CompilerOptions(getCompilerOptions());
	if (options.sourceLevel < ClassFileConstants.JDK1_5) {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	void foo() {}\n" +
				"	class M {\n" +
				"		M(Object o) {}\n" +
				"		M() {\n" +
				"			this(new Object() {\n" +
				"				void baz() {\n" +
				"					new Object() {\n" +
				"						void baz() {\n" +
				"							foo(); //0\n" +
				"						}\n" +
				"					};\n" +
				"					class Local {\n" +
				"						void baz() {\n" +
				"							foo(); //1\n" +
				"						}\n" +
				"					}\n" +
				"					new Local();\n" +
				"					foo();//2\n" +
				"				}\n" +
				"			});\n" +
				"			new Object() {\n" +
				"				void baz() {\n" +
				"					foo();//3\n" +
				"					bar();\n" +
				"				}\n" +
				"			};\n" +
				"		}\n" +
				"		void bar() {}\n" +
				"		void baz() {\n" +
				"			new Object() {\n" +
				"				void baz() {\n" +
				"					foo();//4\n" +
				"					bar();\n" +
				"				}\n" +
				"			};\n" +
				"		}\n" +
				"	}\n" +
				"}\n",
			},
		"----------\n" +
		"1. ERROR in X.java (at line 10)\n" +
		"	foo(); //0\n" +
		"	^^^^^\n" +
		"No enclosing instance of the type X is accessible in scope\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 15)\n" +
		"	foo(); //1\n" +
		"	^^^^^\n" +
		"No enclosing instance of the type X is accessible in scope\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 19)\n" +
		"	foo();//2\n" +
		"	^^^^^\n" +
		"No enclosing instance of the type X is accessible in scope\n" +
		"----------\n");
		return;
	}
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	void foo() {}\n" +
			"	class M {\n" +
			"		M(Object o) {}\n" +
			"		M() {\n" +
			"			this(new Object() {\n" +
			"				void baz() {\n" +
			"					class Local {\n" +
			"						void baz() {\n" +
			"							foo(); //1\n" +
			"						}\n" +
			"					}\n" +
			"					new Local();\n" +
			"					foo();//2\n" +
			"				}\n" +
			"			});\n" +
			"			new Object() {\n" +
			"				void baz() {\n" +
			"					foo();//3\n" +
			"					bar();\n" +
			"				}\n" +
			"			};\n" +
			"		}\n" +
			"		void bar() {}\n" +
			"		void baz() {\n" +
			"			new Object() {\n" +
			"				void baz() {\n" +
			"					foo();//4\n" +
			"					bar();\n" +
			"				}\n" +
			"			};\n" +
			"		}\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 10)\n" +
		"	foo(); //1\n" +
		"	^^^^^\n" +
		"No enclosing instance of the type X is accessible in scope\n" +
		"----------\n");
}
public void test121() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	X(Object o) {\n" +
			"	}\n" +
			"	class M extends X {\n" +
			"		M() {\n" +
			"			super(null); //1\n" +
			"		}\n" +
			"		M(Object o) {\n" +
			"			super(new X(null){});//2\n" +
			"		}\n" +
			"	}\n" +
			"}\n",
		},
		"");
}
public void _test122() {
	CompilerOptions options = new CompilerOptions(getCompilerOptions());
	if (options.sourceLevel < ClassFileConstants.JDK1_5) {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		new X().new M();\n" +
				"	}\n" +
				"	void foo(String s) { System.out.print(\"<foo:\"+s+\">\"); }\n" +
				"	class M {\n" +
				"		M(Runnable r) { r.run(); }\n" +
				"		M() {\n" +
				"			this(new Runnable() {\n" +
				"				{\n" +
				"					foo(\"0\");\n" +
				"					bar(\"0\");\n" +
				"				}\n" +
				"				public void run() {\n" +
				"				}\n" +
				"			});\n" +
				"		}\n" +
				"		void bar(String s) { System.out.print(\"<bar:\"+s+\">\"); }\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"cannot access foo(0)\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 12)\n" +
			"	bar(\"0\");\n" +
			"	^^^\n" +
			"Cannot refer to an instance method while explicitly invoking a constructor\n" +
			"----------\n");
		return;
	}
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		new X().new M();\n" +
			"	}\n" +
			"	void foo(String s) { System.out.print(\"<foo:\"+s+\">\"); }\n" +
			"	class M {\n" +
			"		M(Runnable r) { r.run(); }\n" +
			"		M() {\n" +
			"			this(new Runnable() {\n" +
			"				{\n" +
			"					foo(\"0\");\n" +
			"					bar(\"0\");\n" +
			"				}\n" +
			"				public void run() {\n" +
			"				}\n" +
			"			});\n" +
			"		}\n" +
			"		void bar(String s) { System.out.print(\"<bar:\"+s+\">\"); }\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 12)\n" +
		"	bar(\"0\");\n" +
		"	^^^\n" +
		"Cannot refer to an instance method while explicitly invoking a constructor\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=110182 - variation
public void test123() throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"class Y {\n" +
			"	public static final boolean b = false;\n" +
			"}\n" +
			"public class X {\n" +
			"    private static Y y = new Y(); \n" +
			"    private static Object o = new Object(); \n" +
			"\n" +
			"	static class Z {\n" +
			"		Z() {\n" +
			"	    	if (y.b) {\n" +
			"	    		System.out.println(\"dead code\");\n" +
			"	    	}\n" +
			"		}\n" +
			"		public int bar() {\n" +
			"	    	if (y.b) {\n" +
			"	    		System.out.println(\"dead code\");\n" +
			"	    	}\n" +
			"    		System.out.println(\"bar\");\n" +
			"			return 0;\n" +
			"		}\n" +
			"	}\n" +
			"    static int foo() {\n" +
			"    	synchronized(o) { \n" +
			"	    	Z z = new Z();\n" +
			"    		return z.bar();\n" +
			"    	}\n" +
			"    }\n" +
			"    \n" +
			"    public static void main(String[] args) {\n" +
			"    	foo();\n" +
			"    }\n" +
			"}\n",
		},
		"bar");
	String nestHost = "";
	CompilerOptions options = new CompilerOptions(getCompilerOptions());
	if (options.complianceLevel >= ClassFileConstants.JDK11) {
		nestHost = "\n" +
						  "Nest Host: #32 X\n";
	}
	// ensure synthetic access method got generated for enclosing field
	String expectedOutput =
		"  // Method descriptor #6 ()V\n" +
			"  // Stack: 1, Locals: 1\n" +
			"  X$Z();\n" +
			"    0  aload_0 [this]\n" +
			"    1  invokespecial java.lang.Object() [8]\n" +
			"    4  return\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 9]\n" +
			"        [pc: 4, line: 13]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 5] local: this index: 0 type: X.Z\n" +
			"  \n" +
			"  // Method descriptor #15 ()I\n" +
			"  // Stack: 2, Locals: 1\n" +
			"  public int bar();\n" +
			"     0  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"     3  ldc <String \"bar\"> [22]\n" +
			"     5  invokevirtual java.io.PrintStream.println(java.lang.String) : void [23]\n" +
			"     8  iconst_0\n" +
			"     9  ireturn\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 18]\n" +
			"        [pc: 8, line: 19]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 10] local: this index: 0 type: X.Z\n" +
			"\n" +
			"  Inner classes:\n" +
			"    [inner class info: #1 X$Z, outer class info: #32 X\n" +
			"     inner name: #34 Z, accessflags: 8 static]\n" +
			nestHost +
			"}";

	File f = new File(OUTPUT_DIR + File.separator + "X$Z.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);
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=77473
public void test124() throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"    public static void main(String[] args) throws Exception {\n" +
			"        Foo foo = new Foo();\n" +
			"        try {\n" +
			"	        foo.frob(Baz.class);\n" +
			"        	System.out.println(\"FAILED\");\n" +
			"        } catch(IllegalAccessException e){\n" +
			"        	System.out.println(\"SUCCESS\");\n" +
			"        }\n" +
			"    }\n" +
			"    private static class Baz {\n" +
			"    }\n" +
			"}\n" +
			"class Foo {\n" +
			"    public void frob(Class cls) throws Exception {\n" +
			"        Object o = cls.newInstance();\n" +
			"    }\n" +
			"}\n",
		},
		"SUCCESS");
	// ensure synthetic access method got generated for enclosing field
	String expectedOutput =
		"  // Method descriptor #6 ()V\n" +
		"  // Stack: 1, Locals: 1\n" +
		"  private X$Baz();\n" +
		"    0  aload_0 [this]\n" +
		"    1  invokespecial java.lang.Object() [8]\n" +
		"    4  return\n" +
		"      Line numbers:\n" +
		"        [pc: 0, line: 11]\n" +
		"      Local variable table:\n" +
		"        [pc: 0, pc: 5] local: this index: 0 type: X.Baz\n";

	File f = new File(OUTPUT_DIR + File.separator + "X$Baz.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);
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=77473 - variation
public void test125() throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	\n" +
			"	void foo(final String s) {\n" +
			"		class Local {\n" +
			"			private Local() {}\n" +
			"				void bar() {\n" +
			"					System.out.println(s);\n" +
			"				}\n" +
			"		}\n" +
			"		new Local().bar();\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		new X().foo(\"SUCCESS\");\n" +
			"	}\n" +
			"}\n",
		},
		"SUCCESS");
	// check private constructor outcome (if >= 1.4 modifier change, if 1.3 synthetic emulation)
	CompilerOptions options = new CompilerOptions(getCompilerOptions());
	String expectedOutput = options.complianceLevel <= ClassFileConstants.JDK1_3
		? 	"class X$1$Local {\n" +
			"  \n" +
			"  // Field descriptor #6 LX;\n" +
			"  final synthetic X this$0;\n" +
			"  \n" +
			"  // Field descriptor #9 Ljava/lang/String;\n" +
			"  private final synthetic java.lang.String val$s;\n" +
			"  \n" +
			"  // Method descriptor #11 (LX;Ljava/lang/String;)V\n" +
			"  // Stack: 2, Locals: 3\n" +
			"  private X$1$Local(X arg0, java.lang.String arg1);\n" +
			"     0  aload_0 [this]\n" +
			"     1  invokespecial java.lang.Object() [13]\n" +
			"     4  aload_0 [this]\n" +
			"     5  aload_1 [arg0]\n" +
			"     6  putfield X$1$Local.this$0 : X [16]\n" +
			"     9  aload_0 [this]\n" +
			"    10  aload_2 [arg1]\n" +
			"    11  putfield X$1$Local.val$s : java.lang.String [18]\n" +
			"    14  return\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 5]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 15] local: this index: 0 type: new X(){}.Local\n" +
			"  \n" +
			"  // Method descriptor #15 ()V\n" +
			"  // Stack: 2, Locals: 1\n" +
			"  void bar();\n" +
			"     0  getstatic java.lang.System.out : java.io.PrintStream [25]\n" +
			"     3  aload_0 [this]\n" +
			"     4  getfield X$1$Local.val$s : java.lang.String [18]\n" +
			"     7  invokevirtual java.io.PrintStream.println(java.lang.String) : void [31]\n" +
			"    10  return\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 7]\n" +
			"        [pc: 10, line: 8]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 11] local: this index: 0 type: new X(){}.Local\n" +
			"  \n" +
			"  // Method descriptor #37 (LX;Ljava/lang/String;LX$1$Local;)V\n" +
			"  // Stack: 3, Locals: 4\n" +
			"  synthetic X$1$Local(X arg0, java.lang.String arg1, new X(){}.Local arg2);\n" +
			"    0  aload_0 [this]\n" +
			"    1  aload_1 [arg0]\n" +
			"    2  aload_2 [arg1]\n" +
			"    3  invokespecial X$1$Local(X, java.lang.String) [38]\n" +
			"    6  return\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 5]\n" +
			"\n" +
			"  Inner classes:\n" +
			"    [inner class info: #1 X$1$Local, outer class info: #0\n" +
			"     inner name: #43 Local, accessflags: 0 default]\n" +
			"}"
		: options.complianceLevel == ClassFileConstants.JDK1_4
			?  	"class X$1$Local {\n" +
			"  \n" +
			"  // Field descriptor #6 LX;\n" +
			"  final synthetic X this$0;\n" +
			"  \n" +
			"  // Field descriptor #9 Ljava/lang/String;\n" +
			"  private final synthetic java.lang.String val$s;\n" +
			"  \n" +
			"  // Method descriptor #11 (LX;Ljava/lang/String;)V\n" +
			"  // Stack: 2, Locals: 3\n" +
			"  X$1$Local(X arg0, java.lang.String arg1);\n" +
			"     0  aload_0 [this]\n" +
			"     1  aload_1 [arg0]\n" +
			"     2  putfield X$1$Local.this$0 : X [13]\n" +
			"     5  aload_0 [this]\n" +
			"     6  aload_2 [arg1]\n" +
			"     7  putfield X$1$Local.val$s : java.lang.String [15]\n" +
			"    10  aload_0 [this]\n" +
			"    11  invokespecial java.lang.Object() [17]\n" +
			"    14  return\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 5]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 15] local: this index: 0 type: new X(){}.Local\n" +
			"  \n" +
			"  // Method descriptor #19 ()V\n" +
			"  // Stack: 2, Locals: 1\n" +
			"  void bar();\n" +
			"     0  getstatic java.lang.System.out : java.io.PrintStream [25]\n" +
			"     3  aload_0 [this]\n" +
			"     4  getfield X$1$Local.val$s : java.lang.String [15]\n" +
			"     7  invokevirtual java.io.PrintStream.println(java.lang.String) : void [31]\n" +
			"    10  return\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 7]\n" +
			"        [pc: 10, line: 8]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 11] local: this index: 0 type: new X(){}.Local\n" +
			"\n" +
			"  Inner classes:\n" +
			"    [inner class info: #1 X$1$Local, outer class info: #0\n" +
			"     inner name: #40 Local, accessflags: 0 default]\n" +
			"}"
			:	"class X$1Local {\n" +
				"  \n" +
				"  // Field descriptor #6 LX;\n" +
				"  final synthetic X this$0;\n" +
				"  \n" +
				"  // Field descriptor #8 Ljava/lang/String;\n" +
				"  private final synthetic java.lang.String val$s;\n" +
				"  \n" +
				"  // Method descriptor #10 (LX;Ljava/lang/String;)V\n" +
				"  // Stack: 2, Locals: 3\n" +
				(isMinimumCompliant(ClassFileConstants.JDK11) ? "  private " :"  ") +
				"X$1Local(X arg0, java.lang.String arg1);\n" +
				"     0  aload_0 [this]\n" +
				"     1  aload_1 [arg0]\n" +
				"     2  putfield X$1Local.this$0 : X [12]\n" +
				"     5  aload_0 [this]\n" +
				"     6  aload_2 [arg1]\n" +
				"     7  putfield X$1Local.val$s : java.lang.String [14]\n" +
				"    10  aload_0 [this]\n" +
				"    11  invokespecial java.lang.Object() [16]\n" +
				"    14  return\n" +
				"      Line numbers:\n" +
				"        [pc: 0, line: 5]\n" +
				"      Local variable table:\n" +
				"        [pc: 0, pc: 15] local: this index: 0 type: new X(){}\n" +
				"  \n" +
				"  // Method descriptor #18 ()V\n" +
				"  // Stack: 2, Locals: 1\n" +
				"  void bar();\n" +
				"     0  getstatic java.lang.System.out : java.io.PrintStream [24]\n" +
				"     3  aload_0 [this]\n" +
				"     4  getfield X$1Local.val$s : java.lang.String [14]\n" +
				"     7  invokevirtual java.io.PrintStream.println(java.lang.String) : void [30]\n" +
				"    10  return\n" +
				"      Line numbers:\n" +
				"        [pc: 0, line: 7]\n" +
				"        [pc: 10, line: 8]\n" +
				"      Local variable table:\n" +
				"        [pc: 0, pc: 11] local: this index: 0 type: new X(){}\n" +
				"\n" +
				"  Inner classes:\n" +
				"    [inner class info: #1 X$1Local, outer class info: #0\n" +
				"     inner name: #44 Local, accessflags: 0 default]\n" +
				(isMinimumCompliant(ClassFileConstants.JDK11) ? 
				"  Enclosing Method: #39  #41 X.foo(Ljava/lang/String;)V\n" +
				"\n" +
				"Nest Host: #39 X\n" : "");

	File f = new File(OUTPUT_DIR + File.separator + (options.complianceLevel >= ClassFileConstants.JDK1_5 ? "X$1Local.class" : "X$1$Local.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);
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=130117
public void test126() {
	CompilerOptions options = new CompilerOptions(getCompilerOptions());
	if (options.sourceLevel < ClassFileConstants.JDK1_5) {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public interface X {\n" +
				"        private class Inner {}\n" +
				"        private interface IInner {}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	private class Inner {}\n" +
			"	              ^^^^^\n" +
			"The interface member type Inner can only be public\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 3)\n" +
			"	private interface IInner {}\n" +
			"	                  ^^^^^^\n" +
			"The interface member type IInner can only be public\n" +
			"----------\n");
		return;
	}
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public interface X {\n" +
			"        private class Inner {}\n" +
			"        private interface IInner {}\n" +
			"        private enum EInner {}\n" +
			"        private @interface AInner {}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 2)\n" +
		"	private class Inner {}\n" +
		"	              ^^^^^\n" +
		"The interface member type Inner can only be public\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 3)\n" +
		"	private interface IInner {}\n" +
		"	                  ^^^^^^\n" +
		"The interface member type IInner can only be public\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 4)\n" +
		"	private enum EInner {}\n" +
		"	             ^^^^^^\n" +
		"The interface member type EInner can only be public\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 5)\n" +
		"	private @interface AInner {}\n" +
		"	                   ^^^^^^\n" +
		"The interface member type AInner can only be public\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=89347
public void test127() {
	this.runConformTest(
		new String[] {
			"p/BugContainer.java",
			"package p;\n" +
			"\n" +
			"public abstract class BugContainer {\n" +
			"        protected static class InternalInfo$ {\n" +
			"                public InternalInfo$() {}\n" +
			"        }\n" +
			"        abstract protected InternalInfo$ getInfo();\n" +
			"}\n", // =================
		},
		"");
	this.runConformTest(
		new String[] {
				"q/BugUser.java", // =================
				"package q;\n" +
				"\n" +
				"import p.BugContainer;\n" +
				"\n" +
				"public class BugUser extends BugContainer{\n" +
				"        protected InternalInfo$ getInfo() {\n" +
				"                return new InternalInfo$();\n" +
				"        }\n" +
				"}", // =================
			},
		"",
		null,
		false,
		null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=89347 - variation
public void test128() {
	this.runConformTest(
		new String[] {
			"p/BugContainer.java",
			"package p;\n" +
			"\n" +
			"public abstract class BugContainer {\n" +
			"        protected static class InternalInfo$ {\n" +
			"                public InternalInfo$() {}\n" +
			"        }\n" +
			"        abstract protected InternalInfo$ getInfo();\n" +
			"}\n", // =================
			"q/BugUser.java", // =================
			"package q;\n" +
			"\n" +
			"import p.BugContainer;\n" +
			"\n" +
			"public class BugUser extends BugContainer{\n" +
			"        protected InternalInfo$ getInfo() {\n" +
			"                return new InternalInfo$();\n" +
			"        }\n" +
			"}", // =================
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=160132 - variation
public void test129() {
	this.runConformTest(
		new String[] {
			"X.java", //========================
			"public interface X {\n" +
			"  interface Entry {\n" +
			"    interface Internal extends Entry {\n" +
			"      Internal createEntry();\n" +
			"    }\n" +
			"  }\n" +
			"}\n", //========================
			"Y.java",
			"public class Y implements X.Entry.Internal {\n" +
			"  public Internal createEntry() {\n" +
			"    return null;\n" +
			"  }\n" +
			"}\n" , //========================
		},
		"");
	// compile Y against X binary
	this.runConformTest(
			new String[] {
				"Y.java", //========================
				"public class Y implements X.Entry.Internal {\n" +
				"  public Internal createEntry() {\n" +
				"    return null;\n" +
				"  }\n" +
				"}\n" , //========================
			},
			"",
			null,
			false,
			null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=164497
public void test130() {
	CompilerOptions options = new CompilerOptions(getCompilerOptions());
	if (options.sourceLevel <= ClassFileConstants.JDK1_3) {
    	runConformTest(
   			true /* flush output directory */,
    		new String[] { /* test files */
    			"X.java", //========================
    			"public class X {\n" +
    			"    public static void main(String[] args) {\n" +
    			"    	new M().foo2();\n" +
    			"    }\n" +
    			"}\n"+
    			"class M  {\n" +
    			"	String name;\n" +
    			"	\n" +
    			"	M() {\n" +
    			"		this.name = \"SUCCESS\";\n" +
    			"	}\n" +
    			"\n" +
    			"	private class Y extends N {\n" +
    			"		private Y() {\n" +
    			"			super();\n" +
    			"		}\n" +
    			"		protected void foo(Z z) {\n" +
    			"			z.bar(new A());\n" +
    			"		}\n" +
    			"	}\n" +
    			"	\n" +
    			"    public class A implements I {\n" +
    			"    	public void configure() {\n" +
    			"    		new B().foo();\n" +
    			"    	}\n" +
    			"    	public class B {\n" +
    			"            public void foo() {\n" +
    			"				try {\n" +
    			"                System.out.println(M.this.name);\n" +
    			"				} catch(NullPointerException e) {\n" +
    			"					System.err.println(\"NPE THROWN\");\n" +
    			"				}\n" +
    			"            }\n" +
    			"        }\n" +
    			"    }\n" +
    			"    \n" +
    			"    public void foo2() {\n" +
    			"    	new Y();\n" +
    			"    }\n" +
    			"}\n" +
    			"class Z {\n" +
    			"	void bar(I i) {\n" +
    			"		i.configure();\n" +
    			"	}\n" +
    			"}\n" +
    			"\n" +
    			"interface I {\n" +
    			"	void configure();\n" +
    			"}\n" +
    			"\n" +
    			"class N {\n" +
    			"	protected void foo(Z z) {\n" +
    			"	}\n" +
    			"	N() {\n" +
    			"		this.foo(new Z());\n" +
    			"	}\n" +
    			"}\n"
    		},
			null /* do not check compiler log */,
			"" /* expected output string */,
			"NPE THROWN" /* expected error string */,
			JavacTestOptions.DEFAULT /* default javac test options */);
    	return;
	}
	this.runConformTest(
    		new String[] {
    			"X.java", //========================
    			"public class X {\n" +
    			"    public static void main(String[] args) {\n" +
    			"    	new M().foo2();\n" +
    			"    }\n" +
    			"}\n"+
    			"class M  {\n" +
    			"	String name;\n" +
    			"	\n" +
    			"	M() {\n" +
    			"		this.name = \"SUCCESS\";\n" +
    			"	}\n" +
    			"\n" +
    			"	private class Y extends N {\n" +
    			"		private Y() {\n" +
    			"			super();\n" +
    			"		}\n" +
    			"		protected void foo(Z z) {\n" +
    			"			z.bar(new A());\n" +
    			"		}\n" +
    			"	}\n" +
    			"	\n" +
    			"    public class A implements I {\n" +
    			"    	public void configure() {\n" +
    			"    		new B().foo();\n" +
    			"    	}\n" +
    			"    	public class B {\n" +
    			"            public void foo() {\n" +
    			"                System.out.println(M.this.name);\n" +
    			"            }\n" +
    			"        }\n" +
    			"    }\n" +
    			"    \n" +
    			"    public void foo2() {\n" +
    			"    	new Y();\n" +
    			"    }\n" +
    			"}\n" +
    			"class Z {\n" +
    			"	void bar(I i) {\n" +
    			"		i.configure();\n" +
    			"	}\n" +
    			"}\n" +
    			"\n" +
    			"interface I {\n" +
    			"	void configure();\n" +
    			"}\n" +
    			"\n" +
    			"class N {\n" +
    			"	protected void foo(Z z) {\n" +
    			"	}\n" +
    			"	N() {\n" +
    			"		this.foo(new Z());\n" +
    			"	}\n" +
    			"}\n"
    		},
    		"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=165662
public void test131() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	void foo() {\n" +
			"		class Local {\n" +
			"			void foo() {\n" +
			"			}\n" +
			"		}\n" +
			"		{\n" +
			"			class Local {\n" +
			"				Local(int i) {\n" +
			"					this.init(i);\n" +
			"					this.bar(); // should detect error\n" +
			"				}\n" +
			"				void init(int i) {\n" +
			"				}\n" +
			"			}\n" +
			"			Local l = new Local(0); // should be fine\n" +
			"		}\n" +
			"		Local l = new Local();\n" +
			"		l.foo();\n" +
			"	}\n" +
			"}", // =================,
		},
		"----------\n" +
		"1. ERROR in X.java (at line 8)\n" +
		"	class Local {\n" +
		"	      ^^^^^\n" +
		"Duplicate nested type Local\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 11)\n" +
		"	this.bar(); // should detect error\n" +
		"	     ^^^\n" +
		"The method bar() is undefined for the type Local\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=165662
public void test132() {
	this.runConformTest(
		true,
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void main(String argv[]) {\n" +
			"		class Local {}\n" +
			"		class Foo {\n" +
			"			void foo() {\n" +
			"				class Local {}\n" +
			"			}\n" +
			"		}\n" +
			"	}\n" +
			"}", // =================
		},
		"----------\n" +
		"1. WARNING in X.java (at line 6)\n" +
		"	class Local {}\n" +
		"	      ^^^^^\n" +
		"The type Local is hiding the type Local\n" +
		"----------\n",
		"",
		"",
		JavacTestOptions.Excuse.EclipseHasSomeMoreWarnings);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=168331
public void test133() {
	if (this.complianceLevel >= ClassFileConstants.JDK1_5) {
		this.runConformTest(
			new String[] {
				"X.java",	//===================
				"public class X {\n" +
				"  public static interface I {\n" +
				"  }\n" +
				"  public static interface IE extends I {\n" +
				"  }\n" +
				"  public static interface J {\n" +
				"    I getI(int i);\n" +
				"  }\n" +
				"  public static interface JE extends J {\n" +
				"    IE getI(int i);\n" +
				"  }\n" +
				"  public static class Y implements JE {\n" +
				"    public IE getI(int i) {\n" +
				"      return null;\n" +
				"    }\n" +
				"  }\n" +
				"  private J j = new Y();\n" +
				"  public void foo() {\n" +
				"    j.getI(0);\n" +
				"    System.out.println(\"SUCCESS\");\n" +
				"  }\n" +
				"  public static void main(String[] args) {\n" +
				"    new X().foo();\n" +
				"  }\n" +
				"}", 		// =================
			},
			"SUCCESS");
	}
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=168331
public void test134() {
	if (this.complianceLevel >= ClassFileConstants.JDK1_5) {
		this.runConformTest(
			new String[] {
				"X.java",	//===================
				"public class X {\n" +
				"  public interface I {\n" +
				"    public String foo();\n" +
				"  }\n" +
				"  public interface J {\n" +
				"    public I getI();\n" +
				"  }\n" +
				"  public static class XI implements I {\n" +
				"    public String foo() {\n" +
				"      return \"XI\";\n" +
				"    }\n" +
				"  }\n" +
				"  public interface K extends J {\n" +
				"    public XI getI();\n" +
				"  }\n" +
				"  public static abstract class XK implements K {\n" +
				"    public XI getI() {\n" +
				"      return new XI();\n" +
				"    }\n" +
				"  }\n" +
				"  public static class Y extends XK {\n" +
				"  }\n" +
				"  public static void main(String[] args) {\n" +
				"    K k = new Y();\n" +
				"    System.out.println(k.getI().foo());\n" +
				"    J j = k;\n" +
				"    System.out.println(j.getI().foo());\n" +
				"  }\n" +
				"}", 		// =================
			},
			"XI\nXI");
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=152961
public void test135() {
	this.runNegativeTest(
		new String[] {
			"p/X.java",
			"package p;\n" +
			"import p.A;\n" +
			"public class X {\n" +
			"	\n" +
			"	void foo(Object o, Object [] os) {\n" +
			"		A.M2.MM1 mm1 = (A.M2.MM1) o;\n" +
			"		A.M2.MM1[] mm1s = (A.M2.MM1[]) os;\n" +
			"	}\n" +
			"	private interface Outer {\n" +
			"		interface Inner {\n" +
			"			String variable = \"my testing\";\n" +
			"		}\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		System.out.println(Outer.Inner.variable);\n" +
			"		Zork z;\n" +
			"	}\n" +
			"}", // =================,
			"p/A.java",
			"package p;\n" +
			"/** @deprecated */\n" +
			"public class A {\n" +
			"	public class M1 {\n" +
			"		public class MM1 {\n" +
			"		}\n" +
			"	}\n" +
			"	public class M2 extends M1 {\n" +
			"	}\n" +
			"}", // =================,
		},
		"----------\n" +
		"1. WARNING in p\\X.java (at line 2)\n" +
		"	import p.A;\n" +
		"	       ^^^\n" +
		"The type A is deprecated\n" +
		"----------\n" +
		"2. WARNING in p\\X.java (at line 6)\n" +
		"	A.M2.MM1 mm1 = (A.M2.MM1) o;\n" +
		"	^\n" +
		"The type A is deprecated\n" +
		"----------\n" +
		"3. WARNING in p\\X.java (at line 6)\n" +
		"	A.M2.MM1 mm1 = (A.M2.MM1) o;\n" +
		"	  ^^\n" +
		"The type A.M2 is deprecated\n" +
		"----------\n" +
		"4. WARNING in p\\X.java (at line 6)\n" +
		"	A.M2.MM1 mm1 = (A.M2.MM1) o;\n" +
		"	     ^^^\n" +
		"The type A.M1.MM1 is deprecated\n" +
		"----------\n" +
		"5. WARNING in p\\X.java (at line 6)\n" +
		"	A.M2.MM1 mm1 = (A.M2.MM1) o;\n" +
		"	                ^\n" +
		"The type A is deprecated\n" +
		"----------\n" +
		"6. WARNING in p\\X.java (at line 6)\n" +
		"	A.M2.MM1 mm1 = (A.M2.MM1) o;\n" +
		"	                  ^^\n" +
		"The type A.M2 is deprecated\n" +
		"----------\n" +
		"7. WARNING in p\\X.java (at line 6)\n" +
		"	A.M2.MM1 mm1 = (A.M2.MM1) o;\n" +
		"	                     ^^^\n" +
		"The type A.M1.MM1 is deprecated\n" +
		"----------\n" +
		"8. WARNING in p\\X.java (at line 7)\n" +
		"	A.M2.MM1[] mm1s = (A.M2.MM1[]) os;\n" +
		"	^\n" +
		"The type A is deprecated\n" +
		"----------\n" +
		"9. WARNING in p\\X.java (at line 7)\n" +
		"	A.M2.MM1[] mm1s = (A.M2.MM1[]) os;\n" +
		"	  ^^\n" +
		"The type A.M2 is deprecated\n" +
		"----------\n" +
		"10. WARNING in p\\X.java (at line 7)\n" +
		"	A.M2.MM1[] mm1s = (A.M2.MM1[]) os;\n" +
		"	     ^^^\n" +
		"The type A.M1.MM1 is deprecated\n" +
		"----------\n" +
		"11. WARNING in p\\X.java (at line 7)\n" +
		"	A.M2.MM1[] mm1s = (A.M2.MM1[]) os;\n" +
		"	                   ^\n" +
		"The type A is deprecated\n" +
		"----------\n" +
		"12. WARNING in p\\X.java (at line 7)\n" +
		"	A.M2.MM1[] mm1s = (A.M2.MM1[]) os;\n" +
		"	                     ^^\n" +
		"The type A.M2 is deprecated\n" +
		"----------\n" +
		"13. WARNING in p\\X.java (at line 7)\n" +
		"	A.M2.MM1[] mm1s = (A.M2.MM1[]) os;\n" +
		"	                        ^^^\n" +
		"The type A.M1.MM1 is deprecated\n" +
		"----------\n" +
		"14. ERROR in p\\X.java (at line 16)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=152961 - variation
public void test136() {
	this.runNegativeTest(
		new String[] {
			"p/X.java",
			"package p;\n" +
			"public class X {\n" +
			"	private interface Outer {\n" +
			"		interface Inner {\n" +
			"			String variable = \"my testing\";\n" +
			"		}\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		Outer.Inner variable = null;\n" +
			"		System.out.println(variable);\n" +
			"		Zork z;\n" +
			"	}\n" +
			"}", // =================,
		},
		"----------\n" +
		"1. ERROR in p\\X.java (at line 11)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=152961 - variation
public void test137() {
	this.runNegativeTest(
		new String[] {
			"p/X.java",
			"package p;\n" +
			"public class X {\n" +
			"	private interface Outer {\n" +
			"		interface Inner {\n" +
			"			String variable = \"my testing\";\n" +
			"		}\n" +
			"	}\n" +
			"	private interface Outer2 extends Outer {\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		System.out.println(Outer2.Inner.variable);\n" +
			"		Zork z;\n" +
			"	}\n" +
			"}", // =================,
		},
		"----------\n" +
		"1. ERROR in p\\X.java (at line 12)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=152961 - variation
public void test138() {
	this.runNegativeTest(
		new String[] {
			"p/X.java",
			"public class X {\n" +
			"	private interface Outer {\n" +
			"		interface Inner {\n" +
			"			String variable = \"my testing\";\n" +
			"		}\n" +
			"	}\n" +
			"	private interface Outer2 extends Outer {\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		Outer2.Inner variable = null;\n" +
			"		System.out.println(variable);\n" +
			"		Zork z;\n" +
			"	}\n" +
			"}", // =================,
		},
		"----------\n" +
		"1. ERROR in p\\X.java (at line 12)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=152961 - variation
public void test139() {
	String errMessage = isMinimumCompliant(ClassFileConstants.JDK11) ?
			"----------\n" +
			"1. ERROR in X.java (at line 9)\n" +
			"	class Y extends Zork {}\n" +
			"	                ^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n"
			:
			"----------\n" +
			"1. WARNING in X.java (at line 5)\n" +
			"	private class Y extends A {\n" +
			"	              ^\n" +
			"Access to enclosing constructor X.A() is emulated by a synthetic accessor method\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 9)\n" +
			"	class Y extends Zork {}\n" +
			"	                ^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n";
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X { \n" +
			"   private class A {\n" +
			"    class B {}\n" +
			"  }\n" +
			"  private class Y extends A {\n" +
			"  }\n" +
			"  Y.B d = null;\n" +
			"}\n" +
			"class Y extends Zork {}\n", // =================
		},
		errMessage);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=171184
public void test140() throws Exception {
	this.runConformTest(new String[] {
		"p/A.java",
		"package p;\n" +
		"public class A {\n" +
		"	public static interface I {\n" +
		"		void foo();\n" +
		"	}\n" +
		"}",
		"p1/X.java",
		"package p1;\n" +
		"import p.A;\n" +
		"public class X implements A.I {\n" +
		"        public void foo() { /* dummy */ }\n" +
		"}"
	});
	String expectedOutput =
		"  Inner classes:\n" +
		"    [inner class info: #5 p/A$I, outer class info: #20 p/A\n" +
		"     inner name: #22 I, accessflags: 1545 public abstract static]\n";
	checkDisassembledClassFile(OUTPUT_DIR + File.separator + "p1" + File.separator + "X.class", "X", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=171184
public void test141() throws Exception {
	this.runConformTest(new String[] {
		"p/A.java",
		"package p;\n" +
		"public class A {\n" +
		"	public static class B {\n" +
		"		void foo() { /* dummy */ }\n" +
		"	}\n" +
		"}",
		"p1/X.java",
		"package p1;\n" +
		"import p.A;\n" +
		"public class X extends A.B {\n" +
		"}"
	});
	String expectedOutput =
		"  Inner classes:\n" +
		"    [inner class info: #3 p/A$B, outer class info: #17 p/A\n" +
		"     inner name: #19 B, accessflags: 9 public static]\n";
	checkDisassembledClassFile(OUTPUT_DIR + File.separator + "p1" + File.separator + "X.class", "X", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=171184
public void test142() throws Exception {
	this.runConformTest(new String[] {
		"p/A.java",
		"package p;\n" +
		"public class A {\n" +
		"	public class B {\n" +
		"		void foo() { /* dummy */ }\n" +
		"	}\n" +
		"}",
		"p1/X.java",
		"package p1;\n" +
		"import p.A;\n" +
		"public class X {\n" +
		"	Object foo() {\n" +
		"		return new A().new B();\n" +
		"	}\n" +
		"}"
	});
	String expectedOutput =
		"  Inner classes:\n" +
		"    [inner class info: #16 p/A$B, outer class info: #18 p/A\n" +
		"     inner name: #31 B, accessflags: 1 public]\n";
	if (new CompilerOptions(getCompilerOptions()).targetJDK == ClassFileConstants.JDK1_1) {
		expectedOutput =
			"  Inner classes:\n" +
			"    [inner class info: #16 p/A$B, outer class info: #18 p/A\n" +
			"     inner name: #27 B, accessflags: 1 public]\n";
	}
	checkDisassembledClassFile(OUTPUT_DIR + File.separator + "p1" + File.separator + "X.class", "X", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=171184
public void test143() throws Exception {
	this.runConformTest(new String[] {
		"X.java",
		"class A {\n" +
		"	public class B {\n" +
		"		void foo() { /* dummy */ }\n" +
		"	}\n" +
		"}\n" +
		"public class X {\n" +
		"	Object foo() {\n" +
		"		return A.B.class;\n" +
		"	}\n" +
		"}"
	});
	if (new CompilerOptions(getCompilerOptions()).targetJDK >= ClassFileConstants.JDK1_5) {
		String expectedOutput =
			"  Inner classes:\n" +
			"    [inner class info: #16 A$B, outer class info: #21 A\n" +
			"     inner name: #23 B, accessflags: 1 public]\n";
		checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput);
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=171184
public void test144() throws Exception {
	this.runConformTest(new String[] {
		"X.java",
		"class A {\n" +
		"	public static class B {\n" +
		"		public static int CONST = 0;\n" +
		"	}\n" +
		"}\n" +
		"public class X {\n" +
		"	int foo() {\n" +
		"		return A.B.CONST;\n" +
		"	}\n" +
		"}"
	});
	String expectedOutput =
		"  Inner classes:\n" +
		"    [inner class info: #17 A$B, outer class info: #25 A\n" +
		"     inner name: #27 B, accessflags: 9 public static]\n";
	checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=171184
public void test145() throws Exception {
	this.runConformTest(new String[] {
		"X.java",
		"class A {\n" +
		"	public static class B {\n" +
		"	}\n" +
		"}\n" +
		"public class X {\n" +
		"	A.B field;\n" +
		"}"
	});
	String expectedOutput =
		"  Inner classes:\n" +
		"    [inner class info: #19 A$B, outer class info: #21 A\n" +
		"     inner name: #23 B, accessflags: 9 public static]\n";
	checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=171184
public void test146() throws Exception {
	this.runConformTest(new String[] {
		"X.java",
		"class A {\n" +
		"	public static class B {\n" +
		"	}\n" +
		"}\n" +
		"public class X {\n" +
		"	int foo(A.B o) {\n" +
		"		return 0;\n" +
		"	}\n" +
		"}"
	});
	String expectedOutput =
		"  Inner classes:\n" +
		"    [inner class info: #21 A$B, outer class info: #23 A\n" +
		"     inner name: #25 B, accessflags: 9 public static]\n";
	checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=171184
public void test147() throws Exception {
	this.runConformTest(new String[] {
		"X.java",
		"class A {\n" +
		"	public static class B {\n" +
		"	}\n" +
		"}\n" +
		"public class X {\n" +
		"	A.B foo() {\n" +
		"		return null;\n" +
		"	}\n" +
		"}"
	});
	String expectedOutput =
		"  Inner classes:\n" +
		"    [inner class info: #19 A$B, outer class info: #21 A\n" +
		"     inner name: #23 B, accessflags: 9 public static]\n";
	checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=171184
public void test148() throws Exception {
	this.runConformTest(new String[] {
		"X.java",
		"class A {\n" +
		"	public static class B extends Exception {\n" +
		"	}\n" +
		"}\n" +
		"public class X {\n" +
		"	void foo() throws A.B{\n" +
		"	}\n" +
		"}"
	});
	String expectedOutput =
		"  Inner classes:\n" +
		"    [inner class info: #16 A$B, outer class info: #21 A\n" +
		"     inner name: #23 B, accessflags: 9 public static]\n";
	checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=171749
public void test149() throws Exception {
	this.runConformTest(new String[] {
		"X.java",
		"public final class X implements A.Foo1 {\n" +
		"        public void foo() {}\n" +
		"        public A.Foo2 foo2() {   return null; }\n" +
		"        public void foo3( A.Foo3 foo ) {}\n" +
		"        public void foo4() { A.Foo4 foo = null; }\n" +
		"        public void foo5() {\n" +
		"                new A.Foo5() {\n" +
		"                        public void foo() {}\n" +
		"                }.foo();\n" +
		"        }\n" +
		"        public static class Foo6 implements A.Foo6 {\n" +
		"                public void foo() {}\n" +
		"        }\n" +
		"        public void foo7() { Bar2.foo7().foo(); }\n" +
		"}",
		"A.java",
		"class A {\n" +
		"        public static interface Foo1 { void foo(); }\n" +
		"        public static interface Foo2 { void foo(); }\n" +
		"        public static interface Foo3 { void foo(); }\n" +
		"        public static interface Foo4 { void foo(); }\n" +
		"        public static interface Foo5 { void foo(); }\n" +
		"        public static interface Foo6 { void foo(); }\n" +
		"        public static interface Foo7 { void foo(); }\n" +
		"}",
		"Bar2.java",
		"class Bar2 {\n" +
		"        public static A.Foo7 foo7() { return null; }\n" +
		"}"
	});
	String expectedOutput =
		"  Inner classes:\n" +
		"    [inner class info: #5 A$Foo1, outer class info: #44 A\n" +
		"     inner name: #46 Foo1, accessflags: 1545 public abstract static],\n" +
		"    [inner class info: #47 A$Foo2, outer class info: #44 A\n" +
		"     inner name: #49 Foo2, accessflags: 1545 public abstract static],\n" +
		"    [inner class info: #50 A$Foo3, outer class info: #44 A\n" +
		"     inner name: #52 Foo3, accessflags: 1545 public abstract static],\n" +
		"    [inner class info: #39 A$Foo7, outer class info: #44 A\n" +
		"     inner name: #53 Foo7, accessflags: 1545 public abstract static],\n" +
		"    [inner class info: #25 X$1, outer class info: #0\n" +
		"     inner name: #0, accessflags: 0 default],\n" +
		"    [inner class info: #54 X$Foo6, outer class info: #1 X\n" +
		"     inner name: #56 Foo6, accessflags: 9 public static]\n";
	checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=210422
public void test150() {
	this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.io.Serializable;\n" +
				"\n" +
				"public final class X implements Serializable {\n" +
				"\n" +
				"        void bar() {}\n" +
				"\n" +
				"        interface IM {}\n" +
				"        class SMember extends String {}\n" +
				"\n" +
				"        class Member extends X {  \n" +
				"                ZorkMember z;\n" +
				"                void foo() {\n" +
				"                        this.bar();\n" +
				"                        Zork1 z;\n" +
				"                } \n" +
				"        }\n" +
				"\n" +
				"        void foo() {\n" +
				"                new X().new IM();\n" +
				"                class Local extends X { \n" +
				"                        ZorkLocal z;\n" +
				"                        void foo() {\n" +
				"                                this.bar();\n" +
				"                                Zork3 z;\n" +
				"                        }\n" +
				"                }\n" +
				"                new X() {\n" +
				"                        ZorkAnonymous2 z;                       \n" +
				"                        void foo() {\n" +
				"                                this.bar();\n" +
				"                                Zork4 z;\n" +
				"                        }\n" +
				"                };\n" +
				"        }\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	public final class X implements Serializable {\n" +
			"	                   ^\n" +
			"The serializable class X does not declare a static final serialVersionUID field of type long\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 8)\n" +
			"	class SMember extends String {}\n" +
			"	                      ^^^^^^\n" +
			"The type SMember cannot subclass the final class String\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 10)\n" +
			"	class Member extends X {  \n" +
			"	                     ^\n" +
			"The type Member cannot subclass the final class X\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 11)\n" +
			"	ZorkMember z;\n" +
			"	^^^^^^^^^^\n" +
			"ZorkMember cannot be resolved to a type\n" +
			"----------\n" +
			"5. ERROR in X.java (at line 13)\n" +
			"	this.bar();\n" +
			"	     ^^^\n" +
			"The method bar() is undefined for the type X.Member\n" +
			"----------\n" +
			"6. ERROR in X.java (at line 14)\n" +
			"	Zork1 z;\n" +
			"	^^^^^\n" +
			"Zork1 cannot be resolved to a type\n" +
			"----------\n" +
			"7. WARNING in X.java (at line 14)\n" +
			"	Zork1 z;\n" +
			"	      ^\n" +
			"The local variable z is hiding a field from type X.Member\n" +
			"----------\n" +
			"8. ERROR in X.java (at line 19)\n" +
			"	new X().new IM();\n" +
			"	            ^^\n" +
			"Cannot instantiate the type X.IM\n" +
			"----------\n" +
			"9. ERROR in X.java (at line 20)\n" +
			"	class Local extends X { \n" +
			"	                    ^\n" +
			"The type Local cannot subclass the final class X\n" +
			"----------\n" +
			"10. ERROR in X.java (at line 21)\n" +
			"	ZorkLocal z;\n" +
			"	^^^^^^^^^\n" +
			"ZorkLocal cannot be resolved to a type\n" +
			"----------\n" +
			"11. ERROR in X.java (at line 23)\n" +
			"	this.bar();\n" +
			"	     ^^^\n" +
			"The method bar() is undefined for the type Local\n" +
			"----------\n" +
			"12. ERROR in X.java (at line 24)\n" +
			"	Zork3 z;\n" +
			"	^^^^^\n" +
			"Zork3 cannot be resolved to a type\n" +
			"----------\n" +
			"13. WARNING in X.java (at line 24)\n" +
			"	Zork3 z;\n" +
			"	      ^\n" +
			"The local variable z is hiding a field from type Local\n" +
			"----------\n" +
			"14. ERROR in X.java (at line 27)\n" +
			"	new X() {\n" +
			"	    ^\n" +
			"An anonymous class cannot subclass the final class X\n" +
			"----------\n" +
			"15. ERROR in X.java (at line 28)\n" +
			"	ZorkAnonymous2 z;                       \n" +
			"	^^^^^^^^^^^^^^\n" +
			"ZorkAnonymous2 cannot be resolved to a type\n" +
			"----------\n" +
			"16. ERROR in X.java (at line 30)\n" +
			"	this.bar();\n" +
			"	     ^^^\n" +
			"The method bar() is undefined for the type new X(){}\n" +
			"----------\n" +
			"17. ERROR in X.java (at line 31)\n" +
			"	Zork4 z;\n" +
			"	^^^^^\n" +
			"Zork4 cannot be resolved to a type\n" +
			"----------\n" +
			"18. WARNING in X.java (at line 31)\n" +
			"	Zork4 z;\n" +
			"	      ^\n" +
			"The local variable z is hiding a field from type new X(){}\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216683
public void test151() {
	long compliance = new CompilerOptions(getCompilerOptions()).complianceLevel;
	if (compliance <= ClassFileConstants.JDK1_3) {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"\n" +
					"    public static interface Foo { }\n" +
					"    public static interface Bar { }\n" +
					"\n" +
					"    private static class B2F extends X { }\n" +
					"    private static class F2B extends X { }\n" +
					"\n" +
					"    public static abstract class Key {\n" +
					"\n" +
					"        public abstract Key flip();\n" +
					"\n" +
					"        private static class B2F extends Key {\n" +
					"            private static B2F create() { return new B2F(); }\n" +
					"            public Key flip() { return F2B.create(); }\n" +
					"        }\n" +
					"\n" +
					"        private static class F2B extends Key {\n" +
					"            private static F2B create() { return new F2B(); }\n" +
					"            public Key flip() { return B2F.create(); }\n" +
					"        }\n" +
					"    }\n" +
					"}", // =================
				},
				"----------\n" +
				"1. ERROR in X.java (at line 15)\n" +
				"	public Key flip() { return F2B.create(); }\n" +
				"	                           ^^^\n" +
				"The type F2B is defined in an inherited type and an enclosing scope\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 20)\n" +
				"	public Key flip() { return B2F.create(); }\n" +
				"	                           ^^^\n" +
				"The type B2F is defined in an inherited type and an enclosing scope\n" +
				"----------\n");
	} else if (compliance == ClassFileConstants.JDK1_4) {
		this.runConformTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"\n" +
					"    public static interface Foo { }\n" +
					"    public static interface Bar { }\n" +
					"\n" +
					"    private static class B2F extends X { }\n" +
					"    private static class F2B extends X { }\n" +
					"\n" +
					"    public static abstract class Key {\n" +
					"\n" +
					"        public abstract Key flip();\n" +
					"\n" +
					"        private static class B2F extends Key {\n" +
					"            private static B2F create() { return new B2F(); }\n" +
					"            public Key flip() { return F2B.create(); }\n" +
					"        }\n" +
					"\n" +
					"        private static class F2B extends Key {\n" +
					"            private static F2B create() { return new F2B(); }\n" +
					"            public Key flip() { return B2F.create(); }\n" +
					"        }\n" +
					"    }\n" +
					"}", // =================

				},
				"");
	} else {
		this.runConformTest(
				new String[] {
					"X.java",
					"public class X<U, V> {\n" +
					"\n" +
					"    public static interface Foo { }\n" +
					"    public static interface Bar { }\n" +
					"\n" +
					"    private static class B2F extends X<Bar, Foo> { }\n" +
					"    private static class F2B extends X<Foo, Bar> { }\n" +
					"\n" +
					"    public static abstract class Key<S, T> {\n" +
					"\n" +
					"        public abstract Key<T, S> flip();\n" +
					"\n" +
					"        private static class B2F extends Key<Bar, Foo> {\n" +
					"            private static B2F create() { return new B2F(); }\n" +
					"            public Key<Foo, Bar> flip() { return F2B.create(); }\n" +
					"        }\n" +
					"\n" +
					"        private static class F2B extends Key<Foo, Bar> {\n" +
					"            private static F2B create() { return new F2B(); }\n" +
					"            public Key<Bar, Foo> flip() { return B2F.create(); }\n" +
					"        }\n" +
					"    }\n" +
					"}", // =================
				},
				"");
	}
}

//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216683 - variation
public void test152() {
	long compliance = new CompilerOptions(getCompilerOptions()).complianceLevel;
	if (compliance <= ClassFileConstants.JDK1_3) {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"\n" +
					"    public static interface Foo { }\n" +
					"    public static interface Bar { }\n" +
					"\n" +
					"    public static class B2F extends X { }\n" +
					"    public static class F2B extends X { }\n" +
					"\n" +
					"    public static abstract class Key {\n" +
					"\n" +
					"        public abstract Key flip();\n" +
					"\n" +
					"        public static class B2F extends Key {\n" +
					"            private static B2F create() { return new B2F(); }\n" +
					"            public Key flip() { return F2B.create(); }\n" +
					"        }\n" +
					"\n" +
					"        public static class F2B extends Key {\n" +
					"            private static F2B create() { return new F2B(); }\n" +
					"            public Key flip() { return B2F.create(); }\n" +
					"        }\n" +
					"    }\n" +
					"}", // =================
				},
				"----------\n" +
				"1. ERROR in X.java (at line 15)\n" +
				"	public Key flip() { return F2B.create(); }\n" +
				"	                           ^^^\n" +
				"The type F2B is defined in an inherited type and an enclosing scope\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 20)\n" +
				"	public Key flip() { return B2F.create(); }\n" +
				"	                           ^^^\n" +
				"The type B2F is defined in an inherited type and an enclosing scope\n" +
				"----------\n");
	} else if (compliance == ClassFileConstants.JDK1_4) {
		this.runConformTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"\n" +
					"    public static interface Foo { }\n" +
					"    public static interface Bar { }\n" +
					"\n" +
					"    private static class B2F extends X { }\n" +
					"    private static class F2B extends X { }\n" +
					"\n" +
					"    public static abstract class Key {\n" +
					"\n" +
					"        public abstract Key flip();\n" +
					"\n" +
					"        private static class B2F extends Key {\n" +
					"            private static B2F create() { return new B2F(); }\n" +
					"            public Key flip() { return F2B.create(); }\n" +
					"        }\n" +
					"\n" +
					"        private static class F2B extends Key {\n" +
					"            private static F2B create() { return new F2B(); }\n" +
					"            public Key flip() { return B2F.create(); }\n" +
					"        }\n" +
					"    }\n" +
					"}", // =================

				},
				"");
	} else {
		this.runConformTest(
				new String[] {
					"X.java",
					"public class X<U, V> {\n" +
					"\n" +
					"    public static interface Foo { }\n" +
					"    public static interface Bar { }\n" +
					"\n" +
					"    private static class B2F extends X<Bar, Foo> { }\n" +
					"    private static class F2B extends X<Foo, Bar> { }\n" +
					"\n" +
					"    public static abstract class Key<S, T> {\n" +
					"\n" +
					"        public abstract Key<T, S> flip();\n" +
					"\n" +
					"        private static class B2F extends Key<Bar, Foo> {\n" +
					"            private static B2F create() { return new B2F(); }\n" +
					"            public Key<Foo, Bar> flip() { return F2B.create(); }\n" +
					"        }\n" +
					"\n" +
					"        private static class F2B extends Key<Foo, Bar> {\n" +
					"            private static F2B create() { return new F2B(); }\n" +
					"            public Key<Bar, Foo> flip() { return B2F.create(); }\n" +
					"        }\n" +
					"    }\n" +
					"}", // =================
				},
				"");
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=201487
public void _test153() {
	long compliance = new CompilerOptions(getCompilerOptions()).complianceLevel;
	if (compliance <= ClassFileConstants.JDK1_4) {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"	public class Test3 {\n" +
					"		protected void load() {\n" +
					"		}\n" +
					"	}\n" +
					"	public class Test2 {\n" +
					"		public Test2(String string, Test3 test3) {\n" +
					"		}\n" +
					"	}\n" +
					"	private String var1;\n" +
					"private class Test5 {\n" +
					"		private class Test4 extends Test2 {\n" +
					"			public Test4() {\n" +
					"				super(\"available\", new Test3() {\n" +
					"					protected void load() {\n" +
					"						System.out.println(X.this.var1.trim());\n" +
					"						System.out.println(var1.trim());\n" +
					"					}\n" +
					"				});\n" +
					"			}\n" +
					"		}\n" +
					"	}\n" +
					"}", // =================
				},
				"----------\n" +
				"1. ERROR in X.java (at line 16)\n" +
				"	System.out.println(X.this.var1.trim());\n" +
				"	                   ^^^^^^\n" +
				"No enclosing instance of the type X is accessible in scope\n" +
				"----------\n" +
				"2. WARNING in X.java (at line 16)\n" +
				"	System.out.println(X.this.var1.trim());\n" +
				"	                          ^^^^\n" +
				"Read access to enclosing field X.var1 is emulated by a synthetic accessor method\n" +
				"----------\n" +
				"3. WARNING in X.java (at line 17)\n" +
				"	System.out.println(var1.trim());\n" +
				"	                   ^^^^\n" +
				"Read access to enclosing field X.var1 is emulated by a synthetic accessor method\n" +
				"----------\n" +
				"4. ERROR in X.java (at line 17)\n" +
				"	System.out.println(var1.trim());\n" +
				"	                   ^^^^\n" +
				"No enclosing instance of the type X is accessible in scope\n" +
				"----------\n");
	} else {
		this.runConformTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"	public class Test3 {\n" +
					"		protected void load() {\n" +
					"		}\n" +
					"	}\n" +
					"	public class Test2 {\n" +
					"		public Test2(String string, Test3 test3) {\n" +
					"		}\n" +
					"	}\n" +
					"	private String var1;\n" +
					"private class Test5 {\n" +
					"		private class Test4 extends Test2 {\n" +
					"			public Test4() {\n" +
					"				super(\"available\", new Test3() {\n" +
					"					protected void load() {\n" +
					"						System.out.println(X.this.var1.trim());\n" +
					"						System.out.println(var1.trim());\n" +
					"					}\n" +
					"				});\n" +
					"			}\n" +
					"		}\n" +
					"	}\n" +
					"}", // =================
				},
				"");
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=201487 - variation
public void test154() {
	long compliance = new CompilerOptions(getCompilerOptions()).complianceLevel;
	if (compliance <= ClassFileConstants.JDK1_4) {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"	public class Test3 {\n" +
					"		protected void load() {\n" +
					"		}\n" +
					"	}\n" +
					"	public class Test2 {\n" +
					"		public Test2(String string, Test3 test3) {\n" +
					"		}\n" +
					"	}\n" +
					"	private String var1;\n" +
					"//	private class Test5 {\n" +
					"		private class Test4 extends Test2 {\n" +
					"			public Test4() {\n" +
					"				super(\"available\", new Test3() {\n" +
					"					protected void load() {\n" +
					"						System.out.println(X.this.var1.trim());\n" +
					"						System.out.println(var1.trim());\n" +
					"					}\n" +
					"				});\n" +
					"			}\n" +
					"		}\n" +
					"//	}\n" +
					"}", // =================
				},
				"----------\n" +
				"1. ERROR in X.java (at line 16)\n" +
				"	System.out.println(X.this.var1.trim());\n" +
				"	                   ^^^^^^\n" +
				"No enclosing instance of the type X is accessible in scope\n" +
				"----------\n" +
				"2. WARNING in X.java (at line 16)\n" +
				"	System.out.println(X.this.var1.trim());\n" +
				"	                          ^^^^\n" +
				"Read access to enclosing field X.var1 is emulated by a synthetic accessor method\n" +
				"----------\n" +
				"3. WARNING in X.java (at line 17)\n" +
				"	System.out.println(var1.trim());\n" +
				"	                   ^^^^\n" +
				"Read access to enclosing field X.var1 is emulated by a synthetic accessor method\n" +
				"----------\n" +
				"4. ERROR in X.java (at line 17)\n" +
				"	System.out.println(var1.trim());\n" +
				"	                   ^^^^\n" +
				"No enclosing instance of the type X is accessible in scope\n" +
				"----------\n");
	} else {
		this.runConformTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"	public class Test3 {\n" +
					"		protected void load() {\n" +
					"		}\n" +
					"	}\n" +
					"	public class Test2 {\n" +
					"		public Test2(String string, Test3 test3) {\n" +
					"		}\n" +
					"	}\n" +
					"	private String var1;\n" +
					"//	private class Test5 {\n" +
					"		private class Test4 extends Test2 {\n" +
					"			public Test4() {\n" +
					"				super(\"available\", new Test3() {\n" +
					"					protected void load() {\n" +
					"						System.out.println(X.this.var1.trim());\n" +
					"						System.out.println(var1.trim());\n" +
					"					}\n" +
					"				});\n" +
					"			}\n" +
					"		}\n" +
					"//	}\n" +
					"}", // =================
				},
				"");
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=
public void test155() throws Exception {
	this.runConformTest(new String[] {
		"X.java",
		"public class X {\n" + 
		"	Object foo() {\n" +
		"		return new X() {};\n" +
		"	}\n" +
		"}"
	});
	File fileX = new File(OUTPUT_DIR + File.separator  +"X$1.class");
	IClassFileReader reader = ToolFactory.createDefaultClassFileReader(fileX.getAbsolutePath(), IClassFileReader.CONSTANT_POOL);
	assertFalse("Should not be final", Flags.isFinal(reader.getAccessFlags()));
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=128563
public void test156() throws Exception {
	this.runConformTest(new String[] {
		"package1/A.java",//=======================
		"package package1;\n" + 
		"abstract class A {\n" + 
		"    protected final void outerMethod() {\n" + 
		"    }\n" + 
		"}\n",
		"package1/B.java",//=======================
		"package package1;\n" + 
		"public class B extends A {\n" + 
		"}\n", 
		"package2/C.java",//=======================
		"package package2;\n" + 
		"import package1.B;\n" + 
		"public class C extends B {\n" + 
		"    private final MyInner myInner = new MyInner();\n" + 
		"    private class MyInner {\n" + 
		"        public void innerMethod() {\n" + 
		"            C.this.outerMethod();\n" + 
		"        }\n" + 
		"    }\n" + 
		"    public static void main(String[] args) {\n" + 
		"        final C c = new C();\n" + 
		"        c.myInner.innerMethod();\n" + 
		"    }\n" + 
		"}\n",
	},
	"");
	String expectedOutput =
		"  static synthetic void access$0(package2.C arg0);\n" + 
		"    0  aload_0 [arg0]\n" + 
		"    1  invokevirtual package2.C.outerMethod() : void";
	checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107
public void test157() throws Exception {
	this.runConformTest(new String[] {
		"package1/A.java",//=======================
		"package package1;\n" + 
		"abstract class A {\n" + 
		"    protected int outerField; {\n" + 
		"    }\n" + 
		"}\n",
		"package1/B.java",//=======================
		"package package1;\n" + 
		"public class B extends A {\n" + 
		"}\n", 
		"package2/C.java",//=======================
		"package package2;\n" + 
		"import package1.B;\n" + 
		"public class C extends B {\n" + 
		"    private final MyInner myInner = new MyInner();\n" + 
		"    private class MyInner {\n" + 
		"        public void innerMethod() {\n" + 
		"            int j = C.this.outerField;\n" + 
		"        }\n" + 
		"    }\n" + 
		"    public static void main(String[] args) {\n" + 
		"        final C c = new C();\n" + 
		"        c.myInner.innerMethod();\n" + 
		"    }\n" + 
		"}\n",
	},
	"");
	String expectedOutput =
		"  // Method descriptor #33 (Lpackage2/C;)I\n" + 
		"  // Stack: 1, Locals: 1\n" + 
		"  static synthetic int access$0(package2.C arg0);\n" + 
		"    0  aload_0 [arg0]\n" + 
		"    1  getfield package2.C.outerField : int";
	checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test158() throws Exception {
	this.runConformTest(new String[] {
		"package1/A.java",//=======================
		"package package1;\n" + 
		"abstract class A {\n" + 
		"    protected int outerField; {\n" + 
		"    }\n" + 
		"}\n",
		"package1/B.java",//=======================
		"package package1;\n" + 
		"public class B extends A {\n" + 
		"}\n", 
		"package2/C.java",//=======================
		"package package2;\n" + 
		"import package1.B;\n" + 
		"public class C extends B {\n" + 
		"    private final MyInner myInner = new MyInner();\n" + 
		"    private class MyInner {\n" + 
		"        public void innerMethod() {\n" + 
		"            C.this.outerField = 12;\n" + 
		"        }\n" + 
		"    }\n" + 
		"    public static void main(String[] args) {\n" + 
		"        final C c = new C();\n" + 
		"        c.myInner.innerMethod();\n" + 
		"    }\n" + 
		"}\n",
	},
	"");
	String expectedOutput =
		"  // Method descriptor #33 (Lpackage2/C;I)V\n" + 
		"  // Stack: 2, Locals: 2\n" + 
		"  static synthetic void access$0(package2.C arg0, int arg1);\n" + 
		"    0  aload_0 [arg0]\n" + 
		"    1  iload_1 [arg1]\n" + 
		"    2  putfield package2.C.outerField : int";

	checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test159() throws Exception {
	this.runConformTest(new String[] {
		"package1/A.java",//=======================
		"package package1;\n" + 
		"abstract class A {\n" + 
		"    protected int outerField; {\n" + 
		"    }\n" + 
		"}\n",
		"package1/B.java",//=======================
		"package package1;\n" + 
		"public class B extends A {\n" + 
		"}\n", 
		"package2/C.java",//=======================
		"package package2;\n" + 
		"import package1.B;\n" + 
		"public class C extends B {\n" + 
		"    private final MyInner myInner = new MyInner();\n" + 
		"    private class MyInner {\n" + 
		"        public void innerMethod() {\n" + 
		"            int j = outerField;\n" + 
		"        }\n" + 
		"    }\n" + 
		"    public static void main(String[] args) {\n" + 
		"        final C c = new C();\n" + 
		"        c.myInner.innerMethod();\n" + 
		"    }\n" + 
		"}\n",
	},
	"");
	String expectedOutput =
		"  // Method descriptor #33 (Lpackage2/C;)I\n" + 
		"  // Stack: 1, Locals: 1\n" + 
		"  static synthetic int access$0(package2.C arg0);\n" + 
		"    0  aload_0 [arg0]\n" + 
		"    1  getfield package2.C.outerField : int";
	checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test160() throws Exception {
	this.runConformTest(new String[] {
		"package1/A.java",//=======================
		"package package1;\n" + 
		"abstract class A {\n" + 
		"    protected int outerField; {\n" + 
		"    }\n" + 
		"}\n",
		"package1/B.java",//=======================
		"package package1;\n" + 
		"public class B extends A {\n" + 
		"}\n", 
		"package2/C.java",//=======================
		"package package2;\n" + 
		"import package1.B;\n" + 
		"public class C extends B {\n" + 
		"    private final MyInner myInner = new MyInner();\n" + 
		"    private class MyInner {\n" + 
		"        public void innerMethod() {\n" + 
		"            outerField = 12;\n" + 
		"        }\n" + 
		"    }\n" + 
		"    public static void main(String[] args) {\n" + 
		"        final C c = new C();\n" + 
		"        c.myInner.innerMethod();\n" + 
		"    }\n" + 
		"}\n",
	},
	"");
	String expectedOutput =
		"  // Method descriptor #33 (Lpackage2/C;I)V\n" + 
		"  // Stack: 2, Locals: 2\n" + 
		"  static synthetic void access$0(package2.C arg0, int arg1);\n" + 
		"    0  aload_0 [arg0]\n" + 
		"    1  iload_1 [arg1]\n" + 
		"    2  putfield package2.C.outerField : int";
	checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test161() throws Exception {
	this.runConformTest(new String[] {
		"package1/A.java",//=======================
		"package package1;\n" + 
		"abstract class A {\n" + 
		"    static protected int outerField; {\n" + 
		"    }\n" + 
		"}\n",
		"package1/B.java",//=======================
		"package package1;\n" + 
		"public class B extends A {\n" + 
		"}\n", 
		"package2/C.java",//=======================
		"package package2;\n" + 
		"import package1.B;\n" + 
		"public class C extends B {\n" + 
		"    private final MyInner myInner = new MyInner();\n" + 
		"    private class MyInner {\n" + 
		"        public void innerMethod() {\n" + 
		"            int j = C.this.outerField;\n" + 
		"        }\n" + 
		"    }\n" + 
		"    public static void main(String[] args) {\n" + 
		"        final C c = new C();\n" + 
		"        c.myInner.innerMethod();\n" + 
		"    }\n" + 
		"}\n",
	},
	"");
	String expectedOutput =
		"  // Method descriptor #33 ()I\n" + 
		"  // Stack: 1, Locals: 0\n" + 
		"  static synthetic int access$0();\n" + 
		"    0  getstatic package2.C.outerField : int";
	checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test162() throws Exception {
	this.runConformTest(new String[] {
		"package1/A.java",//=======================
		"package package1;\n" + 
		"abstract class A {\n" + 
		"    static protected int outerField; {\n" + 
		"    }\n" + 
		"}\n",
		"package1/B.java",//=======================
		"package package1;\n" + 
		"public class B extends A {\n" + 
		"}\n", 
		"package2/C.java",//=======================
		"package package2;\n" + 
		"import package1.B;\n" + 
		"public class C extends B {\n" + 
		"    private final MyInner myInner = new MyInner();\n" + 
		"    private class MyInner {\n" + 
		"        public void innerMethod() {\n" + 
		"            C.this.outerField = 12;\n" + 
		"        }\n" + 
		"    }\n" + 
		"    public static void main(String[] args) {\n" + 
		"        final C c = new C();\n" + 
		"        c.myInner.innerMethod();\n" + 
		"    }\n" + 
		"}\n",
	},
	"");
	String expectedOutput =
		"  // Method descriptor #33 (I)V\n" + 
		"  // Stack: 1, Locals: 1\n" + 
		"  static synthetic void access$0(int arg0);\n" + 
		"    0  iload_0 [arg0]\n" + 
		"    1  putstatic package2.C.outerField : int";

	checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test163() throws Exception {
	this.runConformTest(new String[] {
		"package1/A.java",//=======================
		"package package1;\n" + 
		"abstract class A {\n" + 
		"    static protected int outerField; {\n" + 
		"    }\n" + 
		"}\n",
		"package1/B.java",//=======================
		"package package1;\n" + 
		"public class B extends A {\n" + 
		"}\n", 
		"package2/C.java",//=======================
		"package package2;\n" + 
		"import package1.B;\n" + 
		"public class C extends B {\n" + 
		"    private final MyInner myInner = new MyInner();\n" + 
		"    private class MyInner {\n" + 
		"        public void innerMethod() {\n" + 
		"            int j = outerField;\n" + 
		"        }\n" + 
		"    }\n" + 
		"    public static void main(String[] args) {\n" + 
		"        final C c = new C();\n" + 
		"        c.myInner.innerMethod();\n" + 
		"    }\n" + 
		"}\n",
	},
	"");
	String expectedOutput =
		"  // Method descriptor #33 ()I\n" + 
		"  // Stack: 1, Locals: 0\n" + 
		"  static synthetic int access$0();\n" + 
		"    0  getstatic package2.C.outerField : int";
	checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test164() throws Exception {
	this.runConformTest(new String[] {
		"package1/A.java",//=======================
		"package package1;\n" + 
		"abstract class A {\n" + 
		"    static protected int outerField; {\n" + 
		"    }\n" + 
		"}\n",
		"package1/B.java",//=======================
		"package package1;\n" + 
		"public class B extends A {\n" + 
		"}\n", 
		"package2/C.java",//=======================
		"package package2;\n" + 
		"import package1.B;\n" + 
		"public class C extends B {\n" + 
		"    private final MyInner myInner = new MyInner();\n" + 
		"    private class MyInner {\n" + 
		"        public void innerMethod() {\n" + 
		"            outerField = 12;\n" + 
		"        }\n" + 
		"    }\n" + 
		"    public static void main(String[] args) {\n" + 
		"        final C c = new C();\n" + 
		"        c.myInner.innerMethod();\n" + 
		"    }\n" + 
		"}\n",
	},
	"");
	String expectedOutput =
		"  // Method descriptor #33 (I)V\n" + 
		"  // Stack: 1, Locals: 1\n" + 
		"  static synthetic void access$0(int arg0);\n" + 
		"    0  iload_0 [arg0]\n" + 
		"    1  putstatic package2.C.outerField : int";
	checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=128563 - variation
public void test165() throws Exception {
	this.runConformTest(new String[] {
		"package1/A.java",//=======================
		"package package1;\n" + 
		"abstract class A {\n" + 
		"    static protected final void outerMethod() {\n" + 
		"    }\n" + 
		"}\n",
		"package1/B.java",//=======================
		"package package1;\n" + 
		"public class B extends A {\n" + 
		"}\n", 
		"package2/C.java",//=======================
		"package package2;\n" + 
		"import package1.B;\n" + 
		"public class C extends B {\n" + 
		"    private final MyInner myInner = new MyInner();\n" + 
		"    private class MyInner {\n" + 
		"        public void innerMethod() {\n" + 
		"            C.this.outerMethod();\n" + 
		"        }\n" + 
		"    }\n" + 
		"    public static void main(String[] args) {\n" + 
		"        final C c = new C();\n" + 
		"        c.myInner.innerMethod();\n" + 
		"    }\n" + 
		"}\n",
	},
	"");
	String expectedOutput =
		"  // Method descriptor #8 ()V\n" + 
		"  // Stack: 0, Locals: 0\n" + 
		"  static synthetic void access$0();\n" + 
		"    0  invokestatic package2.C.outerMethod() : void";
	checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test166() throws Exception {
	this.runConformTest(new String[] {
		"X.java",//=======================
		"class XSuper {\n" + 
		"	protected String field = \"[XSuper#field]\";//$NON-NLS-1$\n" + 
		"}\n" + 
		"public class X extends XSuper {\n" + 
		"	protected String field = \"[X#field]\";//$NON-NLS-1$\n" + 
		"	public static void main(String[] args) {\n" + 
		"		new X().foo();\n" + 
		"	}\n" + 
		"	void foo() {\n" + 
		"		new Object() {\n" + 
		"			void bar() {\n" + 
		"				System.out.print(\"X.this.field=\" + X.this.field);\n" + 
		"				System.out.print(\"X.super.field=\" + X.super.field);\n" + 
		"			}\n" + 
		"		}.bar();\n" + 
		"	}\n" + 
		"}\n",
	},
	"X.this.field=[X#field]X.super.field=[XSuper#field]");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test167() throws Exception {
	this.runConformTest(new String[] {
		"X.java",//=======================
		"class XSuper {\n" + 
		"	protected String method() { return \"[XSuper#method()]\"; }//$NON-NLS-1$\n" + 
		"}\n" + 
		"public class X extends XSuper {\n" + 
		"	protected String method() { return \"[X#method()]\"; }//$NON-NLS-1$\n" + 
		"	public static void main(String[] args) {\n" + 
		"		new X().foo();\n" + 
		"	}\n" + 
		"	void foo() {\n" + 
		"		new Object() {\n" + 
		"			void bar() {\n" + 
		"				System.out.print(\"X.this.method()=\" + X.this.method());\n" + 
		"				System.out.print(\"X.super.method()=\" + X.super.method());\n" + 
		"			}\n" + 
		"		}.bar();\n" + 
		"	}\n" + 
		"}\n",
	},
	"X.this.method()=[X#method()]X.super.method()=[XSuper#method()]");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test168() throws Exception {
	this.runConformTest(new String[] {
		"X.java",//=======================
		"class XSuper {\n" + 
		"	protected String field;\n" + 
		"}\n" + 
		"public class X extends XSuper {\n" + 
		"	protected String field;\n" + 
		"	public static void main(String[] args) {\n" + 
		"		new X().foo();\n" + 
		"	}\n" + 
		"	void foo() {\n" + 
		"		new Object() {\n" + 
		"			void bar() {\n" + 
		"				X.this.field = \"[X#field]\";\n" +
		"				X.super.field = \"[XSuper#field]\";\n" +
		"				System.out.print(\"X.this.field=\" + X.this.field);\n" + 
		"				System.out.print(\"X.super.field=\" + X.super.field);\n" + 
		"			}\n" + 
		"		}.bar();\n" + 
		"	}\n" + 
		"}\n",
	},
	"X.this.field=[X#field]X.super.field=[XSuper#field]");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test169() throws Exception {
	this.runConformTest(new String[] {
		"X.java",//=======================
		"import p.XSuper;\n" + 
		"public class X extends XSuper {\n" + 
		"	protected String method() { return \"[X#method()]\"; }//$NON-NLS-1$\n" + 
		"	public static void main(String[] args) {\n" + 
		"		new X().foo();\n" + 
		"	}\n" + 
		"	void foo() {\n" + 
		"		new Object () {\n" + 
		"			void bar() {\n" + 
		"				System.out.print(\"X.this.method()=\" + X.this.method());\n" + 
		"				System.out.print(\"X.super.method()=\" + X.super.method());\n" + 
		"			}\n" + 
		"		}.bar();\n" + 
		"	}\n" + 
		"}\n",
		"p/XSuper.java",//=======================
		"package p;\n" + 
		"class XInternal {\n" + 
		"	protected String method() { return \"[XInternal#method()]\"; }//$NON-NLS-1$\n" + 
		"}\n" + 
		"public class XSuper extends XInternal {\n" + 
		"}\n",
	},
	"X.this.method()=[X#method()]X.super.method()=[XInternal#method()]");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test170() throws Exception {
	this.runConformTest(new String[] {
		"X.java",//=======================
		"public class X {\n" + 
		"    class Member {\n" + 
		"        private String field = \"SUCCESS\";\n" + 
		"    }\n" + 
		"    class SubMember extends Member {\n" + 
		"    	void foo() {\n" + 
		"    		System.out.println(super.field);\n" + 
		"    	}\n" + 
		"    }	\n" + 
		"    public static void main(String argv[]) {\n" + 
		"		new X().new SubMember().foo();    	\n" + 
		"    }\n" + 
		"}\n",
	},
	"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test171() throws Exception {
	this.runConformTest(new String[] {
		"X.java",//=======================
		"public class X {\n" + 
		"    class Member {\n" + 
		"        private String method() { return \"SUCCESS\"; }\n" + 
		"    }\n" + 
		"    class SubMember extends Member {\n" + 
		"    	void foo() {\n" + 
		"    		System.out.println(super.method());\n" + 
		"    	}\n" + 
		"    }	\n" + 
		"    public static void main(String argv[]) {\n" + 
		"		new X().new SubMember().foo();    	\n" + 
		"    }\n" + 
		"}\n",
	},
	"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=197271
public void test172() throws Exception {
	String[] files = new String[] {
			"X.java",
			"public class X {\n" + 
			"	void a() {}\n" + 
			"	private static void a(String s) {}\n" + 
			"	private void c() {}\n" + 
			"	private static void c(String s) {}\n" + 
			"	static class M1 extends X {\n" + 
			"		public void x() {\n" + 
			"			a(null);\n" + 
			"			c(null);\n" + 
			"		}\n" + 
			"	}\n" + 
			"	static class M2 {\n" + 
			"		public void x() {\n" + 
			"			a(null);\n" + 
			"			c(null);\n" + 
			"		}\n" + 
			"	}\n" + 
			"	public static void main(String[] args) {\n" + 
			"	}\n" + 
			"}\n",
		};
	if (this.complianceLevel < ClassFileConstants.JDK11) {
		this.runNegativeTest(
				files,
				"----------\n" + 
				"1. WARNING in X.java (at line 8)\n" + 
				"	a(null);\n" + 
				"	^^^^^^^\n" + 
				"Access to enclosing method a(String) from the type X is emulated by a synthetic accessor method\n" + 
				"----------\n" + 
				"2. WARNING in X.java (at line 9)\n" + 
				"	c(null);\n" + 
				"	^^^^^^^\n" + 
				"Access to enclosing method c(String) from the type X is emulated by a synthetic accessor method\n" + 
				"----------\n" + 
				"3. WARNING in X.java (at line 14)\n" + 
				"	a(null);\n" + 
				"	^^^^^^^\n" + 
				"Access to enclosing method a(String) from the type X is emulated by a synthetic accessor method\n" + 
				"----------\n" + 
				"4. WARNING in X.java (at line 15)\n" + 
				"	c(null);\n" + 
				"	^^^^^^^\n" + 
				"Access to enclosing method c(String) from the type X is emulated by a synthetic accessor method\n" + 
				"----------\n"
				);
	} else {
		this.runConformTest(files, "");
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=308245
public void test173() throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",//=======================
			"import java.util.ArrayList;\n" + 
			"import java.util.Comparator;\n" + 
			"import java.util.List;\n" + 
			"public class X {\n" + 
			"	public static void main(String[] args) {\n" + 
			"		final List yourList = new ArrayList();\n" + 
			"		final List myList = new ArrayList();\n" + 
			"		new Comparator() {\n" + 
			"			public int compare(Object o1, Object o2) {\n" + 
			"				compare(yourList != null ? yourList : myList, yourList);\n" + 
			"				return 0;\n" + 
			"			}\n" + 
			"		};\n" + 
			"		System.out.println(\"SUCCESS\");\n" + 
			"	}\n" + 
			"}",
		},
		"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=308245
public void test174() throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",//=======================
			"import java.util.Comparator;\n" + 
			"public class X {\n" + 
			"	public static class MyList {\n" +
			"		int size;\n" + 
			"	}\n" + 
			"	public static void main(String[] args) {\n" + 
			"		final MyList yourList = new MyList();\n" + 
			"		final MyList myList = new MyList();\n" + 
			"		new Comparator() {\n" + 
			"			public int compare(Object o1, Object o2) {\n" +
			"				return compare((MyList) o1, (MyList) o2);\n" + 
			"			}\n" + 
			"			public int compare(MyList o1, MyList o2) {\n" + 
			"				return foo(yourList != null ? yourList.size : myList.size, yourList.size);\n" + 
			"			}\n" + 
			"			private int foo(int i, int j) {\n" + 
			"				return i - j;\n" + 
			"			}\n" + 
			"		};\n" + 
			"		System.out.println(\"SUCCESS\");\n" + 
			"	}\n" + 
			"}",
		},
		"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=388903
public void test175() throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",//=======================
			"public class X {\n" + 
			"	class Inner extends X {\n" +
			"	}\n" + 
			"	public static void main(String[] args) {\n" +
			"		new X().new Inner(){};\n" + 
			"		System.out.println(\"SUCCESS\");\n" + 
			"	}\n" + 
			"}",
		},
		"SUCCESS");
	this.runConformTest(
			new String[] {
				"X.java",//=======================
				"public class X {\n" +
				"	String which;\n" +
				"	X(String s) {\n" +
				"		this.which = s;\n" +
				"	}\n" + 
				"	class Inner extends X {\n" +
				"		Inner() {\n" +
				"			super(\"Inner\");\n" +
				"			System.out.print( X.this.which + \",\" ); // will output 'Enclosing,'\n" +
				"		}\n" +
				"	}\n" + 
				"	void check() {\n" +
				"		new X(\"Enclosing\").new Inner() {\n" +
				"			{\n" +
				"				System.out.print( X.this.which + \",\" ); // will output 'Context,'\n" +
				"			}\n" +
				"			void f() {\n" +
				"				System.out.println( X.this.which ); // will output 'Context'\n" +
				"			}\n" +
				"		}.f();\n" + 
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		new X(\"Context\").check();\n" +
				"	}\n" + 
				"}",
			},
			"Enclosing,Context,Context");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=435419 Instantiating needs outer constructor
public void test176() {
	this.runConformTest(
		new String[] {
			"Demo.java",
			"import java.util.ArrayList;\n" + 
			"public class Demo {\n" + 
			"        static class ExprFactoryList extends ArrayList {\n" + 
			"                class Expr {}\n" + 
			"                class Expr2 extends Expr {}\n" + 
			"        }\n" + 
			"        final static ExprFactoryList arith =  new ExprFactoryList() {\n" + 
			"                {\n" + 
			"                        add(new Object() {public Expr generate() {return new Expr() {};} }); // OK\n" + 
			"                        add(new Object() {public Expr generate() {return new Expr2() {};} }); // Ok\n" + 
			"                }\n" + 
			"        };\n" + 
			"        final static ExprFactoryList statementFactory =  new ExprFactoryList() {\n" + 
			"                class Statement extends Expr {}\n" + 
			"                void m() {\n" + 
			"                        add(new Object() {\n" + 
			"                                public void generate() {\n" + 
			"                                        new Statement(){}; // OK\n" + 
			"                                }\n" + 
			"                        });\n" + 
			"                }\n" + 
			"                {\n" + 
			"                        add (new Statement()); // OK\n" + 
			"                        add(new Object() {\n" + 
			"                                public void generate() {\n" + 
			"                                        new Statement(); // OK\n" + 
			"                                        new Statement(){}; // cannot compile\n" + 
			"                                }\n" + 
			"                        });\n" + 
			"                }\n" + 
			"        };\n" + 
			"        public static void main(String[] args) {\n" + 
			"        	Demo demo = new Demo();\n" + 
			"        	System.out.println(\"SUCCESS\");\n" + 
			"        }\n" + 
			"       \n" + 
			"}"	
		},
		"SUCCESS");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=484546 "IncompatibleClassChangeError: Expected static method[...]" with inner classes
public void testbug484546() {
	this.runConformTest(
		new String[] {
			"inner/test/InnerTest.java",
			"package inner.test;\n" + 
			"class Inner029SuperSuper {\n" + 
			"  public int getValue() {\n" + 
			"    return 10;\n" + 
			"  }\n" + 
			"}\n" + 
			"class Inner029Super extends Inner029SuperSuper {\n" + 
			"}\n" + 
			"class InnerSuper extends Inner029Super {\n" + 
			"  public int getValue() {\n" + 
			"    return 20;\n" + 
			"  }\n" + 
			"}\n" + 
			"public class InnerTest extends Inner029Super {\n" + 
			"  public int result = new Inner().getInner2().test();\n" + 
			"  class Inner extends InnerSuper {\n" + 
			"    Inner2 getInner2() {\n" + 
			"      return new Inner2();\n" + 
			"    }\n" + 
			"    class Inner2 {\n" + 
			"      public int test() {\n" + 
			"        return InnerTest.super.getValue();\n" + 
			"      }\n" + 
			"    }\n" + 
			"  }\n" + 
			"  public static void main(String[] args) {\n" + 
			"	System.out.println(new InnerTest().result);\n" + 
			"}\n" + 
			"}\n"
		},
		"10");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=373371 [compiler] JDT Compiler reports an error whereas javac compiles without problem
public void testbug373371() {
	String[] sources = new String[] {
		"Outer.java",
		"class Outer {\n" + 
		"    class Inner extends Outer {    }\n" + 
		"    class SubInner extends Inner {\n" + 
		"        public SubInner() {\n" + 
		"          // Outer.this.super(); // (1)\n" + 
		"        }\n" + 
		"    }\n" + 
		"}"
	};
	if (this.complianceLevel < ClassFileConstants.JDK1_4 || this.complianceLevel > ClassFileConstants.JDK1_6) {
		this.runConformTest(sources);
	} else {
		this.runNegativeTest(
			sources,
			"----------\n" +
			"1. ERROR in Outer.java (at line 4)\n" +
			"	public SubInner() {\n" +
			"	       ^^^^^^^^^^\n" +
			"No enclosing instance of type Outer is available due to some intermediate constructor invocation\n" +
			"----------\n");
	}
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=522061 EJC 4.8M1 does not compile a class that javac 1.8.0_112 compiles
public void testbug522061() {
	String[] sources = new String[] {
		"ztest/Foo.java",
		"package ztest;\n" + 
		"import java.io.File;\n" + 
		"import javax.swing.Action;\n" + 
		"public abstract class Foo {\n" + 
		"	public FilteredFileTree matching(final Action filterConfigAction) {\n" + 
		"		return new FilteredFileTree() {\n" + 
		"			//@Override\n" + 
		"			protected File filter(File set) {\n" + 
		"				return null;\n" + 
		"			}\n" + 
		"		};\n" + 
		"	}\n" + 
		"	public String getDisplayName() {\n" + 
		"		return null;\n" + 
		"	}\n" + 
		"   private abstract class FilteredFileTree extends Foo {\n" + 
		"		protected abstract File filter(File set);\n" + 
		"		public String getDisplayName() {\n" + 
		"			return Foo.this.toString();\n" + 
		"		}\n" + 
		"	}\n" + 
		"}"
	};
	if (this.complianceLevel < ClassFileConstants.JDK1_4 || this.complianceLevel > ClassFileConstants.JDK1_6) {
		this.runConformTest(sources);
	} else {
		this.runNegativeTest(
			sources,
			"----------\n" + 
			"1. WARNING in ztest\\Foo.java (at line 6)\n" + 
			"	return new FilteredFileTree() {\n" + 
			"	           ^^^^^^^^^^^^^^^^^^\n" + 
			"Access to enclosing constructor Foo.FilteredFileTree() is emulated by a synthetic accessor method\n" + 
			"----------\n" + 
			"2. ERROR in ztest\\Foo.java (at line 6)\n" + 
			"	return new FilteredFileTree() {\n" + 
			"	           ^^^^^^^^^^^^^^^^^^\n" + 
			"No enclosing instance of type Foo is available due to some intermediate constructor invocation\n" + 
			"----------\n");
	}
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=481793 Compilation error when trying to compile nested inner classes
public void testbug481793() {
	String[] sources = new String[] {
		"A.java",
		"public class A {\n" + 
		"	public class B extends A {\n" + 
		"		public class C extends B {}\n" + 
		"	}\n" + 
		"}"
	};
	if (this.complianceLevel < ClassFileConstants.JDK1_4 || this.complianceLevel > ClassFileConstants.JDK1_6) {
		this.runConformTest(sources);
	} else {
		this.runNegativeTest(
			sources,
			"----------\n" + 
			"1. ERROR in A.java (at line 3)\n" + 
			"	public class C extends B {}\n" + 
			"	             ^\n" + 
			"No enclosing instance of type A is available due to some intermediate constructor invocation\n" + 
			"----------\n");
	}
}
public static Class testClass() {
	return InnerEmulationTest.class;
}
}
