/*******************************************************************************
 * Copyright (c) 2003, 2014 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 345305 - [compiler][null] Compiler misidentifies a case of "variable can only be null"
 *								bug 387612 - Unreachable catch block...exception is never thrown from the try
 *     Jesper Steen Moller - Contribution for
 *								bug 404146 - [1.7][compiler] nested try-catch-finally-blocks leads to unrunnable Java byte code
 *******************************************************************************/
package org.eclipse.jdt.core.tests.compiler.regression;

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

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

import junit.framework.Test;

@SuppressWarnings({ "unchecked", "rawtypes" })
public class TryStatementTest extends AbstractRegressionTest {

static {
//	TESTS_NAMES = new String[] { "testBug387612" };
//	TESTS_NUMBERS = new int[] { 74, 75 };
//	TESTS_RANGE = new int[] { 11, -1 };
}
public TryStatementTest(String name) {
	super(name);
}
public static Test suite() {
	return buildAllCompliancesTestSuite(testClass());
}
@Override
protected Map getCompilerOptions() {
	Map compilerOptions = super.getCompilerOptions();
	compilerOptions.put(CompilerOptions.OPTION_ShareCommonFinallyBlocks, CompilerOptions.ENABLED);
	return compilerOptions;
}
public void test001() {
	this.runConformTest(new String[] {
		"p/X.java",
		"package p;\n" +
		"public class X {\n" +
		"  public class X1 {\n" +
		"    public X1() throws Exception {\n" +
		"    }\n" +
		"  }\n" +
		"  public void method1(){\n" +
		"    try {\n" +
		"      new X1() {\n" +
		"      };\n" +
		"    } catch(Exception e){\n" +
		"    }\n" +
		"  }\n" +
		"}\n",
	});
}

public void test002() {
	this.runConformTest(new String[] {
		"p/X.java",
		"package p;\n" +
		"import java.io.*;\n" +
		"import java.util.zip.*;\n" +
		"class X {\n" +
		"  void bar() throws ZipException, IOException {}\n" +
		"  void foo() {\n" +
		"    try {\n" +
		"      bar();\n" +
		"    } catch (ZipException e) {\n" +
		"    } catch (IOException e) {\n" +
		"    }\n" +
		"  }\n" +
		"}\n",
	});
}

public void test003() {
	this.runConformTest(new String[] {
		"p/X.java",
		"package p;\n" +
		"public class X {\n" +
		"  public class A1 {\n" +
		"    public A1() throws Exception {\n" +
		"    }\n" +
		"  }\n" +
		"  public void method1(){\n" +
		"    try {\n" +
		"      new A1() {\n" +
		"      };\n" +
		"    } catch(Exception e){\n" +
		"    }\n" +
		"  }\n" +
		"}\n",
	});
}

public void test004() {
	this.runConformTest(new String[] {
		"p/ATC.java",
		"package p;\n" +
		"public class ATC {\n" +
		"    \n" +
		"    public class B extends Exception {\n" +
		"      public B(String msg) { super(msg); }\n" +
		"    }\n" +
		"    \n" +
		"    void foo() throws ATC.B {\n" +
		"      Object hello$1 = null;\n" +
		"      try {\n" +
		"        throw new B(\"Inside foo()\");\n" +
		"      } catch(B e) {\n" +
		"        System.out.println(\"Caught B\");\n" +
		"      }    \n" +
		"    }       \n" +
		"}\n",
	});
}

public void test005() {
	this.runConformTest(new String[] {
		"p/A.java",
		"package p;\n" +
		"import java.io.IOException;\n" +
		"import java.util.Vector;\n" +
		"/**\n" +
		" * This test0 should run without producing a java.lang.ClassFormatError\n" +
		" */\n" +
		"public class A {\n" +
		"  public Vector getComponents () {\n" +
		"    try{\n" +
		"      throw new IOException();\n" +
		"    }\n" +
		"    catch (IOException ioe) {\n" +
		"    }\n" +
		"    return null;\n" +
		"  }\n" +
		"  public static void main(String[] args) {\n" +
		"    new A().getComponents();\n" +
		"  }\n" +
		"}\n",
	});
}

public void test006() {
	this.runConformTest(new String[] {
		"p/T.java",
		"package p;\n" +
		"import java.lang.reflect.*;\n" +
		"public class T extends InvocationTargetException {\n" +
		"  public static void main(String[] args) {\n" +
		"    T ct = new T();\n" +
		"    ct.getTargetException();\n" +
		"  }\n" +
		"  public Throwable getTargetException() {\n" +
		"    Runnable runnable = new Runnable() {\n" +
		"      public void run() {\n" +
		"        System.out.println(\"we got here\");\n" +
		"        T.super.getTargetException();\n" +
		"      }\n" +
		"    };\n" +
		"    runnable.run();\n" +
		"    return new Throwable();\n" +
		"  }\n" +
		"}\n",
	});
}
public void test007() {
	this.runConformTest(new String[] {
		"TryFinally.java",
		"class TryFinally {	\n"+
		"	public int readFile(String filename) throws Exception {	\n"+
		"		int interfaceID = -1;	\n"+
		"		int iNdx = 0;	\n"+
		"		try {	\n"+
		"			try {	\n"+
		"				return interfaceID;	\n"+
		"			} // end try	\n"+
		"			finally {	\n"+
		"				iNdx = 1;	\n"+
		"			} // end finally	\n"+
		"		} // end try	\n"+
		"		catch (Exception ex) {	\n"+
		"			throw new Exception(\"general exception \" + ex.getMessage() + \" on processing file \" + filename);	\n"+
		"		} // end catch	\n"+
		"		finally {	\n"+
		"		} // end finally	\n"+
		"	} // end readFile method	\n"+
		"}	\n"
});
}
/*
 * 1FZR1TO: IVJCOM:WIN - Class does not compile in VAJava 3.02-Java2
 */
public void test008() {
	this.runConformTest(
		new String[] {
			"RedundantException.java",
			"import java.io.*;\n" +
			"public class RedundantException {\n" +
			"	/**\n" +
			"	     * Runs the class as an application.\n" +
			"	     */\n" +
			"	public static void main(String[] args) {\n" +
			"		RedundantException re = new RedundantException();\n" +
			"		re.catchIt();\n" +
			"		System.out.println(\"SUCCESS\");\n" +
			"	}\n" +
			"	/**\n" +
			"	     * Defines a method that lists an exception twice.\n" +
			"	     * This can be buried in a much longer list.\n" +
			"	     */\n" +
			"	void throwIt() throws IOException, IOException {\n" +
			"		throw new IOException();\n" +
			"	}\n" +
			"	/**\n" +
			"	     * Catches the redundantly defined exception.\n" +
			"	     */\n" +
			"	void catchIt() {\n" +
			"		try {\n" +
			"			throwIt(); // compile error here\n" +
			"		} catch (IOException e) {\n" +
			"			System.out.println(\"Caught.\");\n" +
			"		}\n" +
			"	}\n" +
			"}"
		},
		"Caught.\n" +
		"SUCCESS");
}
public void test009() {
	this.runConformTest(
		new String[] {
			"Test.java",
			"public class Test {\n" +
			"public void save() {\n" +
			"	int a = 3;\n" +
			"	try {\n" +
			"		Object warnings = null;\n" +
			"      	try {\n" +
			"         	Object contexts = null;\n" +
			"         	try {\n" +
			"            	System.out.println(warnings);\n" +
			"			 	return;\n" +
			"      	 	} catch (NullPointerException npe) {\n" +
			"				System.out.println(contexts);\n" +
			"               return;\n" +
			"       	}\n" +
			"		} catch (Exception e) {\n" +
			" 			return;\n" +
			"   	}\n" +
			"	} finally {\n" +
			"     	int b = 4;\n" +
			"       System.out.println(\"#save -> \" + b + a);\n" +
			"    }\n" +
			"}\n" +
			"public static void main(String[] args) {\n" +
			"	new Test().save();\n"+
			"}\n" +
			"}"
		},
		"null\n" +
		"#save -> 43");
}
public void test010() {
	this.runConformTest(
		new String[] {
			"Test.java",
			"public class Test {\n" +
			"public void save() {\n" +
			"	int a = 3;\n" +
			"	try {\n" +
			"		Object warnings = null;\n" +
			"      	try {\n" +
			"         	Object contexts = null;\n" +
			"         	try {\n" +
			"            	System.out.println(warnings);\n" +
			"			 	return;\n" +
			"      	 	} catch (NullPointerException npe) {\n" +
			"				System.out.println(contexts);\n" +
			"               return;\n" +
			"       	}\n" +
			"		} catch (Exception e) {\n" +
			" 			return;\n" +
			"   	}\n" +
			"	} catch(Exception e){\n"+
			"		Object dummy1 = null;\n" +
			"		System.out.println(dummy1);\n" +
			"		Object dummy2 = null;\n" +
			"		System.out.println(dummy2);\n" +
			"		return;\n"+
			"	} finally {\n" +
			"     	int b = 4;\n" +
			"       System.out.println(\"#save -> \" + b + a);\n" +
			"    }\n" +
			"}\n" +
			"public static void main(String[] args) {\n" +
			"	new Test().save();\n"+
			"}\n" +
			"}"
		},
		"null\n" +
		"#save -> 43");
}

public void test011() {
	this.runConformTest(
		new String[] {
			"Test.java",
			"public class Test {\n" +
			"public void save() {\n" +
			"	int a = 3;\n" +
			"	try {\n" +
			"		Object warnings = null;\n" +
			"      	try {\n" +
			"         	Object contexts = null;\n" +
			"         	try {\n" +
			"            	System.out.println(warnings);\n" +
			"			 	return;\n" +
			"      	 	} catch (NullPointerException npe) {\n" +
			"				System.out.println(contexts);\n" +
			"               return;\n" +
			"       	}\n" +
			"		} catch (Exception e) {\n" +
			" 			return;\n" +
			"   	}\n" +
			"	} catch(Exception e){\n"+
			"		int dummy1 = 11;\n" +
			"		System.out.println(dummy1);\n" +
			"		int dummy2 = 12;\n" +
			"		System.out.println(dummy2);\n" +
			"		return;\n"+
			"	} finally {\n" +
			"     	int b = 4;\n" +
			"       System.out.println(\"#save -> \" + b + a);\n" +
			"    }\n" +
			"}\n" +
			"public static void main(String[] args) {\n" +
			"	new Test().save();\n"+
			"}\n" +
			"}"
		},
		"null\n" +
		"#save -> 43");
}
/*
 * 4943  Verification error
 */
public void test012() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.io.*;\n" +
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		try {\n" +
			"			new X().delete(args);\n" +
			"			System.out.println(\"success\");\n" +
			"		} catch (Exception e) {\n" +
			"		}\n" +
			"	}\n" +
			"	void bar(int i) {\n" +
			"	}\n" +
			"	public Object delete(String[] resources) throws IOException {\n" +
			"		try {\n" +
			"			int totalWork = 3;\n" +
			"			Object result = \"aaa\";\n" +
			"			try {\n" +
			"				return result;\n" +
			"			} catch (Exception e) {\n" +
			"				throw new IOException();\n" +
			"			} finally {\n" +
			"				bar(totalWork);\n" +
			"			}\n" +
			"		} finally {\n" +
			"			bar(0);\n" +
			"		}\n" +
			"	}\n" +
			"}\n"
		},
		"success");
}

/*
 * 4943  Verification error
 */
public void test013() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.io.*;\n" +
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		try {\n" +
			"			new X().delete(args);\n" +
			"			System.out.println(\"success\");\n" +
			"		} catch (Exception e) {\n" +
			"		}\n" +
			"	}\n" +
			"	void bar(int i) {\n" +
			"	}\n" +
			"	public Object delete(String[] resources) throws IOException {\n" +
			"		try {\n" +
			"			int totalWork = 3;\n" +
			"			Object result = \"aaa\";\n" +
			"			try {\n" +
			"				return result;\n" +
			"			} catch (Exception e) {\n" +
			"				throw new IOException();\n" +
			"			} finally {\n" +
			"				bar(totalWork);\n" +
			"			}\n" +
			"		} finally {\n" +
			"			int totalWork = 4;\n" +
			"			bar(totalWork);\n" +
			"		}\n" +
			"	}\n" +
			"}\n"
		},
		"success");
}
public void test014() {
	this.runConformTest(
		new String[] {
			"Test.java",
			"public class Test {\n" +
			"public void save() {\n" +
			"	int a = 3;\n" +
			"	try {\n" +
			"		Object warnings = null;\n" +
			"      	try {\n" +
			"         	int contexts = 17;\n" +
			"         	try {\n" +
			"				Object dummy = null;\n" +
			"            	System.out.println(warnings);\n" +
			"            	System.out.println(dummy);\n" +
			"			 	return;\n" +
			"      	 	} catch (NullPointerException npe) {\n" +
			"				System.out.println(contexts);\n" +
			"               return;\n" +
			"       	}\n" +
			"		} catch (Exception e) {\n" +
			" 			return;\n" +
			"   	} finally { \n" +
			"			int c = 34; \n"+
			"			System.out.println(\"#inner-finally ->\" + a + c);\n"+
			"       }\n" +
			"	} finally {\n" +
			"     	int b = 4;\n" +
			"       System.out.println(\"#save -> \" + b + a);\n" +
			"    }\n" +
			"}\n" +
			"public static void main(String[] args) {\n" +
			"	new Test().save();\n"+
			"}\n" +
			"}"
		},
		"null\n" +
		"null\n" +
		"#inner-finally ->334\n" +
		"#save -> 43");
}

public void test015() {
	this.runConformTest(
		new String[] {
			"p1/X.java",
			"package p1;	\n" +
			"import java.io.IOException;	\n" +
			"public class X {	\n" +
			"	public static void main(String args[]) {	\n" +
			"		try { 	\n" +
			"			new Object(){	\n" +
			"				{	\n" +
			"					if (true) throw new IOException();	\n" +
			"					if (true) throw new Exception();	\n" +
			"				}	\n" +
			"			};	\n" +
			"			System.out.println(\"FAILED\");	\n" +
			"		} catch(Exception e){	\n" +
			"			System.out.println(\"SUCCESS\");	\n" +
			"		}	\n" +
			"	}	\n" +
			"}	\n",
		},
		"SUCCESS");
}
public void test016() {
	this.runConformTest(
		new String[] {
			"p1/X.java",
			"package p1;	\n" +
			"import java.io.IOException;	\n" +
			"public class X {	\n" +
			"	public static void main(String args[]) {	\n" +
			"		class SomeClass {	\n" +
			"			SomeClass () throws IOException {	\n" +
			"			}	\n" +
			"		}	\n" +
			"		try { 	\n" +
			"			new Object(){	\n" +
			"				{	\n" +
			"					if (true) throw new IOException();	\n" +
			"					if (true) throw new Exception();	\n" +
			"				}	\n" +
			"			};	\n" +
			"			System.out.println(\"FAILED\");	\n" +
			"		} catch(Exception e){	\n" +
			"			System.out.println(\"SUCCESS\");	\n" +
			"		}	\n" +
			"	}	\n" +
			"}	\n",
		},
		"SUCCESS");
}
public void test017() {
	this.runConformTest(
		new String[] {
			"p1/X.java",
			"package p1;	\n" +
			"public class X {	\n" +
			"	public static void main(String args[]) {	\n" +
			"		try { 	\n" +
			"			new Object(){	\n" +
			"				{	\n" +
			"					foo();	\n" +
			"				}	\n" +
			"			};	\n" +
			"			System.out.println(\"FAILED\");	\n" +
			"		} catch(Exception e){	\n" +
			"			System.out.println(\"SUCCESS\");	\n" +
			"		}	\n" +
			"	}	\n" +
			"	static class AEx extends Exception {} \n" +
			"	static class BEx extends Exception {} \n" +
			"	static void foo() throws AEx, BEx {	\n" +
			"		throw new AEx();	\n"+
			"	}	\n" +
			"}	\n",
		},
		"SUCCESS");
}

// 8773 verification error
public void test018() {
	this.runConformTest(
		new String[] {
			"VerifyEr.java",
			"public class VerifyEr {	\n" +
			"  protected boolean err(boolean b) {	\n" +
			"     try {	\n" +
			"          System.out.print(\"SUCC\");	\n" +
			"     } catch (Throwable t) {	\n" +
			"          return b;	\n" +
			"     } finally {	\n" +
			"          try {	\n" +
			"               if (b) {	\n" +
			"                    return b;	\n" +
			"               }	\n" +
			"          } finally {	\n" +
			"          		System.out.println(\"ESS\");	\n" +
			"          }	\n" +
			"     }	\n" +
			"     return false;	\n" +
			"  }	\n" +
			"  public static void main(String[] args) {	\n" +
			"     new VerifyEr().err(false);	\n" +
			"  }	\n" +
			"}	\n",
		},
		"SUCCESS");
}
/*
 * http://bugs.eclipse.org/bugs/show_bug.cgi?id=16279
 */
public void test019() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {	\n" +
			"	String logger;	\n" +
			"  public static void main(String[] args) {	\n" +
			"    new X().foo();	\n" +
			"	}	\n"+
			"	public void foo() {	\n" +
			"		try {	\n" +
			"			System.out.println(\"SUCCESS\");	\n" +
			"		} catch (Exception ce) {	\n" +
			"			String s = null;	\n" +
			"			try {	\n" +
			"				return;	\n" +
			"			} catch (Exception ex) {	\n" +
			"			}	\n" +
			"			s.hashCode();	\n" +
			"		} finally {	\n" +
			"			if (this.logger == null) {	\n" +
			"				String loggerManager = null;	\n" +
			"				System.out.println(loggerManager);	\n" +
			"			}	\n" +
			"		}	\n" +
			"	}	\n" +
			"}	\n"
		},
		"SUCCESS\n" +
		"null");
}

/*
 * http://bugs.eclipse.org/bugs/show_bug.cgi?id=16279
 * shifting of finaly scopes against try/catch ones makes the custom ret address shifting
 * unnecessary.
 */
public void test020() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {	\n" +
			"	String logger;	\n" +
			"  public static void main(String[] args) {	\n" +
			"    new X().foo();	\n" +
			"	}	\n"+
			"	public void foo() {	\n" +
			"		try {	\n" +
			"			System.out.println(\"try1\");	\n" +
			"			try {	\n" +
			"				System.out.println(\"try2\");	\n" +
			"			} finally {	\n" +
			"				System.out.println(\"finally2\");	\n" +
			"			}	\n" +
			"		} catch (Exception ce) {	\n" +
			"			String s = null;	\n" +
			"			try {	\n" +
			"				return;	\n" +
			"			} catch (Exception ex) {	\n" +
			"			}	\n" +
			"			s.hashCode();	\n" +
			"		} finally {	\n" +
			"			System.out.println(\"finally1\");	\n" +
			"			try {	\n" +
			"				System.out.println(\"try3\");	\n" +
			"				if (this.logger == null) {	\n" +
			"					String loggerManager = null;	\n" +
			"				}	\n" +
			"			} finally {	\n" +
			"				System.out.println(\"finally3\");	\n" +
			"			}	\n" +
			"		}	\n" +
			"		int i1 = 0;	\n" +
			"		int i2 = 0;	\n" +
			"		int i3 = 0;	\n" +
			"		int i4 = 0;	\n" +
			"		int i5 = 0;	\n" +
			"		int i6 = 0;	\n" +
			"		int i7 = 0;	\n" +
			"		int i8 = 0;	\n" +
			"		int i9 = 0;	\n" +
			"	}	\n" +
			"}	\n"
		},
		"try1\n" +
		"try2\n" +
		"finally2\n" +
		"finally1\n" +
		"try3\n" +
		"finally3");
}

/*
 * http://dev.eclipse.org/bugs/show_bug.cgi?id=21116
 * protected type visibility check
 */
public void test021() {
	this.runConformTest(
		new String[] {
			"pa/A.java",
			"package pa;	\n" +
			"public abstract class A {	\n" +
			"  public static void main(String[] args) {	\n" +
			"    System.out.println(\"SUCCESS\");	\n" +
			"	}	\n"+
			"	protected AIC memberA;	\n" +
			"	protected class AIC {	\n" +
			"		public void methodAIC(String parameter) {	\n" +
			"		  // ....do something	\n" +
			"		}	\n" +
			"	}	\n" +
			"}	\n",
			"pb/B.java",
			"package pb;	\n" +
			"public class B extends pa.A {	\n" +
			"	private class BIC {	\n" +
			"		public void methodBIC(String param) {	\n" +
			"			memberA.methodAIC(param);	\n" +
			"		}	\n" +
			"	}	\n" +
			"}	\n"
		},
		"SUCCESS");
}

/*
 * http://dev.eclipse.org/bugs/show_bug.cgi?id=19916
 * nested try/synchronized statements (local var index alloc)
 */
public void test022() {
	this.runConformTest(
		new String[] {
			"pa/A.java",
			"package pa;	\n" +
			"public class A {	\n" +
			"  public static void main(String[] args) {	\n" +
			"	 new A().f();	\n" +
			"    System.out.println(\"SUCCESS\");	\n" +
			"	}	\n"+
			"	boolean b = false;	\n" +
			"	private Integer f() {	\n" +
			"		while (true) {	\n" +
			"			try {	\n" +
			"				int x = 3;	\n" +
			"				synchronized (this) {	\n" +
			"					return null;	\n" +
			"				}	\n" +
			"			} finally {	\n" +
			"				if (b)	\n" +
			"					synchronized (this) {	\n" +
			"					int y = 3;	\n" +
			"				}	\n" +
			"			}	\n" +
			"		}	\n" +
			"	}	\n" +
			"}	\n"
		},
		"SUCCESS");
}

public void test023() {
	Map customOptions = getCompilerOptions();
	customOptions.put(CompilerOptions.OPTION_ReportHiddenCatchBlock, CompilerOptions.ERROR);
	runNegativeTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"X.java",
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		try {\n" +
			"			throw new BX();\n" +
			"		} catch(BX e) {\n" +
			"		} catch(AX e) {\n" +
			"		}\n" +
			"	}\n" +
			"} \n" +
			"class AX extends Exception {}\n" +
			"class BX extends AX {}\n"
		},
		// compiler options
		null /* no class libraries */,
		customOptions /* custom options */,
		// compiler results
		"----------\n" +  /* expected compiler log */
		"1. ERROR in X.java (at line 6)\n" +
		"	} catch(AX e) {\n" +
		"	        ^^\n" +
		"Unreachable catch block for AX. Only more specific exceptions are thrown and they are handled by previous catch block(s).\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 10)\n" +
		"	class AX extends Exception {}\n" +
		"	      ^^\n" +
		"The serializable class AX does not declare a static final serialVersionUID field of type long\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 11)\n" +
		"	class BX extends AX {}\n" +
		"	      ^^\n" +
		"The serializable class BX does not declare a static final serialVersionUID field of type long\n" +
		"----------\n",
		// javac options
		JavacTestOptions.Excuse.EclipseWarningConfiguredAsError /* javac test options */);
}

 /*
 * http://bugs.eclipse.org/bugs/show_bug.cgi?id=21203
 * NPE in ExceptionFlowContext
 */
public void test024() {

	this.runNegativeTest(
		new String[] {
			"p/X.java",
			"package p;	\n" +
			"public class X {	\n" +
			"	public void myMethod() {	\n" +
			"	    System.out.println(\"starting\");	\n" +
			"	    try {	\n" +
			"	        if (true) throw new LookupException();	\n" +
			"	    } catch(DataException de) {	\n" +
			"	       	System.out.println(\"DataException occurred\");	\n" +
			"	    } catch(LookupException le) {	\n" +
			"	       	System.out.println(\"LookupException occurred\");	\n" +
			"	    } catch(Throwable t) {	\n" +
			"	       	System.out.println(\"Throwable occurred\");	\n" +
			"	    }	\n" +
			"	    System.out.println(\"SUCCESS\");	\n" +
			"	}	\n" +
			"}	\n" +
			"class DataException extends Throwable {	\n" +
			"} 	\n" +
			"class LookupException extends DataException {	\n" +
			"}	\n"
		},
		"----------\n" +
		"1. ERROR in p\\X.java (at line 9)\n" +
		"	} catch(LookupException le) {	\n" +
		"	        ^^^^^^^^^^^^^^^\n" +
		"Unreachable catch block for LookupException. It is already handled by the catch block for DataException\n" +
		"----------\n" +
		"2. WARNING in p\\X.java (at line 17)\n" +
		"	class DataException extends Throwable {	\n" +
		"	      ^^^^^^^^^^^^^\n" +
		"The serializable class DataException does not declare a static final serialVersionUID field of type long\n" +
		"----------\n" +
		"3. WARNING in p\\X.java (at line 19)\n" +
		"	class LookupException extends DataException {	\n" +
		"	      ^^^^^^^^^^^^^^^\n" +
		"The serializable class LookupException does not declare a static final serialVersionUID field of type long\n" +
		"----------\n");
}
// 60081
public void test025() {

	this.runConformTest(
		new String[] {
			"X.java",
			"import java.io.*;\n" +
			"public class X\n" +
			"{\n" +
			"    {\n" +
			"        String licenseFileName = \"C:/Program Files/Jatt/bin/license.key\";\n" +
			"        File licenseFile = new File(licenseFileName);\n" +
			"        try {\n" +
			"            BufferedReader licenseReader = new BufferedReader(\n" +
			"                new FileReader(licenseFile));\n" +
			"            StringBuffer buf = new StringBuffer();\n" +
			"            String line = null;\n" +
			"            while ((line = licenseReader.readLine()) != null) {\n" +
			"                char[] chars = line.toCharArray();\n" +
			"                for (int i = 0; i < line.length(); i++) {\n" +
			"                    if (!Character.isSpace(line.charAt(i))) {\n" +
			"                        buf.append(line.charAt(i));\n" +
			"                    }\n" +
			"                }\n" +
			"            }\n" +
			"            \n" +
			"        } catch (FileNotFoundException e) {\n" +
			"            throw new Error(\"License file not found\", e);\n" +
			"        } catch (IOException e) {\n" +
			"            throw new Error(\"License file cannot be read\", e);\n" +
			"        }\n" +
			"    }\n" +
			"  public X()\n" +
			"  {\n" +
			"  }\n" +
			"  \n" +
			"  public X(X r) \n" +
			"  {\n" +
			"  }    \n" +
			"  public static void main(String[] args) {\n" +
			"        System.out.println(\"SUCCESS\");\n" +
			"    }\n" +
			"}\n"
		},
		"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=89710
public void test026() throws Exception {

	Map customOptions = getCompilerOptions();
	customOptions.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.PRESERVE);

	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			"public class X {\n" +
			"	\n" +
			"	static private ResourceBundle bundle = null;\n" +
			"	static {\n" +
			"		int i = 0;\n" +
			"		try {\n" +
			"			bundle = foo();\n" +
			"		} catch(Throwable e) {\n" +
			"			e.printStackTrace();\n" +
			"		}\n" +
			"	}\n" +
			"\n" +
			"	static ResourceBundle foo() {\n" +
			"		return null;\n" +
			"	}\n" +
			"}\n",
		},
		"",
		null,
		true,
		null,
		customOptions,
		null); // custom requestor

	String expectedOutput =
		"      Local variable table:\n" +
		"        [pc: 6, pc: 20] local: i index: 0 type: int\n" +
		"        [pc: 16, pc: 20] local: e index: 1 type: java.lang.Throwable\n";

	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=89710 - variation
public void test027() throws Exception {

	Map customOptions = getCompilerOptions();
	customOptions.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.PRESERVE);

	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			"public class X {\n" +
			"	\n" +
			"	void bar(boolean b) {\n" +
			"		if (b) {\n" +
			"			try {\n" +
			"				int i = 0;\n" +
			"			} catch(Exception e) {\n" +
			"				e.printStackTrace();\n" +
			"			}\n" +
			"		} else {\n" +
			"			int j = 0;\n" +
			"		}\n" +
			"	}\n" +
			"}\n",
		},
		"",
		null,
		true,
		null,
		customOptions,
		null); // custom requestor

	String expectedOutput =
		"      Local variable table:\n" +
		"        [pc: 0, pc: 20] local: this index: 0 type: X\n" +
		"        [pc: 0, pc: 20] local: b index: 1 type: boolean\n" +
		"        [pc: 10, pc: 14] local: e index: 2 type: java.lang.Exception\n";

	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98892
public void test028() {

	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"\n" +
			"    public static void main(String[] args) {\n" +
			"    	try {\n" +
			"	        new X().start();\n" +
			"    	} catch(Exception e) {\n" +
			"            System.out.println(\"SUCCESS\");\n" +
			"    	}\n" +
			"    }\n" +
			"    public Object start() {\n" +
			"        try {\n" +
			"            return null;\n" +
			"        } finally {\n" +
			"            System.out.print(\"ONCE:\");\n" +
			"            foo();\n" +
			"        }\n" +
			"    }\n" +
			"\n" +
			"    private void foo() {\n" +
			"        throw new IllegalStateException(\"Gah!\");\n" +
			"    }        \n" +
			"}\n",
		},
		"ONCE:SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98892 - variation
public void test029() {

	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"\n" +
			"    public static void main(String[] args) {\n" +
			"    	try {\n" +
			"	        new X().start();\n" +
			"    	} catch(Exception e) {\n" +
			"            System.out.println(\"SUCCESS\");\n" +
			"    	}\n" +
			"    }\n" +
			"    public Object start() {\n" +
			"        try {\n" +
			"            return null;\n" +
			"        } finally {\n" +
			"            System.out.print(\"ONCE:\");\n" +
			"            foo();\n" +
			"            return this;\n" +
			"        }\n" +
			"    }\n" +
			"\n" +
			"    private void foo() {\n" +
			"        throw new IllegalStateException(\"Gah!\");\n" +
			"    }        \n" +
			"}\n",
		},
		"ONCE:SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98892 - variation
public void test030() {

	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"\n" +
			"    public static void main(String[] args) {\n" +
			"    	try {\n" +
			"	        new X().start();\n" +
			"    	} catch(Exception e) {\n" +
			"            System.out.println(\"SUCCESS\");\n" +
			"    	}\n" +
			"    }\n" +
			"    public Object start() {\n" +
			"        try {\n" +
			"            Object o = null;\n" +
			"            o.toString();\n" +
			"            return null;\n" +
			"        } catch(Exception e) {\n" +
			"            System.out.print(\"EXCEPTION:\");\n" +
			"			return e;        	\n" +
			"        } finally {\n" +
			"            System.out.print(\"ONCE:\");\n" +
			"            foo();\n" +
			"        }\n" +
			"    }\n" +
			"\n" +
			"    private void foo() {\n" +
			"        throw new IllegalStateException(\"Gah!\");\n" +
			"    }        \n" +
			"}\n",
		},
		"EXCEPTION:ONCE:SUCCESS");
}
/*
 * Try block is never reached
 */
public void test031() {
	Map customOptions = getCompilerOptions();
	customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.IGNORE);
	runNegativeTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"X.java",
			"import java.io.IOException;\n" +
			"\n" +
			"public class X {\n" +
			"	static void foo(Object o) {}\n" +
			"	\n" +
			"    public static void main(String[] args) {\n" +
			"    	try {\n" +
			"    		foo(new Object() {\n" +
			"    			public void bar() throws IOException {\n" +
			"    				bar1();\n" +
			"    			}\n" +
			"    		});\n" +
			"    	} catch(IOException e) {\n" +
			"    		e.printStackTrace();\n" +
			"    	}\n" +
			"    }\n" +
			"    \n" +
			"    static void bar1() throws IOException {}\n" +
			"}"
		},
		// compiler options
		null /* no class libraries */,
		customOptions /* custom options */,
		// compiler results
		"----------\n" + /* expected compiler log */
		"1. ERROR in X.java (at line 13)\n" +
		"	} catch(IOException e) {\n" +
		"	        ^^^^^^^^^^^\n" +
		"Unreachable catch block for IOException. This exception is never thrown from the try statement body\n" +
		"----------\n",
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}
/*
 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=114855
 */
public void test032() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X\n" +
			"{\n" +
			"  static int except_count;\n" +
			"\n" +
			"  static boolean test_result = true;\n" +
			"  \n" +
			"  static Throwable all_except[] =\n" +
			"  {\n" +
			"    new AbstractMethodError(),             //  0\n" +
			"    new ArithmeticException(),             //  1\n" +
			"    new ArrayIndexOutOfBoundsException(),  //  2\n" +
			"    new ArrayStoreException(),             //  3\n" +
			"    new ClassCastException(),              //  4\n" +
			"    new ClassCircularityError(),           //  5\n" +
			"    new ClassFormatError(),                //  6\n" +
			"    new ClassNotFoundException(),          //  7\n" +
			"    new CloneNotSupportedException(),      //  8\n" +
			"    new Error(),                           //  9\n" +
			"    new Exception(),                       // 10\n" +
			"    new IllegalAccessError(),              // 11\n" +
			"    new IllegalAccessException(),          // 12\n" +
			"    new IllegalArgumentException(),        // 13\n" +
			"    new IllegalMonitorStateException(),    // 14\n" +
			"    new IllegalThreadStateException(),     // 15\n" +
			"    new IncompatibleClassChangeError(),    // 16\n" +
			"    new IndexOutOfBoundsException(),       // 17\n" +
			"    new InstantiationError(),              // 18\n" +
			"    new InstantiationException(),          // 19\n" +
			"    new InternalError(),                   // 20\n" +
			"    new InterruptedException(),            // 21\n" +
			"    new LinkageError(),                    // 22\n" +
			"    new NegativeArraySizeException(),      // 23\n" +
			"    new NoClassDefFoundError(),            // 24\n" +
			"    new NoSuchFieldError(),                // 25\n" +
			"    new NoSuchMethodError(),               // 26\n" +
			"    new NoSuchMethodException(),           // 27\n" +
			"    new NullPointerException(),            // 28\n" +
			"    new NumberFormatException(),           // 29\n" +
			"    new OutOfMemoryError(),                // 30\n" +
			"    new StackOverflowError(),              // 31\n" +
			"    new RuntimeException(),                // 32\n" +
			"    new SecurityException(),               // 33\n" +
			"    new StringIndexOutOfBoundsException(), // 34\n" +
			"    new ThreadDeath(),                     // 35\n" +
			"    new UnknownError(),                    // 36\n" +
			"    new UnsatisfiedLinkError(),            // 37\n" +
			"    new VerifyError(),                     // 38\n" +
			"  };\n" +
			"\n" +
			"  private static void check_except(int i)\n" +
			"    throws Throwable\n" +
			"  {\n" +
			"    if (except_count != i)\n" +
			"    {\n" +
			"      System.out.println(\"Error \"+except_count+\" != \"+i+\";\");\n" +
			"      test_result=false;\n" +
			"    }\n" +
			"    throw all_except[++except_count];\n" +
			"  }\n" +
			"\n" +
			"  public static void main(String[] args) throws Throwable\n" +
			"  {\n" +
			"    try {\n" +
			"      except_count = 0;\n" +
			"      throw all_except[except_count];\n" +
			"    } catch (AbstractMethodError e0) {\n" +
			"      try {\n" +
			"        check_except(0);\n" +
			"      } catch (ArithmeticException e1) {\n" +
			"        try {\n" +
			"          check_except(1);\n" +
			"        } catch (ArrayIndexOutOfBoundsException e2) {\n" +
			"          try {\n" +
			"            check_except(2);\n" +
			"          } catch (ArrayStoreException e3) {\n" +
			"            try {\n" +
			"              check_except(3);\n" +
			"            } catch (ClassCastException e4) {\n" +
			"              try {\n" +
			"                check_except(4);\n" +
			"              } catch (ClassCircularityError e5) {\n" +
			"                try {\n" +
			"                  check_except(5);\n" +
			"                } catch (ClassFormatError e6) {\n" +
			"                  try {\n" +
			"                    check_except(6);\n" +
			"                  } catch (ClassNotFoundException e7) {\n" +
			"                    try {\n" +
			"                      check_except(7);\n" +
			"                    } catch (CloneNotSupportedException e8) {\n" +
			"                      try {\n" +
			"                        check_except(8);\n" +
			"                      } catch (Error e9) {\n" +
			"                        try {\n" +
			"                          check_except(9);\n" +
			"                        } catch (Exception e10) {\n" +
			"                          try {\n" +
			"                            check_except(10);\n" +
			"                          } catch (IllegalAccessError e11) {\n" +
			"                            try {\n" +
			"                              check_except(11);\n" +
			"                            } catch (IllegalAccessException e12) {\n" +
			"                              try {\n" +
			"                                check_except(12);\n" +
			"                              } catch (IllegalArgumentException e13) {\n" +
			"                                try {\n" +
			"                                  check_except(13);\n" +
			"                                } catch (IllegalMonitorStateException e14) {\n" +
			"                                  try {\n" +
			"                                    check_except(14);\n" +
			"                                  } catch (IllegalThreadStateException e15) {\n" +
			"                                    try {\n" +
			"                                      check_except(15);\n" +
			"                                    } catch (IncompatibleClassChangeError e16) {\n" +
			"                                      try {\n" +
			"                                        check_except(16);\n" +
			"                                      } catch (IndexOutOfBoundsException e17) {\n" +
			"                                        try {\n" +
			"                                          check_except(17);\n" +
			"                                        } catch (InstantiationError e18) {\n" +
			"                                          try {\n" +
			"                                            check_except(18);\n" +
			"                                          } catch (InstantiationException e19) {\n" +
			"                                            try {\n" +
			"                                              check_except(19);\n" +
			"                                            } catch (InternalError e20) {\n" +
			"                                              try {\n" +
			"                                                check_except(20);\n" +
			"                                              } catch (InterruptedException \n" +
			"e21) {\n" +
			"                                                try {\n" +
			"                                                  check_except(21);\n" +
			"                                                } catch (LinkageError e22) {\n" +
			"                                                  try {\n" +
			"                                                    check_except(22);\n" +
			"                                                  } catch \n" +
			"(NegativeArraySizeException e23) {\n" +
			"                                                    try {\n" +
			"                                                      check_except(23);\n" +
			"                                                    } catch \n" +
			"(NoClassDefFoundError e24) {\n" +
			"                                                      try {\n" +
			"                                                        check_except(24);\n" +
			"                                                      } catch (NoSuchFieldError \n" +
			"e25) {\n" +
			"                                                        try {\n" +
			"                                                          check_except(25);\n" +
			"                                                        } catch \n" +
			"(NoSuchMethodError e26) {\n" +
			"                                                          try {\n" +
			"                                                            check_except(26);\n" +
			"                                                          } catch \n" +
			"(NoSuchMethodException e27) {\n" +
			"                                                            try {\n" +
			"                                                              check_except(27);\n" +
			"                                                            } catch \n" +
			"(NullPointerException e28) {\n" +
			"                                                              try {\n" +
			"                                                                check_except\n" +
			"(28);\n" +
			"                                                              } catch \n" +
			"(NumberFormatException e29) {\n" +
			"                                                                try {\n" +
			"                                                                  check_except\n" +
			"(29);\n" +
			"                                                                } catch \n" +
			"(OutOfMemoryError e30) {\n" +
			"                                                                  try {\n" +
			"                                                                    check_except\n" +
			"(30);\n" +
			"                                                                  } catch \n" +
			"(StackOverflowError e31) {\n" +
			"                                                                    try {\n" +
			"                                                                      \n" +
			"check_except(31);\n" +
			"                                                                    } catch \n" +
			"(RuntimeException e32) {\n" +
			"                                                                      try {\n" +
			"                                                                        \n" +
			"check_except(32);\n" +
			"                                                                      } catch \n" +
			"(SecurityException e33) {\n" +
			"                                                                        try {\n" +
			"                                                                          \n" +
			"check_except(33);\n" +
			"                                                                        } catch \n" +
			"(StringIndexOutOfBoundsException e34) {\n" +
			"                                                                          try {\n" +
			"                                                                            \n" +
			"check_except(34);\n" +
			"                                                                          } \n" +
			"catch (ThreadDeath e35) {\n" +
			"                                                                            try \n" +
			"{\n" +
			"                                                                              \n" +
			"check_except(35);\n" +
			"                                                                            } \n" +
			"catch (UnknownError e36) {\n" +
			"                                                                              \n" +
			"try {\n" +
			"                                                                                \n" +
			"check_except(36);\n" +
			"                                                                              } \n" +
			"catch (UnsatisfiedLinkError e37) {\n" +
			"                                                                                \n" +
			"try {\n" +
			"                                                                                \n" +
			"  check_except(37);\n" +
			"                                                                                \n" +
			"} catch (VerifyError e38) {\n" +
			"                                                                                \n" +
			"  ++except_count;\n" +
			"                                                                                \n" +
			"}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}\n" +
			"    System.out.print(test_result & (except_count == all_except.length));\n" +
			"  }\n" +
			"}",
		},
		"true");
}
public void test033() throws Exception {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	interface IActionSetContributionItem {\n" +
				"		String getActionSetId();\n" +
				"	}\n" +
				"	public interface IAction {\n" +
				"	}\n" +
				"	interface IContributionItem {\n" +
				"		String getId();\n" +
				"		boolean isSeparator();\n" +
				"		boolean isGroupMarker();\n" +
				"	}\n" +
				"    public static void findInsertionPoint(String startId,\n" +
				"            String sortId, IContributionItem[] items) {\n" +
				"        // Find the reference item.\n" +
				"        try {\n" +
				"	        int insertIndex = 0;\n" +
				"	        while (insertIndex < items.length) {\n" +
				"	            if (startId.equals(items[insertIndex].getId()))\n" +
				"	                break;\n" +
				"	            ++insertIndex;\n" +
				"	        }\n" +
				"	        if (insertIndex >= items.length)\n" +
				"	            return;\n" +
				"	\n" +
				"	        int compareMetric = 0;\n" +
				"	\n" +
				"	        // Find the insertion point for the new item.\n" +
				"	        // We do this by iterating through all of the previous\n" +
				"	        // action set contributions define within the current group.\n" +
				"	        for (int nX = insertIndex + 1; nX < items.length; nX++) {\n" +
				"	            IContributionItem item = items[nX];\n" +
				"	            if (item.isSeparator() || item.isGroupMarker()) {\n" +
				"	                // Fix for bug report 18357\n" +
				"	                break;\n" +
				"	            }\n" +
				"	            if (item instanceof IActionSetContributionItem) {\n" +
				"	                if (sortId != null) {\n" +
				"	                    String testId = ((IActionSetContributionItem) item)\n" +
				"	                            .getActionSetId();\n" +
				"	                    if (sortId.compareTo(testId) < compareMetric)\n" +
				"	                        break;\n" +
				"	                }\n" +
				"	                insertIndex = nX;\n" +
				"	            } else {\n" +
				"	                break;\n" +
				"	            }\n" +
				"	        }\n" +
				"	    } catch(Exception e) {}\n" +
				"    }\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"		findInsertionPoint(\"\", \"\", null);\n" +
				"	}\n" +
				"}",
			},
			"");
	String expectedOutput =
		"  // Method descriptor #15 (Ljava/lang/String;Ljava/lang/String;[LX$IContributionItem;)V\n" +
		"  // Stack: 3, Locals: 8\n" +
		"  public static void findInsertionPoint(java.lang.String startId, java.lang.String sortId, X.IContributionItem[] items);\n" +
		"      0  iconst_0\n" +
		"      1  istore_3 [insertIndex]\n" +
		"      2  goto 26\n" +
		"      5  aload_0 [startId]\n" +
		"      6  aload_2 [items]\n" +
		"      7  iload_3 [insertIndex]\n" +
		"      8  aaload\n" +
		"      9  invokeinterface X$IContributionItem.getId() : java.lang.String [16] [nargs: 1]\n" +
		"     14  invokevirtual java.lang.String.equals(java.lang.Object) : boolean [22]\n" +
		"     17  ifeq 23\n" +
		"     20  goto 32\n" +
		"     23  iinc 3 1 [insertIndex]\n" +
		"     26  iload_3 [insertIndex]\n" +
		"     27  aload_2 [items]\n" +
		"     28  arraylength\n" +
		"     29  if_icmplt 5\n" +
		"     32  iload_3 [insertIndex]\n" +
		"     33  aload_2 [items]\n" +
		"     34  arraylength\n" +
		"     35  if_icmplt 39\n" +
		"     38  return\n" +
		"     39  iconst_0\n" +
		"     40  istore 4 [compareMetric]\n" +
		"     42  iload_3 [insertIndex]\n" +
		"     43  iconst_1\n" +
		"     44  iadd\n" +
		"     45  istore 5 [nX]\n" +
		"     47  goto 123\n" +
		"     50  aload_2 [items]\n" +
		"     51  iload 5 [nX]\n" +
		"     53  aaload\n" +
		"     54  astore 6 [item]\n" +
		"     56  aload 6 [item]\n" +
		"     58  invokeinterface X$IContributionItem.isSeparator() : boolean [28] [nargs: 1]\n" +
		"     63  ifne 134\n" +
		"     66  aload 6 [item]\n" +
		"     68  invokeinterface X$IContributionItem.isGroupMarker() : boolean [32] [nargs: 1]\n" +
		"     73  ifeq 79\n" +
		"     76  goto 134\n" +
		"     79  aload 6 [item]\n" +
		"     81  instanceof X$IActionSetContributionItem [35]\n" +
		"     84  ifeq 134\n" +
		"     87  aload_1 [sortId]\n" +
		"     88  ifnull 117\n" +
		"     91  aload 6 [item]\n" +
		"     93  checkcast X$IActionSetContributionItem [35]\n" +
		"     96  invokeinterface X$IActionSetContributionItem.getActionSetId() : java.lang.String [37] [nargs: 1]\n" +
		"    101  astore 7 [testId]\n" +
		"    103  aload_1 [sortId]\n" +
		"    104  aload 7 [testId]\n" +
		"    106  invokevirtual java.lang.String.compareTo(java.lang.String) : int [40]\n" +
		"    109  iload 4 [compareMetric]\n" +
		"    111  if_icmpge 117\n" +
		"    114  goto 134\n" +
		"    117  iload 5 [nX]\n" +
		"    119  istore_3 [insertIndex]\n" +
		"    120  iinc 5 1 [nX]\n" +
		"    123  iload 5 [nX]\n" +
		"    125  aload_2 [items]\n" +
		"    126  arraylength\n" +
		"    127  if_icmplt 50\n" +
		"    130  goto 134\n" +
		"    133  astore_3\n" +
		"    134  return\n";

	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=124853
public void test034() throws Exception {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	private static int scenario(){\n" +
				"		try {\n" +
				"			int i = 1;\n" +
				"			System.out.print(\"[i: \" + i+\"]\");\n" +
				"			if (i > 5) {\n" +
				"				return i;\n" +
				"			}\n" +
				"			return -i;\n" +
				"		} catch (Exception e) {\n" +
				"			System.out.print(\"[WRONG CATCH]\");\n" +
				"			return 2;\n" +
				"		} finally {\n" +
				"			System.out.print(\"[finally]\");\n" +
				"			try {\n" +
				"				throwRuntime();\n" +
				"			} finally {\n" +
				"				clean();\n" +
				"			}\n" +
				"		}\n" +
				"	}\n" +
				"\n" +
				"	private static void throwRuntime() {\n" +
				"		throw new RuntimeException(\"error\");\n" +
				"	}\n" +
				"\n" +
				"	private static void clean() {\n" +
				"		System.out.print(\"[clean]\");\n" +
				"	}\n" +
				"\n" +
				"	public static void main(String[] args) {\n" +
				"		try {\n" +
				"			scenario();\n" +
				"		} catch(Exception e){\n" +
				"			System.out.println(\"[end]\");\n" +
				"		}\n" +
				"	}\n" +
				"\n" +
				"}\n",
			},
			"[i: 1][finally][clean][end]");

//	if (this.complianceLevel.compareTo(COMPLIANCE_1_6) >= 0) return;
	String expectedOutput = new CompilerOptions(getCompilerOptions()).inlineJsrBytecode
		?	"  // Method descriptor #15 ()I\n" +
			"  // Stack: 4, Locals: 4\n" +
			"  private static int scenario();\n" +
			"      0  iconst_1\n" +
			"      1  istore_0 [i]\n" +
			"      2  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"      5  new java.lang.StringBuilder [22]\n" +
			"      8  dup\n" +
			"      9  ldc <String \"[i: \"> [24]\n" +
			"     11  invokespecial java.lang.StringBuilder(java.lang.String) [26]\n" +
			"     14  iload_0 [i]\n" +
			"     15  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [29]\n" +
			"     18  ldc <String \"]\"> [33]\n" +
			"     20  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [35]\n" +
			"     23  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n" +
			"     26  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n" +
			"     29  iload_0 [i]\n" +
			"     30  iconst_5\n" +
			"     31  if_icmple 61\n" +
			"     34  iload_0 [i]\n" +
			"     35  istore_2\n" +
			"     36  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"     39  ldc <String \"[finally]\"> [47]\n" +
			"     41  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n" +
			"     44  invokestatic X.throwRuntime() : void [49]\n" +
			"     47  goto 56\n" +
			"     50  astore_3\n" +
			"     51  invokestatic X.clean() : void [52]\n" +
			"     54  aload_3\n" +
			"     55  athrow\n" +
			"     56  invokestatic X.clean() : void [52]\n" +
			"     59  iload_2\n" +
			"     60  ireturn\n" +
			"     61  iload_0 [i]\n" +
			"     62  ineg\n" +
			"     63  istore_2\n" +
			"     64  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"     67  ldc <String \"[finally]\"> [47]\n" +
			"     69  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n" +
			"     72  invokestatic X.throwRuntime() : void [49]\n" +
			"     75  goto 84\n" +
			"     78  astore_3\n" +
			"     79  invokestatic X.clean() : void [52]\n" +
			"     82  aload_3\n" +
			"     83  athrow\n" +
			"     84  invokestatic X.clean() : void [52]\n" +
			"     87  iload_2\n" +
			"     88  ireturn\n" +
			"     89  astore_0 [e]\n" +
			"     90  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"     93  ldc <String \"[WRONG CATCH]\"> [55]\n" +
			"     95  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n" +
			"     98  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"    101  ldc <String \"[finally]\"> [47]\n" +
			"    103  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n" +
			"    106  invokestatic X.throwRuntime() : void [49]\n" +
			"    109  goto 118\n" +
			"    112  astore_3\n" +
			"    113  invokestatic X.clean() : void [52]\n" +
			"    116  aload_3\n" +
			"    117  athrow\n" +
			"    118  invokestatic X.clean() : void [52]\n" +
			"    121  iconst_2\n" +
			"    122  ireturn\n" +
			"    123  astore_1\n" +
			"    124  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"    127  ldc <String \"[finally]\"> [47]\n" +
			"    129  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n" +
			"    132  invokestatic X.throwRuntime() : void [49]\n" +
			"    135  goto 144\n" +
			"    138  astore_3\n" +
			"    139  invokestatic X.clean() : void [52]\n" +
			"    142  aload_3\n" +
			"    143  athrow\n" +
			"    144  invokestatic X.clean() : void [52]\n" +
			"    147  aload_1\n" +
			"    148  athrow\n" +
			"      Exception Table:\n" +
			"        [pc: 44, pc: 50] -> 50 when : any\n" +
			"        [pc: 72, pc: 78] -> 78 when : any\n" +
			"        [pc: 0, pc: 36] -> 89 when : java.lang.Exception\n" +
			"        [pc: 61, pc: 64] -> 89 when : java.lang.Exception\n" +
			"        [pc: 106, pc: 112] -> 112 when : any\n" +
			"        [pc: 0, pc: 36] -> 123 when : any\n" +
			"        [pc: 61, pc: 64] -> 123 when : any\n" +
			"        [pc: 89, pc: 98] -> 123 when : any\n" +
			"        [pc: 132, pc: 138] -> 138 when : any\n"
	: 		"  // Method descriptor #15 ()I\n" +
			"  // Stack: 4, Locals: 6\n" +
			"  private static int scenario();\n" +
			"      0  iconst_1\n" +
			"      1  istore_0 [i]\n" +
			"      2  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"      5  new java.lang.StringBuffer [22]\n" +
			"      8  dup\n" +
			"      9  ldc <String \"[i: \"> [24]\n" +
			"     11  invokespecial java.lang.StringBuffer(java.lang.String) [26]\n" +
			"     14  iload_0 [i]\n" +
			"     15  invokevirtual java.lang.StringBuffer.append(int) : java.lang.StringBuffer [29]\n" +
			"     18  ldc <String \"]\"> [33]\n" +
			"     20  invokevirtual java.lang.StringBuffer.append(java.lang.String) : java.lang.StringBuffer [35]\n" +
			"     23  invokevirtual java.lang.StringBuffer.toString() : java.lang.String [38]\n" +
			"     26  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n" +
			"     29  iload_0 [i]\n" +
			"     30  iconst_5\n" +
			"     31  if_icmple 41\n" +
			"     34  iload_0 [i]\n" +
			"     35  istore_3\n" +
			"     36  jsr 69\n" +
			"     39  iload_3\n" +
			"     40  ireturn\n" +
			"     41  iload_0 [i]\n" +
			"     42  ineg\n" +
			"     43  istore_3\n" +
			"     44  jsr 69\n" +
			"     47  iload_3\n" +
			"     48  ireturn\n" +
			"     49  astore_0 [e]\n" +
			"     50  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"     53  ldc <String \"[WRONG CATCH]\"> [47]\n" +
			"     55  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n" +
			"     58  jsr 69\n" +
			"     61  iconst_2\n" +
			"     62  ireturn\n" +
			"     63  astore_2\n" +
			"     64  jsr 69\n" +
			"     67  aload_2\n" +
			"     68  athrow\n" +
			"     69  astore_1\n" +
			"     70  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"     73  ldc <String \"[finally]\"> [49]\n" +
			"     75  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n" +
			"     78  invokestatic X.throwRuntime() : void [51]\n" +
			"     81  goto 99\n" +
			"     84  astore 5\n" +
			"     86  jsr 92\n" +
			"     89  aload 5\n" +
			"     91  athrow\n" +
			"     92  astore 4\n" +
			"     94  invokestatic X.clean() : void [54]\n" +
			"     97  ret 4\n" +
			"     99  jsr 92\n" +
			"    102  ret 1\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 39] -> 49 when : java.lang.Exception\n" +
			"        [pc: 41, pc: 47] -> 49 when : java.lang.Exception\n" +
			"        [pc: 0, pc: 39] -> 63 when : any\n" +
			"        [pc: 41, pc: 47] -> 63 when : any\n" +
			"        [pc: 49, pc: 61] -> 63 when : any\n" +
			"        [pc: 78, pc: 84] -> 84 when : any\n" +
			"        [pc: 99, pc: 102] -> 84 when : any\n";

	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=124853 - variation
public void test035() {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		try {\n" +
				"			new X().bar();\n" +
				"		} catch(Exception e){\n" +
				"			System.out.println(\"[end]\");\n" +
				"		}\n" +
				"	}\n" +
				"	Object bar() {\n" +
				"		try {\n" +
				"			System.out.print(\"[try]\");\n" +
				"			return this;\n" +
				"		} catch(Exception e){\n" +
				"			System.out.print(\"[WRONG CATCH]\");\n" +
				"		} finally {\n" +
				"			System.out.print(\"[finally]\");\n" +
				"			foo();\n" +
				"		}\n" +
				"		return this;\n" +
				"	}\n" +
				"	Object foo() {\n" +
				"		throw new RuntimeException();\n" +
				"	}\n" +
				"}\n",
			},
			"[try][finally][end]");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=124853 - variation
public void test036() {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		try {\n" +
				"			new X().bar();\n" +
				"		} catch(Exception e){\n" +
				"			System.out.println(\"[end]\");\n" +
				"		}\n" +
				"	}\n" +
				"	Object bar() {\n" +
				"		try {\n" +
				"			System.out.print(\"[try]\");\n" +
				"			throw new RuntimeException();\n" +
				"		} catch(Exception e){\n" +
				"			System.out.print(\"[catch]\");\n" +
				"			return this;\n" +
				"		} finally {\n" +
				"			System.out.print(\"[finally]\");\n" +
				"			foo();\n" +
				"		}\n" +
				"	}\n" +
				"	Object foo() {\n" +
				"		throw new RuntimeException();\n" +
				"	}\n" +
				"}\n",
			},
			"[try][catch][finally][end]");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=124853 - variation
public void test037() {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"\n" +
				"	public static void main(String[] args) {\n" +
				"		try {\n" +
				"			scenario();\n" +
				"		} catch(Exception e){\n" +
				"			System.out.println(\"[end]\");\n" +
				"		}\n" +
				"	}\n" +
				"\n" +
				"	private static void scenario() throws Exception {\n" +
				"		try {\n" +
				"			System.out.print(\"[try1]\");\n" +
				"			try {\n" +
				"				System.out.print(\"[try2]\");\n" +
				"				return;\n" +
				"			} catch(Exception e) {\n" +
				"				System.out.print(\"[catch2]\");\n" +
				"			} finally {\n" +
				"				System.out.print(\"[finally2]\");\n" +
				"				throwRuntime();\n" +
				"			}\n" +
				"		} catch(Exception e) {\n" +
				"			System.out.print(\"[catch1]\");\n" +
				"			throw e;\n" +
				"		} finally {\n" +
				"			System.out.print(\"[finally1]\");\n" +
				"		}\n" +
				"	}\n" +
				"\n" +
				"	private static void throwRuntime() {\n" +
				"		throw new RuntimeException(\"error\");\n" +
				"	}\n" +
				"}\n",
			},
			"[try1][try2][finally2][catch1][finally1][end]");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=87423
public void test038() {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"\n" +
				"	int hasLoop() {\n" +
				"		int l, m, n;\n" +
				"		for (m = 0; m < 10; m++) {\n" +
				"			n = 2;\n" +
				"			try {\n" +
				"				n = 3;\n" +
				"				try {\n" +
				"					n = 4;\n" +
				"				} catch (ArithmeticException e1) {\n" +
				"					n = 11;\n" +
				"				} finally {\n" +
				"					for (l = 0; l < 10; l++) {\n" +
				"						n++;\n" +
				"					}\n" +
				"					if (n == 12) {\n" +
				"						n = 13;\n" +
				"						break;\n" +
				"					}\n" +
				"					n = 15;\n" +
				"				}\n" +
				"			} catch (OutOfMemoryError e2) {\n" +
				"				n = 18;\n" +
				"			}\n" +
				"		}\n" +
				"		return 0;\n" +
				"	}\n" +
				"\n" +
				"	public static void main(String args[]) {\n" +
				"      System.out.println(\"Loaded fine\");\n" +
				"   }\n" +
				"}\n",
			},
			"Loaded fine");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=127603
public void test039() {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public static void someMethod() {\n" +
				"		int count = 0;\n" +
				"		int code = -1;\n" +
				"		while (count < 2 && (code == -1 || code == 2)) {\n" +
				"			count++;\n" +
				"			try {\n" +
				"				{\n" +
				"					System.out.print(\"[Try:\" + count + \";\" + code+\"]\");\n" +
				"				}\n" +
				"				code = 0;\n" +
				"\n" +
				"			} finally {\n" +
				"				System.out.print(\"[Finally\" + count + \";\" + code+\"]\");\n" +
				"			}\n" +
				"		}\n" +
				"		System.out.print(\"[Outering\");\n" +
				"\n" +
				"		if (code == 0) {\n" +
				"			System.out.print(\"[Return:\" + count + \";\" + code+\"]\");\n" +
				"			return;\n" +
				"		}\n" +
				"		throw new RuntimeException(null + \"a\");\n" +
				"	}\n" +
				"\n" +
				"	public static void main(String[] args) throws Exception {\n" +
				"		for (int i = 0; i < 1; i++) {\n" +
				"			someMethod();\n" +
				"			System.out.println();\n" +
				"		}\n" +
				"	}\n" +
				"}\n",
			},
			"[Try:1;-1][Finally1;0][Outering[Return:1;0]");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=128705
public void test040() throws Exception {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public void foo(boolean b) {\n" +
				"		try { \n" +
				"			if (b){ \n" +
				"				int i = 0;\n" +
				"				return;\n" +
				"			} else {\n" +
				"				Object o = null;\n" +
				"				return;\n" +
				"			}\n" +
				"		} finally {\n" +
				"			System.out.println(\"done\");\n" +
				"		}\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		new X().foo(true);\n" +
				"	}\n" +
				"}\n",
			},
			"done");

	CompilerOptions compilerOptions = new CompilerOptions(getCompilerOptions());
	String expectedOutput = !compilerOptions.inlineJsrBytecode
		?	"  // Method descriptor #15 (Z)V\n" +
			"  // Stack: 2, Locals: 5\n" +
			"  public void foo(boolean b);\n" +
			"     0  iload_1 [b]\n" +
			"     1  ifeq 10\n" +
			"     4  iconst_0\n" +
			"     5  istore_2 [i]\n" +
			"     6  jsr 23\n" +
			"     9  return\n" +
			"    10  aconst_null\n" +
			"    11  astore_2 [o]\n" +
			"    12  goto 6\n" +
			"    15  astore 4\n" +
			"    17  jsr 23\n" +
			"    20  aload 4\n" +
			"    22  athrow\n" +
			"    23  astore_3\n" +
			"    24  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"    27  ldc <String \"done\"> [22]\n" +
			"    29  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n" +
			"    32  ret 3\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 9] -> 15 when : any\n" +
			"        [pc: 10, pc: 15] -> 15 when : any\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 4]\n" +
			"        [pc: 4, line: 5]\n" +
			"        [pc: 6, line: 6]\n" +
			"        [pc: 10, line: 8]\n" +
			"        [pc: 12, line: 9]\n" +
			"        [pc: 15, line: 11]\n" +
			"        [pc: 20, line: 13]\n" +
			"        [pc: 23, line: 11]\n" +
			"        [pc: 24, line: 12]\n" +
			"        [pc: 32, line: 13]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 34] local: this index: 0 type: X\n" +
			"        [pc: 0, pc: 34] local: b index: 1 type: boolean\n" +
			"        [pc: 6, pc: 10] local: i index: 2 type: int\n" +
			"        [pc: 12, pc: 15] local: o index: 2 type: java.lang.Object\n"
	: 		null;
	if (expectedOutput == null) {
		if (compilerOptions.targetJDK == ClassFileConstants.JDK1_5) {
			expectedOutput = "  // Method descriptor #15 (Z)V\n" +
			"  // Stack: 2, Locals: 4\n" +
			"  public void foo(boolean b);\n" +
			"     0  iload_1 [b]\n" +
			"     1  ifeq 15\n" +
			"     4  iconst_0\n" +
			"     5  istore_2 [i]\n" +
			"     6  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"     9  ldc <String \"done\"> [22]\n" +
			"    11  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n" +
			"    14  return\n" +
			"    15  aconst_null\n" +
			"    16  astore_2 [o]\n" +
			"    17  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"    20  ldc <String \"done\"> [22]\n" +
			"    22  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n" +
			"    25  return\n" +
			"    26  astore_3\n" +
			"    27  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"    30  ldc <String \"done\"> [22]\n" +
			"    32  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n" +
			"    35  aload_3\n" +
			"    36  athrow\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 6] -> 26 when : any\n" +
			"        [pc: 15, pc: 17] -> 26 when : any\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 4]\n" +
			"        [pc: 4, line: 5]\n" +
			"        [pc: 6, line: 12]\n" +
			"        [pc: 14, line: 6]\n" +
			"        [pc: 15, line: 8]\n" +
			"        [pc: 17, line: 12]\n" +
			"        [pc: 25, line: 9]\n" +
			"        [pc: 26, line: 11]\n" +
			"        [pc: 27, line: 12]\n" +
			"        [pc: 35, line: 13]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 37] local: this index: 0 type: X\n" +
			"        [pc: 0, pc: 37] local: b index: 1 type: boolean\n" +
			"        [pc: 6, pc: 15] local: i index: 2 type: int\n" +
			"        [pc: 17, pc: 26] local: o index: 2 type: java.lang.Object\n";
		} else {
			expectedOutput = "  // Method descriptor #15 (Z)V\n" +
			"  // Stack: 2, Locals: 4\n" +
			"  public void foo(boolean b);\n" +
			"     0  iload_1 [b]\n" +
			"     1  ifeq 15\n" +
			"     4  iconst_0\n" +
			"     5  istore_2 [i]\n" +
			"     6  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"     9  ldc <String \"done\"> [22]\n" +
			"    11  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n" +
			"    14  return\n" +
			"    15  aconst_null\n" +
			"    16  astore_2 [o]\n" +
			"    17  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"    20  ldc <String \"done\"> [22]\n" +
			"    22  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n" +
			"    25  return\n" +
			"    26  astore_3\n" +
			"    27  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"    30  ldc <String \"done\"> [22]\n" +
			"    32  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n" +
			"    35  aload_3\n" +
			"    36  athrow\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 6] -> 26 when : any\n" +
			"        [pc: 15, pc: 17] -> 26 when : any\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 4]\n" +
			"        [pc: 4, line: 5]\n" +
			"        [pc: 6, line: 12]\n" +
			"        [pc: 14, line: 6]\n" +
			"        [pc: 15, line: 8]\n" +
			"        [pc: 17, line: 12]\n" +
			"        [pc: 25, line: 9]\n" +
			"        [pc: 26, line: 11]\n" +
			"        [pc: 27, line: 12]\n" +
			"        [pc: 35, line: 13]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 37] local: this index: 0 type: X\n" +
			"        [pc: 0, pc: 37] local: b index: 1 type: boolean\n" +
			"        [pc: 6, pc: 15] local: i index: 2 type: int\n" +
			"        [pc: 17, pc: 26] local: o index: 2 type: java.lang.Object\n" +
			"      Stack map table: number of frames 2\n" +
			"        [pc: 15, same]\n" +
			"        [pc: 26, same_locals_1_stack_item, stack: {java.lang.Throwable}]\n";
		}
	}

	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=128705 - variation
public void test041() throws Exception {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public void foo(boolean b) {\n" +
				"		try {\n" +
				"			int i = 0;\n" +
				"			return;\n" +
				"		} catch(Exception e) {\n" +
				"			return;\n" +
				"		} finally {\n" +
				"			System.out.println(\"done\");\n" +
				"		}\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		new X().foo(true);\n" +
				"	}\n" +
				"}\n",
			},
			"done");

	CompilerOptions compilerOptions = new CompilerOptions(getCompilerOptions());
	String expectedOutput = !compilerOptions.inlineJsrBytecode
		?	"  // Method descriptor #15 (Z)V\n" +
			"  // Stack: 2, Locals: 5\n" +
			"  public void foo(boolean b);\n" +
			"     0  iconst_0\n" +
			"     1  istore_2 [i]\n" +
			"     2  jsr 18\n" +
			"     5  return\n" +
			"     6  astore_2 [e]\n" +
			"     7  goto 2\n" +
			"    10  astore 4\n" +
			"    12  jsr 18\n" +
			"    15  aload 4\n" +
			"    17  athrow\n" +
			"    18  astore_3\n" +
			"    19  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"    22  ldc <String \"done\"> [22]\n" +
			"    24  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n" +
			"    27  ret 3\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 5] -> 6 when : java.lang.Exception\n" +
			"        [pc: 0, pc: 5] -> 10 when : any\n" +
			"        [pc: 6, pc: 10] -> 10 when : any\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 4]\n" +
			"        [pc: 2, line: 5]\n" +
			"        [pc: 6, line: 6]\n" +
			"        [pc: 7, line: 7]\n" +
			"        [pc: 10, line: 8]\n" +
			"        [pc: 15, line: 10]\n" +
			"        [pc: 18, line: 8]\n" +
			"        [pc: 19, line: 9]\n" +
			"        [pc: 27, line: 10]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 29] local: this index: 0 type: X\n" +
			"        [pc: 0, pc: 29] local: b index: 1 type: boolean\n" +
			"        [pc: 2, pc: 6] local: i index: 2 type: int\n" +
			"        [pc: 7, pc: 10] local: e index: 2 type: java.lang.Exception\n"
		: null;
	if (expectedOutput == null) {
		if (compilerOptions.targetJDK == ClassFileConstants.JDK1_5) {
			expectedOutput = "  // Method descriptor #15 (Z)V\n" +
			"  // Stack: 2, Locals: 4\n" +
			"  public void foo(boolean b);\n" +
			"     0  iconst_0\n" +
			"     1  istore_2 [i]\n" +
			"     2  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"     5  ldc <String \"done\"> [22]\n" +
			"     7  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n" +
			"    10  return\n" +
			"    11  astore_2 [e]\n" +
			"    12  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"    15  ldc <String \"done\"> [22]\n" +
			"    17  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n" +
			"    20  return\n" +
			"    21  astore_3\n" +
			"    22  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"    25  ldc <String \"done\"> [22]\n" +
			"    27  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n" +
			"    30  aload_3\n" +
			"    31  athrow\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 2] -> 11 when : java.lang.Exception\n" +
			"        [pc: 0, pc: 2] -> 21 when : any\n" +
			"        [pc: 11, pc: 12] -> 21 when : any\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 4]\n" +
			"        [pc: 2, line: 9]\n" +
			"        [pc: 10, line: 5]\n" +
			"        [pc: 11, line: 6]\n" +
			"        [pc: 12, line: 9]\n" +
			"        [pc: 20, line: 7]\n" +
			"        [pc: 21, line: 8]\n" +
			"        [pc: 22, line: 9]\n" +
			"        [pc: 30, line: 10]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 32] local: this index: 0 type: X\n" +
			"        [pc: 0, pc: 32] local: b index: 1 type: boolean\n" +
			"        [pc: 2, pc: 11] local: i index: 2 type: int\n" +
			"        [pc: 12, pc: 21] local: e index: 2 type: java.lang.Exception\n";
		} else {
			expectedOutput = "  // Method descriptor #15 (Z)V\n" +
			"  // Stack: 2, Locals: 4\n" +
			"  public void foo(boolean b);\n" +
			"     0  iconst_0\n" +
			"     1  istore_2 [i]\n" +
			"     2  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"     5  ldc <String \"done\"> [22]\n" +
			"     7  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n" +
			"    10  return\n" +
			"    11  astore_2 [e]\n" +
			"    12  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"    15  ldc <String \"done\"> [22]\n" +
			"    17  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n" +
			"    20  return\n" +
			"    21  astore_3\n" +
			"    22  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"    25  ldc <String \"done\"> [22]\n" +
			"    27  invokevirtual java.io.PrintStream.println(java.lang.String) : void [24]\n" +
			"    30  aload_3\n" +
			"    31  athrow\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 2] -> 11 when : java.lang.Exception\n" +
			"        [pc: 0, pc: 2] -> 21 when : any\n" +
			"        [pc: 11, pc: 12] -> 21 when : any\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 4]\n" +
			"        [pc: 2, line: 9]\n" +
			"        [pc: 10, line: 5]\n" +
			"        [pc: 11, line: 6]\n" +
			"        [pc: 12, line: 9]\n" +
			"        [pc: 20, line: 7]\n" +
			"        [pc: 21, line: 8]\n" +
			"        [pc: 22, line: 9]\n" +
			"        [pc: 30, line: 10]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 32] local: this index: 0 type: X\n" +
			"        [pc: 0, pc: 32] local: b index: 1 type: boolean\n" +
			"        [pc: 2, pc: 11] local: i index: 2 type: int\n" +
			"        [pc: 12, pc: 21] local: e index: 2 type: java.lang.Exception\n" +
			"      Stack map table: number of frames 2\n" +
			"        [pc: 11, same_locals_1_stack_item, stack: {java.lang.Exception}]\n" +
			"        [pc: 21, same_locals_1_stack_item, stack: {java.lang.Throwable}]\n";
		}
	}

	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=128705 - variation
public void test042() throws Exception {
	this.runConformTest(
			new String[] {
				"X.java",
				" public class X {\n" +
				" public static void main(String[] args) {\n" +
				"		System.out.println(new X().foo(args));\n" +
				"	}\n" +
				"	String foo(String[] args) {\n" +
				"		try {\n" +
				"			if (args == null) return \"KO\";\n" +
				"			switch(args.length) {\n" +
				"			case 0:\n" +
				"				return \"OK\";\n" +
				"			case 1:\n" +
				"				return \"KO\";\n" +
				"			case 3:\n" +
				"				return \"OK\";\n" +
				"			default:\n" +
				"				return \"KO\";\n" +
				"			}\n" +
				"		} finally {\n" +
				"			System.out.print(\"FINALLY:\");\n" +
				"		}\n" +
				"	}\n" +
				"}\n",
			},
			"FINALLY:OK");

	String expectedOutput = new CompilerOptions(getCompilerOptions()).inlineJsrBytecode
		?	"  // Method descriptor #26 ([Ljava/lang/String;)Ljava/lang/String;\n" +
			"  // Stack: 2, Locals: 3\n" +
			"  java.lang.String foo(java.lang.String[] args);\n" +
			"     0  aload_1 [args]\n" +
			"     1  ifnonnull 15\n" +
			"     4  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"     7  ldc <String \"FINALLY:\"> [35]\n" +
			"     9  invokevirtual java.io.PrintStream.print(java.lang.String) : void [37]\n" +
			"    12  ldc <String \"KO\"> [40]\n" +
			"    14  areturn\n" +
			"    15  aload_1 [args]\n" +
			"    16  arraylength\n" +
			"    17  tableswitch default: 65\n" +
			"          case 0: 48\n" +
			"          case 1: 59\n" +
			"          case 2: 65\n" +
			"          case 3: 62\n" +
			"    48  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"    51  ldc <String \"FINALLY:\"> [35]\n" +
			"    53  invokevirtual java.io.PrintStream.print(java.lang.String) : void [37]\n" +
			"    56  ldc <String \"OK\"> [42]\n" +
			"    58  areturn\n" +
			"    59  goto 4\n" +
			"    62  goto 48\n" +
			"    65  goto 4\n" +
			"    68  astore_2\n" +
			"    69  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"    72  ldc <String \"FINALLY:\"> [35]\n" +
			"    74  invokevirtual java.io.PrintStream.print(java.lang.String) : void [37]\n" +
			"    77  aload_2\n" +
			"    78  athrow\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 4] -> 68 when : any\n" +
			"        [pc: 15, pc: 48] -> 68 when : any\n" +
			"        [pc: 59, pc: 68] -> 68 when : any\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 7]\n" +
			"        [pc: 4, line: 19]\n" +
			"        [pc: 12, line: 7]\n" +
			"        [pc: 15, line: 8]\n" +
			"        [pc: 48, line: 19]\n" +
			"        [pc: 56, line: 10]\n" +
			"        [pc: 59, line: 12]\n" +
			"        [pc: 62, line: 14]\n" +
			"        [pc: 65, line: 16]\n" +
			"        [pc: 68, line: 18]\n" +
			"        [pc: 69, line: 19]\n" +
			"        [pc: 77, line: 20]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 79] local: this index: 0 type: X\n" +
			"        [pc: 0, pc: 79] local: args index: 1 type: java.lang.String[]\n"
	: 		"  // Method descriptor #26 ([Ljava/lang/String;)Ljava/lang/String;\n" +
			"  // Stack: 2, Locals: 4\n" +
			"  java.lang.String foo(java.lang.String[] args);\n" +
			"     0  aload_1 [args]\n" +
			"     1  ifnonnull 10\n" +
			"     4  jsr 65\n" +
			"     7  ldc <String \"KO\"> [35]\n" +
			"     9  areturn\n" +
			"    10  aload_1 [args]\n" +
			"    11  arraylength\n" +
			"    12  tableswitch default: 56\n" +
			"          case 0: 44\n" +
			"          case 1: 50\n" +
			"          case 2: 56\n" +
			"          case 3: 53\n" +
			"    44  jsr 65\n" +
			"    47  ldc <String \"OK\"> [37]\n" +
			"    49  areturn\n" +
			"    50  goto 4\n" +
			"    53  goto 44\n" +
			"    56  goto 4\n" +
			"    59  astore_3\n" +
			"    60  jsr 65\n" +
			"    63  aload_3\n" +
			"    64  athrow\n" +
			"    65  astore_2\n" +
			"    66  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"    69  ldc <String \"FINALLY:\"> [39]\n" +
			"    71  invokevirtual java.io.PrintStream.print(java.lang.String) : void [41]\n" +
			"    74  ret 2\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 7] -> 59 when : any\n" +
			"        [pc: 10, pc: 47] -> 59 when : any\n" +
			"        [pc: 50, pc: 59] -> 59 when : any\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 7]\n" +
			"        [pc: 10, line: 8]\n" +
			"        [pc: 44, line: 10]\n" +
			"        [pc: 50, line: 12]\n" +
			"        [pc: 53, line: 14]\n" +
			"        [pc: 56, line: 16]\n" +
			"        [pc: 59, line: 18]\n" +
			"        [pc: 63, line: 20]\n" +
			"        [pc: 65, line: 18]\n" +
			"        [pc: 66, line: 19]\n" +
			"        [pc: 74, line: 20]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 76] local: this index: 0 type: X\n" +
			"        [pc: 0, pc: 76] local: args index: 1 type: java.lang.String[]\n";

	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}

//https://bugs.eclipse.org/bugs/show_bug.cgi?id=404146 - variation without sharing of inlined escaping finally-blocks
public void test042_not_shared() throws Exception {
	Map customOptions = getCompilerOptions();
	customOptions.put(CompilerOptions.OPTION_ShareCommonFinallyBlocks, CompilerOptions.DISABLED);
	customOptions.put(CompilerOptions.OPTION_InlineJsr, CompilerOptions.ENABLED);

	this.runConformTest(
			new String[] {
				"X.java",
				" public class X {\n" +
				" public static void main(String[] args) {\n" +
				"		System.out.println(new X().foo(args));\n" +
				"	}\n" +
				"	String foo(String[] args) {\n" +
				"		try {\n" +
				"			if (args == null) return \"KO\";\n" +
				"			switch(args.length) {\n" +
				"			case 0:\n" +
				"				return \"OK\";\n" +
				"			case 1:\n" +
				"				return \"KO\";\n" +
				"			case 3:\n" +
				"				return \"OK\";\n" +
				"			default:\n" +
				"				return \"KO\";\n" +
				"			}\n" +
				"		} finally {\n" +
				"			System.out.print(\"FINALLY:\");\n" +
				"		}\n" +
				"	}\n" +
				"}\n",
			},
			"FINALLY:OK",
			null,
			true,
			null,
			customOptions,
			null);

	String expectedOutput =
			"  // Method descriptor #26 ([Ljava/lang/String;)Ljava/lang/String;\n" +
			"  // Stack: 2, Locals: 3\n" +
			"  java.lang.String foo(java.lang.String[] args);\n" +
			"      0  aload_1 [args]\n" +
			"      1  ifnonnull 15\n" +
			"      4  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"      7  ldc <String \"FINALLY:\"> [35]\n" +
			"      9  invokevirtual java.io.PrintStream.print(java.lang.String) : void [37]\n" +
			"     12  ldc <String \"KO\"> [40]\n" +
			"     14  areturn\n" +
			"     15  aload_1 [args]\n" +
			"     16  arraylength\n" +
			"     17  tableswitch default: 81\n" +
			"          case 0: 48\n" +
			"          case 1: 59\n" +
			"          case 2: 81\n" +
			"          case 3: 70\n" +
			"     48  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"     51  ldc <String \"FINALLY:\"> [35]\n" +
			"     53  invokevirtual java.io.PrintStream.print(java.lang.String) : void [37]\n" +
			"     56  ldc <String \"OK\"> [42]\n" +
			"     58  areturn\n" +
			"     59  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"     62  ldc <String \"FINALLY:\"> [35]\n" +
			"     64  invokevirtual java.io.PrintStream.print(java.lang.String) : void [37]\n" +
			"     67  ldc <String \"KO\"> [40]\n" +
			"     69  areturn\n" +
			"     70  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"     73  ldc <String \"FINALLY:\"> [35]\n" +
			"     75  invokevirtual java.io.PrintStream.print(java.lang.String) : void [37]\n" +
			"     78  ldc <String \"OK\"> [42]\n" +
			"     80  areturn\n" +
			"     81  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"     84  ldc <String \"FINALLY:\"> [35]\n" +
			"     86  invokevirtual java.io.PrintStream.print(java.lang.String) : void [37]\n" +
			"     89  ldc <String \"KO\"> [40]\n" +
			"     91  areturn\n" +
			"     92  astore_2\n" +
			"     93  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"     96  ldc <String \"FINALLY:\"> [35]\n" +
			"     98  invokevirtual java.io.PrintStream.print(java.lang.String) : void [37]\n" +
			"    101  aload_2\n" +
			"    102  athrow\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 4] -> 92 when : any\n" +
			"        [pc: 15, pc: 48] -> 92 when : any\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 7]\n" +
			"        [pc: 4, line: 19]\n" +
			"        [pc: 12, line: 7]\n" +
			"        [pc: 15, line: 8]\n" +
			"        [pc: 48, line: 19]\n" +
			"        [pc: 56, line: 10]\n" +
			"        [pc: 59, line: 19]\n" +
			"        [pc: 67, line: 12]\n" +
			"        [pc: 70, line: 19]\n" +
			"        [pc: 78, line: 14]\n" +
			"        [pc: 81, line: 19]\n" +
			"        [pc: 89, line: 16]\n" +
			"        [pc: 92, line: 18]\n" +
			"        [pc: 93, line: 19]\n" +
			"        [pc: 101, line: 20]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 103] local: this index: 0 type: X\n" +
			"        [pc: 0, pc: 103] local: args index: 1 type: java.lang.String[]\n";

	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}



//https://bugs.eclipse.org/bugs/show_bug.cgi?id=128705 - variation
public void test043() throws Exception {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public void save() {\n" +
				"		int a = 3;\n" +
				"		try {\n" +
				"			Object warnings = null;\n" +
				"			Object contexts = null;\n" +
				"			try {\n" +
				"				System.out.print(warnings);\n" +
				"				return;\n" +
				"			} catch (NullPointerException npe) {\n" +
				"				System.out.print(contexts);\n" +
				"				return;\n" +
				"			} finally {\n" +
				"				System.out.print(\"#inner -> \" + a);\n" +
				"			}\n" +
				"		} catch (Exception e) {\n" +
				"			return;\n" +
				"		} finally {\n" +
				"			int var = 0;\n" +
				"			System.out.println(\"#save -> \" + a);\n" +
				"		}\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		new X().save();\n" +
				"	}\n" +
				"}\n",
			},
			"null#inner -> 3#save -> 3");

	CompilerOptions compilerOptions = new CompilerOptions(getCompilerOptions());
	String expectedOutput = !compilerOptions.inlineJsrBytecode
		?	"  // Method descriptor #6 ()V\n" +
			"  // Stack: 4, Locals: 10\n" +
			"  public void save();\n" +
			"      0  iconst_3\n" +
			"      1  istore_1 [a]\n" +
			"      2  aconst_null\n" +
			"      3  astore_2 [warnings]\n" +
			"      4  aconst_null\n" +
			"      5  astore_3 [contexts]\n" +
			"      6  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"      9  aload_2 [warnings]\n" +
			"     10  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [21]\n" +
			"     13  jsr 40\n" +
			"     16  jsr 78\n" +
			"     19  return\n" +
			"     20  astore 4 [npe]\n" +
			"     22  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     25  aload_3 [contexts]\n" +
			"     26  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [21]\n" +
			"     29  goto 13\n" +
			"     32  astore 6\n" +
			"     34  jsr 40\n" +
			"     37  aload 6\n" +
			"     39  athrow\n" +
			"     40  astore 5\n" +
			"     42  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     45  new java.lang.StringBuffer [27]\n" +
			"     48  dup\n" +
			"     49  ldc <String \"#inner -> \"> [29]\n" +
			"     51  invokespecial java.lang.StringBuffer(java.lang.String) [31]\n" +
			"     54  iload_1 [a]\n" +
			"     55  invokevirtual java.lang.StringBuffer.append(int) : java.lang.StringBuffer [34]\n" +
			"     58  invokevirtual java.lang.StringBuffer.toString() : java.lang.String [38]\n" +
			"     61  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n" +
			"     64  ret 5\n" +
			"     66  astore_2 [e]\n" +
			"     67  goto 16\n" +
			"     70  astore 8\n" +
			"     72  jsr 78\n" +
			"     75  aload 8\n" +
			"     77  athrow\n" +
			"     78  astore 7\n" +
			"     80  iconst_0\n" +
			"     81  istore 9 [var]\n" +
			"     83  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     86  new java.lang.StringBuffer [27]\n" +
			"     89  dup\n" +
			"     90  ldc <String \"#save -> \"> [44]\n" +
			"     92  invokespecial java.lang.StringBuffer(java.lang.String) [31]\n" +
			"     95  iload_1 [a]\n" +
			"     96  invokevirtual java.lang.StringBuffer.append(int) : java.lang.StringBuffer [34]\n" +
			"     99  invokevirtual java.lang.StringBuffer.toString() : java.lang.String [38]\n" +
			"    102  invokevirtual java.io.PrintStream.println(java.lang.String) : void [46]\n" +
			"    105  ret 7\n" +
			"      Exception Table:\n" +
			"        [pc: 6, pc: 16] -> 20 when : java.lang.NullPointerException\n" +
			"        [pc: 6, pc: 16] -> 32 when : any\n" +
			"        [pc: 20, pc: 32] -> 32 when : any\n" +
			"        [pc: 2, pc: 19] -> 66 when : java.lang.Exception\n" +
			"        [pc: 20, pc: 66] -> 66 when : java.lang.Exception\n" +
			"        [pc: 2, pc: 19] -> 70 when : any\n" +
			"        [pc: 20, pc: 70] -> 70 when : any\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 3]\n" +
			"        [pc: 2, line: 5]\n" +
			"        [pc: 4, line: 6]\n" +
			"        [pc: 6, line: 8]\n" +
			"        [pc: 13, line: 9]\n" +
			"        [pc: 20, line: 10]\n" +
			"        [pc: 22, line: 11]\n" +
			"        [pc: 29, line: 12]\n" +
			"        [pc: 32, line: 13]\n" +
			"        [pc: 37, line: 15]\n" +
			"        [pc: 40, line: 13]\n" +
			"        [pc: 42, line: 14]\n" +
			"        [pc: 64, line: 15]\n" +
			"        [pc: 66, line: 16]\n" +
			"        [pc: 67, line: 17]\n" +
			"        [pc: 70, line: 18]\n" +
			"        [pc: 75, line: 21]\n" +
			"        [pc: 78, line: 18]\n" +
			"        [pc: 80, line: 19]\n" +
			"        [pc: 83, line: 20]\n" +
			"        [pc: 105, line: 21]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 107] local: this index: 0 type: X\n" +
			"        [pc: 2, pc: 107] local: a index: 1 type: int\n" +
			"        [pc: 4, pc: 66] local: warnings index: 2 type: java.lang.Object\n" +
			"        [pc: 6, pc: 66] local: contexts index: 3 type: java.lang.Object\n" +
			"        [pc: 22, pc: 32] local: npe index: 4 type: java.lang.NullPointerException\n" +
			"        [pc: 67, pc: 70] local: e index: 2 type: java.lang.Exception\n" +
			"        [pc: 83, pc: 105] local: var index: 9 type: int\n"
		: null;

	if (expectedOutput == null) {
		if (compilerOptions.targetJDK == ClassFileConstants.JDK1_5) {
			expectedOutput = "  // Method descriptor #6 ()V\n" +
			"  // Stack: 4, Locals: 8\n" +
			"  public void save();\n" +
			"      0  iconst_3\n" +
			"      1  istore_1 [a]\n" +
			"      2  aconst_null\n" +
			"      3  astore_2 [warnings]\n" +
			"      4  aconst_null\n" +
			"      5  astore_3 [contexts]\n" +
			"      6  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"      9  aload_2 [warnings]\n" +
			"     10  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [21]\n" +
			"     13  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     16  new java.lang.StringBuilder [27]\n" +
			"     19  dup\n" +
			"     20  ldc <String \"#inner -> \"> [29]\n" +
			"     22  invokespecial java.lang.StringBuilder(java.lang.String) [31]\n" +
			"     25  iload_1 [a]\n" +
			"     26  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [34]\n" +
			"     29  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n" +
			"     32  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n" +
			"     35  iconst_0\n" +
			"     36  istore 7 [var]\n" +
			"     38  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     41  new java.lang.StringBuilder [27]\n" +
			"     44  dup\n" +
			"     45  ldc <String \"#save -> \"> [44]\n" +
			"     47  invokespecial java.lang.StringBuilder(java.lang.String) [31]\n" +
			"     50  iload_1 [a]\n" +
			"     51  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [34]\n" +
			"     54  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n" +
			"     57  invokevirtual java.io.PrintStream.println(java.lang.String) : void [46]\n" +
			"     60  return\n" +
			"     61  astore 4 [npe]\n" +
			"     63  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     66  aload_3 [contexts]\n" +
			"     67  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [21]\n" +
			"     70  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     73  new java.lang.StringBuilder [27]\n" +
			"     76  dup\n" +
			"     77  ldc <String \"#inner -> \"> [29]\n" +
			"     79  invokespecial java.lang.StringBuilder(java.lang.String) [31]\n" +
			"     82  iload_1 [a]\n" +
			"     83  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [34]\n" +
			"     86  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n" +
			"     89  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n" +
			"     92  iconst_0\n" +
			"     93  istore 7 [var]\n" +
			"     95  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     98  new java.lang.StringBuilder [27]\n" +
			"    101  dup\n" +
			"    102  ldc <String \"#save -> \"> [44]\n" +
			"    104  invokespecial java.lang.StringBuilder(java.lang.String) [31]\n" +
			"    107  iload_1 [a]\n" +
			"    108  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [34]\n" +
			"    111  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n" +
			"    114  invokevirtual java.io.PrintStream.println(java.lang.String) : void [46]\n" +
			"    117  return\n" +
			"    118  astore 5\n" +
			"    120  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"    123  new java.lang.StringBuilder [27]\n" +
			"    126  dup\n" +
			"    127  ldc <String \"#inner -> \"> [29]\n" +
			"    129  invokespecial java.lang.StringBuilder(java.lang.String) [31]\n" +
			"    132  iload_1 [a]\n" +
			"    133  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [34]\n" +
			"    136  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n" +
			"    139  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n" +
			"    142  aload 5\n" +
			"    144  athrow\n" +
			"    145  astore_2 [e]\n" +
			"    146  iconst_0\n" +
			"    147  istore 7 [var]\n" +
			"    149  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"    152  new java.lang.StringBuilder [27]\n" +
			"    155  dup\n" +
			"    156  ldc <String \"#save -> \"> [44]\n" +
			"    158  invokespecial java.lang.StringBuilder(java.lang.String) [31]\n" +
			"    161  iload_1 [a]\n" +
			"    162  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [34]\n" +
			"    165  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n" +
			"    168  invokevirtual java.io.PrintStream.println(java.lang.String) : void [46]\n" +
			"    171  return\n" +
			"    172  astore 6\n" +
			"    174  iconst_0\n" +
			"    175  istore 7 [var]\n" +
			"    177  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"    180  new java.lang.StringBuilder [27]\n" +
			"    183  dup\n" +
			"    184  ldc <String \"#save -> \"> [44]\n" +
			"    186  invokespecial java.lang.StringBuilder(java.lang.String) [31]\n" +
			"    189  iload_1 [a]\n" +
			"    190  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [34]\n" +
			"    193  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n" +
			"    196  invokevirtual java.io.PrintStream.println(java.lang.String) : void [46]\n" +
			"    199  aload 6\n" +
			"    201  athrow\n" +
			"      Exception Table:\n" +
			"        [pc: 6, pc: 13] -> 61 when : java.lang.NullPointerException\n" +
			"        [pc: 6, pc: 13] -> 118 when : any\n" +
			"        [pc: 61, pc: 70] -> 118 when : any\n" +
			"        [pc: 2, pc: 35] -> 145 when : java.lang.Exception\n" +
			"        [pc: 61, pc: 92] -> 145 when : java.lang.Exception\n" +
			"        [pc: 118, pc: 145] -> 145 when : java.lang.Exception\n" +
			"        [pc: 2, pc: 35] -> 172 when : any\n" +
			"        [pc: 61, pc: 92] -> 172 when : any\n" +
			"        [pc: 118, pc: 146] -> 172 when : any\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 3]\n" +
			"        [pc: 2, line: 5]\n" +
			"        [pc: 4, line: 6]\n" +
			"        [pc: 6, line: 8]\n" +
			"        [pc: 13, line: 14]\n" +
			"        [pc: 35, line: 19]\n" +
			"        [pc: 38, line: 20]\n" +
			"        [pc: 60, line: 9]\n" +
			"        [pc: 61, line: 10]\n" +
			"        [pc: 63, line: 11]\n" +
			"        [pc: 70, line: 14]\n" +
			"        [pc: 92, line: 19]\n" +
			"        [pc: 95, line: 20]\n" +
			"        [pc: 117, line: 12]\n" +
			"        [pc: 118, line: 13]\n" +
			"        [pc: 120, line: 14]\n" +
			"        [pc: 142, line: 15]\n" +
			"        [pc: 145, line: 16]\n" +
			"        [pc: 146, line: 19]\n" +
			"        [pc: 149, line: 20]\n" +
			"        [pc: 171, line: 17]\n" +
			"        [pc: 172, line: 18]\n" +
			"        [pc: 174, line: 19]\n" +
			"        [pc: 177, line: 20]\n" +
			"        [pc: 199, line: 21]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 202] local: this index: 0 type: X\n" +
			"        [pc: 2, pc: 202] local: a index: 1 type: int\n" +
			"        [pc: 4, pc: 145] local: warnings index: 2 type: java.lang.Object\n" +
			"        [pc: 6, pc: 145] local: contexts index: 3 type: java.lang.Object\n" +
			"        [pc: 63, pc: 118] local: npe index: 4 type: java.lang.NullPointerException\n" +
			"        [pc: 146, pc: 172] local: e index: 2 type: java.lang.Exception\n" +
			"        [pc: 38, pc: 60] local: var index: 7 type: int\n" +
			"        [pc: 95, pc: 117] local: var index: 7 type: int\n" +
			"        [pc: 149, pc: 171] local: var index: 7 type: int\n" +
			"        [pc: 177, pc: 199] local: var index: 7 type: int\n";
		} else {
			expectedOutput = "  // Method descriptor #6 ()V\n" +
			"  // Stack: 4, Locals: 8\n" +
			"  public void save();\n" +
			"      0  iconst_3\n" +
			"      1  istore_1 [a]\n" +
			"      2  aconst_null\n" +
			"      3  astore_2 [warnings]\n" +
			"      4  aconst_null\n" +
			"      5  astore_3 [contexts]\n" +
			"      6  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"      9  aload_2 [warnings]\n" +
			"     10  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [21]\n" +
			"     13  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     16  new java.lang.StringBuilder [27]\n" +
			"     19  dup\n" +
			"     20  ldc <String \"#inner -> \"> [29]\n" +
			"     22  invokespecial java.lang.StringBuilder(java.lang.String) [31]\n" +
			"     25  iload_1 [a]\n" +
			"     26  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [34]\n" +
			"     29  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n" +
			"     32  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n" +
			"     35  iconst_0\n" +
			"     36  istore 7 [var]\n" +
			"     38  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     41  new java.lang.StringBuilder [27]\n" +
			"     44  dup\n" +
			"     45  ldc <String \"#save -> \"> [44]\n" +
			"     47  invokespecial java.lang.StringBuilder(java.lang.String) [31]\n" +
			"     50  iload_1 [a]\n" +
			"     51  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [34]\n" +
			"     54  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n" +
			"     57  invokevirtual java.io.PrintStream.println(java.lang.String) : void [46]\n" +
			"     60  return\n" +
			"     61  astore 4 [npe]\n" +
			"     63  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     66  aload_3 [contexts]\n" +
			"     67  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [21]\n" +
			"     70  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     73  new java.lang.StringBuilder [27]\n" +
			"     76  dup\n" +
			"     77  ldc <String \"#inner -> \"> [29]\n" +
			"     79  invokespecial java.lang.StringBuilder(java.lang.String) [31]\n" +
			"     82  iload_1 [a]\n" +
			"     83  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [34]\n" +
			"     86  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n" +
			"     89  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n" +
			"     92  iconst_0\n" +
			"     93  istore 7 [var]\n" +
			"     95  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     98  new java.lang.StringBuilder [27]\n" +
			"    101  dup\n" +
			"    102  ldc <String \"#save -> \"> [44]\n" +
			"    104  invokespecial java.lang.StringBuilder(java.lang.String) [31]\n" +
			"    107  iload_1 [a]\n" +
			"    108  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [34]\n" +
			"    111  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n" +
			"    114  invokevirtual java.io.PrintStream.println(java.lang.String) : void [46]\n" +
			"    117  return\n" +
			"    118  astore 5\n" +
			"    120  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"    123  new java.lang.StringBuilder [27]\n" +
			"    126  dup\n" +
			"    127  ldc <String \"#inner -> \"> [29]\n" +
			"    129  invokespecial java.lang.StringBuilder(java.lang.String) [31]\n" +
			"    132  iload_1 [a]\n" +
			"    133  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [34]\n" +
			"    136  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n" +
			"    139  invokevirtual java.io.PrintStream.print(java.lang.String) : void [42]\n" +
			"    142  aload 5\n" +
			"    144  athrow\n" +
			"    145  astore_2 [e]\n" +
			"    146  iconst_0\n" +
			"    147  istore 7 [var]\n" +
			"    149  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"    152  new java.lang.StringBuilder [27]\n" +
			"    155  dup\n" +
			"    156  ldc <String \"#save -> \"> [44]\n" +
			"    158  invokespecial java.lang.StringBuilder(java.lang.String) [31]\n" +
			"    161  iload_1 [a]\n" +
			"    162  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [34]\n" +
			"    165  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n" +
			"    168  invokevirtual java.io.PrintStream.println(java.lang.String) : void [46]\n" +
			"    171  return\n" +
			"    172  astore 6\n" +
			"    174  iconst_0\n" +
			"    175  istore 7 [var]\n" +
			"    177  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"    180  new java.lang.StringBuilder [27]\n" +
			"    183  dup\n" +
			"    184  ldc <String \"#save -> \"> [44]\n" +
			"    186  invokespecial java.lang.StringBuilder(java.lang.String) [31]\n" +
			"    189  iload_1 [a]\n" +
			"    190  invokevirtual java.lang.StringBuilder.append(int) : java.lang.StringBuilder [34]\n" +
			"    193  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [38]\n" +
			"    196  invokevirtual java.io.PrintStream.println(java.lang.String) : void [46]\n" +
			"    199  aload 6\n" +
			"    201  athrow\n" +
			"      Exception Table:\n" +
			"        [pc: 6, pc: 13] -> 61 when : java.lang.NullPointerException\n" +
			"        [pc: 6, pc: 13] -> 118 when : any\n" +
			"        [pc: 61, pc: 70] -> 118 when : any\n" +
			"        [pc: 2, pc: 35] -> 145 when : java.lang.Exception\n" +
			"        [pc: 61, pc: 92] -> 145 when : java.lang.Exception\n" +
			"        [pc: 118, pc: 145] -> 145 when : java.lang.Exception\n" +
			"        [pc: 2, pc: 35] -> 172 when : any\n" +
			"        [pc: 61, pc: 92] -> 172 when : any\n" +
			"        [pc: 118, pc: 146] -> 172 when : any\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 3]\n" +
			"        [pc: 2, line: 5]\n" +
			"        [pc: 4, line: 6]\n" +
			"        [pc: 6, line: 8]\n" +
			"        [pc: 13, line: 14]\n" +
			"        [pc: 35, line: 19]\n" +
			"        [pc: 38, line: 20]\n" +
			"        [pc: 60, line: 9]\n" +
			"        [pc: 61, line: 10]\n" +
			"        [pc: 63, line: 11]\n" +
			"        [pc: 70, line: 14]\n" +
			"        [pc: 92, line: 19]\n" +
			"        [pc: 95, line: 20]\n" +
			"        [pc: 117, line: 12]\n" +
			"        [pc: 118, line: 13]\n" +
			"        [pc: 120, line: 14]\n" +
			"        [pc: 142, line: 15]\n" +
			"        [pc: 145, line: 16]\n" +
			"        [pc: 146, line: 19]\n" +
			"        [pc: 149, line: 20]\n" +
			"        [pc: 171, line: 17]\n" +
			"        [pc: 172, line: 18]\n" +
			"        [pc: 174, line: 19]\n" +
			"        [pc: 177, line: 20]\n" +
			"        [pc: 199, line: 21]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 202] local: this index: 0 type: X\n" +
			"        [pc: 2, pc: 202] local: a index: 1 type: int\n" +
			"        [pc: 4, pc: 145] local: warnings index: 2 type: java.lang.Object\n" +
			"        [pc: 6, pc: 145] local: contexts index: 3 type: java.lang.Object\n" +
			"        [pc: 63, pc: 118] local: npe index: 4 type: java.lang.NullPointerException\n" +
			"        [pc: 146, pc: 172] local: e index: 2 type: java.lang.Exception\n" +
			"        [pc: 38, pc: 60] local: var index: 7 type: int\n" +
			"        [pc: 95, pc: 117] local: var index: 7 type: int\n" +
			"        [pc: 149, pc: 171] local: var index: 7 type: int\n" +
			"        [pc: 177, pc: 199] local: var index: 7 type: int\n" +
			"      Stack map table: number of frames 4\n" +
			"        [pc: 61, full, stack: {java.lang.NullPointerException}, locals: {X, int, java.lang.Object, java.lang.Object}]\n" +
			"        [pc: 118, same_locals_1_stack_item, stack: {java.lang.Throwable}]\n" +
			"        [pc: 145, full, stack: {java.lang.Exception}, locals: {X, int}]\n" +
			"        [pc: 172, same_locals_1_stack_item, stack: {java.lang.Throwable}]\n";
		}
	}

	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=129305
public void test044() throws Exception {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		foo();\n" +
				"	}  \n" +
				"	static Object foo() {\n" +
				"		try {\n" +
				"			return null;\n" +
				"		} catch(Exception e) {\n" +
				"			return null;\n" +
				"		} finally {\n" +
				"			System.out.println(\"SUCCESS\");\n" +
				"		}\n" +
				"	}\n" +
				"}\n",
			},
			"SUCCESS");

	CompilerOptions compilerOptions = new CompilerOptions(getCompilerOptions());
	String expectedOutput = !compilerOptions.inlineJsrBytecode ?
			"  // Method descriptor #19 ()Ljava/lang/Object;\n" +
			"  // Stack: 2, Locals: 3\n" +
			"  static java.lang.Object foo();\n" +
			"     0  jsr 15\n" +
			"     3  aconst_null\n" +
			"     4  areturn\n" +
			"     5  astore_0 [e]\n" +
			"     6  goto 0\n" +
			"     9  astore_2\n" +
			"    10  jsr 15\n" +
			"    13  aload_2\n" +
			"    14  athrow\n" +
			"    15  astore_1\n" +
			"    16  getstatic java.lang.System.out : java.io.PrintStream [22]\n" +
			"    19  ldc <String \"SUCCESS\"> [28]\n" +
			"    21  invokevirtual java.io.PrintStream.println(java.lang.String) : void [30]\n" +
			"    24  ret 1\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 3] -> 5 when : java.lang.Exception\n" +
			"        [pc: 0, pc: 3] -> 9 when : any\n" +
			"        [pc: 5, pc: 9] -> 9 when : any\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 7]\n" +
			"        [pc: 5, line: 8]\n" +
			"        [pc: 6, line: 9]\n" +
			"        [pc: 9, line: 10]\n" +
			"        [pc: 13, line: 12]\n" +
			"        [pc: 15, line: 10]\n" +
			"        [pc: 16, line: 11]\n" +
			"        [pc: 24, line: 12]\n" +
			"      Local variable table:\n" +
			"        [pc: 6, pc: 9] local: e index: 0 type: java.lang.Exception\n"
		: null;

	if (expectedOutput == null) {
		if (compilerOptions.targetJDK == ClassFileConstants.JDK1_5) {
			expectedOutput =
				"  // Method descriptor #19 ()Ljava/lang/Object;\n" +
				"  // Stack: 2, Locals: 0\n" +
				"  static java.lang.Object foo();\n" +
				"     0  getstatic java.lang.System.out : java.io.PrintStream [22]\n" +
				"     3  ldc <String \"SUCCESS\"> [28]\n" +
				"     5  invokevirtual java.io.PrintStream.println(java.lang.String) : void [30]\n" +
				"     8  aconst_null\n" +
				"     9  areturn\n" +
				"      Line numbers:\n" +
				"        [pc: 0, line: 11]\n" +
				"        [pc: 8, line: 7]\n";
		} else {
			expectedOutput = "  // Method descriptor #19 ()Ljava/lang/Object;\n" +
			"  // Stack: 2, Locals: 0\n" +
			"  static java.lang.Object foo();\n" +
			"     0  getstatic java.lang.System.out : java.io.PrintStream [22]\n" +
			"     3  ldc <String \"SUCCESS\"> [28]\n" +
			"     5  invokevirtual java.io.PrintStream.println(java.lang.String) : void [30]\n" +
			"     8  aconst_null\n" +
			"     9  areturn\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 11]\n" +
			"        [pc: 8, line: 7]\n";
		}
	}
	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=129306
public void test045() throws Exception {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public void save() {\n" +
				"		try {\n" +
				"			Object warnings = null;\n" +
				"			Object contexts = null;\n" +
				"			try {\n" +
				"				System.out.print(\"[try]\");\n" +
				"				System.out.print(warnings); \n" +
				"				return;\n" +
				"			} catch (NullPointerException npe) {\n" +
				"				System.out.print(\"[npe]\");\n" +
				"				System.out.print(contexts); \n" +
				"				return;\n" +
				"			}\n" +
				"		} catch (Exception e) {\n" +
				"			System.out.print(\"[e]\");\n" +
				"			return;\n" +
				"		} finally { \n" +
				"			int var = 0;\n" +
				"			System.out.print(\"[finally]\");\n" +
				"			Object o = null;\n" +
				"			o.toString();\n" +
				"		}\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		try {\n" +
				"			new X().save();\n" +
				"		} catch(NullPointerException e) {\n" +
				"			System.out.println(\"[caught npe]\");\n" +
				"		}\n" +
				"	}\n" +
				"}\n",
			},
			"[try]null[finally][caught npe]");

	CompilerOptions compilerOptions = new CompilerOptions(getCompilerOptions());
	String expectedOutput = !compilerOptions.inlineJsrBytecode
		?	"  // Method descriptor #6 ()V\n" +
			"  // Stack: 2, Locals: 8\n" +
			"  public void save();\n" +
			"     0  aconst_null\n" +
			"     1  astore_1 [warnings]\n" +
			"     2  aconst_null\n" +
			"     3  astore_2 [contexts]\n" +
			"     4  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     7  ldc <String \"[try]\"> [21]\n" +
			"     9  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n" +
			"    12  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"    15  aload_1 [warnings]\n" +
			"    16  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [29]\n" +
			"    19  jsr 62\n" +
			"    22  return\n" +
			"    23  astore_3 [npe]\n" +
			"    24  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"    27  ldc <String \"[npe]\"> [32]\n" +
			"    29  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n" +
			"    32  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"    35  aload_2 [contexts]\n" +
			"    36  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [29]\n" +
			"    39  goto 19\n" +
			"    42  astore_1 [e]\n" +
			"    43  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"    46  ldc <String \"[e]\"> [34]\n" +
			"    48  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n" +
			"    51  goto 19\n" +
			"    54  astore 5\n" +
			"    56  jsr 62\n" +
			"    59  aload 5\n" +
			"    61  athrow\n" +
			"    62  astore 4\n" +
			"    64  iconst_0\n" +
			"    65  istore 6 [var]\n" +
			"    67  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"    70  ldc <String \"[finally]\"> [36]\n" +
			"    72  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n" +
			"    75  aconst_null\n" +
			"    76  astore 7 [o]\n" +
			"    78  aload 7 [o]\n" +
			"    80  invokevirtual java.lang.Object.toString() : java.lang.String [38]\n" +
			"    83  pop\n" +
			"    84  ret 4\n" +
			"      Exception Table:\n" +
			"        [pc: 4, pc: 19] -> 23 when : java.lang.NullPointerException\n" +
			"        [pc: 0, pc: 22] -> 42 when : java.lang.Exception\n" +
			"        [pc: 23, pc: 42] -> 42 when : java.lang.Exception\n" +
			"        [pc: 0, pc: 22] -> 54 when : any\n" +
			"        [pc: 23, pc: 54] -> 54 when : any\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 4]\n" +
			"        [pc: 2, line: 5]\n" +
			"        [pc: 4, line: 7]\n" +
			"        [pc: 12, line: 8]\n" +
			"        [pc: 19, line: 9]\n" +
			"        [pc: 23, line: 10]\n" +
			"        [pc: 24, line: 11]\n" +
			"        [pc: 32, line: 12]\n" +
			"        [pc: 39, line: 13]\n" +
			"        [pc: 42, line: 15]\n" +
			"        [pc: 43, line: 16]\n" +
			"        [pc: 51, line: 17]\n" +
			"        [pc: 54, line: 18]\n" +
			"        [pc: 59, line: 23]\n" +
			"        [pc: 62, line: 18]\n" +
			"        [pc: 64, line: 19]\n" +
			"        [pc: 67, line: 20]\n" +
			"        [pc: 75, line: 21]\n" +
			"        [pc: 78, line: 22]\n" +
			"        [pc: 84, line: 23]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 86] local: this index: 0 type: X\n" +
			"        [pc: 2, pc: 42] local: warnings index: 1 type: java.lang.Object\n" +
			"        [pc: 4, pc: 42] local: contexts index: 2 type: java.lang.Object\n" +
			"        [pc: 24, pc: 42] local: npe index: 3 type: java.lang.NullPointerException\n" +
			"        [pc: 43, pc: 54] local: e index: 1 type: java.lang.Exception\n" +
			"        [pc: 67, pc: 84] local: var index: 6 type: int\n" +
			"        [pc: 78, pc: 84] local: o index: 7 type: java.lang.Object\n"
		: null;

	if (expectedOutput == null) {
		if (compilerOptions.targetJDK == ClassFileConstants.JDK1_5) {
			expectedOutput = "  // Method descriptor #6 ()V\n" +
			"  // Stack: 2, Locals: 7\n" +
			"  public void save();\n" +
			"      0  aconst_null\n" +
			"      1  astore_1 [warnings]\n" +
			"      2  aconst_null\n" +
			"      3  astore_2 [contexts]\n" +
			"      4  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"      7  ldc <String \"[try]\"> [21]\n" +
			"      9  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n" +
			"     12  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     15  aload_1 [warnings]\n" +
			"     16  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [29]\n" +
			"     19  iconst_0\n" +
			"     20  istore 5 [var]\n" +
			"     22  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     25  ldc <String \"[finally]\"> [32]\n" +
			"     27  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n" +
			"     30  aconst_null\n" +
			"     31  astore 6 [o]\n" +
			"     33  aload 6 [o]\n" +
			"     35  invokevirtual java.lang.Object.toString() : java.lang.String [34]\n" +
			"     38  pop\n" +
			"     39  return\n" +
			"     40  astore_3 [npe]\n" +
			"     41  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     44  ldc <String \"[npe]\"> [38]\n" +
			"     46  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n" +
			"     49  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     52  aload_2 [contexts]\n" +
			"     53  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [29]\n" +
			"     56  iconst_0\n" +
			"     57  istore 5 [var]\n" +
			"     59  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     62  ldc <String \"[finally]\"> [32]\n" +
			"     64  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n" +
			"     67  aconst_null\n" +
			"     68  astore 6 [o]\n" +
			"     70  aload 6 [o]\n" +
			"     72  invokevirtual java.lang.Object.toString() : java.lang.String [34]\n" +
			"     75  pop\n" +
			"     76  return\n" +
			"     77  astore_1 [e]\n" +
			"     78  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     81  ldc <String \"[e]\"> [40]\n" +
			"     83  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n" +
			"     86  iconst_0\n" +
			"     87  istore 5 [var]\n" +
			"     89  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     92  ldc <String \"[finally]\"> [32]\n" +
			"     94  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n" +
			"     97  aconst_null\n" +
			"     98  astore 6 [o]\n" +
			"    100  aload 6 [o]\n" +
			"    102  invokevirtual java.lang.Object.toString() : java.lang.String [34]\n" +
			"    105  pop\n" +
			"    106  return\n" +
			"    107  astore 4\n" +
			"    109  iconst_0\n" +
			"    110  istore 5 [var]\n" +
			"    112  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"    115  ldc <String \"[finally]\"> [32]\n" +
			"    117  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n" +
			"    120  aconst_null\n" +
			"    121  astore 6 [o]\n" +
			"    123  aload 6 [o]\n" +
			"    125  invokevirtual java.lang.Object.toString() : java.lang.String [34]\n" +
			"    128  pop\n" +
			"    129  aload 4\n" +
			"    131  athrow\n" +
			"      Exception Table:\n" +
			"        [pc: 4, pc: 19] -> 40 when : java.lang.NullPointerException\n" +
			"        [pc: 0, pc: 19] -> 77 when : java.lang.Exception\n" +
			"        [pc: 40, pc: 56] -> 77 when : java.lang.Exception\n" +
			"        [pc: 0, pc: 19] -> 107 when : any\n" +
			"        [pc: 40, pc: 56] -> 107 when : any\n" +
			"        [pc: 77, pc: 86] -> 107 when : any\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 4]\n" +
			"        [pc: 2, line: 5]\n" +
			"        [pc: 4, line: 7]\n" +
			"        [pc: 12, line: 8]\n" +
			"        [pc: 19, line: 19]\n" +
			"        [pc: 22, line: 20]\n" +
			"        [pc: 30, line: 21]\n" +
			"        [pc: 33, line: 22]\n" +
			"        [pc: 39, line: 9]\n" +
			"        [pc: 40, line: 10]\n" +
			"        [pc: 41, line: 11]\n" +
			"        [pc: 49, line: 12]\n" +
			"        [pc: 56, line: 19]\n" +
			"        [pc: 59, line: 20]\n" +
			"        [pc: 67, line: 21]\n" +
			"        [pc: 70, line: 22]\n" +
			"        [pc: 76, line: 13]\n" +
			"        [pc: 77, line: 15]\n" +
			"        [pc: 78, line: 16]\n" +
			"        [pc: 86, line: 19]\n" +
			"        [pc: 89, line: 20]\n" +
			"        [pc: 97, line: 21]\n" +
			"        [pc: 100, line: 22]\n" +
			"        [pc: 106, line: 17]\n" +
			"        [pc: 107, line: 18]\n" +
			"        [pc: 109, line: 19]\n" +
			"        [pc: 112, line: 20]\n" +
			"        [pc: 120, line: 21]\n" +
			"        [pc: 123, line: 22]\n" +
			"        [pc: 129, line: 23]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 132] local: this index: 0 type: X\n" +
			"        [pc: 2, pc: 77] local: warnings index: 1 type: java.lang.Object\n" +
			"        [pc: 4, pc: 77] local: contexts index: 2 type: java.lang.Object\n" +
			"        [pc: 41, pc: 77] local: npe index: 3 type: java.lang.NullPointerException\n" +
			"        [pc: 78, pc: 107] local: e index: 1 type: java.lang.Exception\n" +
			"        [pc: 22, pc: 39] local: var index: 5 type: int\n" +
			"        [pc: 59, pc: 76] local: var index: 5 type: int\n" +
			"        [pc: 89, pc: 106] local: var index: 5 type: int\n" +
			"        [pc: 112, pc: 129] local: var index: 5 type: int\n" +
			"        [pc: 33, pc: 39] local: o index: 6 type: java.lang.Object\n" +
			"        [pc: 70, pc: 76] local: o index: 6 type: java.lang.Object\n" +
			"        [pc: 100, pc: 106] local: o index: 6 type: java.lang.Object\n" +
			"        [pc: 123, pc: 129] local: o index: 6 type: java.lang.Object\n";
		} else {
			expectedOutput = "  // Method descriptor #6 ()V\n" +
			"  // Stack: 2, Locals: 7\n" +
			"  public void save();\n" +
			"      0  aconst_null\n" +
			"      1  astore_1 [warnings]\n" +
			"      2  aconst_null\n" +
			"      3  astore_2 [contexts]\n" +
			"      4  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"      7  ldc <String \"[try]\"> [21]\n" +
			"      9  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n" +
			"     12  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     15  aload_1 [warnings]\n" +
			"     16  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [29]\n" +
			"     19  iconst_0\n" +
			"     20  istore 5 [var]\n" +
			"     22  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     25  ldc <String \"[finally]\"> [32]\n" +
			"     27  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n" +
			"     30  aconst_null\n" +
			"     31  astore 6 [o]\n" +
			"     33  aload 6 [o]\n" +
			"     35  invokevirtual java.lang.Object.toString() : java.lang.String [34]\n" +
			"     38  pop\n" +
			"     39  return\n" +
			"     40  astore_3 [npe]\n" +
			"     41  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     44  ldc <String \"[npe]\"> [38]\n" +
			"     46  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n" +
			"     49  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     52  aload_2 [contexts]\n" +
			"     53  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [29]\n" +
			"     56  iconst_0\n" +
			"     57  istore 5 [var]\n" +
			"     59  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     62  ldc <String \"[finally]\"> [32]\n" +
			"     64  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n" +
			"     67  aconst_null\n" +
			"     68  astore 6 [o]\n" +
			"     70  aload 6 [o]\n" +
			"     72  invokevirtual java.lang.Object.toString() : java.lang.String [34]\n" +
			"     75  pop\n" +
			"     76  return\n" +
			"     77  astore_1 [e]\n" +
			"     78  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     81  ldc <String \"[e]\"> [40]\n" +
			"     83  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n" +
			"     86  iconst_0\n" +
			"     87  istore 5 [var]\n" +
			"     89  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"     92  ldc <String \"[finally]\"> [32]\n" +
			"     94  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n" +
			"     97  aconst_null\n" +
			"     98  astore 6 [o]\n" +
			"    100  aload 6 [o]\n" +
			"    102  invokevirtual java.lang.Object.toString() : java.lang.String [34]\n" +
			"    105  pop\n" +
			"    106  return\n" +
			"    107  astore 4\n" +
			"    109  iconst_0\n" +
			"    110  istore 5 [var]\n" +
			"    112  getstatic java.lang.System.out : java.io.PrintStream [15]\n" +
			"    115  ldc <String \"[finally]\"> [32]\n" +
			"    117  invokevirtual java.io.PrintStream.print(java.lang.String) : void [23]\n" +
			"    120  aconst_null\n" +
			"    121  astore 6 [o]\n" +
			"    123  aload 6 [o]\n" +
			"    125  invokevirtual java.lang.Object.toString() : java.lang.String [34]\n" +
			"    128  pop\n" +
			"    129  aload 4\n" +
			"    131  athrow\n" +
			"      Exception Table:\n" +
			"        [pc: 4, pc: 19] -> 40 when : java.lang.NullPointerException\n" +
			"        [pc: 0, pc: 19] -> 77 when : java.lang.Exception\n" +
			"        [pc: 40, pc: 56] -> 77 when : java.lang.Exception\n" +
			"        [pc: 0, pc: 19] -> 107 when : any\n" +
			"        [pc: 40, pc: 56] -> 107 when : any\n" +
			"        [pc: 77, pc: 86] -> 107 when : any\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 4]\n" +
			"        [pc: 2, line: 5]\n" +
			"        [pc: 4, line: 7]\n" +
			"        [pc: 12, line: 8]\n" +
			"        [pc: 19, line: 19]\n" +
			"        [pc: 22, line: 20]\n" +
			"        [pc: 30, line: 21]\n" +
			"        [pc: 33, line: 22]\n" +
			"        [pc: 39, line: 9]\n" +
			"        [pc: 40, line: 10]\n" +
			"        [pc: 41, line: 11]\n" +
			"        [pc: 49, line: 12]\n" +
			"        [pc: 56, line: 19]\n" +
			"        [pc: 59, line: 20]\n" +
			"        [pc: 67, line: 21]\n" +
			"        [pc: 70, line: 22]\n" +
			"        [pc: 76, line: 13]\n" +
			"        [pc: 77, line: 15]\n" +
			"        [pc: 78, line: 16]\n" +
			"        [pc: 86, line: 19]\n" +
			"        [pc: 89, line: 20]\n" +
			"        [pc: 97, line: 21]\n" +
			"        [pc: 100, line: 22]\n" +
			"        [pc: 106, line: 17]\n" +
			"        [pc: 107, line: 18]\n" +
			"        [pc: 109, line: 19]\n" +
			"        [pc: 112, line: 20]\n" +
			"        [pc: 120, line: 21]\n" +
			"        [pc: 123, line: 22]\n" +
			"        [pc: 129, line: 23]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 132] local: this index: 0 type: X\n" +
			"        [pc: 2, pc: 77] local: warnings index: 1 type: java.lang.Object\n" +
			"        [pc: 4, pc: 77] local: contexts index: 2 type: java.lang.Object\n" +
			"        [pc: 41, pc: 77] local: npe index: 3 type: java.lang.NullPointerException\n" +
			"        [pc: 78, pc: 107] local: e index: 1 type: java.lang.Exception\n" +
			"        [pc: 22, pc: 39] local: var index: 5 type: int\n" +
			"        [pc: 59, pc: 76] local: var index: 5 type: int\n" +
			"        [pc: 89, pc: 106] local: var index: 5 type: int\n" +
			"        [pc: 112, pc: 129] local: var index: 5 type: int\n" +
			"        [pc: 33, pc: 39] local: o index: 6 type: java.lang.Object\n" +
			"        [pc: 70, pc: 76] local: o index: 6 type: java.lang.Object\n" +
			"        [pc: 100, pc: 106] local: o index: 6 type: java.lang.Object\n" +
			"        [pc: 123, pc: 129] local: o index: 6 type: java.lang.Object\n" +
			"      Stack map table: number of frames 3\n" +
			"        [pc: 40, full, stack: {java.lang.NullPointerException}, locals: {X, java.lang.Object, java.lang.Object}]\n" +
			"        [pc: 77, full, stack: {java.lang.Exception}, locals: {X}]\n" +
			"        [pc: 107, same_locals_1_stack_item, stack: {java.lang.Throwable}]\n";
		}
	}

	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=108180
public void test046() throws Exception {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public static Object sanityCheckBug() {\n" +
				"        Object obj;\n" +
				"        try {\n" +
				"            obj = new Object();\n" +
				"            return obj;\n" +
				"        } finally {\n" +
				"             obj = null;\n" +
				"        }\n" +
				"    }\n" +
				"    public static void main(String[] arguments) {\n" +
				"		X.sanityCheckBug();\n" +
				"    }\n" +
				"}\n",
			},
			"");

	CompilerOptions compilerOptions = new CompilerOptions(getCompilerOptions());
	String expectedOutput = !compilerOptions.inlineJsrBytecode
		?	"  // Method descriptor #15 ()Ljava/lang/Object;\n" +
			"  // Stack: 2, Locals: 4\n" +
			"  public static java.lang.Object sanityCheckBug();\n" +
			"     0  new java.lang.Object [3]\n" +
			"     3  dup\n" +
			"     4  invokespecial java.lang.Object() [8]\n" +
			"     7  astore_0 [obj]\n" +
			"     8  aload_0 [obj]\n" +
			"     9  astore_3\n" +
			"    10  jsr 21\n" +
			"    13  aload_3\n" +
			"    14  areturn\n" +
			"    15  astore_2\n" +
			"    16  jsr 21\n" +
			"    19  aload_2\n" +
			"    20  athrow\n" +
			"    21  astore_1\n" +
			"    22  aconst_null\n" +
			"    23  astore_0 [obj]\n" +
			"    24  ret 1\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 13] -> 15 when : any\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 5]\n" +
			"        [pc: 8, line: 6]\n" +
			"        [pc: 15, line: 7]\n" +
			"        [pc: 19, line: 9]\n" +
			"        [pc: 21, line: 7]\n" +
			"        [pc: 22, line: 8]\n" +
			"        [pc: 24, line: 9]\n" +
			"      Local variable table:\n" +
			"        [pc: 8, pc: 15] local: obj index: 0 type: java.lang.Object\n" +
			"        [pc: 24, pc: 26] local: obj index: 0 type: java.lang.Object\n"
		: null;

	if (expectedOutput == null) {
		if (compilerOptions.targetJDK == ClassFileConstants.JDK1_5) {
			expectedOutput = "  // Method descriptor #15 ()Ljava/lang/Object;\n" +
			"  // Stack: 2, Locals: 3\n" +
			"  public static java.lang.Object sanityCheckBug();\n" +
			"     0  new java.lang.Object [3]\n" +
			"     3  dup\n" +
			"     4  invokespecial java.lang.Object() [8]\n" +
			"     7  astore_0 [obj]\n" +
			"     8  aload_0 [obj]\n" +
			"     9  astore_2\n" +
			"    10  aconst_null\n" +
			"    11  astore_0 [obj]\n" +
			"    12  aload_2\n" +
			"    13  areturn\n" +
			"    14  astore_1\n" +
			"    15  aconst_null\n" +
			"    16  astore_0 [obj]\n" +
			"    17  aload_1\n" +
			"    18  athrow\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 10] -> 14 when : any\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 5]\n" +
			"        [pc: 8, line: 6]\n" +
			"        [pc: 10, line: 8]\n" +
			"        [pc: 12, line: 6]\n" +
			"        [pc: 14, line: 7]\n" +
			"        [pc: 15, line: 8]\n" +
			"        [pc: 17, line: 9]\n" +
			"      Local variable table:\n" +
			"        [pc: 8, pc: 14] local: obj index: 0 type: java.lang.Object\n" +
			"        [pc: 17, pc: 19] local: obj index: 0 type: java.lang.Object\n";
		} else {
			expectedOutput = "  // Method descriptor #15 ()Ljava/lang/Object;\n" +
			"  // Stack: 2, Locals: 3\n" +
			"  public static java.lang.Object sanityCheckBug();\n" +
			"     0  new java.lang.Object [3]\n" +
			"     3  dup\n" +
			"     4  invokespecial java.lang.Object() [8]\n" +
			"     7  astore_0 [obj]\n" +
			"     8  aload_0 [obj]\n" +
			"     9  astore_2\n" +
			"    10  aconst_null\n" +
			"    11  astore_0 [obj]\n" +
			"    12  aload_2\n" +
			"    13  areturn\n" +
			"    14  astore_1\n" +
			"    15  aconst_null\n" +
			"    16  astore_0 [obj]\n" +
			"    17  aload_1\n" +
			"    18  athrow\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 10] -> 14 when : any\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 5]\n" +
			"        [pc: 8, line: 6]\n" +
			"        [pc: 10, line: 8]\n" +
			"        [pc: 12, line: 6]\n" +
			"        [pc: 14, line: 7]\n" +
			"        [pc: 15, line: 8]\n" +
			"        [pc: 17, line: 9]\n" +
			"      Local variable table:\n" +
			"        [pc: 8, pc: 14] local: obj index: 0 type: java.lang.Object\n" +
			"        [pc: 17, pc: 19] local: obj index: 0 type: java.lang.Object\n";
		}
	}

	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}
public void test047() {
	if (new CompilerOptions(getCompilerOptions()).complianceLevel <= ClassFileConstants.JDK1_3) {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"        public static void main(String[] args) {\n" +
					"                try {\n" +
					"					if (false) throw null;\n" +
					"					throw new Object();\n" +
					"                } catch(Object o) {\n" +
					"                }\n" +
					"        }\n" +
					"}\n",
				},
				"----------\n" +
				"1. ERROR in X.java (at line 4)\n" +
				"	if (false) throw null;\n" +
				"	                 ^^^^\n" +
				"Cannot throw null as an exception\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 5)\n" +
				"	throw new Object();\n" +
				"	      ^^^^^^^^^^^^\n" +
				"No exception of type Object can be thrown; an exception type must be a subclass of Throwable\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 6)\n" +
				"	} catch(Object o) {\n" +
				"	        ^^^^^^\n" +
				"No exception of type Object can be thrown; an exception type must be a subclass of Throwable\n" +
				"----------\n");
		return;
	}
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"        public static void main(String[] args) {\n" +
			"                try {\n" +
			"					if (false) throw null;\n" +
			"					throw new Object();\n" +
			"                } catch(Object o) {\n" +
			"                }\n" +
			"        }\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	throw new Object();\n" +
		"	      ^^^^^^^^^^^^\n" +
		"No exception of type Object can be thrown; an exception type must be a subclass of Throwable\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 6)\n" +
		"	} catch(Object o) {\n" +
		"	        ^^^^^^\n" +
		"No exception of type Object can be thrown; an exception type must be a subclass of Throwable\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=114894
public void test048() throws Exception {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	boolean bool() { return true; }\n" +
				"	void foo() {\n" +
				"		try {\n" +
				"			if (bool()) {\n" +
				"				return;\n" +
				"			}\n" +
				"		} catch (Exception e) {\n" +
				"		}\n" +
				"	}\n" +
				"	int foo2() {\n" +
				"		try {\n" +
				"			while (bool()) {\n" +
				"				return 0;\n" +
				"			}\n" +
				"		} catch (Exception e) {\n" +
				"		}\n" +
				"		return 1;\n" +
				"	}\n" +
				"	long foo3() {\n" +
				"		try {\n" +
				"			do {\n" +
				"				if (true) return 0L;\n" +
				"			} while (bool());\n" +
				"		} catch (Exception e) {\n" +
				"		}\n" +
				"		return 1L;\n" +
				"	}	\n" +
				"	float foo4() {\n" +
				"		try {\n" +
				"			for (int i  = 0; bool(); i++) {\n" +
				"				return 0.0F;\n" +
				"			}\n" +
				"		} catch (Exception e) {\n" +
				"		}\n" +
				"		return 1.0F;\n" +
				"	}		\n" +
				"	double bar() {\n" +
				"		if (bool()) {\n" +
				"			if (bool())\n" +
				"				return 0.0;\n" +
				"		} else {\n" +
				"			if (bool()) {\n" +
				"				throw new NullPointerException();\n" +
				"			}\n" +
				"		}\n" +
				"		return 1.0;\n" +
				"	}\n" +
				"	void baz(int i) {\n" +
				"		if (bool()) {\n" +
				"			switch(i) {\n" +
				"				case 0 : return;\n" +
				"				default : break;\n" +
				"			}\n" +
				"		} else {\n" +
				"			bool();\n" +
				"		}\n" +
				"	}\n" +
				"}\n",
			},
			"");

	String expectedOutput = new CompilerOptions(getCompilerOptions()).complianceLevel < ClassFileConstants.JDK1_6
		?	"  // Method descriptor #6 ()V\n" +
				"  // Stack: 1, Locals: 2\n" +
				"  void foo();\n" +
				"     0  aload_0 [this]\n" +
				"     1  invokevirtual X.bool() : boolean [17]\n" +
				"     4  ifeq 9\n" +
				"     7  return\n" +
				"     8  astore_1\n" +
				"     9  return\n" +
				"      Exception Table:\n" +
				"        [pc: 0, pc: 7] -> 8 when : java.lang.Exception\n" +
				"      Line numbers:\n" +
				"        [pc: 0, line: 5]\n" +
				"        [pc: 7, line: 6]\n" +
				"        [pc: 8, line: 8]\n" +
				"        [pc: 9, line: 10]\n" +
				"      Local variable table:\n" +
				"        [pc: 0, pc: 10] local: this index: 0 type: X\n" +
				"  \n" +
				"  // Method descriptor #22 ()I\n" +
				"  // Stack: 1, Locals: 2\n" +
				"  int foo2();\n" +
				"     0  aload_0 [this]\n" +
				"     1  invokevirtual X.bool() : boolean [17]\n" +
				"     4  ifeq 10\n" +
				"     7  iconst_0\n" +
				"     8  ireturn\n" +
				"     9  astore_1\n" +
				"    10  iconst_1\n" +
				"    11  ireturn\n" +
				"      Exception Table:\n" +
				"        [pc: 0, pc: 7] -> 9 when : java.lang.Exception\n" +
				"      Line numbers:\n" +
				"        [pc: 0, line: 13]\n" +
				"        [pc: 7, line: 14]\n" +
				"        [pc: 9, line: 16]\n" +
				"        [pc: 10, line: 18]\n" +
				"      Local variable table:\n" +
				"        [pc: 0, pc: 12] local: this index: 0 type: X\n" +
				"  \n" +
				"  // Method descriptor #24 ()J\n" +
				"  // Stack: 2, Locals: 1\n" +
				"  long foo3();\n" +
				"    0  lconst_0\n" +
				"    1  lreturn\n" +
				"    2  lconst_1\n" +
				"    3  lreturn\n" +
				"      Line numbers:\n" +
				"        [pc: 0, line: 23]\n" +
				"        [pc: 2, line: 27]\n" +
				"      Local variable table:\n" +
				"        [pc: 0, pc: 4] local: this index: 0 type: X\n" +
				"  \n" +
				"  // Method descriptor #26 ()F\n" +
				"  // Stack: 1, Locals: 2\n" +
				"  float foo4();\n" +
				"     0  iconst_0\n" +
				"     1  istore_1 [i]\n" +
				"     2  aload_0 [this]\n" +
				"     3  invokevirtual X.bool() : boolean [17]\n" +
				"     6  ifeq 12\n" +
				"     9  fconst_0\n" +
				"    10  freturn\n" +
				"    11  astore_1\n" +
				"    12  fconst_1\n" +
				"    13  freturn\n" +
				"      Exception Table:\n" +
				"        [pc: 0, pc: 9] -> 11 when : java.lang.Exception\n" +
				"      Line numbers:\n" +
				"        [pc: 0, line: 31]\n" +
				"        [pc: 9, line: 32]\n" +
				"        [pc: 11, line: 34]\n" +
				"        [pc: 12, line: 36]\n" +
				"      Local variable table:\n" +
				"        [pc: 0, pc: 14] local: this index: 0 type: X\n" +
				"        [pc: 2, pc: 11] local: i index: 1 type: int\n" +
				"  \n" +
				"  // Method descriptor #30 ()D\n" +
				"  // Stack: 2, Locals: 1\n" +
				"  double bar();\n" +
				"     0  aload_0 [this]\n" +
				"     1  invokevirtual X.bool() : boolean [17]\n" +
				"     4  ifeq 16\n" +
				"     7  aload_0 [this]\n" +
				"     8  invokevirtual X.bool() : boolean [17]\n" +
				"    11  ifeq 31\n" +
				"    14  dconst_0\n" +
				"    15  dreturn\n" +
				"    16  aload_0 [this]\n" +
				"    17  invokevirtual X.bool() : boolean [17]\n" +
				"    20  ifeq 31\n" +
				"    23  new java.lang.NullPointerException [31]\n" +
				"    26  dup\n" +
				"    27  invokespecial java.lang.NullPointerException() [33]\n" +
				"    30  athrow\n" +
				"    31  dconst_1\n" +
				"    32  dreturn\n" +
				"      Line numbers:\n" +
				"        [pc: 0, line: 39]\n" +
				"        [pc: 7, line: 40]\n" +
				"        [pc: 14, line: 41]\n" +
				"        [pc: 16, line: 43]\n" +
				"        [pc: 23, line: 44]\n" +
				"        [pc: 31, line: 47]\n" +
				"      Local variable table:\n" +
				"        [pc: 0, pc: 33] local: this index: 0 type: X\n" +
				"  \n" +
				"  // Method descriptor #35 (I)V\n" +
				"  // Stack: 1, Locals: 2\n" +
				"  void baz(int i);\n" +
				"     0  aload_0 [this]\n" +
				"     1  invokevirtual X.bool() : boolean [17]\n" +
				"     4  ifeq 32\n" +
				"     7  iload_1 [i]\n" +
				"     8  tableswitch default: 29\n" +
				"          case 0: 28\n" +
				"    28  return\n" +
				"    29  goto 37\n" +
				"    32  aload_0 [this]\n" +
				"    33  invokevirtual X.bool() : boolean [17]\n" +
				"    36  pop\n" +
				"    37  return\n" +
				"      Line numbers:\n" +
				"        [pc: 0, line: 50]\n" +
				"        [pc: 7, line: 51]\n" +
				"        [pc: 28, line: 52]\n" +
				"        [pc: 29, line: 55]\n" +
				"        [pc: 32, line: 56]\n" +
				"        [pc: 37, line: 58]\n" +
				"      Local variable table:\n" +
				"        [pc: 0, pc: 38] local: this index: 0 type: X\n" +
				"        [pc: 0, pc: 38] local: i index: 1 type: int\n"
		:
			"  // Method descriptor #6 ()V\n" +
			"  // Stack: 1, Locals: 2\n" +
			"  void foo();\n" +
			"     0  aload_0 [this]\n" +
			"     1  invokevirtual X.bool() : boolean [17]\n" +
			"     4  ifeq 9\n" +
			"     7  return\n" +
			"     8  astore_1\n" +
			"     9  return\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 7] -> 8 when : java.lang.Exception\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 5]\n" +
			"        [pc: 7, line: 6]\n" +
			"        [pc: 8, line: 8]\n" +
			"        [pc: 9, line: 10]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 10] local: this index: 0 type: X\n" +
			"      Stack map table: number of frames 2\n" +
			"        [pc: 8, same_locals_1_stack_item, stack: {java.lang.Exception}]\n" +
			"        [pc: 9, same]\n" +
			"  \n" +
			"  // Method descriptor #23 ()I\n" +
			"  // Stack: 1, Locals: 2\n" +
			"  int foo2();\n" +
			"     0  aload_0 [this]\n" +
			"     1  invokevirtual X.bool() : boolean [17]\n" +
			"     4  ifeq 10\n" +
			"     7  iconst_0\n" +
			"     8  ireturn\n" +
			"     9  astore_1\n" +
			"    10  iconst_1\n" +
			"    11  ireturn\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 7] -> 9 when : java.lang.Exception\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 13]\n" +
			"        [pc: 7, line: 14]\n" +
			"        [pc: 9, line: 16]\n" +
			"        [pc: 10, line: 18]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 12] local: this index: 0 type: X\n" +
			"      Stack map table: number of frames 2\n" +
			"        [pc: 9, same_locals_1_stack_item, stack: {java.lang.Exception}]\n" +
			"        [pc: 10, same]\n" +
			"  \n" +
			"  // Method descriptor #25 ()J\n" +
			"  // Stack: 2, Locals: 1\n" +
			"  long foo3();\n" +
			"    0  lconst_0\n" +
			"    1  lreturn\n" +
			"    2  lconst_1\n" +
			"    3  lreturn\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 23]\n" +
			"        [pc: 2, line: 27]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 4] local: this index: 0 type: X\n" +
			"      Stack map table: number of frames 1\n" +
			"        [pc: 2, same]\n" +
			"  \n" +
			"  // Method descriptor #27 ()F\n" +
			"  // Stack: 1, Locals: 2\n" +
			"  float foo4();\n" +
			"     0  iconst_0\n" +
			"     1  istore_1 [i]\n" +
			"     2  aload_0 [this]\n" +
			"     3  invokevirtual X.bool() : boolean [17]\n" +
			"     6  ifeq 12\n" +
			"     9  fconst_0\n" +
			"    10  freturn\n" +
			"    11  astore_1\n" +
			"    12  fconst_1\n" +
			"    13  freturn\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 9] -> 11 when : java.lang.Exception\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 31]\n" +
			"        [pc: 9, line: 32]\n" +
			"        [pc: 11, line: 34]\n" +
			"        [pc: 12, line: 36]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 14] local: this index: 0 type: X\n" +
			"        [pc: 2, pc: 11] local: i index: 1 type: int\n" +
			"      Stack map table: number of frames 2\n" +
			"        [pc: 11, same_locals_1_stack_item, stack: {java.lang.Exception}]\n" +
			"        [pc: 12, same]\n" +
			"  \n" +
			"  // Method descriptor #31 ()D\n" +
			"  // Stack: 2, Locals: 1\n" +
			"  double bar();\n" +
			"     0  aload_0 [this]\n" +
			"     1  invokevirtual X.bool() : boolean [17]\n" +
			"     4  ifeq 16\n" +
			"     7  aload_0 [this]\n" +
			"     8  invokevirtual X.bool() : boolean [17]\n" +
			"    11  ifeq 31\n" +
			"    14  dconst_0\n" +
			"    15  dreturn\n" +
			"    16  aload_0 [this]\n" +
			"    17  invokevirtual X.bool() : boolean [17]\n" +
			"    20  ifeq 31\n" +
			"    23  new java.lang.NullPointerException [32]\n" +
			"    26  dup\n" +
			"    27  invokespecial java.lang.NullPointerException() [34]\n" +
			"    30  athrow\n" +
			"    31  dconst_1\n" +
			"    32  dreturn\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 39]\n" +
			"        [pc: 7, line: 40]\n" +
			"        [pc: 14, line: 41]\n" +
			"        [pc: 16, line: 43]\n" +
			"        [pc: 23, line: 44]\n" +
			"        [pc: 31, line: 47]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 33] local: this index: 0 type: X\n" +
			"      Stack map table: number of frames 2\n" +
			"        [pc: 16, same]\n" +
			"        [pc: 31, same]\n" +
			"  \n" +
			"  // Method descriptor #36 (I)V\n" +
			"  // Stack: 1, Locals: 2\n" +
			"  void baz(int i);\n" +
			"     0  aload_0 [this]\n" +
			"     1  invokevirtual X.bool() : boolean [17]\n" +
			"     4  ifeq 32\n" +
			"     7  iload_1 [i]\n" +
			"     8  tableswitch default: 29\n" +
			"          case 0: 28\n" +
			"    28  return\n" +
			"    29  goto 37\n" +
			"    32  aload_0 [this]\n" +
			"    33  invokevirtual X.bool() : boolean [17]\n" +
			"    36  pop\n" +
			"    37  return\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 50]\n" +
			"        [pc: 7, line: 51]\n" +
			"        [pc: 28, line: 52]\n" +
			"        [pc: 29, line: 55]\n" +
			"        [pc: 32, line: 56]\n" +
			"        [pc: 37, line: 58]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 38] local: this index: 0 type: X\n" +
			"        [pc: 0, pc: 38] local: i index: 1 type: int\n" +
			"      Stack map table: number of frames 4\n" +
			"        [pc: 28, same]\n" +
			"        [pc: 29, same]\n" +
			"        [pc: 32, same]\n" +
			"        [pc: 37, same]\n";
	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}

//https://bugs.eclipse.org/bugs/show_bug.cgi?id=114894 - variation
public void test049() throws Exception {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	boolean bool() { return true; }\n" +
				"	void foo() {\n" +
				"		try {\n" +
				"			if (bool()) {\n" +
				"				throw new NullPointerException();\n" +
				"			}\n" +
				"		} catch (Exception e) {\n" +
				"		}\n" +
				"	}\n" +
				"	void foo2() {\n" +
				"		try {\n" +
				"			while (bool()) {\n" +
				"				throw new NullPointerException();\n" +
				"			}\n" +
				"		} catch (Exception e) {\n" +
				"		}\n" +
				"	}\n" +
				"	void foo3() {\n" +
				"		try {\n" +
				"			do {\n" +
				"				if (true) throw new NullPointerException();\n" +
				"			} while (bool());\n" +
				"		} catch (Exception e) {\n" +
				"		}\n" +
				"	}	\n" +
				"	void foo4() {\n" +
				"		try {\n" +
				"			for (int i  = 0; bool(); i++) {\n" +
				"				throw new NullPointerException();\n" +
				"			}\n" +
				"		} catch (Exception e) {\n" +
				"		}\n" +
				"	}		\n" +
				"	void bar() {\n" +
				"		if (bool()) {\n" +
				"			if (bool())\n" +
				"				throw new NullPointerException();\n" +
				"		} else {\n" +
				"			if (bool()) {\n" +
				"				throw new NullPointerException();\n" +
				"			}\n" +
				"		}\n" +
				"	}\n" +
				"	void baz(int i) {\n" +
				"		if (bool()) {\n" +
				"			switch(i) {\n" +
				"				case 0 : throw new NullPointerException();\n" +
				"				default : break;\n" +
				"			}\n" +
				"		} else {\n" +
				"			bool();\n" +
				"		}\n" +
				"	}\n" +
				"}\n",
			},
			"");

	String expectedOutput = new CompilerOptions(getCompilerOptions()).complianceLevel < ClassFileConstants.JDK1_6
		?	"  // Method descriptor #6 ()V\n" +
			"  // Stack: 2, Locals: 2\n" +
			"  void foo();\n" +
			"     0  aload_0 [this]\n" +
			"     1  invokevirtual X.bool() : boolean [17]\n" +
			"     4  ifeq 16\n" +
			"     7  new java.lang.NullPointerException [19]\n" +
			"    10  dup\n" +
			"    11  invokespecial java.lang.NullPointerException() [21]\n" +
			"    14  athrow\n" +
			"    15  astore_1\n" +
			"    16  return\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 15] -> 15 when : java.lang.Exception\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 5]\n" +
			"        [pc: 7, line: 6]\n" +
			"        [pc: 15, line: 8]\n" +
			"        [pc: 16, line: 10]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 17] local: this index: 0 type: X\n" +
			"  \n" +
			"  // Method descriptor #6 ()V\n" +
			"  // Stack: 2, Locals: 2\n" +
			"  void foo2();\n" +
			"     0  aload_0 [this]\n" +
			"     1  invokevirtual X.bool() : boolean [17]\n" +
			"     4  ifeq 16\n" +
			"     7  new java.lang.NullPointerException [19]\n" +
			"    10  dup\n" +
			"    11  invokespecial java.lang.NullPointerException() [21]\n" +
			"    14  athrow\n" +
			"    15  astore_1\n" +
			"    16  return\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 15] -> 15 when : java.lang.Exception\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 13]\n" +
			"        [pc: 7, line: 14]\n" +
			"        [pc: 15, line: 16]\n" +
			"        [pc: 16, line: 18]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 17] local: this index: 0 type: X\n" +
			"  \n" +
			"  // Method descriptor #6 ()V\n" +
			"  // Stack: 2, Locals: 2\n" +
			"  void foo3();\n" +
			"     0  new java.lang.NullPointerException [19]\n" +
			"     3  dup\n" +
			"     4  invokespecial java.lang.NullPointerException() [21]\n" +
			"     7  athrow\n" +
			"     8  astore_1\n" +
			"     9  return\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 8] -> 8 when : java.lang.Exception\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 22]\n" +
			"        [pc: 8, line: 24]\n" +
			"        [pc: 9, line: 26]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 10] local: this index: 0 type: X\n" +
			"  \n" +
			"  // Method descriptor #6 ()V\n" +
			"  // Stack: 2, Locals: 2\n" +
			"  void foo4();\n" +
			"     0  iconst_0\n" +
			"     1  istore_1 [i]\n" +
			"     2  aload_0 [this]\n" +
			"     3  invokevirtual X.bool() : boolean [17]\n" +
			"     6  ifeq 18\n" +
			"     9  new java.lang.NullPointerException [19]\n" +
			"    12  dup\n" +
			"    13  invokespecial java.lang.NullPointerException() [21]\n" +
			"    16  athrow\n" +
			"    17  astore_1\n" +
			"    18  return\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 17] -> 17 when : java.lang.Exception\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 29]\n" +
			"        [pc: 9, line: 30]\n" +
			"        [pc: 17, line: 32]\n" +
			"        [pc: 18, line: 34]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 19] local: this index: 0 type: X\n" +
			"        [pc: 2, pc: 17] local: i index: 1 type: int\n" +
			"  \n" +
			"  // Method descriptor #6 ()V\n" +
			"  // Stack: 2, Locals: 1\n" +
			"  void bar();\n" +
			"     0  aload_0 [this]\n" +
			"     1  invokevirtual X.bool() : boolean [17]\n" +
			"     4  ifeq 22\n" +
			"     7  aload_0 [this]\n" +
			"     8  invokevirtual X.bool() : boolean [17]\n" +
			"    11  ifeq 37\n" +
			"    14  new java.lang.NullPointerException [19]\n" +
			"    17  dup\n" +
			"    18  invokespecial java.lang.NullPointerException() [21]\n" +
			"    21  athrow\n" +
			"    22  aload_0 [this]\n" +
			"    23  invokevirtual X.bool() : boolean [17]\n" +
			"    26  ifeq 37\n" +
			"    29  new java.lang.NullPointerException [19]\n" +
			"    32  dup\n" +
			"    33  invokespecial java.lang.NullPointerException() [21]\n" +
			"    36  athrow\n" +
			"    37  return\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 36]\n" +
			"        [pc: 7, line: 37]\n" +
			"        [pc: 14, line: 38]\n" +
			"        [pc: 22, line: 40]\n" +
			"        [pc: 29, line: 41]\n" +
			"        [pc: 37, line: 44]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 38] local: this index: 0 type: X\n" +
			"  \n" +
			"  // Method descriptor #31 (I)V\n" +
			"  // Stack: 2, Locals: 2\n" +
			"  void baz(int i);\n" +
			"     0  aload_0 [this]\n" +
			"     1  invokevirtual X.bool() : boolean [17]\n" +
			"     4  ifeq 39\n" +
			"     7  iload_1 [i]\n" +
			"     8  tableswitch default: 36\n" +
			"          case 0: 28\n" +
			"    28  new java.lang.NullPointerException [19]\n" +
			"    31  dup\n" +
			"    32  invokespecial java.lang.NullPointerException() [21]\n" +
			"    35  athrow\n" +
			"    36  goto 44\n" +
			"    39  aload_0 [this]\n" +
			"    40  invokevirtual X.bool() : boolean [17]\n" +
			"    43  pop\n" +
			"    44  return\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 46]\n" +
			"        [pc: 7, line: 47]\n" +
			"        [pc: 28, line: 48]\n" +
			"        [pc: 36, line: 51]\n" +
			"        [pc: 39, line: 52]\n" +
			"        [pc: 44, line: 54]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 45] local: this index: 0 type: X\n" +
			"        [pc: 0, pc: 45] local: i index: 1 type: int\n"
		:
			"  // Method descriptor #6 ()V\n" +
			"  // Stack: 2, Locals: 2\n" +
			"  void foo();\n" +
			"     0  aload_0 [this]\n" +
			"     1  invokevirtual X.bool() : boolean [17]\n" +
			"     4  ifeq 16\n" +
			"     7  new java.lang.NullPointerException [19]\n" +
			"    10  dup\n" +
			"    11  invokespecial java.lang.NullPointerException() [21]\n" +
			"    14  athrow\n" +
			"    15  astore_1\n" +
			"    16  return\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 15] -> 15 when : java.lang.Exception\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 5]\n" +
			"        [pc: 7, line: 6]\n" +
			"        [pc: 15, line: 8]\n" +
			"        [pc: 16, line: 10]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 17] local: this index: 0 type: X\n" +
			"      Stack map table: number of frames 2\n" +
			"        [pc: 15, same_locals_1_stack_item, stack: {java.lang.Exception}]\n" +
			"        [pc: 16, same]\n" +
			"  \n" +
			"  // Method descriptor #6 ()V\n" +
			"  // Stack: 2, Locals: 2\n" +
			"  void foo2();\n" +
			"     0  aload_0 [this]\n" +
			"     1  invokevirtual X.bool() : boolean [17]\n" +
			"     4  ifeq 16\n" +
			"     7  new java.lang.NullPointerException [19]\n" +
			"    10  dup\n" +
			"    11  invokespecial java.lang.NullPointerException() [21]\n" +
			"    14  athrow\n" +
			"    15  astore_1\n" +
			"    16  return\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 15] -> 15 when : java.lang.Exception\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 13]\n" +
			"        [pc: 7, line: 14]\n" +
			"        [pc: 15, line: 16]\n" +
			"        [pc: 16, line: 18]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 17] local: this index: 0 type: X\n" +
			"      Stack map table: number of frames 2\n" +
			"        [pc: 15, same_locals_1_stack_item, stack: {java.lang.Exception}]\n" +
			"        [pc: 16, same]\n" +
			"  \n" +
			"  // Method descriptor #6 ()V\n" +
			"  // Stack: 2, Locals: 2\n" +
			"  void foo3();\n" +
			"     0  new java.lang.NullPointerException [19]\n" +
			"     3  dup\n" +
			"     4  invokespecial java.lang.NullPointerException() [21]\n" +
			"     7  athrow\n" +
			"     8  astore_1\n" +
			"     9  return\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 8] -> 8 when : java.lang.Exception\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 22]\n" +
			"        [pc: 8, line: 24]\n" +
			"        [pc: 9, line: 26]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 10] local: this index: 0 type: X\n" +
			"      Stack map table: number of frames 1\n" +
			"        [pc: 8, same_locals_1_stack_item, stack: {java.lang.Exception}]\n" +
			"  \n" +
			"  // Method descriptor #6 ()V\n" +
			"  // Stack: 2, Locals: 2\n" +
			"  void foo4();\n" +
			"     0  iconst_0\n" +
			"     1  istore_1 [i]\n" +
			"     2  aload_0 [this]\n" +
			"     3  invokevirtual X.bool() : boolean [17]\n" +
			"     6  ifeq 18\n" +
			"     9  new java.lang.NullPointerException [19]\n" +
			"    12  dup\n" +
			"    13  invokespecial java.lang.NullPointerException() [21]\n" +
			"    16  athrow\n" +
			"    17  astore_1\n" +
			"    18  return\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 17] -> 17 when : java.lang.Exception\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 29]\n" +
			"        [pc: 9, line: 30]\n" +
			"        [pc: 17, line: 32]\n" +
			"        [pc: 18, line: 34]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 19] local: this index: 0 type: X\n" +
			"        [pc: 2, pc: 17] local: i index: 1 type: int\n" +
			"      Stack map table: number of frames 2\n" +
			"        [pc: 17, same_locals_1_stack_item, stack: {java.lang.Exception}]\n" +
			"        [pc: 18, same]\n" +
			"  \n" +
			"  // Method descriptor #6 ()V\n" +
			"  // Stack: 2, Locals: 1\n" +
			"  void bar();\n" +
			"     0  aload_0 [this]\n" +
			"     1  invokevirtual X.bool() : boolean [17]\n" +
			"     4  ifeq 22\n" +
			"     7  aload_0 [this]\n" +
			"     8  invokevirtual X.bool() : boolean [17]\n" +
			"    11  ifeq 37\n" +
			"    14  new java.lang.NullPointerException [19]\n" +
			"    17  dup\n" +
			"    18  invokespecial java.lang.NullPointerException() [21]\n" +
			"    21  athrow\n" +
			"    22  aload_0 [this]\n" +
			"    23  invokevirtual X.bool() : boolean [17]\n" +
			"    26  ifeq 37\n" +
			"    29  new java.lang.NullPointerException [19]\n" +
			"    32  dup\n" +
			"    33  invokespecial java.lang.NullPointerException() [21]\n" +
			"    36  athrow\n" +
			"    37  return\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 36]\n" +
			"        [pc: 7, line: 37]\n" +
			"        [pc: 14, line: 38]\n" +
			"        [pc: 22, line: 40]\n" +
			"        [pc: 29, line: 41]\n" +
			"        [pc: 37, line: 44]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 38] local: this index: 0 type: X\n" +
			"      Stack map table: number of frames 2\n" +
			"        [pc: 22, same]\n" +
			"        [pc: 37, same]\n" +
			"  \n" +
			"  // Method descriptor #32 (I)V\n" +
			"  // Stack: 2, Locals: 2\n" +
			"  void baz(int i);\n" +
			"     0  aload_0 [this]\n" +
			"     1  invokevirtual X.bool() : boolean [17]\n" +
			"     4  ifeq 39\n" +
			"     7  iload_1 [i]\n" +
			"     8  tableswitch default: 36\n" +
			"          case 0: 28\n" +
			"    28  new java.lang.NullPointerException [19]\n" +
			"    31  dup\n" +
			"    32  invokespecial java.lang.NullPointerException() [21]\n" +
			"    35  athrow\n" +
			"    36  goto 44\n" +
			"    39  aload_0 [this]\n" +
			"    40  invokevirtual X.bool() : boolean [17]\n" +
			"    43  pop\n" +
			"    44  return\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 46]\n" +
			"        [pc: 7, line: 47]\n" +
			"        [pc: 28, line: 48]\n" +
			"        [pc: 36, line: 51]\n" +
			"        [pc: 39, line: 52]\n" +
			"        [pc: 44, line: 54]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 45] local: this index: 0 type: X\n" +
			"        [pc: 0, pc: 45] local: i index: 1 type: int\n" +
			"      Stack map table: number of frames 4\n" +
			"        [pc: 28, same]\n" +
			"        [pc: 36, same]\n" +
			"        [pc: 39, same]\n" +
			"        [pc: 44, same]\n";
	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=114894 - variation
public void test050() throws Exception {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	boolean bool() { return true; }\n" +
				"	void foo() {\n" +
				"		check: try {\n" +
				"			if (bool()) {\n" +
				"				break check;\n" +
				"			}\n" +
				"		} catch (Exception e) {\n" +
				"		}\n" +
				"	}\n" +
				"	void foo2() {\n" +
				"		check: try {\n" +
				"			while (bool()) {\n" +
				"				break check;\n" +
				"			}\n" +
				"		} catch (Exception e) {\n" +
				"		}\n" +
				"	}\n" +
				"	void foo3() {\n" +
				"		check: try {\n" +
				"			do {\n" +
				"				if (true) break check;\n" +
				"			} while (bool());\n" +
				"		} catch (Exception e) {\n" +
				"		}\n" +
				"	}	\n" +
				"	void foo4() {\n" +
				"		check: try {\n" +
				"			for (int i  = 0; bool(); i++) {\n" +
				"				break check;\n" +
				"			}\n" +
				"		} catch (Exception e) {\n" +
				"		}\n" +
				"	}\n" +
				"	void bar() {\n" +
				"		check: if (bool()) {\n" +
				"			if (bool())\n" +
				"				break check;\n" +
				"		} else {\n" +
				"			if (bool()) {\n" +
				"				break check;\n" +
				"			}\n" +
				"		}\n" +
				"	}\n" +
				"	void baz(int i) {\n" +
				"		check: if (bool()) {\n" +
				"			switch(i) {\n" +
				"				case 0 : break check;\n" +
				"				default : break;\n" +
				"			}\n" +
				"		} else {\n" +
				"			bool();\n" +
				"		}\n" +
				"	}\n" +
				"}\n",
			},
			"");

	String expectedOutput = new CompilerOptions(getCompilerOptions()).complianceLevel < ClassFileConstants.JDK1_6
		?	"  // Method descriptor #6 ()V\n" +
				"  // Stack: 1, Locals: 2\n" +
				"  void foo();\n" +
				"     0  aload_0 [this]\n" +
				"     1  invokevirtual X.bool() : boolean [17]\n" +
				"     4  ifeq 11\n" +
				"     7  goto 11\n" +
				"    10  astore_1\n" +
				"    11  return\n" +
				"      Exception Table:\n" +
				"        [pc: 0, pc: 7] -> 10 when : java.lang.Exception\n" +
				"      Line numbers:\n" +
				"        [pc: 0, line: 5]\n" +
				"        [pc: 7, line: 6]\n" +
				"        [pc: 10, line: 8]\n" +
				"        [pc: 11, line: 10]\n" +
				"      Local variable table:\n" +
				"        [pc: 0, pc: 12] local: this index: 0 type: X\n" +
				"  \n" +
				"  // Method descriptor #6 ()V\n" +
				"  // Stack: 1, Locals: 2\n" +
				"  void foo2();\n" +
				"     0  aload_0 [this]\n" +
				"     1  invokevirtual X.bool() : boolean [17]\n" +
				"     4  ifeq 11\n" +
				"     7  goto 11\n" +
				"    10  astore_1\n" +
				"    11  return\n" +
				"      Exception Table:\n" +
				"        [pc: 0, pc: 7] -> 10 when : java.lang.Exception\n" +
				"      Line numbers:\n" +
				"        [pc: 0, line: 13]\n" +
				"        [pc: 7, line: 14]\n" +
				"        [pc: 10, line: 16]\n" +
				"        [pc: 11, line: 18]\n" +
				"      Local variable table:\n" +
				"        [pc: 0, pc: 12] local: this index: 0 type: X\n" +
				"  \n" +
				"  // Method descriptor #6 ()V\n" +
				"  // Stack: 0, Locals: 1\n" +
				"  void foo3();\n" +
				"    0  return\n" +
				"      Line numbers:\n" +
				"        [pc: 0, line: 26]\n" +
				"      Local variable table:\n" +
				"        [pc: 0, pc: 1] local: this index: 0 type: X\n" +
				"  \n" +
				"  // Method descriptor #6 ()V\n" +
				"  // Stack: 1, Locals: 2\n" +
				"  void foo4();\n" +
				"     0  iconst_0\n" +
				"     1  istore_1 [i]\n" +
				"     2  aload_0 [this]\n" +
				"     3  invokevirtual X.bool() : boolean [17]\n" +
				"     6  ifeq 13\n" +
				"     9  goto 13\n" +
				"    12  astore_1\n" +
				"    13  return\n" +
				"      Exception Table:\n" +
				"        [pc: 0, pc: 9] -> 12 when : java.lang.Exception\n" +
				"      Line numbers:\n" +
				"        [pc: 0, line: 29]\n" +
				"        [pc: 9, line: 30]\n" +
				"        [pc: 12, line: 32]\n" +
				"        [pc: 13, line: 34]\n" +
				"      Local variable table:\n" +
				"        [pc: 0, pc: 14] local: this index: 0 type: X\n" +
				"        [pc: 2, pc: 12] local: i index: 1 type: int\n" +
				"  \n" +
				"  // Method descriptor #6 ()V\n" +
				"  // Stack: 1, Locals: 1\n" +
				"  void bar();\n" +
				"     0  aload_0 [this]\n" +
				"     1  invokevirtual X.bool() : boolean [17]\n" +
				"     4  ifeq 17\n" +
				"     7  aload_0 [this]\n" +
				"     8  invokevirtual X.bool() : boolean [17]\n" +
				"    11  ifeq 24\n" +
				"    14  goto 24\n" +
				"    17  aload_0 [this]\n" +
				"    18  invokevirtual X.bool() : boolean [17]\n" +
				"    21  ifeq 24\n" +
				"    24  return\n" +
				"      Line numbers:\n" +
				"        [pc: 0, line: 36]\n" +
				"        [pc: 7, line: 37]\n" +
				"        [pc: 14, line: 38]\n" +
				"        [pc: 17, line: 40]\n" +
				"        [pc: 24, line: 44]\n" +
				"      Local variable table:\n" +
				"        [pc: 0, pc: 25] local: this index: 0 type: X\n" +
				"  \n" +
				"  // Method descriptor #28 (I)V\n" +
				"  // Stack: 1, Locals: 2\n" +
				"  void baz(int i);\n" +
				"     0  aload_0 [this]\n" +
				"     1  invokevirtual X.bool() : boolean [17]\n" +
				"     4  ifeq 34\n" +
				"     7  iload_1 [i]\n" +
				"     8  tableswitch default: 31\n" +
				"          case 0: 28\n" +
				"    28  goto 39\n" +
				"    31  goto 39\n" +
				"    34  aload_0 [this]\n" +
				"    35  invokevirtual X.bool() : boolean [17]\n" +
				"    38  pop\n" +
				"    39  return\n" +
				"      Line numbers:\n" +
				"        [pc: 0, line: 46]\n" +
				"        [pc: 7, line: 47]\n" +
				"        [pc: 28, line: 48]\n" +
				"        [pc: 31, line: 51]\n" +
				"        [pc: 34, line: 52]\n" +
				"        [pc: 39, line: 54]\n" +
				"      Local variable table:\n" +
				"        [pc: 0, pc: 40] local: this index: 0 type: X\n" +
				"        [pc: 0, pc: 40] local: i index: 1 type: int\n"
		:
			"  // Method descriptor #6 ()V\n" +
			"  // Stack: 1, Locals: 2\n" +
			"  void foo();\n" +
			"     0  aload_0 [this]\n" +
			"     1  invokevirtual X.bool() : boolean [17]\n" +
			"     4  ifeq 11\n" +
			"     7  goto 11\n" +
			"    10  astore_1\n" +
			"    11  return\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 7] -> 10 when : java.lang.Exception\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 5]\n" +
			"        [pc: 7, line: 6]\n" +
			"        [pc: 10, line: 8]\n" +
			"        [pc: 11, line: 10]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 12] local: this index: 0 type: X\n" +
			"      Stack map table: number of frames 2\n" +
			"        [pc: 10, same_locals_1_stack_item, stack: {java.lang.Exception}]\n" +
			"        [pc: 11, same]\n" +
			"  \n" +
			"  // Method descriptor #6 ()V\n" +
			"  // Stack: 1, Locals: 2\n" +
			"  void foo2();\n" +
			"     0  aload_0 [this]\n" +
			"     1  invokevirtual X.bool() : boolean [17]\n" +
			"     4  ifeq 11\n" +
			"     7  goto 11\n" +
			"    10  astore_1\n" +
			"    11  return\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 7] -> 10 when : java.lang.Exception\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 13]\n" +
			"        [pc: 7, line: 14]\n" +
			"        [pc: 10, line: 16]\n" +
			"        [pc: 11, line: 18]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 12] local: this index: 0 type: X\n" +
			"      Stack map table: number of frames 2\n" +
			"        [pc: 10, same_locals_1_stack_item, stack: {java.lang.Exception}]\n" +
			"        [pc: 11, same]\n" +
			"  \n" +
			"  // Method descriptor #6 ()V\n" +
			"  // Stack: 0, Locals: 1\n" +
			"  void foo3();\n" +
			"    0  return\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 26]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 1] local: this index: 0 type: X\n" +
			"  \n" +
			"  // Method descriptor #6 ()V\n" +
			"  // Stack: 1, Locals: 2\n" +
			"  void foo4();\n" +
			"     0  iconst_0\n" +
			"     1  istore_1 [i]\n" +
			"     2  aload_0 [this]\n" +
			"     3  invokevirtual X.bool() : boolean [17]\n" +
			"     6  ifeq 13\n" +
			"     9  goto 13\n" +
			"    12  astore_1\n" +
			"    13  return\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 9] -> 12 when : java.lang.Exception\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 29]\n" +
			"        [pc: 9, line: 30]\n" +
			"        [pc: 12, line: 32]\n" +
			"        [pc: 13, line: 34]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 14] local: this index: 0 type: X\n" +
			"        [pc: 2, pc: 12] local: i index: 1 type: int\n" +
			"      Stack map table: number of frames 2\n" +
			"        [pc: 12, same_locals_1_stack_item, stack: {java.lang.Exception}]\n" +
			"        [pc: 13, same]\n" +
			"  \n" +
			"  // Method descriptor #6 ()V\n" +
			"  // Stack: 1, Locals: 1\n" +
			"  void bar();\n" +
			"     0  aload_0 [this]\n" +
			"     1  invokevirtual X.bool() : boolean [17]\n" +
			"     4  ifeq 17\n" +
			"     7  aload_0 [this]\n" +
			"     8  invokevirtual X.bool() : boolean [17]\n" +
			"    11  ifeq 24\n" +
			"    14  goto 24\n" +
			"    17  aload_0 [this]\n" +
			"    18  invokevirtual X.bool() : boolean [17]\n" +
			"    21  ifeq 24\n" +
			"    24  return\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 36]\n" +
			"        [pc: 7, line: 37]\n" +
			"        [pc: 14, line: 38]\n" +
			"        [pc: 17, line: 40]\n" +
			"        [pc: 24, line: 44]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 25] local: this index: 0 type: X\n" +
			"      Stack map table: number of frames 2\n" +
			"        [pc: 17, same]\n" +
			"        [pc: 24, same]\n" +
			"  \n" +
			"  // Method descriptor #29 (I)V\n" +
			"  // Stack: 1, Locals: 2\n" +
			"  void baz(int i);\n" +
			"     0  aload_0 [this]\n" +
			"     1  invokevirtual X.bool() : boolean [17]\n" +
			"     4  ifeq 34\n" +
			"     7  iload_1 [i]\n" +
			"     8  tableswitch default: 31\n" +
			"          case 0: 28\n" +
			"    28  goto 39\n" +
			"    31  goto 39\n" +
			"    34  aload_0 [this]\n" +
			"    35  invokevirtual X.bool() : boolean [17]\n" +
			"    38  pop\n" +
			"    39  return\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 46]\n" +
			"        [pc: 7, line: 47]\n" +
			"        [pc: 28, line: 48]\n" +
			"        [pc: 31, line: 51]\n" +
			"        [pc: 34, line: 52]\n" +
			"        [pc: 39, line: 54]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 40] local: this index: 0 type: X\n" +
			"        [pc: 0, pc: 40] local: i index: 1 type: int\n" +
			"      Stack map table: number of frames 4\n" +
			"        [pc: 28, same]\n" +
			"        [pc: 31, same]\n" +
			"        [pc: 34, same]\n" +
			"        [pc: 39, same]\n";

	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=114894 - variation
public void test051() throws Exception {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public static void main(String argv[]) {\n" +
				"		System.out.println(\"[count=\" + count() + \"]\");\n" +
				"	}\n" +
				"	static int count() {\n" +
				"		int count = 0;\n" +
				"		try {\n" +
				"			for (int i = 0;;) {\n" +
				"				count++;\n" +
				"				if (i++ > 10) \n" +
				"					break; \n" +
				"			}\n" +
				"		} catch(Exception e) {\n" +
				"		}\n" +
				"		return count;\n" +
				"	}\n" +
				"}\n",
			},
			"[count=12]");

	String expectedOutput = new CompilerOptions(getCompilerOptions()).complianceLevel < ClassFileConstants.JDK1_6
		?	"  // Method descriptor #32 ()I\n" +
			"  // Stack: 2, Locals: 2\n" +
			"  static int count();\n" +
			"     0  iconst_0\n" +
			"     1  istore_0 [count]\n" +
			"     2  iconst_0\n" +
			"     3  istore_1 [i]\n" +
			"     4  iinc 0 1 [count]\n" +
			"     7  iload_1 [i]\n" +
			"     8  iinc 1 1 [i]\n" +
			"    11  bipush 10\n" +
			"    13  if_icmple 4\n" +
			"    16  goto 20\n" +
			"    19  astore_1\n" +
			"    20  iload_0 [count]\n" +
			"    21  ireturn\n" +
			"      Exception Table:\n" +
			"        [pc: 2, pc: 16] -> 19 when : java.lang.Exception\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 6]\n" +
			"        [pc: 2, line: 8]\n" +
			"        [pc: 4, line: 9]\n" +
			"        [pc: 7, line: 10]\n" +
			"        [pc: 16, line: 13]\n" +
			"        [pc: 20, line: 15]\n" +
			"      Local variable table:\n" +
			"        [pc: 2, pc: 22] local: count index: 0 type: int\n" +
			"        [pc: 4, pc: 16] local: i index: 1 type: int\n"
		:
			"  // Method descriptor #32 ()I\n" +
			"  // Stack: 2, Locals: 2\n" +
			"  static int count();\n" +
			"     0  iconst_0\n" +
			"     1  istore_0 [count]\n" +
			"     2  iconst_0\n" +
			"     3  istore_1 [i]\n" +
			"     4  iinc 0 1 [count]\n" +
			"     7  iload_1 [i]\n" +
			"     8  iinc 1 1 [i]\n" +
			"    11  bipush 10\n" +
			"    13  if_icmple 4\n" +
			"    16  goto 20\n" +
			"    19  astore_1\n" +
			"    20  iload_0 [count]\n" +
			"    21  ireturn\n" +
			"      Exception Table:\n" +
			"        [pc: 2, pc: 16] -> 19 when : java.lang.Exception\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 6]\n" +
			"        [pc: 2, line: 8]\n" +
			"        [pc: 4, line: 9]\n" +
			"        [pc: 7, line: 10]\n" +
			"        [pc: 16, line: 13]\n" +
			"        [pc: 20, line: 15]\n" +
			"      Local variable table:\n" +
			"        [pc: 2, pc: 22] local: count index: 0 type: int\n" +
			"        [pc: 4, pc: 16] local: i index: 1 type: int\n" +
			"      Stack map table: number of frames 3\n" +
			"        [pc: 4, append: {int, int}]\n" +
			"        [pc: 19, full, stack: {java.lang.Exception}, locals: {int}]\n" +
			"        [pc: 20, same]\n";

	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=114894 - variation
public void test052() throws Exception {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public static void main(String argv[]) {\n" +
				"		try {\n" +
				"			for (int i = 0; i < 0; i++)\n" +
				"				do ;  while (true);\n" +
				"		} catch(Exception e) {\n" +
				"		}\n" +
				"	} \n" +
				"}\n",
			},
			"");

	String expectedOutput = new CompilerOptions(getCompilerOptions()).complianceLevel < ClassFileConstants.JDK1_6
		?	"  // Method descriptor #15 ([Ljava/lang/String;)V\n" +
			"  // Stack: 1, Locals: 2\n" +
			"  public static void main(java.lang.String[] argv);\n" +
			"     0  iconst_0\n" +
			"     1  istore_1 [i]\n" +
			"     2  iload_1 [i]\n" +
			"     3  ifge 10\n" +
			"     6  goto 6\n" +
			"     9  astore_1\n" +
			"    10  return\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 9] -> 9 when : java.lang.Exception\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 4]\n" +
			"        [pc: 6, line: 5]\n" +
			"        [pc: 9, line: 6]\n" +
			"        [pc: 10, line: 8]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 11] local: argv index: 0 type: java.lang.String[]\n" +
			"        [pc: 2, pc: 9] local: i index: 1 type: int\n"
		:
			"  // Method descriptor #15 ([Ljava/lang/String;)V\n" +
			"  // Stack: 1, Locals: 2\n" +
			"  public static void main(java.lang.String[] argv);\n" +
			"     0  iconst_0\n" +
			"     1  istore_1 [i]\n" +
			"     2  iload_1 [i]\n" +
			"     3  ifge 10\n" +
			"     6  goto 6\n" +
			"     9  astore_1\n" +
			"    10  return\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 9] -> 9 when : java.lang.Exception\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 4]\n" +
			"        [pc: 6, line: 5]\n" +
			"        [pc: 9, line: 6]\n" +
			"        [pc: 10, line: 8]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 11] local: argv index: 0 type: java.lang.String[]\n" +
			"        [pc: 2, pc: 9] local: i index: 1 type: int\n" +
			"      Stack map table: number of frames 3\n" +
			"        [pc: 6, append: {int}]\n" +
			"        [pc: 9, full, stack: {java.lang.Exception}, locals: {java.lang.String[]}]\n" +
			"        [pc: 10, same]\n";

	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=114894 - variation
public void test053() throws Exception {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		try {\n" +
				"			final int val;\n" +
				"			for (val = 7; val > 0;) break;\n" +
				"			System.out.println(val);\n" +
				"		} catch(Exception e) {\n" +
				"		}\n" +
				"	}	\n" +
				"}\n",
			},
			"7");

	String expectedOutput = new CompilerOptions(getCompilerOptions()).complianceLevel < ClassFileConstants.JDK1_6
		?	"  // Method descriptor #15 ([Ljava/lang/String;)V\n" +
			"  // Stack: 2, Locals: 2\n" +
			"  public static void main(java.lang.String[] args);\n" +
			"     0  bipush 7\n" +
			"     2  istore_1 [val]\n" +
			"     3  iload_1 [val]\n" +
			"     4  ifle 7\n" +
			"     7  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"    10  iload_1 [val]\n" +
			"    11  invokevirtual java.io.PrintStream.println(int) : void [22]\n" +
			"    14  goto 18\n" +
			"    17  astore_1\n" +
			"    18  return\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 14] -> 17 when : java.lang.Exception\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 5]\n" +
			"        [pc: 7, line: 6]\n" +
			"        [pc: 14, line: 7]\n" +
			"        [pc: 18, line: 9]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 19] local: args index: 0 type: java.lang.String[]\n" +
			"        [pc: 3, pc: 14] local: val index: 1 type: int\n"
		:
			"  // Method descriptor #15 ([Ljava/lang/String;)V\n" +
			"  // Stack: 2, Locals: 2\n" +
			"  public static void main(java.lang.String[] args);\n" +
			"     0  bipush 7\n" +
			"     2  istore_1 [val]\n" +
			"     3  iload_1 [val]\n" +
			"     4  ifle 7\n" +
			"     7  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"    10  iload_1 [val]\n" +
			"    11  invokevirtual java.io.PrintStream.println(int) : void [22]\n" +
			"    14  goto 18\n" +
			"    17  astore_1\n" +
			"    18  return\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 14] -> 17 when : java.lang.Exception\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 5]\n" +
			"        [pc: 7, line: 6]\n" +
			"        [pc: 14, line: 7]\n" +
			"        [pc: 18, line: 9]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 19] local: args index: 0 type: java.lang.String[]\n" +
			"        [pc: 3, pc: 14] local: val index: 1 type: int\n" +
			"      Stack map table: number of frames 3\n" +
			"        [pc: 7, append: {int}]\n" +
			"        [pc: 17, full, stack: {java.lang.Exception}, locals: {java.lang.String[]}]\n" +
			"        [pc: 18, same]\n";

	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=114894 - variation
public void test054() throws Exception {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				" X parent;\n" +
				" int kind;\n" +
				" static boolean F = false;\n" +
				" public static void main(String[] args) {\n" +
				"  X x = new X();\n" +
				"  x.kind = 2; \n" +
				"  try {\n" +
				"   x.foo();\n" +
				"  } catch(NullPointerException e) { \n" +
				"   System.out.println(\"SUCCESS\");\n" +
				"   return;\n" +
				"  }\n" +
				"  System.out.println(\"FAILED\");  \n" +
				" }\n" +
				" void foo() {\n" +
				"  X x = this;\n" +
				"  done : while (true) {\n" +
				"   switch (x.kind) {\n" +
				"    case 2 :\n" +
				"     if (F) {\n" +
				"      return;\n" +
				"     }\n" +
				"     break;\n" +
				"    case 3 :\n" +
				"     break done;\n" +
				"   }\n" +
				"   x = x.parent; // should throw npe\n" +
				"  }\n" +
				" } \n" +
				"}\n",
			},
			"SUCCESS");

	String expectedOutput = new CompilerOptions(getCompilerOptions()).complianceLevel < ClassFileConstants.JDK1_6
		?	"  // Method descriptor #12 ()V\n" +
			"  // Stack: 1, Locals: 2\n" +
			"  void foo();\n" +
			"     0  aload_0 [this]\n" +
			"     1  astore_1 [x]\n" +
			"     2  aload_1 [x]\n" +
			"     3  getfield X.kind : int [25]\n" +
			"     6  tableswitch default: 38\n" +
			"          case 2: 28\n" +
			"          case 3: 35\n" +
			"    28  getstatic X.F : boolean [14]\n" +
			"    31  ifeq 38\n" +
			"    34  return\n" +
			"    35  goto 46\n" +
			"    38  aload_1 [x]\n" +
			"    39  getfield X.parent : X [53]\n" +
			"    42  astore_1 [x]\n" +
			"    43  goto 2\n" +
			"    46  return\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 17]\n" +
			"        [pc: 2, line: 19]\n" +
			"        [pc: 28, line: 21]\n" +
			"        [pc: 34, line: 22]\n" +
			"        [pc: 35, line: 26]\n" +
			"        [pc: 38, line: 27]\n" +
			"        [pc: 39, line: 28]\n" +
			"        [pc: 43, line: 18]\n" +
			"        [pc: 46, line: 30]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 47] local: this index: 0 type: X\n" +
			"        [pc: 2, pc: 47] local: x index: 1 type: X\n"
		:
			"  // Method descriptor #12 ()V\n" +
			"  // Stack: 1, Locals: 2\n" +
			"  void foo();\n" +
			"     0  aload_0 [this]\n" +
			"     1  astore_1 [x]\n" +
			"     2  aload_1 [x]\n" +
			"     3  getfield X.kind : int [25]\n" +
			"     6  tableswitch default: 38\n" +
			"          case 2: 28\n" +
			"          case 3: 35\n" +
			"    28  getstatic X.F : boolean [14]\n" +
			"    31  ifeq 38\n" +
			"    34  return\n" +
			"    35  goto 46\n" +
			"    38  aload_1 [x]\n" +
			"    39  getfield X.parent : X [55]\n" +
			"    42  astore_1 [x]\n" +
			"    43  goto 2\n" +
			"    46  return\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 17]\n" +
			"        [pc: 2, line: 19]\n" +
			"        [pc: 28, line: 21]\n" +
			"        [pc: 34, line: 22]\n" +
			"        [pc: 35, line: 26]\n" +
			"        [pc: 38, line: 27]\n" +
			"        [pc: 39, line: 28]\n" +
			"        [pc: 43, line: 18]\n" +
			"        [pc: 46, line: 30]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 47] local: this index: 0 type: X\n" +
			"        [pc: 2, pc: 47] local: x index: 1 type: X\n" +
			"      Stack map table: number of frames 5\n" +
			"        [pc: 2, append: {X}]\n" +
			"        [pc: 28, same]\n" +
			"        [pc: 35, same]\n" +
			"        [pc: 38, same]\n" +
			"        [pc: 46, same]\n";

	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=114894 - variation
public void test055() throws Exception {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"\n" +
				"void foo5() {\n" +
				"  L : for (;;) {\n" +
				"    continue L; // good\n" +
				"  }\n" +
				"}\n" +
				"}\n",
			},
			"");

	String expectedOutput = new CompilerOptions(getCompilerOptions()).complianceLevel < ClassFileConstants.JDK1_6
		?	"  // Method descriptor #6 ()V\n" +
			"  // Stack: 0, Locals: 1\n" +
			"  void foo5();\n" +
			"    0  goto 0\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 4]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 3] local: this index: 0 type: X\n"
		:
			"  // Method descriptor #6 ()V\n" +
			"  // Stack: 0, Locals: 1\n" +
			"  void foo5();\n" +
			"    0  goto 0\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 4]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 3] local: this index: 0 type: X\n" +
			"      Stack map table: number of frames 1\n" +
			"        [pc: 0, same]\n";

	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}
public void _test056() {
	this.runNegativeTest(
		new String[] {
			"p/BytecodeA.java",
			"package p;\n" +
			"class BytecodeA {\n" +
			"  \n" +
			"int foo() { // good\n" +
			"  boolean b = true;\n" +
			"  if (b) {\n" +
			"    if (true)\n" +
			"      return 0;\n" +
			"  } else {\n" +
			"    if (true)\n" +
			"      return 1;\n" +
			"  }\n" +
			"  return 5;\n" +
			"}\n" +
			"int foo10() {\n" +
			"  try {\n" +
			"    //if (true)\n" +
			"      return 0;\n" +
			"  } catch (Exception e) {\n" +
			"    if (true)\n" +
			"      return 1;\n" +
			"  } finally {\n" +
			"    if (true)\n" +
			"      return 2;\n" +
			"  };\n" +
			"  return 1;\n" +
			"}   \n" +
			"int foo11() {\n" +
			"  synchronized (this) {\n" +
			"    if (true)\n" +
			"      return 1;\n" +
			"  };\n" +
			"  return 2;\n" +
			"} \n" +
			"int foo12() {\n" +
			"  for (;;)\n" +
			"    return 1;\n" +
			"}\n" +
			"int foo13() {\n" +
			"  for (;;)\n" +
			"    if (true)\n" +
			"      return 1;\n" +
			"}\n" +
			"int foo14() {\n" +
			"  for (int i = 1; i < 10; i++)\n" +
			"    if (true)\n" +
			"      return 1;\n" +
			"  return 2;\n" +
			"} \n" +
			"int foo15() {\n" +
			"  for (int i = 1; i < 10; i++)\n" +
			"    return 1;\n" +
			"  return 2;\n" +
			"}\n" +
			"int foo16() {\n" +
			"  final int i;\n" +
			"  while (true) {\n" +
			"    i = 1;\n" +
			"    if (true)\n" +
			"      break;\n" +
			"  };\n" +
			"  return 1;\n" +
			"}              \n" +
			"int foo17() {\n" +
			"  final int i;\n" +
			"  for (;;) {\n" +
			"    i = 1;\n" +
			"    if (true)\n" +
			"      break;\n" +
			"  };\n" +
			"  return 1;\n" +
			"} \n" +
			"void foo2() {\n" +
			"  L1 :;  // good\n" +
			"}\n" +
			"void foo20() {\n" +
			"  if (true)\n" +
			"    return;\n" +
			"} \n" +
			"void foo3() {\n" +
			"  L : if (true) {\n" +
			"    for (;;) {\n" +
			"      continue L; // bad\n" +
			"    }\n" +
			"  }\n" +
			"}   \n" +
			"void foo4() {\n" +
			"  L : if (true) {\n" +
			"    try {\n" +
			"      for (;;) {\n" +
			"        continue L; // bad\n" +
			"      }\n" +
			"    } finally {\n" +
			"      return;\n" +
			"    }\n" +
			"  } \n" +
			"}\n" +
			"void foo5() {\n" +
			"  L : for (;;) {\n" +
			"    continue L; // good\n" +
			"  }\n" +
			"}\n" +
			"void foo5bis() {\n" +
			"  L : K : for (;;) {\n" +
			"    continue L; // good\n" +
			"  }\n" +
			"}\n" +
			"void foo6(){\n" +
			"  int i;\n" +
			"  boolean a[] = new boolean[5];\n" +
			"  a[i=1] = i > 0; // good\n" +
			"}    \n" +
			"void foo7(){\n" +
			"  Object x[];\n" +
			"  x [1] = (x = new Object[5]); // bad\n" +
			"}    \n" +
			"void foo8() {\n" +
			"  try {\n" +
			"  } catch (java.io.IOException e) {\n" +
			"    foo(); // unreachable\n" +
			"  }\n" +
			"}\n" +
			"void foo9() {\n" +
			"  try {\n" +
			"  } catch (NullPointerException e) {\n" +
			"    foo(); // ok\n" +
			"  }\n" +
			"}\n" +
			"    public static void main(String args[]) {\n" +
			"      BytecodeA a = new BytecodeA();\n" +
			"      a.foo10();\n" +
			"    }\n" +
			"}",
		},
		"----------\n" +
		"1. WARNING in p\\BytecodeA.java (at line 74)\n" +
		"	L1 :;  // good\n" +
		"	^^\n" +
		"The label L1 is never explicitly referenced\n" +
		"----------\n" +
		"2. ERROR in p\\BytecodeA.java (at line 83)\n" +
		"	continue L; // bad\n" +
		"	^^^^^^^^^^\n" +
		"continue cannot be used outside of a loop\n" +
		"----------\n" +
		"3. ERROR in p\\BytecodeA.java (at line 91)\n" +
		"	continue L; // bad\n" +
		"	^^^^^^^^^^\n" +
		"continue cannot be used outside of a loop\n" +
		"----------\n" +
		"4. WARNING in p\\BytecodeA.java (at line 93)\n" +
		"	} finally {\n" +
		"      return;\n" +
		"    }\n" +
		"	          ^^^^^^^^^^^^^^^^^^^^^\n" +
		"finally block does not complete normally\n" +
		"----------\n" +
		"5. WARNING in p\\BytecodeA.java (at line 104)\n" +
		"	L : K : for (;;) {\n" +
		"	    ^\n" +
		"The label K is never explicitly referenced\n" +
		"----------\n" +
		"6. ERROR in p\\BytecodeA.java (at line 105)\n" +
		"	continue L; // good\n" +
		"	^^^^^^^^^^\n" +
		"continue cannot be used outside of a loop\n" +
		"----------\n" +
		"7. ERROR in p\\BytecodeA.java (at line 115)\n" +
		"	x [1] = (x = new Object[5]); // bad\n" +
		"	^\n" +
		"The local variable x may not have been initialized\n" +
		"----------\n" +
		"8. ERROR in p\\BytecodeA.java (at line 119)\n" +
		"	} catch (java.io.IOException e) {\n" +
		"	         ^^^^^^^^^^^^^^^^^^^\n" +
		"Unreachable catch block for IOException. This exception is never thrown from the try statement body\n" +
		"----------\n");
}

// was Compliance_1_x#test007
public void test057() {
	String[] sources = new String[] {
		"p1/Test.java",
		"package p1; \n"+
		"public class Test { \n"+
		"	public static void main(String[] arguments) { \n"+
		"		try {	\n" +
		"			throw null; \n"+
		"		} catch(NullPointerException e){ 	\n" +
		"			System.out.println(\"SUCCESS\");	\n"	+
		"		}	\n" +
		"	} \n"+
		"} \n"
	};
	if (this.complianceLevel == ClassFileConstants.JDK1_3) {
		runNegativeTest(
			sources,
			"----------\n" +
			"1. ERROR in p1\\Test.java (at line 5)\n" +
			"	throw null; \n" +
			"	      ^^^^\n" +
			"Cannot throw null as an exception\n" +
			"----------\n");
	} else {
		runConformTest(
			sources,
			"SUCCESS");
	}
}
//https://bugs.eclpse.org/bugs/show_bug.cgi?id=3184
public void test058() throws Exception {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public static void main(String args[]) {\n" +
				"		try {\n" +
				"			try {\n" +
				"				System.out.print(\"SU\");\n" +
				"			} finally {\n" +
				"				System.out.print(\"CC\");\n" +
				"			}\n" +
				"		} finally {\n" +
				"			System.out.println(\"ESS\");\n" +
				"		}\n" +
				"	}\n" +
				"}\n" +
				"",
			},
			"SUCCESS");

	String expectedOutput = new CompilerOptions(getCompilerOptions()).complianceLevel <= ClassFileConstants.JDK1_4
		?	"  // Method descriptor #15 ([Ljava/lang/String;)V\n" +
			"  // Stack: 2, Locals: 5\n" +
			"  public static void main(java.lang.String[] args);\n" +
			"     0  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"     3  ldc <String \"SU\"> [22]\n" +
			"     5  invokevirtual java.io.PrintStream.print(java.lang.String) : void [24]\n" +
			"     8  goto 28\n" +
			"    11  astore_2\n" +
			"    12  jsr 17\n" +
			"    15  aload_2\n" +
			"    16  athrow\n" +
			"    17  astore_1\n" +
			"    18  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"    21  ldc <String \"CC\"> [30]\n" +
			"    23  invokevirtual java.io.PrintStream.print(java.lang.String) : void [24]\n" +
			"    26  ret 1\n" +
			"    28  jsr 17\n" +
			"    31  goto 53\n" +
			"    34  astore 4\n" +
			"    36  jsr 42\n" +
			"    39  aload 4\n" +
			"    41  athrow\n" +
			"    42  astore_3\n" +
			"    43  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"    46  ldc <String \"ESS\"> [32]\n" +
			"    48  invokevirtual java.io.PrintStream.println(java.lang.String) : void [34]\n" +
			"    51  ret 3\n" +
			"    53  jsr 42\n" +
			"    56  return\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 11] -> 11 when : any\n" +
			"        [pc: 28, pc: 31] -> 11 when : any\n" +
			"        [pc: 0, pc: 34] -> 34 when : any\n" +
			"        [pc: 53, pc: 56] -> 34 when : any\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 5]\n" +
			"        [pc: 8, line: 6]\n" +
			"        [pc: 15, line: 8]\n" +
			"        [pc: 17, line: 6]\n" +
			"        [pc: 18, line: 7]\n" +
			"        [pc: 26, line: 8]\n" +
			"        [pc: 31, line: 9]\n" +
			"        [pc: 39, line: 11]\n" +
			"        [pc: 42, line: 9]\n" +
			"        [pc: 43, line: 10]\n" +
			"        [pc: 51, line: 11]\n" +
			"        [pc: 56, line: 12]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 57] local: args index: 0 type: java.lang.String[]\n"
		:
			"  // Method descriptor #15 ([Ljava/lang/String;)V\n" +
			"  // Stack: 2, Locals: 3\n" +
			"  public static void main(java.lang.String[] args);\n" +
			"     0  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"     3  ldc <String \"SU\"> [22]\n" +
			"     5  invokevirtual java.io.PrintStream.print(java.lang.String) : void [24]\n" +
			"     8  goto 22\n" +
			"    11  astore_1\n" +
			"    12  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"    15  ldc <String \"CC\"> [30]\n" +
			"    17  invokevirtual java.io.PrintStream.print(java.lang.String) : void [24]\n" +
			"    20  aload_1\n" +
			"    21  athrow\n" +
			"    22  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"    25  ldc <String \"CC\"> [30]\n" +
			"    27  invokevirtual java.io.PrintStream.print(java.lang.String) : void [24]\n" +
			"    30  goto 44\n" +
			"    33  astore_2\n" +
			"    34  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"    37  ldc <String \"ESS\"> [32]\n" +
			"    39  invokevirtual java.io.PrintStream.println(java.lang.String) : void [34]\n" +
			"    42  aload_2\n" +
			"    43  athrow\n" +
			"    44  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"    47  ldc <String \"ESS\"> [32]\n" +
			"    49  invokevirtual java.io.PrintStream.println(java.lang.String) : void [34]\n" +
			"    52  return\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 11] -> 11 when : any\n" +
			"        [pc: 0, pc: 33] -> 33 when : any\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 5]\n" +
			"        [pc: 8, line: 6]\n" +
			"        [pc: 12, line: 7]\n" +
			"        [pc: 20, line: 8]\n" +
			"        [pc: 22, line: 7]\n" +
			"        [pc: 30, line: 9]\n" +
			"        [pc: 34, line: 10]\n" +
			"        [pc: 42, line: 11]\n" +
			"        [pc: 44, line: 10]\n" +
			"        [pc: 52, line: 12]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 53] local: args index: 0 type: java.lang.String[]\n";

	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=183395
public void test059() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"    public static void main(String[] args) {\n" +
			"    	try {\n" +
			"    		System.out.println(args.length);\n" +
			"    	} catch(Exception[] e) {\n" +
			"    		// ignore\n" +
			"    	}\n" +
			"    }\n" +
			"}"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	} catch(Exception[] e) {\n" +
		"	        ^^^^^^^^^^^\n" +
		"No exception of type Exception[] can be thrown; an exception type must be a subclass of Throwable\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=183395
public void test060() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"    public static void main(String[] args) {\n" +
			"    	try {\n" +
			"    		System.out.println(args.length);\n" +
			"    	} catch(int e) {\n" +
			"    		// ignore\n" +
			"    	}\n" +
			"    }\n" +
			"}"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	} catch(int e) {\n" +
		"	        ^^^\n" +
		"No exception of type int can be thrown; an exception type must be a subclass of Throwable\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=190209 - variation
public void test062() throws Exception {
	if (new CompilerOptions(getCompilerOptions()).complianceLevel < ClassFileConstants.JDK1_5) return; // need autoboxing
	this.runConformTest(
			new String[] {
				"X.java",
				"final public class X {\n" +
				"	final class MyClass {\n" +
				"		/** @param s */\n" +
				"		void foo(final String s) {\n" +
				"			 /* do nothing */\n" +
				"		}\n" +
				"	}\n" +
				"	Object bar() {\n" +
				"		try {\n" +
				"			final MyClass myClass = new MyClass();\n" +
				"			try {\n" +
				"				return 0;\n" +
				"			} catch (final Throwable ex) {\n" +
				"				myClass.foo(this == null ? \"\" : \"\");\n" +
				"			}\n" +
				"	\n" +
				"			return this;\n" +
				"		} finally {\n" +
				"			{ /* do nothing */ }\n" +
				"		}\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		new X().bar();\n" +
				"		System.out.print(\"SUCCESS\");\n" +
				"	}\n" +
				"}\n",
			},
			"SUCCESS");

	String expectedOutput =
			"  // Method descriptor #15 ()Ljava/lang/Object;\n" +
			"  // Stack: 3, Locals: 5\n" +
			"  java.lang.Object bar();\n" +
			"     0  new X$MyClass [16]\n" +
			"     3  dup\n" +
			"     4  aload_0 [this]\n" +
			"     5  invokespecial X$MyClass(X) [18]\n" +
			"     8  astore_1 [myClass]\n" +
			"     9  iconst_0\n" +
			"    10  invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [21]\n" +
			"    13  astore 4\n" +
			"    15  aload 4\n" +
			"    17  areturn\n" +
			"    18  astore_2 [ex]\n" +
			"    19  aload_1 [myClass]\n" +
			"    20  aload_0 [this]\n" +
			"    21  ifnonnull 29\n" +
			"    24  ldc <String \"\"> [27]\n" +
			"    26  goto 31\n" +
			"    29  ldc <String \"\"> [27]\n" +
			"    31  invokevirtual X$MyClass.foo(java.lang.String) : void [29]\n" +
			"    34  aload_0 [this]\n" +
			"    35  astore 4\n" +
			"    37  aload 4\n" +
			"    39  areturn\n" +
			"    40  astore_3\n" +
			"    41  aload_3\n" +
			"    42  athrow\n" +
			"      Exception Table:\n" +
			"        [pc: 9, pc: 15] -> 18 when : java.lang.Throwable\n" +
			"        [pc: 0, pc: 15] -> 40 when : any\n" +
			"        [pc: 18, pc: 37] -> 40 when : any\n";

	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=190209 - variation
public void test063() throws Exception {
	this.runConformTest(
			new String[] {
				"X.java",
				"final public class X {\n" +
				"	final class MyClass {\n" +
				"		/** @param s */\n" +
				"		void foo(final String s) {\n" +
				"			 /* do nothing */\n" +
				"		}\n" +
				"	}\n" +
				"	void bar() {\n" +
				"		try {\n" +
				"			final MyClass myClass = new MyClass();\n" +
				"			try {\n" +
				"				return;\n" +
				"			} catch (final Throwable ex) {\n" +
				"				myClass.foo(this == null ? \"\" : \"\");\n" +
				"			}\n" +
				"			return;\n" +
				"		} finally {\n" +
				"			{ /* do nothing */ }\n" +
				"		}\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		new X().bar();\n" +
				"		System.out.print(\"SUCCESS\");\n" +
				"	}\n" +
				"}\n",
			},
			"SUCCESS");

	String expectedOutput = new CompilerOptions(getCompilerOptions()).complianceLevel <= ClassFileConstants.JDK1_4
		?	"  // Method descriptor #6 ()V\n" +
			"  // Stack: 3, Locals: 5\n" +
			"  void bar();\n" +
			"     0  new X$MyClass [15]\n" +
			"     3  dup\n" +
			"     4  aload_0 [this]\n" +
			"     5  invokespecial X$MyClass(X) [17]\n" +
			"     8  astore_1 [myClass]\n" +
			"     9  jsr 21\n" +
			"    12  return\n" +
			"    13  astore 4\n" +
			"    15  jsr 21\n" +
			"    18  aload 4\n" +
			"    20  athrow\n" +
			"    21  astore_3\n" +
			"    22  ret 3\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 12] -> 13 when : any\n"
		:
			"  // Method descriptor #6 ()V\n" +
			"  // Stack: 3, Locals: 4\n" +
			"  void bar();\n" +
			"     0  new X$MyClass [15]\n" +
			"     3  dup\n" +
			"     4  aload_0 [this]\n" +
			"     5  invokespecial X$MyClass(X) [17]\n" +
			"     8  astore_1 [myClass]\n" +
			"     9  return\n" +
			"    10  return\n" +
			"    11  astore_3\n" +
			"    12  aload_3\n" +
			"    13  athrow\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 9] -> 11 when : any\n";

	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=190209 - variation
public void test064() throws Exception {
	this.runConformTest(
			new String[] {
				"X.java",
				"final public class X {\n" +
				"	final class MyClass {\n" +
				"		/** @param s */\n" +
				"		void foo(final String s) {\n" +
				"			 /* do nothing */\n" +
				"		}\n" +
				"	}\n" +
				"	Object bar() {\n" +
				"		try {\n" +
				"			final MyClass myClass = new MyClass();\n" +
				"			try {\n" +
				"				return null;\n" +
				"			} catch (final Throwable ex) {\n" +
				"				myClass.foo(this == null ? \"\" : \"\");\n" +
				"			}\n" +
				"			return null;\n" +
				"		} finally {\n" +
				"			{ /* do nothing */ }\n" +
				"		}\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		new X().bar();\n" +
				"		System.out.print(\"SUCCESS\");\n" +
				"	}\n" +
				"}\n",
			},
			"SUCCESS");

	String expectedOutput = new CompilerOptions(getCompilerOptions()).complianceLevel <= ClassFileConstants.JDK1_4
		?	"  // Method descriptor #15 ()Ljava/lang/Object;\n" +
			"  // Stack: 3, Locals: 5\n" +
			"  java.lang.Object bar();\n" +
			"     0  new X$MyClass [16]\n" +
			"     3  dup\n" +
			"     4  aload_0 [this]\n" +
			"     5  invokespecial X$MyClass(X) [18]\n" +
			"     8  astore_1 [myClass]\n" +
			"     9  jsr 22\n" +
			"    12  aconst_null\n" +
			"    13  areturn\n" +
			"    14  astore 4\n" +
			"    16  jsr 22\n" +
			"    19  aload 4\n" +
			"    21  athrow\n" +
			"    22  astore_3\n" +
			"    23  ret 3\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 12] -> 14 when : any\n"
		:	"  // Method descriptor #15 ()Ljava/lang/Object;\n" +
			"  // Stack: 3, Locals: 4\n" +
			"  java.lang.Object bar();\n" +
			"     0  new X$MyClass [16]\n" +
			"     3  dup\n" +
			"     4  aload_0 [this]\n" +
			"     5  invokespecial X$MyClass(X) [18]\n" +
			"     8  astore_1 [myClass]\n" +
			"     9  aconst_null\n" +
			"    10  areturn\n" +
			"    11  aconst_null\n" +
			"    12  areturn\n" +
			"    13  astore_3\n" +
			"    14  aload_3\n" +
			"    15  athrow\n" +
			"      Exception Table:\n" +
			"        [pc: 0, pc: 9] -> 13 when : any\n";

	File f = new File(OUTPUT_DIR + File.separator + "X.class");
	byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	int index = result.indexOf(expectedOutput);
	if (index == -1 || expectedOutput.length() == 0) {
		System.out.println(Util.displayString(result, 3));
	}
	if (index == -1) {
		assertEquals("Wrong contents", expectedOutput, result);
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=191865
public void test065() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	void foo() {\n" +
			"		try {\n" +
			"			System.out.println(\"Hello\");\n" +
			"		} finally {\n" +
			"			if (true)\n" +
			"				return;\n" +
			"		}\n" +
			"		return;\n" +
			"	}\n" +
			"	void bar() {\n" +
			"		try {\n" +
			"			System.out.println(\"Hello\");\n" +
			"		} finally {\n" +
			"			return;\n" +
			"		}\n" +
			"		return;\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 14)\n" +
		"	} finally {\n" +
		"			return;\n" +
		"		}\n" +
		"	          ^^^^^^^^^^^^^^^^\n" +
		"finally block does not complete normally\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 17)\n" +
		"	return;\n" +
		"	^^^^^^^\n" +
		"Unreachable code\n" +
		"----------\n");
}

//https://bugs.eclipse.org/bugs/show_bug.cgi?id=196653
public void test066() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	void bar() {\n" +
			"		try {\n" +
			"			Zork z = null;\n" +
			"			z.foo();\n" +
			"		} catch(Zork z) {\n" +
			"			z.foo();\n" +
			"		}		\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	Zork z = null;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 6)\n" +
		"	} catch(Zork z) {\n" +
		"	        ^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=248319
public void test067() throws Exception {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public static void main(final String[] args) {\n" +
				"		System.out.println(new X().verifyError());\n" +
				"	}\n" +
				"	private Object verifyError() {\n" +
				"		try {\n" +
				"			if (someBooleanMethod()) {\n" +
				"				return null;\n" +
				"			}\n" +
				"			return getStuff();\n" +
				"		} catch (final Exception ex) {\n" +
				"			return null;\n" +
				"		} finally {\n" +
				"			while (someBooleanMethod()) {\n" +
				"				anyMethod();\n" +
				"			}\n" +
				"		}\n" +
				"	}\n" +
				"	private void anyMethod() { /*empty*/ }\n" +
				"	private Object getStuff() { return null; }\n" +
				"	private boolean someBooleanMethod() { return false; }\n" +
				"}\n" +
				"",
			},
			"null");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=340485
public void test068() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
					"    public static void main(String [] args) {\n" +
					"        doSomething(false);\n" +
					"    }\n" +
					"    public static void doSomething (boolean bool) {\n" +
					"        try {\n" +
					"            if (bool)\n" +
					"                throw new GrandSonOfFoo();\n" +
					"            else \n" +
					"                throw new GrandDaughterOfFoo();\n" +
					"        } catch(Foo e) {\n" +
					"            try { \n" +
					"                    throw e; \n" +
					"            } catch (SonOfFoo e1) {\n" +
					"                 e1.printStackTrace();\n" +
					"            } catch (DaughterOfFoo e1) {\n" +
					"                System.out.println(\"caught a daughter of foo\");\n" +
					"            } catch (Foo f) {}\n" +
					"        }\n" +
					"    }\n" +
					"}\n" +
					"class Foo extends Exception {}\n" +
					"class SonOfFoo extends Foo {}\n" +
					"class GrandSonOfFoo extends SonOfFoo {}\n" +
					"class DaughterOfFoo extends Foo {}\n" +
					"class GrandDaughterOfFoo extends DaughterOfFoo {}\n"
		},
		"caught a daughter of foo");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=340484
public void test069() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"    public static void main(String[] args) {\n" +
			"        try {\n" +
			"            throw new DaughterOfFoo();\n" +
			"        } catch(Foo e) {\n" +
			"            try { \n" +
			"                while (true) {\n" +
			"                    throw e; \n" +
			"                }\n" +
			"            } catch (SonOfFoo e1) {\n" +
			"                 e1.printStackTrace();\n" +
			"            } catch (Foo e1) {}\n" +
			"        }\n" +
			"    }\n" +
			"}\n" +
			"class Foo extends Exception {}\n" +
			"class SonOfFoo extends Foo {}\n" +
			"class DaughterOfFoo extends Foo {}\n"
		},
		this.complianceLevel < ClassFileConstants.JDK1_7 ?
				"----------\n" +
				"1. WARNING in X.java (at line 16)\n" +
				"	class Foo extends Exception {}\n" +
				"	      ^^^\n" +
				"The serializable class Foo does not declare a static final serialVersionUID field of type long\n" +
				"----------\n" +
				"2. WARNING in X.java (at line 17)\n" +
				"	class SonOfFoo extends Foo {}\n" +
				"	      ^^^^^^^^\n" +
				"The serializable class SonOfFoo does not declare a static final serialVersionUID field of type long\n" +
				"----------\n" +
				"3. WARNING in X.java (at line 18)\n" +
				"	class DaughterOfFoo extends Foo {}\n" +
				"	      ^^^^^^^^^^^^^\n" +
				"The serializable class DaughterOfFoo does not declare a static final serialVersionUID field of type long\n" +
				"----------\n" :
				"----------\n" +
				"1. ERROR in X.java (at line 10)\n" +
				"	} catch (SonOfFoo e1) {\n" +
				"	         ^^^^^^^^\n" +
				"Unreachable catch block for SonOfFoo. This exception is never thrown from the try statement body\n" +
				"----------\n" +
				"2. WARNING in X.java (at line 16)\n" +
				"	class Foo extends Exception {}\n" +
				"	      ^^^\n" +
				"The serializable class Foo does not declare a static final serialVersionUID field of type long\n" +
				"----------\n" +
				"3. WARNING in X.java (at line 17)\n" +
				"	class SonOfFoo extends Foo {}\n" +
				"	      ^^^^^^^^\n" +
				"The serializable class SonOfFoo does not declare a static final serialVersionUID field of type long\n" +
				"----------\n" +
				"4. WARNING in X.java (at line 18)\n" +
				"	class DaughterOfFoo extends Foo {}\n" +
				"	      ^^^^^^^^^^^^^\n" +
				"The serializable class DaughterOfFoo does not declare a static final serialVersionUID field of type long\n" +
				"----------\n");
}
// precise throw computation should also take care of throws clause in 1.7. 1.6- should continue to behave as it always has.
public void test070() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void foo() throws DaughterOfFoo {\n" +
			"		try {\n" +
			"			throw new DaughterOfFoo();\n" +
			"		} catch (Foo e){\n" +
			"			throw e;\n" +
			"           foo();\n" +
			"		}\n"+
			"	}\n"+
			"	public static void main(String[] args) {\n" +
			"		try {\n" +
			"			foo();\n"+
			"		} catch(Foo e) {}\n" +
			"	}\n" +
			"}\n"+
			"class Foo extends Exception {}\n"+
			"class SonOfFoo extends Foo {}\n"+
			"class DaughterOfFoo extends Foo {}\n"
		},
		this.complianceLevel < ClassFileConstants.JDK1_7 ?
				"----------\n" +
				"1. ERROR in X.java (at line 6)\n" +
				"	throw e;\n" +
				"	^^^^^^^^\n" +
				"Unhandled exception type Foo\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 7)\n" +
				"	foo();\n" +
				"	^^^^^^\n" +
				"Unreachable code\n" +
				"----------\n" +
				"3. WARNING in X.java (at line 16)\n" +
				"	class Foo extends Exception {}\n" +
				"	      ^^^\n" +
				"The serializable class Foo does not declare a static final serialVersionUID field of type long\n" +
				"----------\n" +
				"4. WARNING in X.java (at line 17)\n" +
				"	class SonOfFoo extends Foo {}\n" +
				"	      ^^^^^^^^\n" +
				"The serializable class SonOfFoo does not declare a static final serialVersionUID field of type long\n" +
				"----------\n" +
				"5. WARNING in X.java (at line 18)\n" +
				"	class DaughterOfFoo extends Foo {}\n" +
				"	      ^^^^^^^^^^^^^\n" +
				"The serializable class DaughterOfFoo does not declare a static final serialVersionUID field of type long\n" +
				"----------\n":

				"----------\n" +
				"1. ERROR in X.java (at line 7)\n" +
				"	foo();\n" +
				"	^^^^^^\n" +
				"Unreachable code\n" +
				"----------\n" +
				"2. WARNING in X.java (at line 16)\n" +
				"	class Foo extends Exception {}\n" +
				"	      ^^^\n" +
				"The serializable class Foo does not declare a static final serialVersionUID field of type long\n" +
				"----------\n" +
				"3. WARNING in X.java (at line 17)\n" +
				"	class SonOfFoo extends Foo {}\n" +
				"	      ^^^^^^^^\n" +
				"The serializable class SonOfFoo does not declare a static final serialVersionUID field of type long\n" +
				"----------\n" +
				"4. WARNING in X.java (at line 18)\n" +
				"	class DaughterOfFoo extends Foo {}\n" +
				"	      ^^^^^^^^^^^^^\n" +
				"The serializable class DaughterOfFoo does not declare a static final serialVersionUID field of type long\n" +
				"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=348369
public void test071() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void main(String [] args) {\n" +
			"		try {\n" +
			"		} catch (Exception [][][][][]  e [][][][]) {\n" +
			"		}\n" +
			"    }\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	} catch (Exception [][][][][]  e [][][][]) {\n" +
		"	         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"No exception of type Exception[][][][][][][][][] can be thrown; an exception type must be a subclass of Throwable\n" +
		"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=348369
public void test072() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void main(String [] args) {\n" +
			"		try {\n" +
			"		} catch (Exception e []) {\n" +
			"		}\n" +
			"    }\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	} catch (Exception e []) {\n" +
		"	         ^^^^^^^^^^^^^^\n" +
		"No exception of type Exception[] can be thrown; an exception type must be a subclass of Throwable\n" +
		"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=348369
public void test073() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void main(String [] args) {\n" +
			"		try {\n" +
			"		} catch (Exception [] e) {\n" +
			"		}\n" +
			"    }\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	} catch (Exception [] e) {\n" +
		"	         ^^^^^^^^^^^^\n" +
		"No exception of type Exception[] can be thrown; an exception type must be a subclass of Throwable\n" +
		"----------\n");
}
// test for regression during work on bug 345305
// saw "The local variable name may not have been initialized" against last code line
public void test074() {
	runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	Class test(String name) throws ClassNotFoundException {\n" +
			"		Class c= findClass(name);\n" +
			"		if (c != null)\n" +
			"			return c;\n" +
			"		if (isExcluded(name)) {\n" +
			"			try {\n" +
			"				c= findClass(name);\n" +
			"				return c;\n" +
			"			} catch (ClassNotFoundException e) {\n" +
			"				// keep searching\n" +
			"			}\n" +
			"		}\n" +
			"		return findClass(name);\n" +
			"    }\n" +
			"    boolean isExcluded(String name) { return false; }\n" +
			"    Class findClass(String name) throws ClassNotFoundException { return null; }\n" +
			"}\n"
		});
}

// Bug 387612 - Unreachable catch block...exception is never thrown from the try
// redundant exception in throws must not confuse downstream analysis
public void testBug387612() {
	String serialUID = "private static final long serialVersionUID=1L;";
	runNegativeTest(
		new String[] {
			"E.java",
			"public class E extends Exception {"+serialUID+"}\n",
			"E1.java",
			"public class E1 extends E {"+serialUID+"}\n",
			"E2.java",
			"public class E2 extends E {"+serialUID+"}\n",
			"E3.java",
			"public class E3 extends E {"+serialUID+"}\n",
			"A.java",
			"interface A {\n" +
			"    void foo(String a1, String a2) throws E1, E;\n" +
			"}\n",
			"B.java",
			"interface B extends A {\n" +
			"    void foo(String a1, String a2) throws E;\n" +
			"}\n",
			"Client.java",
			"public class Client {\n" +
			"    void test() {\n" +
			"        B b = new B() {\n" +
			"            public void foo(String a1, String a2) {}\n" +
			"        };\n" +
			"        try {\n" +
			"            b.foo(null, null);\n" +
			"        }\n" +
			"        catch (E1 e) {}\n" +
			"        catch (E2 e) {}\n" +
			"    }\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in Client.java (at line 7)\n" +
		"	b.foo(null, null);\n" +
		"	^^^^^^^^^^^^^^^^^\n" +
		"Unhandled exception type E\n" +
		"----------\n");
}

// Bug 387612 - Unreachable catch block...exception is never thrown from the try
// - changed order in redundant 'throws' clause.
public void testBug387612b() {
	String serialUID = "private static final long serialVersionUID=1L;";
	runNegativeTest(
		new String[] {
			"E.java",
			"public class E extends Exception {"+serialUID+"}\n",
			"E1.java",
			"public class E1 extends E {"+serialUID+"}\n",
			"E2.java",
			"public class E2 extends E {"+serialUID+"}\n",
			"E3.java",
			"public class E3 extends E {"+serialUID+"}\n",
			"A.java",
			"interface A {\n" +
			"    void foo(String a1, String a2) throws E, E1;\n" +
			"}\n",
			"B.java",
			"interface B extends A {\n" +
			"    void foo(String a1, String a2) throws E;\n" +
			"}\n",
			"Client.java",
			"public class Client {\n" +
			"    void test() {\n" +
			"        B b = new B() {\n" +
			"            public void foo(String a1, String a2) {}\n" +
			"        };\n" +
			"        try {\n" +
			"            b.foo(null, null);\n" +
			"        }\n" +
			"        catch (E1 e) {}\n" +
			"        catch (E2 e) {}\n" +
			"    }\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in Client.java (at line 7)\n" +
		"	b.foo(null, null);\n" +
		"	^^^^^^^^^^^^^^^^^\n" +
		"Unhandled exception type E\n" +
		"----------\n");
}

// Bug 387612 - Unreachable catch block...exception is never thrown from the try
// interface with redundant exceptions in throws is read from class file.
public void testBug387612c() {
	String serialUID = "private static final long serialVersionUID=1L;";
	runConformTest(
		new String[] {
			"E.java",
			"public class E extends Exception {"+serialUID+"}\n",
			"E1.java",
			"public class E1 extends E {"+serialUID+"}\n",
			"E2.java",
			"public class E2 extends E {"+serialUID+"}\n",
			"A.java",
			"interface A {\n" +
			"    void foo(String a1, String a2) throws E1, E;\n" +
			"}\n",
			"B.java",
			"interface B extends A {\n" +
			"    void foo(String a1, String a2) throws E;\n" +
			"}\n"
		});
	runNegativeTest(
		new String[] {
			"Client.java",
			"public class Client {\n" +
			"    void test() {\n" +
			"        B b = new B() {\n" +
			"            public void foo(String a1, String a2) {}\n" +
			"        };\n" +
			"        try {\n" +
			"            b.foo(null, null);\n" +
			"        }\n" +
			"        catch (E1 e) {}\n" +
			"        catch (E2 e) {}\n" +
			"    }\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in Client.java (at line 7)\n" +
		"	b.foo(null, null);\n" +
		"	^^^^^^^^^^^^^^^^^\n" +
		"Unhandled exception type E\n" +
		"----------\n",
		null,
		false/*shouldFlush*/);
}

public static Class testClass() {
	return TryStatementTest.class;
}
}
