/*******************************************************************************
 * Copyright (c) 2000, 2019 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
 *     Technical University Berlin - adapted for Object Teams
 *     Stephan Herrmann - Contributions for
 *								bug 383690 - [compiler] location of error re uninitialized final field should be aligned
 *								bug 388800 - [1.8] adjust tests to 1.8 JRE
 *								bug 388795 - [compiler] detection of name clash depends on order of super interfaces
 *								bug 388739 - [1.8][compiler] consider default methods when detecting whether a class needs to be declared abstract
 *								bug 395681 - [compiler] Improve simulation of javac6 behavior from bug 317719 after fixing bug 388795
 *								bug 406928 - computation of inherited methods seems damaged (affecting @Overrides)
 *								Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec)
 *								Bug 424286 - [1.8] Update type inference to spec version 0.9.1
 *								Bug 426676 - [1.8][compiler] Wrong generic method type inferred from lambda expression
 *								Bug 423505 - [1.8] Implement "18.5.4 More Specific Method Inference"
 *								Bug 434483 - [1.8][compiler][inference] Type inference not picked up with method reference
 *     Harry Terkelsen - Bug 460491 - NPE in ParameterizedTypeBinding.collectSubstitutes
 *******************************************************************************/
package org.eclipse.jdt.core.tests.compiler.regression;

import static java.lang.Math.abs;
import static java.util.stream.Collectors.toList;

import java.io.File;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
import java.util.function.IntFunction;
import java.util.stream.IntStream;

import junit.framework.Test;

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

@SuppressWarnings({ "unchecked", "rawtypes" })
public class GenericTypeTest extends AbstractComparableTest {
	
	public GenericTypeTest(String name) {
		super(name);
	}

	// Static initializer to specify tests subset using TESTS_* static variables
	// All specified tests which does not belong to the class are skipped...
	static {
//		TESTS_NAMES = new String[] { "test1277" };
//		TESTS_NUMBERS = new int[] { 470, 627 };
//		TESTS_RANGE = new int[] { 1097, -1 };
	}
	public static Test suite() {
		return buildComparableTestSuite(testClass());
	}

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

	protected Map getCompilerOptions() {
		Map options = super.getCompilerOptions();
		options.put(CompilerOptions.OPTION_ReportMissingOverrideAnnotationForInterfaceMethodImplementation, CompilerOptions.DISABLED);
		options.put(CompilerOptions.OPTION_ReportUnusedLocal, CompilerOptions.IGNORE);
		options.put(CompilerOptions.OPTION_ReportUnusedParameter, CompilerOptions.IGNORE);
		options.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.IGNORE);
		options.put(CompilerOptions.OPTION_ReportUnusedTypeParameter, CompilerOptions.IGNORE);
		return options;
	}

	public void test0001() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<Tx1 extends String, Tx2 extends Comparable>  extends XS<Tx2> {\n" +
				"\n" +
				"    public static void main(String[] args) {\n" +
				"        Integer w = new X<String,Integer>().get(new Integer(12));\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n" +
				"class XS <Txs> {\n" +
				"    Txs get(Txs t) {\n" +
				"        return t;\n" +
				"    }\n" +
				"}\n"
			},
			"SUCCESS");
	}

	public void test0002() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<Xp1 extends String, Xp2 extends Comparable>  extends XS<Xp2> {\n" +
				"\n" +
				"    public static void main(String[] args) {\n" +
				"        Integer w = new X<String,Integer>().get(new Integer(12));\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"    Xp2 get(Xp2 t){\n" +
				"        System.out.print(\"{X::get}\");\n" +
				"        return super.get(t);\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class XS <XSp1> {\n" +
				"    XSp1 get(XSp1 t) {\n" +
				"        System.out.print(\"{XS::get}\");\n" +
				"        return t;\n" +
				"    }\n" +
				"}\n"
			},
			"{X::get}{XS::get}SUCCESS");
	}

	// check cannot bind superclass to type variable
	public void test0003() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <X> extends X {\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 1)\n" +
			"	public class X <X> extends X {\n" +
			"	                ^\n" +
			"The type parameter X is hiding the type X<X>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 1)\n" +
			"	public class X <X> extends X {\n" +
			"	                           ^\n" +
			"Cannot refer to the type parameter X as a supertype\n" +
			"----------\n");
	}

	// check cannot bind superinterface to type variable
	public void test0004() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <X> implements X {\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 1)\n" +
			"	public class X <X> implements X {\n" +
			"	                ^\n" +
			"The type parameter X is hiding the type X<X>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 1)\n" +
			"	public class X <X> implements X {\n" +
			"	                              ^\n" +
			"Cannot refer to the type parameter X as a supertype\n" +
			"----------\n");
	}

	// check cannot bind type variable in static context
	public void test0005() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"    \n" +
				"    T t;\n" +
				"    static {\n" +
				"        T s;\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	T s;\n" +
			"	^\n" +
			"Cannot make a static reference to the non-static type T\n" +
			"----------\n");
	}

	// check static references to type variables
	public void test0006() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"    \n" +
				"    T ok1;\n" +
				"    static {\n" +
				"        T wrong1;\n" +
				"    }\n" +
				"    static void foo(T wrong2) {\n" +
				"		T wrong3;\n" +
				"    }\n" +
				"    class MX extends T {\n" +
				"        T ok2;\n" +
				"    }\n" +
				"    static class SMX extends T {\n" +
				"        T wrong4;\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	T wrong1;\n" +
			"	^\n" +
			"Cannot make a static reference to the non-static type T\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 7)\n" +
			"	static void foo(T wrong2) {\n" +
			"	                ^\n" +
			"Cannot make a static reference to the non-static type T\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 8)\n" +
			"	T wrong3;\n" +
			"	^\n" +
			"Cannot make a static reference to the non-static type T\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 10)\n" +
			"	class MX extends T {\n" +
			"	                 ^\n" +
			"Cannot refer to the type parameter T as a supertype\n" +
			"----------\n" +
			"5. ERROR in X.java (at line 13)\n" +
			"	static class SMX extends T {\n" +
			"	                         ^\n" +
			"Cannot make a static reference to the non-static type T\n" +
			"----------\n" +
			"6. ERROR in X.java (at line 14)\n" +
			"	T wrong4;\n" +
			"	^\n" +
			"Cannot make a static reference to the non-static type T\n" +
			"----------\n");
	}

	// check static references to type variables
	public void test0007() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"    \n" +
				"    T ok1;\n" +
				"    static class SMX {\n" +
				"        T wrong4;\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	T wrong4;\n" +
			"	^\n" +
			"Cannot make a static reference to the non-static type T\n" +
			"----------\n");
	}

	// check static references to type variables
	public void test0008() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"    \n" +
				"     T ok;\n" +
				"    static T wrong;\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	static T wrong;\n" +
			"	       ^\n" +
			"Cannot make a static reference to the non-static type T\n" +
			"----------\n");
	}

	// Object cannot be generic
	public void test0009() {
		this.runNegativeTest(
			new String[] {
				"Object.java",
				"package java.lang;\n" +
				"public class Object <T> {\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in Object.java (at line 2)\n" +
			"	public class Object <T> {\n" +
			"	                     ^\n" +
			"The type java.lang.Object cannot be declared as a generic\n" +
			"----------\n");
	}

	public void test0010() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"class Foo {} \n" +
				"public class X<T extends Object & Comparable<? super T>> {\n" +
				"    public static void main(String[] args) {\n" +
				"        new X<Foo>();\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	new X<Foo>();\n" +
			"	      ^^^\n" +
			"Bound mismatch: The type Foo is not a valid substitute for the bounded parameter <T extends Object & Comparable<? super T>> of the type X<T>\n" +
			"----------\n");
	}

	public void test0011() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T extends Object & Comparable<? super T>> {\n" +
				"    public static void main(String[] args) {\n" +
				"        new X<Foo>();\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	new X<Foo>();\n" +
			"	      ^^^\n" +
			"Foo cannot be resolved to a type\n" +
			"----------\n");
	}

	public void test0012() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T extends String> {\n" +
				"    T foo(T t) {\n" +
				"        return t;\n" +
				"    }\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        String s = new X<String>().foo(\"SUCCESS\");\n" +
				"        System.out.println(s);\n" +
				"    }\n" +
				"}\n",
			},
			"SUCCESS");
	}

	public void test0013() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T extends String> {\n" +
				"    T foo(T t) {\n" +
				"        return t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        new X<String>().baz(\"SUCCESS\");\n" +
				"    }\n" +
				"    void baz(final T t) {\n" +
				"        new Object() {\n" +
				"            void print() {\n" +
				"                System.out.println(foo(t));\n" +
				"            }\n" +
				"        }.print();\n" +
				"    }\n" +
				"}\n",
			},
			"SUCCESS");
	}

	public void test0014() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T extends Exception> {\n" +
				"    T foo(T t) throws T {\n" +
				"        return t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        new X<EX>().baz(new EX());\n" +
				"    }\n" +
				"    void baz(final T t) {\n" +
				"        new Object() {\n" +
				"            void print() {\n" +
				"                System.out.println(foo(t));\n" +
				"            }\n" +
				"        }.print();\n" +
				"    }\n" +
				"}\n" +
				"class EX extends Exception {\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 11)\n" +
			"	System.out.println(foo(t));\n" +
			"	                   ^^^^^^\n" +
			"Unhandled exception type T\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 16)\n" +
			"	class EX extends Exception {\n" +
			"	      ^^\n" +
			"The serializable class EX does not declare a static final serialVersionUID field of type long\n" +
			"----------\n");
	}
	public void test0015() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T extends Exception> {\n" +
				"    String foo() throws T {\n" +
				"        return \"SUCCESS\";\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        new X<EX>().baz(new EX());\n" +
				"    }\n" +
				"    void baz(final T t) {\n" +
				"        new Object() {\n" +
				"            void print() {\n" +
				"                try {\n" +
				"	                System.out.println(foo());\n" +
				"                } catch (Exception t) {\n" +
				"                }\n" +
				"            }\n" +
				"        }.print();\n" +
				"    }\n" +
				"}\n" +
				"class EX extends Exception {\n" +
				"}\n",
			},
			"SUCCESS");
	}

	public void test0016() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <E extends Exception> {\n" +
				"    void foo(E e) throws E {\n" +
				"        throw e;\n" +
				"    }\n" +
				"    void bar(E e) {\n" +
				"        try {\n" +
				"            foo(e);\n" +
				"        } catch(Exception ex) {\n" +
				"	        System.out.println(\"SUCCESS\");\n" +
				"        }\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        new X<Exception>().bar(new Exception());\n" +
				"    }\n" +
				"}\n",
			},
			"SUCCESS");
	}
	public void test0017() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.io.IOException;\n" +
				"public class X <E extends Exception> {\n" +
				"    void foo(E e) throws E {\n" +
				"        throw e;\n" +
				"    }\n" +
				"    void bar(E e) {\n" +
				"        try {\n" +
				"            foo(e);\n" +
				"        } catch(Exception ex) {\n" +
				"	        System.out.println(\"SUCCESS\");\n" +
				"        }\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        new X<IOException>().bar(new Exception());\n" +
				"    }\n" +
				"}\n" ,
			},
			"----------\n" +
			"1. ERROR in X.java (at line 14)\n" +
			"	new X<IOException>().bar(new Exception());\n" +
			"	                     ^^^\n" +
			"The method bar(IOException) in the type X<IOException> is not applicable for the arguments (Exception)\n" +
			"----------\n");
	}
	public void test0018() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"    T foo(T t) {\n" +
				"        System.out.println(t);\n" +
				"        return t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        new X<XY>() {\n" +
				"            void run() {\n" +
				"                foo(new XY());\n" +
				"            }\n" +
				"        }.run();\n" +
				"    }\n" +
				"}\n" +
				"class XY {\n" +
				"    public String toString() {\n" +
				"        return \"SUCCESS\";\n" +
				"    }\n" +
				"}\n",
			},
			"SUCCESS");
	}
	public void test0019() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"     private T foo(T t) {\n" +
				"        System.out.println(t);\n" +
				"        return t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        new X<XY>() {\n" +
				"            void run() {\n" +
				"                foo(new XY());\n" +
				"            }\n" +
				"        }.run();\n" +
				"    }\n" +
				"}\n" +
				"class XY {\n" +
				"    public String toString() {\n" +
				"        return \"SUCCESS\";\n" +
				"    }\n" +
				"}",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 9)\n" +
			"	foo(new XY());\n" +
			"	^^^\n" +
			"The method foo(T) in the type X<T> is not applicable for the arguments (XY)\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 15)\n" +
			"	public String toString() {\n" +
			"	              ^^^^^^^^^^\n" +
			"The method toString() of type XY should be tagged with @Override since it actually overrides a superclass method\n" +
			"----------\n");
	}
	public void test0020() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"     void foo(Y<T> y) {\n" +
				"		System.out.print(\"SUCC\");\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        new X<String>().bar();\n" +
				"    }\n" +
				"    void bar() {\n" +
				"        new Y<T>() {\n" +
				"            @Override\n" +
				"            public void pre() {\n" +
				"                foo(this);\n" +
				"            }\n" +
				"        }.print(\"ESS\");\n" +
				"    }\n" +
				"}\n" +
				"class Y <P> {\n" +
				"	public void print(P p) {\n" +
				"		pre();\n" +
				"		System.out.println(p);\n" +
				"	}\n" +
				"	public void pre() {\n" +
				"	}\n" +
				"}",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 14)\n" +
			"	}.print(\"ESS\");\n" +
			"	  ^^^^^\n" +
			"The method print(T) in the type Y<T> is not applicable for the arguments (String)\n" +
			"----------\n");
	}
	public void test0021() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T extends String> {\n" +
				"    void foo(T t) {\n" +
				"    }\n" +
				"    void bar(String x) {\n" +
				"        foo(x);\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        new X<String>().foo(new Object());\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 1)\n" +
			"	public class X <T extends String> {\n" +
			"	                          ^^^^^^\n" +
			"The type parameter T should not be bounded by the final type String. Final types cannot be further extended\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 5)\n" +
			"	foo(x);\n" +
			"	^^^\n" +
			"The method foo(T) in the type X<T> is not applicable for the arguments (String)\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 8)\n" +
			"	new X<String>().foo(new Object());\n" +
			"	                ^^^\n" +
			"The method foo(String) in the type X<String> is not applicable for the arguments (Object)\n" +
			"----------\n");
	}

	public void test0022() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T extends String> {\n" +
				"    X(T t) {\n" +
				"        System.out.println(t);\n" +
				"    }\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"       new X<String>(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n",
			},
			"SUCCESS");
	}

	public void test0023() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T extends String> {\n" +
				"    X(final T t) {\n" +
				"        new Object() {\n" +
				"            void print() {\n" +
				"                System.out.println(t);\n" +
				"            }\n" +
				"        }.print();\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        new X<String>(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n",
			},
			"SUCCESS");
	}

	public void test0024() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T extends Exception> {\n" +
				"    X(final T t) throws T {\n" +
				"        new Object() {\n" +
				"            void print() {\n" +
				"                System.out.println(t);\n" +
				"            }\n" +
				"        }.print();\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        new X<EX>(new EX());\n" +
				"    }\n" +
				"}\n" +
				"class EX extends Exception {\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 10)\n" +
			"	new X<EX>(new EX());\n" +
			"	^^^^^^^^^^^^^^^^^^^\n" +
			"Unhandled exception type EX\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 13)\n" +
			"	class EX extends Exception {\n" +
			"	      ^^\n" +
			"The serializable class EX does not declare a static final serialVersionUID field of type long\n" +
			"----------\n");
	}

	public void test0025() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T extends Exception> {\n" +
				"    String foo() throws T {\n" +
				"        return \"SUCCESS\";\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        new X<EX>(new EX());\n" +
				"    }\n" +
				"    X(final T t) {\n" +
				"        new Object() {\n" +
				"            void print() {\n" +
				"                try {\n" +
				"	                System.out.println(foo());\n" +
				"                } catch (Exception t) {\n" +
				"                }\n" +
				"            }\n" +
				"        }.print();\n" +
				"    }\n" +
				"}\n" +
				"class EX extends Exception {\n" +
				"}\n",
			},
			"SUCCESS");
	}

	public void test0026() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <E extends Exception> {\n" +
				"    void foo(E e) throws E {\n" +
				"        throw e;\n" +
				"    }\n" +
				"    X(E e) {\n" +
				"        try {\n" +
				"            foo(e);\n" +
				"        } catch(Exception ex) {\n" +
				"	        System.out.println(\"SUCCESS\");\n" +
				"        }\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        new X<Exception>(new Exception());\n" +
				"    }\n" +
				"}\n",
			},
			"SUCCESS");
	}
	public void test0027() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.io.IOException;\n" +
				"public class X <E extends Exception> {\n" +
				"    void foo(E e) throws E {\n" +
				"        throw e;\n" +
				"    }\n" +
				"    X(E e) {\n" +
				"        try {\n" +
				"            foo(e);\n" +
				"        } catch(Exception ex) {\n" +
				"	        System.out.println(\"SUCCESS\");\n" +
				"        }\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        new X<IOException>(new Exception());\n" +
				"    }\n" +
				"}\n" ,
			},
			"----------\n" +
			"1. ERROR in X.java (at line 14)\n" +
			"	new X<IOException>(new Exception());\n" +
			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"The constructor X<IOException>(Exception) is undefined\n" +
			"----------\n");
	}

	public void test0028() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"    T t;\n" +
				"    X(T t) {\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        String s = new X<String>(\"SU\").t;\n" +
				"        System.out.print(s);\n" +
				"        s = new X<String>(\"failed\").t = \"CC\";\n" +
				"        System.out.print(s);\n" +
				"        s = new X<String>(\"\").t += \"ESS\";\n" +
				"        System.out.println(s);\n" +
				"    }\n" +
				"}\n",
			},
			"SUCCESS");
	}

	public void test0029() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"    T t;\n" +
				"    X() {\n" +
				"    }\n" +
				"    T foo(T a, T b) {\n" +
				"        T s;\n" +
				"        s = t = a;\n" +
				"		s = t += b;\n" +
				"		return t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        System.out.println(new X<String>().foo(\"SUC\", \"CESS\"));\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 8)\n" +
			"	s = t += b;\n" +
			"	    ^^^^^^\n" +
			"The operator += is undefined for the argument type(s) T, T\n" +
			"----------\n");
	}

	public void test0030() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"    T t;\n" +
				"    X() {\n" +
				"    }\n" +
				"    T foo(T a) {\n" +
				"        T s;\n" +
				"        s = t = a;\n" +
				"		return t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        System.out.println(new X<String>().foo(\"SUCCESS\"));\n" +
				"    }\n" +
				"}\n" ,
			},
			"SUCCESS");
	}

	public void test0031() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"    T t;\n" +
				"    X(T t) {\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        new X<String>(\"OUTER\").bar();\n" +
				"    }\n" +
				"    void bar() {\n" +
				"        new X<String>(\"INNER\") {\n" +
				"            void run() {\n" +
				"                \n" +
				"                new Object() {\n" +
				"                    void run() {\n" +
				"		                String s = t = \"SUC\";\n" +
				"		                s = t+= \"CESS\";\n" +
				"				        System.out.println(t);\n" +
				"                    }\n" +
				"                }.run();\n" +
				"            }\n" +
				"        }.run();\n" +
				"    }\n" +
				"}\n" ,
			},
			"SUCCESS");
	}

	public void test0032() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"    T t;\n" +
				"    X(T t) {\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        new X<String>(\"OUTER\").bar();\n" +
				"    }\n" +
				"    void bar() {\n" +
				"        new X<String>(\"INNER\") {\n" +
				"            void run() {\n" +
				"                String s = t = \"SUC\";\n" +
				"                s = t+= \"CESS\";\n" +
				"		        System.out.println(t);\n" +
				"            }\n" +
				"        }.run();\n" +
				"    }\n" +
				"}\n" ,
			},
			"SUCCESS");
	}

	public void test0033() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <E, T> {\n" +
				"	void foo(E e){}\n" +
				"	void foo(T t){}\n" +
				"}\n" ,
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	void foo(E e){}\n" +
			"	     ^^^^^^^^\n" +
			"Erasure of method foo(E) is the same as another method in type X<E,T>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 3)\n" +
			"	void foo(T t){}\n" +
			"	     ^^^^^^^^\n" +
			"Erasure of method foo(T) is the same as another method in type X<E,T>\n" +
			"----------\n");
	}

	public void test0034() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <E extends Exception, T extends Exception> {\n" +
				"	void foo(E e){}\n" +
				"	void foo(T t){}\n" +
				"}\n" ,
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	void foo(E e){}\n" +
			"	     ^^^^^^^^\n" +
			"Erasure of method foo(E) is the same as another method in type X<E,T>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 3)\n" +
			"	void foo(T t){}\n" +
			"	     ^^^^^^^^\n" +
			"Erasure of method foo(T) is the same as another method in type X<E,T>\n" +
			"----------\n");
	}

	public void test0035() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <E extends Exception, T extends Thread> {\n" +
				"	void foo(E e, Thread t){}\n" +
				"	void foo(Exception e, T t){}\n" +
				"}\n" ,
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	void foo(E e, Thread t){}\n" +
			"	     ^^^^^^^^^^^^^^^^^^\n" +
			"Erasure of method foo(E, Thread) is the same as another method in type X<E,T>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 3)\n" +
			"	void foo(Exception e, T t){}\n" +
			"	     ^^^^^^^^^^^^^^^^^^^^^\n" +
			"Erasure of method foo(Exception, T) is the same as another method in type X<E,T>\n" +
			"----------\n");
	}

	public void test0036() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <E extends Exception, T extends Thread> {\n" +
				"	void foo(E e){}\n" +
				"	void foo(T t){}\n" +
				"    public static void main(String[] args) {\n" +
				"		 System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n" ,
			},
			"SUCCESS");
	}

	public void test0037() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <E extends Cloneable, T extends Thread & Cloneable> {\n" +
				"	void foo(E e){}\n" +
				"	void foo(T t){}\n" +
				"    public static void main(String[] args) {\n" +
				"		 System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n" ,
			},
			"SUCCESS");
	}

	public void test0038() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <E extends Cloneable, T extends Thread & Cloneable> {\n" +
				"	void foo(E e){}\n" +
				"	void foo(T t){}\n" +
				"	public static void main(String[] args) {\n" +
				"		X<XY,XY> x = new X<XY, XY>();\n" +
				"		x.foo(new XY());\n" +
				"	}\n" +
				"}\n" +
				"class XY extends Thread implements Cloneable {\n" +
				"}\n" ,
			},		"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	x.foo(new XY());\n" +
			"	  ^^^\n" +
			"The method foo(XY) is ambiguous for the type X<XY,XY>\n" +
			"----------\n");
	}

	public void test0039() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <E extends Cloneable, T extends Thread> {\n" +
				"	void foo(L<E> l1){}\n" +
				"	void foo(L<T> l2){}\n" +
				"	void foo(L l){}\n" +
				"}\n" +
				"\n" +
				"class L<E> {\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	void foo(L<E> l1){}\n" +
			"	     ^^^^^^^^^^^^\n" +
			"Erasure of method foo(L<E>) is the same as another method in type X<E,T>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 3)\n" +
			"	void foo(L<T> l2){}\n" +
			"	     ^^^^^^^^^^^^\n" +
			"Erasure of method foo(L<T>) is the same as another method in type X<E,T>\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 4)\n" +
			"	void foo(L l){}\n" +
			"	     ^^^^^^^^\n" +
			"Erasure of method foo(L) is the same as another method in type X<E,T>\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 4)\n" +
			"	void foo(L l){}\n" +
			"	         ^\n" +
			"L is a raw type. References to generic type L<E> should be parameterized\n" +
			"----------\n");
	}

	public void test0040() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T extends X> {\n" +
				"    public static void main(String[] args) {\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }    \n" +
				"}\n",
			},
			"SUCCESS");
	}

	public void test0041() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T, U extends T> {\n" +
				"    public static void main(String[] args) {\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }    \n" +
				"}\n",
			},
			"SUCCESS");
	}

	// **
	public void test0042() {
		String[] test = new String[] {
			"X.java",
			"public class X <T extends U, U> {}"
		};
		if (this.complianceLevel < ClassFileConstants.JDK1_7) {
			this.runNegativeTest(
				test,
				"----------\n" +
				"1. ERROR in X.java (at line 1)\n" +
				"	public class X <T extends U, U> {}\n" +
				"	                ^\n" +
				"Illegal forward reference to type parameter U\n" +
				"----------\n");
		} else {
			this.runConformTest(test, "");
		}
	}

	public void test0043() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T extends L<T> , U extends T> {\n" +
				"    public static void main(String[] args) {\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n" +
				"class L<E>{}\n",
			},
			"SUCCESS");
	}

	public void test0044() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X extends L<X> {\n" +
				"    public static void main(String[] args) {\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }    \n" +
				"}\n" +
				"class L<E> {}\n",
			},
			"SUCCESS");
	}

	public void test0045() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public Z<T> var;\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	public Z<T> var;\n" +
			"	       ^\n" +
			"Z cannot be resolved to a type\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 2)\n" +
			"	public Z<T> var;\n" +
			"	         ^\n" +
			"T cannot be resolved to a type\n" +
			"----------\n");
	}
	public void test0046() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public Object<T> var;\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	public Object<T> var;\n" +
			"	       ^^^^^^\n" +
			"The type Object is not generic; it cannot be parameterized with arguments <T>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 2)\n" +
			"	public Object<T> var;\n" +
			"	              ^\n" +
			"T cannot be resolved to a type\n" +
			"----------\n");
	}
	public void test0047() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"    private T t;\n" +
				"    X(T t) {\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        new X<String>(\"OUTER\").bar();\n" +
				"    }\n" +
				"    void bar() {\n" +
				"        new MX<String>(\"INNER\") {\n" +
				"            void run() {\n" +
				"                \n" +
				"                new Object() {\n" +
				"                    void run() {\n" +
				"		                String s = t = \"SUC\";\n" +
				"		                s = t+= \"CESS\";\n" +
				"				        System.out.println(t);\n" +
				"                    }\n" +
				"                }.run();\n" +
				"            }\n" +
				"        }.run();\n" +
				"    }\n" +
				"}\n" +
				"class MX<U> {\n" +
				"    MX(U u){}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 15)\n" +
			"	String s = t = \"SUC\";\n" +
			"	           ^^^^^^^^^\n" +
			"Type mismatch: cannot convert from T to String\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 15)\n" +
			"	String s = t = \"SUC\";\n" +
			"	               ^^^^^\n" +
			"Type mismatch: cannot convert from String to T\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 16)\n" +
			"	s = t+= \"CESS\";\n" +
			"	    ^^^^^^^^^^\n" +
			"The operator += is undefined for the argument type(s) T, String\n" +
			"----------\n");
	}
	// Access to enclosing 't' of type 'T' (not substituted from X<X> as private thus non inherited)
	public void test0048() {
		this.runNegativeTest(
			// test directory preparation
			new String[] { /* test files */
				"X.java",
				"public class X <T> {\n" +
				"    private T t;\n" +
				"    X(T t) {\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        new X<String>(\"OUTER\").bar();\n" +
				"    }\n" +
				"    void bar() {\n" +
				"        new X<X>(this) {\n" +
				"            void run() {\n" +
				"                new Object() {\n" +
				"                    void run() {\n" +
				"                        X x = t;\n" +
				"				        System.out.println(x);\n" +
				"                    }\n" +
				"                }.run();\n" +
				"            }\n" +
				"        }.run();\n" +
				"    }\n" +
				"}\n",
			},
			// compiler results
			"----------\n" + /* expected compiler log */
			"1. WARNING in X.java (at line 10)\n" +
			"	new X<X>(this) {\n" +
			"	      ^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 14)\n" +
			"	X x = t;\n" +
			"	^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 14)\n" +
			"	X x = t;\n" +
			"	      ^\n" +
			"Type mismatch: cannot convert from T to X\n" +
			"----------\n",
			// javac options
			JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
	}
	public void test0049() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"    public T t;\n" +
				"    X(T t) {\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        new X<String>(\"OUTER\").bar();\n" +
				"    }\n" +
				"    void bar() {\n" +
				"        new X<X>(this) {\n" +
				"            void run() {\n" +
				"                new Object() {\n" +
				"                    void run() {\n" +
				"                        X x = t;\n" +
				"				        System.out.println(\"SUCCESS\");\n" +
				"                    }\n" +
				"                }.run();\n" +
				"            }\n" +
				"        }.run();\n" +
				"    }\n" +
				"}\n",
			},
			"SUCCESS");
	}
	public void test0050() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T extends N> {\n" +
				"	static class N {}" +
				"}\n" +
				"class Y <T extends Y.N> {\n" +
				"	static class N {}" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 1)\n" +
			"	public class X <T extends N> {\n" +
			"	                          ^\n" +
			"N cannot be resolved to a type\n" +
			"----------\n");
	}
	public void test0050a() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"class Super {class M {}}\n" +
				"public class X <T extends M> extends Super {}\n" +
				"class Y <T extends Y.M> extends Super {}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	public class X <T extends M> extends Super {}\n" +
			"	                          ^\n" +
			"M cannot be resolved to a type\n" +
			"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98504
	public void test0050b() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	class M extends Y implements I {}\n" +
				"}\n" +
				"class Y {\n" +
				"	static interface I { void foo(); }\n" +
				"}\n" +
				"interface I {}\n"
			},
			"");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98504 - variation
	public void test0050c() {
		this.runConformTest(
			new String[] {
				"Test.java",
				"public class Test<T extends Test.InnerTest> implements Base<T> {\n" +
				"	static class InnerTest implements Inner {}\n" +
				"}\n"+
				"interface Base<T> {\n" +
				"	interface Inner {}\n" +
				"}\n"
			},
			"");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=101387
	public void test0050d() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<I, C extends I> {}\n" +
				"class Y extends X<Y.M, Y.N> {\n" +
				"	static class M {}\n" +
				"	static class N extends M {}\n" +
				"}\n"
			},
			"");
	}
	public void test0051() {
		this.runConformTest(
			new String[] {
				"X.java",
				"class Super {class M {}}\n" +
				"public class X extends Super {\n" +
				"	class N <T extends M> {}\n" +
				"	public static void main(String[] args) {\n" +
				"		System.out.println(\"SUCCESS\");\n" +
				"	}\n" +
				"}\n",
			},
			"SUCCESS");
	}
	public void test0052() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T> extends p.A<T> {\n" +
				"	public static void main(String[] args) {\n" +
				"		System.out.println(\"SUCCESS\");\n" +
				"	}\n" +
				"}\n",
				"p/A.java",
				"package p; \n" +
				"public class A<P> {\n" +
				"}\n",
			},
			"SUCCESS");
	}
	public void test0053() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T> extends p.A<T> {\n" +
				"    protected T t;\n" +
				"    X(T t) {\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        new X<String>(\"OUTER\").bar();\n" +
				"    }\n" +
				"    void bar() {\n" +
				"        new X<X>(this) {\n" +
				"            void run() {\n" +
				"                new Object() {\n" +
				"                    void run() {\n" +
				"                        print(t);\n" +
				"                    }\n" +
				"                }.run();\n" +
				"            }\n" +
				"        }.run();\n" +
				"    }\n" +
				"}\n",
				"p/A.java",
				"package p; \n" +
				"public class A<P> {\n" +
				"    protected void print(P p) {\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n",
			},
			"SUCCESS");
	}
	public void test0054() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T> extends p.A<T> {\n" +
				"    protected T t;\n" +
				"    X(T t) {\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        new X<String>(\"OUTER\").bar();\n" +
				"    }\n" +
				"    void bar() {\n" +
				"        new X<X>(this) {\n" +
				"            void run() {\n" +
				"                new Object() {\n" +
				"                    void run() {\n" +
				"                        print(X.this.t);\n" +
				"                    }\n" +
				"                }.run();\n" +
				"            }\n" +
				"        }.run();\n" +
				"    }\n" +
				"}\n",
				"p/A.java",
				"package p; \n" +
				"public class A<P> {\n" +
				"    protected void print(P p) {\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 10)\n" +
			"	new X<X>(this) {\n" +
			"	      ^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 14)\n" +
			"	print(X.this.t);\n" +
			"	^^^^^\n" +
			"The method print(X) in the type A<X> is not applicable for the arguments (T)\n" +
			"----------\n");
	}

	public void test0055() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T> extends p.A<T> {\n" +
				"    protected T t;\n" +
				"    X(T t) {\n" +
				"        super(t);\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"	  X<String> xs = new X<String>(\"SUCCESS\");\n" +
				"	  System.out.println(xs.t);\n" +
				"    }\n" +
				"}\n",
				"p/A.java",
				"package p; \n" +
				"public class A<P> {\n" +
				"	 protected P p;\n" +
				"    protected A(P p) {\n" +
				"       this.p = p; \n" +
				"    } \n" +
				"    protected void print(P p) {\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n",
			},
			"SUCCESS");
	}

	public void test0056() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T> extends p.A<T> {\n" +
				"    protected T t;\n" +
				"    X(T t) {\n" +
				"        super(t);\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"	  X<String> xs = new X<String>(\"SUCCESS\");\n" +
				"	  System.out.println((X)xs.t);\n" +
				"    }\n" +
				"}\n",
				"p/A.java",
				"package p; \n" +
				"public class A<P> {\n" +
				"	 protected P p;\n" +
				"    protected A(P p) {\n" +
				"       this.p = p; \n" +
				"    } \n" +
				"    protected void print(P p) {\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 9)\n" +
			"	System.out.println((X)xs.t);\n" +
			"	                   ^^^^^^^\n" +
			"Cannot cast from String to X\n" +
			"----------\n" +
			"----------\n" +
			"1. WARNING in p\\A.java (at line 7)\n" +
			"	protected void print(P p) {\n" +
			"	                       ^\n" +
			"The parameter p is hiding a field from type A<P>\n" +
			"----------\n");
	}

	public void test0057() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T> extends p.A<T> {\n" +
				"    protected T t;\n" +
				"    X(T t) {\n" +
				"        super(t);\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"	  X<X<String>> xs = new X<X<String>>(new X<String>(\"SUCCESS\"));\n" +
				"	  System.out.println(xs.t.t);\n" +
				"    }\n" +
				"}\n",
				"p/A.java",
				"package p; \n" +
				"public class A<P> {\n" +
				"	 protected P p;\n" +
				"    protected A(P p) {\n" +
				"       this.p = p; \n" +
				"    } \n" +
				"    protected void print(P p) {\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n",
			},
			"SUCCESS");
	}

	// JSR14-v10[2.1,2.2]: Valid multiple parameter types
	public void test0058() {
		this.runConformTest(
			new String[] {
				"test/X.java",
				"package test;\n" +
					"// Valid Parameterized Type Declaration\n" +
					"public class X<A1, A2, A3> {\n" +
					"}\n" +
					"// Valid Type Syntax\n" +
					"class Y {\n" +
					"	X<String, Number, Integer> x;\n" +
					"}\n"
			}
		);
	}
	// JSR14-v10[2.1,2.2]: Invalid multiple parameter types: more declared than referenced
	public void test0059() {
		this.runNegativeTest(
			new String[] {
				"test/X.java",
				"package test;\n" +
					"// Valid Parameterized Type Declaration\n" +
					"public class X<A1, A2, A3, A4> {\n" +
					"}\n" +
					"// Invalid Valid Type Syntax (not enough parameters)\n" +
					"class Y {\n" +
					"	X<String, Number, Integer> x;\n" +
					"}\n"
			},
			"----------\n" +
			"1. ERROR in test\\X.java (at line 7)\n" +
			"	X<String, Number, Integer> x;\n" +
			"	^\n" +
			"Incorrect number of arguments for type X<A1,A2,A3,A4>; it cannot be parameterized with arguments <String, Number, Integer>\n" +
			"----------\n"
		);
	}
	// JSR14-v10[2.1,2.2]: Invalid multiple parameter types: more referenced than declared
	public void test0060() {
		this.runNegativeTest(
			new String[] {
				"test/X.java",
				"package test;\n" +
					"// Valid Parameterized Type Declaration\n" +
					"public class X<A1, A2> {\n" +
					"}\n" +
					"// Invalid Valid Type Syntax (too many parameters)\n" +
					"class Y {\n" +
					"	X<String, Number, Integer> x;\n" +
					"}\n"
			},
			"----------\n" +
				"1. ERROR in test\\X.java (at line 7)\n" +
				"	X<String, Number, Integer> x;\n" +
				"	^\n" +
				"Incorrect number of arguments for type X<A1,A2>; it cannot be parameterized with arguments <String, Number, Integer>\n" +
				"----------\n"
		);
	}
	// JSR14-v10[2.1,2.2]: Invalid multiple parameter types: primitive types
	public void test0061() {
		this.runNegativeTest(
			new String[] {
				"test/X.java",
				"package test;\n" +
					"// Valid Parameterized Type Declaration\n" +
					"public class X<A1, A2, A3, A4, A5, A6, A7> {\n" +
					"}\n" +
					"// Invalid Valid Type Syntax (primitive cannot be parameters)\n" +
					"class Y {\n" +
					"	X<int, short, long, float, double, boolean, char> x;\n" +
					"}\n"
			},
			"----------\n" +
			"1. ERROR in test\\X.java (at line 7)\n" +
			"	X<int, short, long, float, double, boolean, char> x;\n" +
			"	  ^^^\n" +
			"Syntax error, insert \"Dimensions\" to complete TypeArgument\n" +
			"----------\n" +
			"2. ERROR in test\\X.java (at line 7)\n" +
			"	X<int, short, long, float, double, boolean, char> x;\n" +
			"	       ^^^^^\n" +
			"Syntax error, insert \"Dimensions\" to complete TypeArgument\n" +
			"----------\n" +
			"3. ERROR in test\\X.java (at line 7)\n" +
			"	X<int, short, long, float, double, boolean, char> x;\n" +
			"	              ^^^^\n" +
			"Syntax error, insert \"Dimensions\" to complete TypeArgument\n" +
			"----------\n" +
			"4. ERROR in test\\X.java (at line 7)\n" +
			"	X<int, short, long, float, double, boolean, char> x;\n" +
			"	                    ^^^^^\n" +
			"Syntax error, insert \"Dimensions\" to complete TypeArgument\n" +
			"----------\n" +
			"5. ERROR in test\\X.java (at line 7)\n" +
			"	X<int, short, long, float, double, boolean, char> x;\n" +
			"	                           ^^^^^^\n" +
			"Syntax error, insert \"Dimensions\" to complete TypeArgument\n" +
			"----------\n" +
			"6. ERROR in test\\X.java (at line 7)\n" +
			"	X<int, short, long, float, double, boolean, char> x;\n" +
			"	                                   ^^^^^^^\n" +
			"Syntax error, insert \"Dimensions\" to complete TypeArgument\n" +
			"----------\n" +
			"7. ERROR in test\\X.java (at line 7)\n" +
			"	X<int, short, long, float, double, boolean, char> x;\n" +
			"	                                            ^^^^\n" +
			"Syntax error, insert \"Dimensions\" to complete ReferenceType\n" +
			"----------\n");
	}
	// JSR14-v10[2.1,2.2]: Valid multiple parameter types: primitive type arrays
	public void test0062() {
		this.runConformTest(
			new String[] {
				"test/X.java",
				"package test;\n" +
					"// Valid Parameterized Type Declaration\n" +
					"public class X<A1, A2, A3, A4, A5, A6, A7, A8> {\n" +
					"}\n" +
					"// Valid Type Syntax\n" +
					"class Y {\n" +
					"	X<int[], short[][], long[][][], float[][][][], double[][][][][], boolean[][][][][][], char[][][][][][][], Object[][][][][][][][][]> x;\n" +
					"}\n"
			},
			""
		);
	}
	public void test0063() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T> extends p.A<T> {\n" +
				"    \n" +
				"    X(T t) {\n" +
				"        super(t);\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        X x = new X(args);\n" +
				"        X<String> xs = new X<String>(args);\n" +
				"	}\n" +
				"}\n",
				"p/A.java",
				"package p; \n" +
				"public class A<P> {\n" +
				"	 protected P p;\n" +
				"    protected A(P p) {\n" +
				"       this.p = p; \n" +
				"    } \n" +
				"    protected void print(P p) {\n" +
				"        System.out.println(\"SUCCESS\"+p);\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 7)\n" +
			"	X x = new X(args);\n" +
			"	^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 7)\n" +
			"	X x = new X(args);\n" +
			"	      ^^^^^^^^^^^\n" +
			"Type safety: The constructor X(Object) belongs to the raw type X. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 7)\n" +
			"	X x = new X(args);\n" +
			"	          ^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 8)\n" +
			"	X<String> xs = new X<String>(args);\n" +
			"	               ^^^^^^^^^^^^^^^^^^^\n" +
			"The constructor X<String>(String[]) is undefined\n" +
			"----------\n" +
			"----------\n" +
			"1. WARNING in p\\A.java (at line 7)\n" +
			"	protected void print(P p) {\n" +
			"	                       ^\n" +
			"The parameter p is hiding a field from type A<P>\n" +
			"----------\n");
	}
	// raw type: variable map to its strict erasure
	public void test0064() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T extends Exception & IX> {\n" +
				"    T t;\n" +
				"    void bar(T t) {\n" +
				"        t.getMessage();\n" +
				"        t.foo();\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"		X x = new X();\n" + // raw type
				"		x.t.getMessage();\n" + // T is strictly exception !
				"		x.t.foo();\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"interface IX {\n" +
				"    void foo();\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	void bar(T t) {\n" +
			"	           ^\n" +
			"The parameter t is hiding a field from type X<T>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 8)\n" +
			"	X x = new X();\n" +
			"	^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 8)\n" +
			"	X x = new X();\n" +
			"	          ^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 10)\n" +
			"	x.t.foo();\n" +
			"	    ^^^\n" +
			"The method foo() is undefined for the type Exception\n" +
			"----------\n");
	}
	// raw type: assignments
	public void test0065() {
		Map customOptions = getCompilerOptions();
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.io.IOException;\n" +
				"\n" +
				"public class X<T extends Exception> {\n" +
				"\n" +
				"    public static void main(String[] args) {\n" +
				"		X x = new X();\n" +
				"		X<IOException> xioe = new X<IOException>(); // ok\n" +
				"		\n" +
				"		X x2 = xioe;\n" +
				"		X<IOException> xioe2 = x; // unsafe\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 6)\n" +
			"	X x = new X();\n" +
			"	^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 6)\n" +
			"	X x = new X();\n" +
			"	          ^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 9)\n" +
			"	X x2 = xioe;\n" +
			"	^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 10)\n" +
			"	X<IOException> xioe2 = x; // unsafe\n" +
			"	                       ^\n" +
			"Type safety: The expression of type X needs unchecked conversion to conform to X<IOException>\n" +
			"----------\n",
			null,
			true,
			customOptions);
	}

	// JSR14-v10[2.1,2.2]: Invalid PT declaration (mix with reference)
	public void test0066() {
		this.runNegativeTest(
			new String[] {
				"test/X1.java",
				"package test;\n" +
				"// Valid Consecutive Parameterized Type Declaration\n" +
				"public class X1<A1 extends X2<A2>> {\n" +
				"	A1 a1;\n" +
				"}\n" +
				"// Valid Parameterized Type Declaration\n" +
				"class X2<A2>{\n" +
				"	A2 a2;\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in test\\X1.java (at line 3)\n" +
			"	public class X1<A1 extends X2<A2>> {\n" +
			"	                              ^^\n" +
			"A2 cannot be resolved to a type\n" +
			"----------\n"
		);
	}

	// JSR14-v10[2.1,2.2]: Invalid PT declaration (mix with reference)
	public void test0067() {
		this.runNegativeTest(
			new String[] {
				"test/X1.java",
				"package test;\n" +
				"// Valid Consecutive Parameterized Type Declaration\n" +
				"public class X1< A1 extends X2	<	A2	>     			> {\n" +
				"	A1 a1;\n" +
				"}\n" +
				"// Valid Parameterized Type Declaration\n" +
				"class X2<A2>{\n" +
				"	A2 a2;\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in test\\X1.java (at line 3)\n" +
			"	public class X1< A1 extends X2	<	A2	>     			> {\n" +
			"	                              	 	^^\n" +
			"A2 cannot be resolved to a type\n" +
			"----------\n"
		);
	}

	// JSR14-V10[2.4]: Not terminated consecutive declaration
	// TODO (david) diagnosis message on error 3 sounds strange, doesn't it?
	public void _test0068() {
		this.runNegativeTest(
			new String[] {
				"test/X1.java",
				"package test;\n" +
				"// Invalid Consecutive Parameterized Type Declaration\n" +
				"public class X1<A1 extends X2<A2> {\n" +
				"	A1 a1;\n" +
				"}\n" +
				"// Invalid Parameterized Type Declaration\n" +
				"class X2<A2 {\n" +
				"	A2 a2;\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in test\\X1.java (at line 3)\n" +
			"	public class X1<A1 extends X2<A2> {\n" +
			"	                              ^^\n" +
			"A2 cannot be resolved to a type\n" +
			"----------\n" +
			"2. ERROR in test\\X1.java (at line 3)\n" +
			"	public class X1<A1 extends X2<A2> {\n" +
			"	                                ^\n" +
			"Syntax error, insert \">\" to complete ReferenceType1\n" +
			"----------\n" +
			"3. ERROR in test\\X1.java (at line 7)\n" +
			"	class X2<A2 {\n" +
			"	         ^^\n" +
			"Syntax error on token \"A2\", > expected after this token\n" +
			"----------\n"
		);
	}

	// JSR14-V10[2.4]: Not terminated consecutive declaration
	public void test0069() {
		this.runNegativeTest(
			new String[] {
				"test/X1.java",
				"package test;\n" +
				"// Invalid Consecutive Parameterized Type Declaration\n" +
				"public class X1<A1 extends X2<A2 {\n" +
				"	A1 a1;\n" +
				"}\n" +
				"// Invalid Parameterized Type Declaration\n" +
				"class X2<A2> {\n" +
				"	A2 a2;\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in test\\X1.java (at line 3)\n" +
			"	public class X1<A1 extends X2<A2 {\n" +
			"	                              ^^\n" +
			"Syntax error, insert \">>\" to complete ReferenceType2\n" +
			"----------\n"
		);
	}

	// JSR14-v10[2.4]: Unexpected consecutive PT declaration (right-shift symbol)
	// TODO (david) surround expected token with (double-)quotes
	public void test0070() {
		this.runNegativeTest(
			new String[] {
				"test/X1.java",
				"package test;\n" +
				"// Invalid Consecutive Parameterized Type Declaration\n" +
				"public class X1<A1>> {\n" +
				"	A1 a1;\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in test\\X1.java (at line 3)\n" +
			"	public class X1<A1>> {\n" +
//{ObjectTeams: our diagnose parser suggests a different correction:
/* orig:			
			"	                  ^^\n" +
			"Syntax error on token \">>\", > expected\n" +
  :giro */
			"	                ^^\n" + 
			"Syntax error, insert \"< typeAnchor\" to complete AnchoredTypeParameter\n" + 
// SH}
			"----------\n"
		);
	}

	// JSR14-v10[2.1,2.2]: Unexpected consecutive PT declaration (with spaces)
	public void test0071() {
		this.runNegativeTest(
			new String[] {
				"test/X1.java",
				"package test;\n" +
				"// Invalid Consecutive Parameterized Type Declaration\n" +
				"public class X1 < A1 > > {\n" +
				"	A1 a1;\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in test\\X1.java (at line 3)\n" +
			"	public class X1 < A1 > > {\n" +
			"	                       ^\n" +
			"Syntax error on token \">\", delete this token\n" +
			"----------\n"
		);
	}

	// JSR14-v10[2.4]: Unexpected consecutive PT declaration (unary right-shift symbol)
	// TODO (david) surround expected token with (double-)quotes
	public void test0072() {
		this.runNegativeTest(
			new String[] {
				"test/X1.java",
				"package test;\n" +
				"// Invalid Consecutive Parameterized Type Declaration\n" +
				"public class X1<A1>>> {\n" +
				"	A1 a1;\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in test\\X1.java (at line 3)\n" +
			"	public class X1<A1>>> {\n" +
			"	                  ^^^\n" +
			"Syntax error on token \">>>\", > expected\n" +
			"----------\n"
		);
	}

	// JSR14-v10[2.4]: Unexpected consecutive PT declaration (right-shift symbol)
	// TODO (david) surround expected token with (double-)quotes
	public void test0073() {
		this.runNegativeTest(
			new String[] {
				"test/X1.java",
				"package test;\n" +
				"// Invalid Consecutive Parameterized Type Declaration\n" +
				"public class X1<A1 extends X2<A1>>> {\n" +
				"	A1 a1;\n" +
				"}\n" +
				"// Valid Parameterized Type Declaration\n" +
				"class X2<A2> {\n" +
				"	A2 a2;\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in test\\X1.java (at line 3)\n" +
			"	public class X1<A1 extends X2<A1>>> {\n" +
			"	                                ^^^\n" +
			"Syntax error on token \">>>\", >> expected\n" +
			"----------\n"
		);
	}

	// JSR14-v10[2.1,2.2]: Unexpected consecutive PT declaration (with spaces)
	public void test0074() {
		this.runNegativeTest(
			new String[] {
				"test/X1.java",
				"package test;\n" +
				"// Invalid Consecutive Parameterized Type Declaration\n" +
				"public class X1 < A1 > > > {\n" +
				"	A1 a1;\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in test\\X1.java (at line 3)\n" +
			"	public class X1 < A1 > > > {\n" +
			"	                       ^^^\n" +
			"Syntax error on tokens, delete these tokens\n" +
			"----------\n"
		);
	}

	// A is not an interface
	public void test0075() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T extends Object & p.A<? super T>> extends p.A<T> {\n" +
				"    protected T t;\n" +
				"    X(T t) {\n" +
				"        super(t);\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"}",
				"p/A.java",
				"package p;\n" +
				"public class A<P> {\n" +
				"    protected P p;\n" +
				"    protected A(P p) {\n" +
				"        this.p = p;\n" +
				"    }\n" +
				"}"
			},
		"----------\n" +
		"1. ERROR in X.java (at line 1)\n" +
		"	public class X <T extends Object & p.A<? super T>> extends p.A<T> {\n" +
		"	                                   ^^^\n" +
		"The type A<? super T> is not an interface; it cannot be specified as a bounded parameter\n" +
		"----------\n"
		);
	}

	// A is not an interface
	public void test0076() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T extends Object & p.A> extends p.A<T> {\n" +
				"    protected T t;\n" +
				"    X(T t) {\n" +
				"        super(t);\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"}",
				"p/A.java",
				"package p;\n" +
				"public class A<P> {\n" +
				"    protected P p;\n" +
				"    protected A(P p) {\n" +
				"        this.p = p;\n" +
				"    }\n" +
				"}"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 1)\n" +
			"	public class X <T extends Object & p.A> extends p.A<T> {\n" +
			"	                                   ^^^\n" +
			"A is a raw type. References to generic type A<P> should be parameterized\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 1)\n" +
			"	public class X <T extends Object & p.A> extends p.A<T> {\n" +
			"	                                   ^^^\n" +
			"The type A is not an interface; it cannot be specified as a bounded parameter\n" +
			"----------\n"
		);
	}
	// unsafe type operation: only for constructors with signature change
	public void test0077() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T> extends p.A<T> {\n" +
				"	 X() {\n" +
				"		super(null);\n" +
				"	}\n"+
				"    X(T t) {\n" +
				"        super(t);\n" +
				"    }\n" +
				"    X(X<T> xt) {\n" +
				"        super(xt.t);\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        X x = new X();\n" +
				"        X x1 = new X(args);\n" +
				"        X x2 = new X(x);\n" +
				"        X<String> xs = new X<String>(args);\n" +
				"	}\n" +
				"}\n",
				"p/A.java",
				"package p;\n" +
				"public class A<P> {\n" +
				"    protected P p;\n" +
				"    protected A(P p) {\n" +
				"        this.p = p;\n" +
				"    }\n" +
				"}"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 9)\n" +
			"	super(xt.t);\n" +
			"	         ^\n" +
			"t cannot be resolved or is not a field\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 12)\n" +
			"	X x = new X();\n" +
			"	^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 12)\n" +
			"	X x = new X();\n" +
			"	          ^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 13)\n" +
			"	X x1 = new X(args);\n" +
			"	^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 13)\n" +
			"	X x1 = new X(args);\n" +
			"	       ^^^^^^^^^^^\n" +
			"Type safety: The constructor X(Object) belongs to the raw type X. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"6. WARNING in X.java (at line 13)\n" +
			"	X x1 = new X(args);\n" +
			"	           ^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"7. WARNING in X.java (at line 14)\n" +
			"	X x2 = new X(x);\n" +
			"	^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"8. WARNING in X.java (at line 14)\n" +
			"	X x2 = new X(x);\n" +
			"	       ^^^^^^^^\n" +
			"Type safety: The constructor X(X) belongs to the raw type X. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"9. WARNING in X.java (at line 14)\n" +
			"	X x2 = new X(x);\n" +
			"	           ^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"10. ERROR in X.java (at line 15)\n" +
			"	X<String> xs = new X<String>(args);\n" +
			"	               ^^^^^^^^^^^^^^^^^^^\n" +
			"The constructor X<String>(String[]) is undefined\n" +
			"----------\n");
	}
	public void test0078() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import p.A;\n" +
				"public class X {\n" +
				"    X(A<String> a, A<String> b) {\n" +
				"    }\n" +
				"    void foo(A<String> a) {\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        X x = new X((A)null, (A)null);\n" +
				"        A a = new A((A)null);\n" +
				"		x.foo(a);\n" +
				"		a.print(x);\n" +
				"		A<String> as = new A<String>(null);\n" +
				"		as.print(\"hello\");\n" +
				"	}\n" +
				"}\n",
				"p/A.java",
				"package p;\n" +
				"public class A<P> {\n" +
				"    protected P p;\n" +
				"    protected A(P p) {\n" +
				"        this.p = p;\n" +
				"    }\n" +
				"    protected void print(P p) {\n" +
				"        System.out.println(\"SUCCESS\"+p);\n" +
				"    }\n" +
				"    protected void print(A<P> a) {\n" +
				"        print(a.p);\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 8)\n" +
			"	X x = new X((A)null, (A)null);\n" +
			"	            ^^^^^^^\n" +
			"Type safety: The expression of type A needs unchecked conversion to conform to A<String>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 8)\n" +
			"	X x = new X((A)null, (A)null);\n" +
			"	             ^\n" +
			"A is a raw type. References to generic type A<P> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 8)\n" +
			"	X x = new X((A)null, (A)null);\n" +
			"	                     ^^^^^^^\n" +
			"Type safety: The expression of type A needs unchecked conversion to conform to A<String>\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 8)\n" +
			"	X x = new X((A)null, (A)null);\n" +
			"	                      ^\n" +
			"A is a raw type. References to generic type A<P> should be parameterized\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 9)\n" +
			"	A a = new A((A)null);\n" +
			"	^\n" +
			"A is a raw type. References to generic type A<P> should be parameterized\n" +
			"----------\n" +
			"6. ERROR in X.java (at line 9)\n" +
			"	A a = new A((A)null);\n" +
			"	      ^^^^^^^^^^^^^^\n" +
			"The constructor A(P) is not visible\n" +
			"----------\n" +
			"7. WARNING in X.java (at line 9)\n" +
			"	A a = new A((A)null);\n" +
			"	          ^\n" +
			"A is a raw type. References to generic type A<P> should be parameterized\n" +
			"----------\n" +
			"8. WARNING in X.java (at line 9)\n" +
			"	A a = new A((A)null);\n" +
			"	             ^\n" +
			"A is a raw type. References to generic type A<P> should be parameterized\n" +
			"----------\n" +
			"9. WARNING in X.java (at line 10)\n" +
			"	x.foo(a);\n" +
			"	      ^\n" +
			"Type safety: The expression of type A needs unchecked conversion to conform to A<String>\n" +
			"----------\n" +
			"10. ERROR in X.java (at line 11)\n" +
			"	a.print(x);\n" +
			"	  ^^^^^\n" +
			"The method print(P) from the type A is not visible\n" +
			"----------\n" +
			"11. ERROR in X.java (at line 12)\n" +
			"	A<String> as = new A<String>(null);\n" +
			"	               ^^^^^^^^^^^^^^^^^^^\n" +
			"The constructor A<String>(P) is not visible\n" +
			"----------\n" +
			"12. ERROR in X.java (at line 13)\n" +
			"	as.print(\"hello\");\n" +
			"	   ^^^^^\n" +
			"The method print(P) from the type A<String> is not visible\n" +
			"----------\n" +
			"----------\n" +
			"1. WARNING in p\\A.java (at line 7)\n" +
			"	protected void print(P p) {\n" +
			"	                       ^\n" +
			"The parameter p is hiding a field from type A<P>\n" +
			"----------\n");
	}

	// JSR14-v10[2.4]: Valid consecutive Type Parameters Brackets
	public void test0079() {
		this.runConformTest(
			new String[] {
				"test/X.java",
				"package test;\n" +
					"public class X<A extends X1<X2<X3<String>>>> {\n" +
					"	A a;\n" +
					"	public static void main(String[] args) {\n" +
					"		X<X1<X2<X3<String>>>> x = new X<X1<X2<X3<String>>>>();\n" +
					"		x.a = new X1<X2<X3<String>>>();\n" +
					"		x.a.a1 = new X2<X3<String>>();\n" +
					"		x.a.a1.a2 = new X3<String>();\n" +
					"		x.a.a1.a2.a3 = \"SUCCESS\";\n" +
					"		System.out.println(x.a.a1.a2.a3);\n" +
					"	}\n" +
					"}\n" +
					"class X1<A extends X2<X3<String>>> {\n" +
					"	A a1;\n" +
					"}\n" +
					"class X2<A extends X3<String>> {\n" +
					"	A a2;\n" +
					"}\n" +
					"class X3<A> {\n" +
					"	A a3;\n" +
					"}\n"
			},
			"SUCCESS"
		);
	}
	// TODO (david) remove errors: insert dimension to complete array type
	public void _test0080() {
		this.runNegativeTest(
			new String[] {
				"test/X.java",
				"package test;\n" +
					"public class X<A extends X1<X2<X3<String>>> {}\n" +
					"class X1<A extends X2<X3<String>> {}\n" +
					"class X2<A extends X3<String> {}\n" +
					"class X3<A {}\n"
			},
			"----------\n" +
			"1. ERROR in test\\X.java (at line 2)\n" +
			"	public class X<A extends X1<X2<X3<String>>> {}\n" +
			"	                                        ^^^\n" +
			"Syntax error, insert \">\" to complete ReferenceType1\n" +
			"----------\n" +
			"2. ERROR in test\\X.java (at line 3)\n" +
			"	class X1<A extends X2<X3<String>> {}\n" +
			"	                               ^^\n" +
			"Syntax error, insert \">\" to complete ReferenceType1\n" +
			"----------\n" +
			"3. ERROR in test\\X.java (at line 4)\n" +
			"	class X2<A extends X3<String> {}\n" +
			"	                            ^\n" +
			"Syntax error, insert \">\" to complete ReferenceType1\n" +
			"----------\n" +
			"4. ERROR in test\\X.java (at line 5)\n" +
			"	class X3<A {}\n" +
			"	         ^\n" +
			"Syntax error on token \"A\", > expected after this token\n" +
			"----------\n"
		);
	}
	// TODO (david) remove errors: insert dimension to complete array type
	public void test0081() {
		this.runNegativeTest(
			new String[] {
				"test/X.java",
				"package test;\n" +
					"public class X<A extends X1<X2<X3<String>> {}\n" +
					"class X1<A extends X2<X3<String> {}\n" +
					"class X2<A extends X3<String {}\n" +
					"class X3<A> {}\n"
			},
			"----------\n" +
			"1. ERROR in test\\X.java (at line 2)\n" +
			"	public class X<A extends X1<X2<X3<String>> {}\n" +
			"	                                        ^^\n" +
			"Syntax error, insert \">>\" to complete ReferenceType2\n" +
			"----------\n" +
			"2. ERROR in test\\X.java (at line 3)\n" +
			"	class X1<A extends X2<X3<String> {}\n" +
			"	                               ^\n" +
			"Syntax error, insert \">>\" to complete ReferenceType2\n" +
			"----------\n" +
			"3. ERROR in test\\X.java (at line 4)\n" +
			"	class X2<A extends X3<String {}\n" +
			"	                      ^^^^^^\n" +
			"Syntax error, insert \">>\" to complete ReferenceType2\n" +
			"----------\n"
		);
	}
	// TODO (david) remove error: insert dimension to complete array type
	public void test0082() {
		this.runNegativeTest(
			new String[] {
				"test/X.java",
				"package test;\n" +
					"public class X<A extends X1<X2<X3<String> {}\n" +
					"class X1<A extends X2<X3<String {}\n" +
					"class X2<A extends X3<String>> {}\n" +
					"class X3<A> {}\n"
			},
			"----------\n" +
			"1. ERROR in test\\X.java (at line 2)\n" +
			"	public class X<A extends X1<X2<X3<String> {}\n" +
			"	                                        ^\n" +
			"Syntax error, insert \">>>\" to complete ReferenceType3\n" +
			"----------\n" +
			"2. ERROR in test\\X.java (at line 3)\n" +
			"	class X1<A extends X2<X3<String {}\n" +
			"	                         ^^^^^^\n" +
			"Syntax error, insert \">>>\" to complete ReferenceType3\n" +
			"----------\n"
		);
	}
	// TODO (david) remove error: insert dimension to complete array type
	public void _test0083() {
		this.runNegativeTest(
			new String[] {
				"test/X.java",
				"package test;\n" +
					"public class X<A extends X1<X2<X3<String {}\n" +
					"class X1<A extends X2<X3<String>>> {}\n" +
					"class X2<A extends X3<String>> {}\n" +
					"class X3<A> {}\n"
			},
			"----------\n" +
			"1. ERROR in test\\X.java (at line 2)\n" +
			"	public class X<A extends X1<X2<X3<String {}\n" +
			"	                                  ^^^^^^\n" +
			"Syntax error, insert \">>>\" to complete ReferenceType3\n" +
			"----------\n" +
			"2. ERROR in test\\X.java (at line 2)\n" +
			"	public class X<A extends X1<X2<X3<String {}\n" +
			"	                                  ^^^^^^\n" +
			"Syntax error, insert \">\" to complete ReferenceType1\n" +
			"----------\n");
	}
	public void test0084() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    X(AX<String> a, AX<String> b) {\n" +
				"    }\n" +
				"    void foo(AX<String> a) {\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        X x = new X((AX)null, (AX)null);\n" +
				"        AX a = new AX((AX)null);\n" +
				"        AX a2 = new AX(null);\n" +
				"		x.foo(a);\n" +
				"		a.foo(a);\n" +
				"		a.bar(a);\n" +
				"		AX<String> as = new AX<String>(null);\n" +
				"		as.print(a);\n" +
				"		as.bar(a);\n" +
				"	}\n" +
				"}\n" +
				"class AX <P> {\n" +
				"    AX(AX<P> ax){}\n" +
				"    AX(P p){}\n" +
				"    void print(P p){}\n" +
				"    void foo(AX rawAx){}\n" +
				"    void bar(AX<P> ax){}\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 7)\n" +
			"	X x = new X((AX)null, (AX)null);\n" +
			"	            ^^^^^^^^\n" +
			"Type safety: The expression of type AX needs unchecked conversion to conform to AX<String>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 7)\n" +
			"	X x = new X((AX)null, (AX)null);\n" +
			"	             ^^\n" +
			"AX is a raw type. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 7)\n" +
			"	X x = new X((AX)null, (AX)null);\n" +
			"	                      ^^^^^^^^\n" +
			"Type safety: The expression of type AX needs unchecked conversion to conform to AX<String>\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 7)\n" +
			"	X x = new X((AX)null, (AX)null);\n" +
			"	                       ^^\n" +
			"AX is a raw type. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 8)\n" +
			"	AX a = new AX((AX)null);\n" +
			"	^^\n" +
			"AX is a raw type. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"6. WARNING in X.java (at line 8)\n" +
			"	AX a = new AX((AX)null);\n" +
			"	       ^^^^^^^^^^^^^^^^\n" +
			"Type safety: The constructor AX(AX) belongs to the raw type AX. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"7. WARNING in X.java (at line 8)\n" +
			"	AX a = new AX((AX)null);\n" +
			"	           ^^\n" +
			"AX is a raw type. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"8. WARNING in X.java (at line 8)\n" +
			"	AX a = new AX((AX)null);\n" +
			"	               ^^\n" +
			"AX is a raw type. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"9. WARNING in X.java (at line 9)\n" +
			"	AX a2 = new AX(null);\n" +
			"	^^\n" +
			"AX is a raw type. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"10. WARNING in X.java (at line 9)\n" +
			"	AX a2 = new AX(null);\n" +
			"	        ^^^^^^^^^^^^\n" +
			"Type safety: The constructor AX(AX) belongs to the raw type AX. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"11. WARNING in X.java (at line 9)\n" +
			"	AX a2 = new AX(null);\n" +
			"	            ^^\n" +
			"AX is a raw type. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"12. WARNING in X.java (at line 10)\n" +
			"	x.foo(a);\n" +
			"	      ^\n" +
			"Type safety: The expression of type AX needs unchecked conversion to conform to AX<String>\n" +
			"----------\n" +
			"13. WARNING in X.java (at line 12)\n" +
			"	a.bar(a);\n" +
			"	^^^^^^^^\n" +
			"Type safety: The method bar(AX) belongs to the raw type AX. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"14. ERROR in X.java (at line 13)\n" +
			"	AX<String> as = new AX<String>(null);\n" +
			"	                ^^^^^^^^^^^^^^^^^^^^\n" +
			"The constructor AX<String>(AX<String>) is ambiguous\n" +
			"----------\n" +
			"15. ERROR in X.java (at line 14)\n" +
			"	as.print(a);\n" +
			"	   ^^^^^\n" +
			"The method print(String) in the type AX<String> is not applicable for the arguments (AX)\n" +
			"----------\n" +
			"16. WARNING in X.java (at line 15)\n" +
			"	as.bar(a);\n" +
			"	       ^\n" +
			"Type safety: The expression of type AX needs unchecked conversion to conform to AX<String>\n" +
			"----------\n" +
			"17. WARNING in X.java (at line 22)\n" +
			"	void foo(AX rawAx){}\n" +
			"	         ^^\n" +
			"AX is a raw type. References to generic type AX<P> should be parameterized\n" +
			"----------\n");
	}

	public void test0085() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        AX ax = new AX();\n" +
				"        X x = (X)ax.p;\n" +
				"        System.out.println(x);\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class AX <P> {\n" +
				"    \n" +
				"    P p;\n" +
				"}\n",
			},
		"null");
	}

	public void test0086() {
		Map customOptions = getCompilerOptions();
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        AX ax = new AX();\n" +
				"        AX ax2 = ax.p;\n" +
				"        ax.p = new AX<String>();\n" +
				"        System.out.println(ax2);\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class AX <P> {\n" +
				"    AX<P> p;\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 4)\n" +
			"	AX ax = new AX();\n" +
			"	^^\n" +
			"AX is a raw type. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 4)\n" +
			"	AX ax = new AX();\n" +
			"	            ^^\n" +
			"AX is a raw type. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 5)\n" +
			"	AX ax2 = ax.p;\n" +
			"	^^\n" +
			"AX is a raw type. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 6)\n" +
			"	ax.p = new AX<String>();\n" +
			"	   ^\n" +
			"Type safety: The field p from the raw type AX is assigned a value of type AX<String>. References to generic type AX<P> should be parameterized\n" +
			"----------\n",
		null,
		true,
		customOptions);
	}

	public void test0087() {
		Map customOptions = getCompilerOptions();
		// check no unsafe type operation problem is issued
		customOptions.put(CompilerOptions.OPTION_ReportUncheckedTypeOperation, CompilerOptions.ERROR);
		customOptions.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.IGNORE);
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        AX ax = new AX();\n" +
				"        AX ax2 = ax.p;\n" +
				"        AX ax3 = new AX<String>();\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class AX <P> {\n" +
				"    AX<P> p;\n" +
				"}\n",
			},
		"SUCCESS",
		null,
		true,
		null,
		customOptions,
		null/*no custom requestor*/);
	}

	public void test0088() {
		Map customOptions = getCompilerOptions();
		// check no unsafe type operation problem is issued
		customOptions.put(CompilerOptions.OPTION_ReportUncheckedTypeOperation, CompilerOptions.ERROR);
		customOptions.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.IGNORE);
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"     AX ax = new AX();\n" +
				"     AX ax2 = ax.p;\n" +
				"     AX ax3 = new AX<String>();\n" +
				"}\n" +
				"\n" +
				"class AX <P> {\n" +
				"    AX<P> p;\n" +
				"}\n",
			},
		"",
		null,
		true,
		null,
		customOptions,
		null/*no custom requestor*/);
	}

	public void test0089() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"    T q;\n" +
				"     public static void main(String[] args) {\n" +
				"         X<String[]> xss = new X<String[]>();\n" +
				"         X<X<String[]>> xxs = new X<X<String[]>>();\n" +
				"         xxs.q = xss;\n" +
				"         System.out.println(\"SUCCESS\");\n" +
				"     }\n" +
				"}\n",
			},
		"SUCCESS");
	}

	public void test0090() {
		Map customOptions = getCompilerOptions();
		// check no unsafe type operation problem is issued
		customOptions.put(CompilerOptions.OPTION_ReportUncheckedTypeOperation, CompilerOptions.ERROR);
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"    T q;\n" +
				"    \n" +
				"     public static void main(String[] args) {\n" +
				"         X<String[]> xss = new X<String[]>();\n" +
				"         X<X<String[]>> xxs = new X<X<String[]>>();\n" +
				"         xxs.q = xss;\n" +
				"         System.out.println(\"SUCCESS\");\n" +
				"     }\n" +
				"      void foo(X[] xs) {\n" +
				"          xs[0] = new X<String>();\n" +
				"     }\n" +
				"}\n",
			},
		"SUCCESS",
		null,
		true,
		null,
		customOptions,
		null/*no custom requestor*/);
	}

	public void test0091() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"      void foo(X<String>[] xs) {\n" +
				"     }\n" +
				"}\n",
			},
			"");
	}

	public void test0092() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"    T t;\n" +
				"    X(T t) {\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"     void foo() {\n" +
				"         X<String> xs = new X<String>(\"\");\n" +
				"         X<String> xs2 = (X<String>) xs;\n" +
				"         \n" +
				"         ((X)xs).t = this;\n" +
				"         \n" +
				"         System.out.prinln((T) this.t);\n" +
				"     }\n" +
				"     public static void main(String[] args) {\n" +
				"		new X<String>(\"SUCCESS\").foo();\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 8)\n" +
			"	X<String> xs2 = (X<String>) xs;\n" +
			"	                ^^^^^^^^^^^^^^\n" +
			"Unnecessary cast from X<String> to X<String>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 10)\n" +
			"	((X)xs).t = this;\n" +
			"	  ^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 10)\n" +
			"	((X)xs).t = this;\n" +
			"	        ^\n" +
			"Type safety: The field t from the raw type X is assigned a value of type X<T>. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 12)\n" +
			"	System.out.prinln((T) this.t);\n" +
			"	           ^^^^^^\n" +
			"The method prinln(T) is undefined for the type PrintStream\n" +
			"----------\n");
	}

	// **
	public void test0093() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"    public static void main(String[] args) {\n" +
				"        AX ax = new AX();\n" +
				"        AX ax2 = new AX();\n" +
				"        ax.p = ax2.p;\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n" +
				"class AX <P> {\n" +
				"    AX<P> p;\n" +
				"}\n",
			},
		"SUCCESS");
	}

	// same as test001, but every type is now a SourceTypeBinding
	public void test0094() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<Tx1 extends S, Tx2 extends C>  extends XS<Tx2> {\n" +
				"\n" +
				"    public static void main(String[] args) {\n" +
				"        I w = new X<S,I>().get(new I());\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n" +
				"class S {}\n" +
				"class I implements C<I> {}\n" +
				"interface C<Tc> {}\n" +
				"class XS <Txs> {\n" +
				"    Txs get(Txs t) {\n" +
				"        return t;\n" +
				"    }\n" +
				"}\n"
			},
			"SUCCESS");
	}
	public void test0095() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<Tx1 extends S, Tx2 extends C>  extends XS<Tx2> {\n" +
				"\n" +
				"    public static void main(String[] args) {\n" +
				"        I w = new X<S,I>().get(new I());\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n" +
				"class S {}\n" +
				"class I implements C {}\n" +
				"interface C<Tc> {}\n" +
				"class XS <Txs> {\n" +
				"    Txs get(Txs t) {\n" +
				"        return t;\n" +
				"    }\n" +
				"}\n"
			},
			"SUCCESS");
	}
	public void test0096() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T> extends X {}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 1)\n" +
			"	public class X<T> extends X {}\n" +
			"	                          ^\n" +
			"Cycle detected: the type X<T> cannot extend/implement itself or one of its own member types\n" +
			"----------\n");
	}
	public void test0097() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T> extends X<String> {}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 1)\n" +
			"	public class X<T> extends X<String> {}\n" +
			"	                          ^\n" +
			"Cycle detected: the type X<T> cannot extend/implement itself or one of its own member types\n" +
			"----------\n");
	}
	public void test0098() {
		Map customOptions = getCompilerOptions();
		customOptions.put(CompilerOptions.OPTION_ReportUncheckedTypeOperation, CompilerOptions.ERROR);
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        AX ax = new AX();\n" +
				"        AX ax2 = ax.p;\n" +
				"        ax.p = new AX<String>();\n" +
				"        ax.q = new AX<String>();\n" +
				"        ax.r = new AX<Object>();\n" +
				"        ax.s = new AX<String>();\n" +
				"        System.out.println(ax2);\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class AX <P> {\n" +
				"    AX<P> p;\n" +
				"    AX<Object> q;\n" +
				"    AX<String> r;\n" +
				"    BX<String> s;\n" +
				"}\n" +
				"\n" +
				"class BX<Q> {\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 4)\n" +
			"	AX ax = new AX();\n" +
			"	^^\n" +
			"AX is a raw type. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 4)\n" +
			"	AX ax = new AX();\n" +
			"	            ^^\n" +
			"AX is a raw type. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 5)\n" +
			"	AX ax2 = ax.p;\n" +
			"	^^\n" +
			"AX is a raw type. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 6)\n" +
			"	ax.p = new AX<String>();\n" +
			"	   ^\n" +
			"Type safety: The field p from the raw type AX is assigned a value of type AX<String>. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"5. ERROR in X.java (at line 7)\n" +
			"	ax.q = new AX<String>();\n" +
			"	   ^\n" +
			"Type safety: The field q from the raw type AX is assigned a value of type AX<String>. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"6. ERROR in X.java (at line 8)\n" +
			"	ax.r = new AX<Object>();\n" +
			"	   ^\n" +
			"Type safety: The field r from the raw type AX is assigned a value of type AX<Object>. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"7. ERROR in X.java (at line 9)\n" +
			"	ax.s = new AX<String>();\n" +
			"	       ^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from AX<String> to BX\n" +
			"----------\n",
		null,
		true,
		customOptions);
	}
	// wildcard bound cannot be base type
	// TODO (david) only syntax error should be related to wilcard bound being a base type. Ripple effect is severe here.
	public void test0099() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X  <T extends AX<? super int>> {\n" +
				"    public static void main(String[] args) {\n" +
				"		AX<String> ax;\n" +
				"		System.out.println(\"SUCCESS\");\n" +
				"	}\n" +
				"	void foo(X<?> x) {\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class AX<P> {\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 1)\n" +
			"	public class X  <T extends AX<? super int>> {\n" +
			"	                                      ^^^\n" +
			"Syntax error, insert \"Dimensions\" to complete ArrayType\n" +
			"----------\n"
);
	}

	// type parameterized with wildcard cannot appear in allocation
	public void test0100() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"    T t;\n" +
				"    X(T t){\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"		X<? extends AX> x = new X<? extends AX>(new AX<String>());\n" +
				"		System.out.println(\"SUCCESS\");\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class AX<P> {\n" +
				"    P foo() { return null; }\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 7)\n" +
			"	X<? extends AX> x = new X<? extends AX>(new AX<String>());\n" +
			"	            ^^\n" +
			"AX is a raw type. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 7)\n" +
			"	X<? extends AX> x = new X<? extends AX>(new AX<String>());\n" +
			"	                        ^\n" +
			"Cannot instantiate the type X<? extends AX>\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 7)\n" +
			"	X<? extends AX> x = new X<? extends AX>(new AX<String>());\n" +
			"	                                    ^^\n" +
			"AX is a raw type. References to generic type AX<P> should be parameterized\n" +
			"----------\n");
	}

	// wilcard may not pass parameter bound check
	public void test0101() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T extends String> {\n" +
				"    T t;\n" +
				"    X(T t){\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"		X<? extends AX> x = new X<AX<String>>(new AX<String>());\n" +
				"		x.t.foo(\"SUCCESS\");\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class AX<P> {\n" +
				"   void foo(P p) { \n" +
				"		System.out.println(p);\n" +
				"   }\n" +
				"}\n" +
				"\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 1)\n" +
			"	public class X <T extends String> {\n" +
			"	                          ^^^^^^\n" +
			"The type parameter T should not be bounded by the final type String. Final types cannot be further extended\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 7)\n" +
			"	X<? extends AX> x = new X<AX<String>>(new AX<String>());\n" +
			"	  ^^^^^^^^^^^^\n" +
			"Bound mismatch: The type ? extends AX is not a valid substitute for the bounded parameter <T extends String> of the type X<T>\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 7)\n" +
			"	X<? extends AX> x = new X<AX<String>>(new AX<String>());\n" +
			"	            ^^\n" +
			"AX is a raw type. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 7)\n" +
			"	X<? extends AX> x = new X<AX<String>>(new AX<String>());\n" +
			"	                          ^^\n" +
			"Bound mismatch: The type AX<String> is not a valid substitute for the bounded parameter <T extends String> of the type X<T>\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 8)\n" +
			"	x.t.foo(\"SUCCESS\");\n" +
			"	^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The method foo(Object) belongs to the raw type AX. References to generic type AX<P> should be parameterized\n" +
			"----------\n");
	}
	// unbound wildcard implicitly bound by matching parameter bounds
	public void test0102() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T extends AX> {\n" +
				"    T t;\n" +
				"    X(T t){\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"		X<?> x = new X<BX<String>>(new BX<String>());\n" +
				"		x.t.foo(\"SUCC\");\n" +
				"		x.t.bar(\"ESS\");\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class AX<P> {\n" +
				"   void foo(P p) { \n" +
				"		System.out.print(p);\n" +
				"   }\n" +
				"}\n" +
				"\n" +
				"class BX<Q> extends AX<Q> {\n" +
				"   void bar(Q q) { \n" +
				"		System.out.println(q);\n" +
				"   }\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 1)\n" +
			"	public class X <T extends AX> {\n" +
			"	                          ^^\n" +
			"AX is a raw type. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 8)\n" +
			"	x.t.foo(\"SUCC\");\n" +
			"	^^^^^^^^^^^^^^^\n" +
			"Type safety: The method foo(Object) belongs to the raw type AX. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 9)\n" +
			"	x.t.bar(\"ESS\");\n" +
			"	    ^^^\n" +
			"The method bar(String) is undefined for the type capture#2-of ?\n" +
			"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=85303
	public void test0103() throws Exception {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T extends AX> {\n" +
				"    T t;\n" +
				"    X(T t){\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"		X<? extends BX> x = new X<BX<String>>(new BX<String>());\n" +
				"		x.t.foo(\"SUCC\");\n" +
				"		x.t.bar(\"ESS\");\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class AX<P> {\n" +
				"   void foo(P p) { \n" +
				"		System.out.print(p);\n" +
				"   }\n" +
				"}\n" +
				"\n" +
				"class BX<Q> extends AX<Q> {\n" +
				"   void bar(Q q) { \n" +
				"		System.out.println(q);\n" +
				"   }\n" +
				"}\n",
			},
			"SUCCESS");
		String expectedOutput =
			"  // Method descriptor #25 ([Ljava/lang/String;)V\n" +
			"  // Stack: 4, Locals: 2\n" +
			"  public static void main(java.lang.String[] args);\n" +
			"     0  new X [1]\n" +
			"     3  dup\n" +
			"     4  new BX [26]\n" +
			"     7  dup\n" +
			"     8  invokespecial BX() [28]\n" +
			"    11  invokespecial X(AX) [29]\n" +
			"    14  astore_1 [x]\n" +
			"    15  aload_1 [x]\n" +
			"    16  getfield X.t : AX [16]\n" +
			"    19  checkcast BX [26]\n" +
			"    22  ldc <String \"SUCC\"> [31]\n" +
			"    24  invokevirtual BX.foo(java.lang.Object) : void [33]\n" +
			"    27  aload_1 [x]\n" +
			"    28  getfield X.t : AX [16]\n" +
			"    31  checkcast BX [26]\n" +
			"    34  ldc <String \"ESS\"> [37]\n" +
			"    36  invokevirtual BX.bar(java.lang.Object) : void [39]\n" +
			"    39  return\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 7]\n" +
			"        [pc: 15, line: 8]\n" +
			"        [pc: 27, line: 9]\n" +
			"        [pc: 39, line: 10]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 40] local: args index: 0 type: java.lang.String[]\n" +
			"        [pc: 15, pc: 40] local: x index: 1 type: X\n" +
			"      Local variable type table:\n" +
			"        [pc: 15, pc: 40] local: x index: 1 type: X<? extends BX>\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);
		}
	}

	// wildcard bound check
	public void test0104() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T extends AX> {\n" +
				"    T t;\n" +
				"    X(T t){\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"		X<? extends BX> x = new X<AX<String>>(new AX<String>());\n" +
				"		x.t.foo(\"SUCC\");\n" +
				"		x.t.bar(\"ESS\");\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class AX<P> {\n" +
				"   void foo(P p) { \n" +
				"		System.out.print(p);\n" +
				"   }\n" +
				"}\n" +
				"\n" +
				"class BX<Q> extends AX<Q> {\n" +
				"   void bar(Q q) { \n" +
				"		System.out.println(q);\n" +
				"   }\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 1)\n" +
			"	public class X <T extends AX> {\n" +
			"	                          ^^\n" +
			"AX is a raw type. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 7)\n" +
			"	X<? extends BX> x = new X<AX<String>>(new AX<String>());\n" +
			"	            ^^\n" +
			"BX is a raw type. References to generic type BX<Q> should be parameterized\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 7)\n" +
			"	X<? extends BX> x = new X<AX<String>>(new AX<String>());\n" +
			"	                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from X<AX<String>> to X<? extends BX>\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 8)\n" +
			"	x.t.foo(\"SUCC\");\n" +
			"	^^^^^^^^^^^^^^^\n" +
			"Type safety: The method foo(Object) belongs to the raw type AX. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 9)\n" +
			"	x.t.bar(\"ESS\");\n" +
			"	^^^^^^^^^^^^^^\n" +
			"Type safety: The method bar(Object) belongs to the raw type BX. References to generic type BX<Q> should be parameterized\n" +
			"----------\n");
	}
	public void test0105() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T extends AX> {\n" +
				"    T t;\n" +
				"    X(T t){\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"		X<? extends AX> x = new X<AX<String>>(new AX<String>());\n" +
				"		x.t.foo(\"SUCCESS\");\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class AX<P> {\n" +
				"   void foo(P p) { \n" +
				"		System.out.println(p);\n" +
				"   }\n" +
				"}\n",
			},
			"SUCCESS");
	}
	public void test0106() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T extends AX> {\n" +
				"    T t;\n" +
				"    X(T t){\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        X<BX<String>> x = new X<BX<String>>(new BX<String>());\n" +
				"		x.t.foo(\"SUCC\");\n" +
				"		x.t.bar(\"ESS\");\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class AX<P> {\n" +
				"   void foo(P p) { \n" +
				"		System.out.print(p);\n" +
				"   }\n" +
				"}\n" +
				"\n" +
				"class BX<Q> extends AX<Q> {\n" +
				"   void bar(Q q) { \n" +
				"		System.out.println(q);\n" +
				"   }\n" +
				"}\n",
			},
			"SUCCESS");
	}
	// unsafe assignment thru binaries
	public void test0107() {
		Map customOptions = getCompilerOptions();
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.ArrayList;\n" +
				"\n" +
				"public class X  {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        \n" +
				"        Iterable<String> is = new ArrayList();\n" +
				"		is.iterator();\n" +
				"    }\n" +
				"}\n" +
				"\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 7)\n" +
			"	Iterable<String> is = new ArrayList();\n" +
			"	                      ^^^^^^^^^^^^^^^\n" +
			"Type safety: The expression of type ArrayList needs unchecked conversion to conform to Iterable<String>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 7)\n" +
			"	Iterable<String> is = new ArrayList();\n" +
			"	                          ^^^^^^^^^\n" +
			"ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized\n" +
			"----------\n",
			null,
			true,
			customOptions);
	}
	// class literal: Integer.class of type Class<Integer>
	public void test0108() {
	    // also ensure no unsafe type operation problem is issued (assignment to variable of type raw)
		Map customOptions = getCompilerOptions();
		customOptions.put(CompilerOptions.OPTION_ReportUncheckedTypeOperation, CompilerOptions.ERROR);
		customOptions.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.IGNORE);
		this.runConformTest(
			new String[] {
				"X.java",
			"public class X {\n" +
			"    Class k;\n" +
			"    public static void main(String args[]) {\n" +
			"        new X().foo();\n" +
			"    }\n" +
			"    void foo() {\n" +
			"        Class c = this.getClass();\n" +
			"        this.k = this.getClass();\n" +
			"        this.k = Integer.class;\n" +
			"        try {\n" +
			"            Integer i = Integer.class.newInstance();\n" +
			"        } catch (Exception e) {\n" +
			"        }\n" +
			"        System.out.println(\"SUCCESS\");\n" +
			"    }\n" +
			"}\n",
			},
		"SUCCESS",
		null,
		true,
		null,
		customOptions,
		null/*no custom requestor*/);
	}
	// parameterized interface cannot be implemented simultaneously with distinct arguments
	public void test0109() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X implements AX<String> {}\n" +
				"class Y extends X implements AX<Thread> {}\n" +
				"interface AX<P> {}\n" +
				"\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	class Y extends X implements AX<Thread> {}\n" +
			"	      ^\n" +
			"The interface AX cannot be implemented more than once with different arguments: AX<String> and AX<Thread>\n" +
			"----------\n");
	}
	public void test0110() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X implements AX {}\n" +
				"class Y extends X implements AX<Thread> {}\n" +
				"interface AX<P> {}\n" +
				"\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 1)\n" +
			"	public class X implements AX {}\n" +
			"	                          ^^\n" +
			"AX is a raw type. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 2)\n" +
			"	class Y extends X implements AX<Thread> {}\n" +
			"	      ^\n" +
			"The interface AX cannot be implemented more than once with different arguments: AX and AX<Thread>\n" +
			"----------\n");
	}
	public void test0111() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X implements AX<Object> {}\n" +
				"class Y extends X implements AX {}\n" +
				"interface AX<P> {}\n" +
				"\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	class Y extends X implements AX {}\n" +
			"	      ^\n" +
			"The interface AX cannot be implemented more than once with different arguments: AX<Object> and AX\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 2)\n" +
			"	class Y extends X implements AX {}\n" +
			"	                             ^^\n" +
			"AX is a raw type. References to generic type AX<P> should be parameterized\n" +
			"----------\n");
	}
	// test member types
	public void test0112() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T extends X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>>{\n" +
				"    void foo(X<Thread>.MX<String>.MMX<X> mx) {}\n" +
				"    class MX <MT> {\n" +
				"        class MMX <MMT> {}\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 1)\n" +
			"	public class X <T extends X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>>{\n" +
			"	                            ^^^^^^^^\n" +
			"X.MX.MMX is a raw type. References to generic type X<T>.MX<MT>.MMX<MMT> should be parameterized\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 1)\n" +
			"	public class X <T extends X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>>{\n" +
			"	                            ^^^^^^^^\n" +
			"Bound mismatch: The type X.MX.MMX is not a valid substitute for the bounded parameter <T extends X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>> of the type X<T>\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 2)\n" +
			"	void foo(X<Thread>.MX<String>.MMX<X> mx) {}\n" +
			"	           ^^^^^^\n" +
			"Bound mismatch: The type Thread is not a valid substitute for the bounded parameter <T extends X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>> of the type X<T>\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 2)\n" +
			"	void foo(X<Thread>.MX<String>.MMX<X> mx) {}\n" +
			"	                                  ^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n");
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T extends X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>>{\n" +
				"    class MX <MT extends Comparable> {\n" +
				"        class MMX <MMT> {}\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 1)\n" +
			"	public class X <T extends X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>>{\n" +
			"	                            ^^^^^^^^\n" +
			"X.MX.MMX is a raw type. References to generic type X<T>.MX<MT>.MMX<MMT> should be parameterized\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 1)\n" +
			"	public class X <T extends X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>>{\n" +
			"	                            ^^^^^^^^\n" +
			"Bound mismatch: The type X.MX.MMX is not a valid substitute for the bounded parameter <T extends X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>> of the type X<T>\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 1)\n" +
			"	public class X <T extends X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>>{\n" +
			"	                                         ^^^^^^^^\n" +
			"Bound mismatch: The type Runnable is not a valid substitute for the bounded parameter <MT extends Comparable> of the type X<T>.MX<MT>\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 2)\n" +
			"	class MX <MT extends Comparable> {\n" +
			"	                     ^^^^^^^^^^\n" +
			"Comparable is a raw type. References to generic type Comparable<T> should be parameterized\n" +
			"----------\n");
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T extends X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>>{\n" +
				"    class MX <MT> {\n" +
				"        class MMX <MMT extends Comparable> {}\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 1)\n" +
			"	public class X <T extends X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>>{\n" +
			"	                            ^^^^^^^^\n" +
			"X.MX.MMX is a raw type. References to generic type X<T>.MX<MT>.MMX<MMT> should be parameterized\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 1)\n" +
			"	public class X <T extends X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>>{\n" +
			"	                            ^^^^^^^^\n" +
			"Bound mismatch: The type X.MX.MMX is not a valid substitute for the bounded parameter <T extends X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>> of the type X<T>\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 1)\n" +
			"	public class X <T extends X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>>{\n" +
			"	                                                       ^^^^^^^^\n" +
			"Bound mismatch: The type Iterable<String> is not a valid substitute for the bounded parameter <MMT extends Comparable> of the type X<T>.MX<MT>.MMX<MMT>\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 3)\n" +
			"	class MMX <MMT extends Comparable> {}\n" +
			"	                       ^^^^^^^^^^\n" +
			"Comparable is a raw type. References to generic type Comparable<T> should be parameterized\n" +
			"----------\n");
	}
	public void test0113() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"  class MX<U> {\n" +
				"  }\n" +
				"\n" +
				"  public static void main(String[] args) {\n" +
				"    new X<Thread>().foo();\n" +
				"	System.out.println(\"SUCCESS\");\n" +
				"  }\n" +
				"  void foo() {\n" +
				"		new X<String>().new MX<T>();\n" +
				"  }\n" +
				"}\n",
			},
			"SUCCESS");
	}
	public void test0114() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"  class MX<U> {\n" +
				"  }\n" +
				"\n" +
				"  public static void main(String[] args) {\n" +
				"    new X<Thread>().foo(new X<String>().new MX<Thread>());\n" +
				"  }\n" +
				"  void foo(X<String>.MX<Thread> mx) {\n" +
				"	System.out.println(\"SUCCESS\");\n" +
				"  }\n" +
				"}\n",
			},
			"SUCCESS");
	}
	public void test0115() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"  class MX<U> {\n" +
				"  }\n" +
				"\n" +
				"  public static void main(String[] args) {\n" +
				"    new X<Thread>().foo(new X<String>().new MX<Thread>());\n" +
				"  }\n" +
				"  void foo(X.MX mx) {\n" +
				"	System.out.println(\"SUCCESS\");\n" +
				"  }\n" +
				"}\n",
			},
			"SUCCESS");
	}
	public void test0116() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"  class MX<U> {\n" +
				"  }\n" +
				"\n" +
				"  public static void main(String[] args) {\n" +
				"    new X<Thread>().foo(new X<String>().new MX<Thread>());\n" +
				"  }\n" +
				"  void foo(X<?>.MX<?> mx) {\n" +
				"	System.out.println(\"SUCCESS\");\n" +
				"  }\n" +
				"}\n",
			},
			"SUCCESS");
	}
	// test member types
	public void test0117() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T extends X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>>{\n" +
				"    public static void main(String [] args) {\n" +
				"        \n" +
				"        new X<X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>>().new MX<Exception>();\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"    void foo(X<X.MX.MMX>.MX<X>.MMX<X> mx) {\n" +
				"    }\n" +
				"    \n" +
				"    class MX <MT> {\n" +
				"        class MMX <MMT> {\n" +
				"        }\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 1)\n" +
			"	public class X <T extends X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>>{\n" +
			"	                            ^^^^^^^^\n" +
			"X.MX.MMX is a raw type. References to generic type X<T>.MX<MT>.MMX<MMT> should be parameterized\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 1)\n" +
			"	public class X <T extends X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>>{\n" +
			"	                            ^^^^^^^^\n" +
			"Bound mismatch: The type X.MX.MMX is not a valid substitute for the bounded parameter <T extends X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>> of the type X<T>\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 4)\n" +
			"	new X<X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>>().new MX<Exception>();\n" +
			"	        ^^^^^^^^\n" +
			"X.MX.MMX is a raw type. References to generic type X<T>.MX<MT>.MMX<MMT> should be parameterized\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 4)\n" +
			"	new X<X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>>().new MX<Exception>();\n" +
			"	        ^^^^^^^^\n" +
			"Bound mismatch: The type X.MX.MMX is not a valid substitute for the bounded parameter <T extends X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>> of the type X<T>\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 7)\n" +
			"	void foo(X<X.MX.MMX>.MX<X>.MMX<X> mx) {\n" +
			"	           ^^^^^^^^\n" +
			"X.MX.MMX is a raw type. References to generic type X<T>.MX<MT>.MMX<MMT> should be parameterized\n" +
			"----------\n" +
			"6. ERROR in X.java (at line 7)\n" +
			"	void foo(X<X.MX.MMX>.MX<X>.MMX<X> mx) {\n" +
			"	           ^^^^^^^^\n" +
			"Bound mismatch: The type X.MX.MMX is not a valid substitute for the bounded parameter <T extends X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>> of the type X<T>\n" +
			"----------\n" +
			"7. WARNING in X.java (at line 7)\n" +
			"	void foo(X<X.MX.MMX>.MX<X>.MMX<X> mx) {\n" +
			"	                        ^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"8. WARNING in X.java (at line 7)\n" +
			"	void foo(X<X.MX.MMX>.MX<X>.MMX<X> mx) {\n" +
			"	                               ^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n");
	}
	// test generic method with recursive parameter bound <T extends Comparable<? super T>>
	public void test0118() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public static void main(String[] args) {\n" +
				"        java.util.Collections.sort(new java.util.LinkedList<String>());\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n"
			},
			"SUCCESS");
	}
	// test generic method
	public void test0118a() {
		this.runConformTest(
			// test directory preparation
			true /* flush output directory */,
			new String[] { /* test files */
				"X.java",
				"class A<T> {}\n" +
				"\n" +
				"public class X {\n" +
				"	static <T extends A<U>, U> void foo() {}\n" +
				"	void bar(A<?> a) {\n" +
				"		foo();\n" +
				"	}\n" +
				"}"
			},
			// compiler results
			null /* do not check compiler log */,
			// runtime results
			"" /* expected output string */,
			null /* do not check error string */,
			// javac options
			JavacTestOptions.JavacHasABug.JavacBugFixed_7 /* javac test options */);
	}
	// test binary member types **
	public void _test0119() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T extends X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>>{\n" +
				"    public static void main(String [] args) {\n" +
				"        \n" +
				"        new X<X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>>().new MX<Exception>();\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"    void foo(X<X.MX.MMX>.MX<Object>.MMX<X> mx) {\n" +
				"    }\n" +
				"    void foo2(X<X.MX.MMX>.MX<Iterable>.MMX<X> mx) {\n" +
				"    }\n" +
				"    void foo3(X<X<X.MX.MMX>.MX<Runnable>.MMX<Iterable<String>>> mx) {\n" +
				"    }\n" +
				"    \n" +
				"    class MX <MT> {\n" +
				"        class MMX <MMT> {\n" +
				"        }\n" +
				"    }\n" +
				"}\n",
			},
			"SUCCESS"
		);

		// TODO (philippe) bounds checks are done before binaryType X is finished creating its type variables
		this.runConformTest(
			new String[] {
				"Y.java",
				"public class Y extends X {\n" +
				"    public static void main(String [] args) {\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n",
			},
			"SUCCESS",
			null,
			false, // do not flush output
			null);
	}
	// test generic method
	public void test0120() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T>{\n" +
				"    public static void main(String[] args) {\n" +
				"        \n" +
				"        String s = new X<String>().foo(\"SUCCESS\");\n" +
				"	}\n" +
				"    <U extends String> T foo (U u) {\n" +
				"        System.out.println(u);\n" +
				"        return null;\n" +
				"    }\n" +
				"}\n",
			},
			"SUCCESS");
	}
	// test generic method
	public void test0120a() {
		this.runConformTest(
			// test directory preparation
			new String[] { /* test files */
				"X.java",
				"public class X<E> {\n" +
				"    <U extends X<?>> U foo() {\n" +
				"    	return null;\n" +
				"    }\n" +
				"    <V extends X<?>> V bar() {\n" +
				"        return foo();\n" +
				"    }\n" +
				"}"
			},
			// javac options
			JavacTestOptions.JavacHasABug.JavacBug6302954 /* javac test options */);
	}
	// substitute array types
	public void test0121() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"    public static void main(String[] args) {\n" +
				"		new X<String>().foo(args);\n" +
				"	}\n" +
				"    \n" +
				"    void foo(T[] ts) {\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n",
			},
			"SUCCESS");
	}
	// generic method with most specific common supertype: U --> String
	public void test0122() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"    public static void main(String[] args) {\n" +
				"		new X<String>().foo(args, new X<X<String>>());\n" +
				"	}\n" +
				"    <U> void foo(U[] us, X<X<U>> xxu) {\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n",
			},
			"SUCCESS");
	}
	// invalid parameterized type
	public void test0123() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"    T<String> ts;\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	T<String> ts;\n" +
			"	^\n" +
			"The type T is not generic; it cannot be parameterized with arguments <String>\n" +
			"----------\n");
	}
	// generic method with indirect type inference: BX<String, Thread> --> AX<W>
	public void test0124() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    \n" +
				"    <W> void foo(AX<W> aw) {\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"     }\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"		new X().foo(new BX<String,Thread>());\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class AX<T> {\n" +
				"}\n" +
				"class BX<U, V> extends AX<V> {\n" +
				"}\n",
			},
			"SUCCESS");
	}
	// generic method with indirect type inference: CX  --> AX<W>
	public void test0125() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    \n" +
				"    <W> void foo(AX<W> aw) {\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"     }\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"		new X().foo(new CX());\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class AX<T> {\n" +
				"}\n" +
				"class BX<U, V> extends AX<V> {\n" +
				"}\n" +
				"class CX extends BX<String, Thread> {\n" +
				"}\n",
			},
			"SUCCESS");
	}
	// variation on test0125 with typo: CX extends B instead of BX.
	public void test0126() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    \n" +
				"    <W> void foo(AX<W> aw) {\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"     }\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"		new X().foo(new CX());\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class AX<T> {\n" +
				"}\n" +
				"class BX<U, V> extends AX<V> {\n" +
				"}\n" +
				"class CX extends B<String, Thread> {\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 8)\n" +
			"	new X().foo(new CX());\n" +
			"	        ^^^\n" +
			"The method foo(AX<W>) in the type X is not applicable for the arguments (CX)\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 16)\n" +
			"	class CX extends B<String, Thread> {\n" +
			"	                 ^\n" +
			"B cannot be resolved to a type\n" +
			"----------\n");
	}
	// 57784: test generic method
	public void test0127() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public static void main(String[] args) {\n" +
				"        java.util.Arrays.asList(new Object[] {\"1\"});\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n"
			},
			"SUCCESS");
	}
	// 58666: special treatment for Object#getClass declared of type: Class<? extends Object>
	// but implicitly converted to Class<? extends X> for free.
	public void test0128() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X { \n" +
				"    public static void main(String[] args) {\n" +
				"		X x = new X();\n" +
				"		Class c1 = x.getClass();\n" +
				"		Class<? extends X> c2 = x.getClass();\n" +
				"		String s = \"hello\";\n" +
				"		Class<? extends X> c3 = s.getClass();\n" +
				"		System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 4)\n" +
			"	Class c1 = x.getClass();\n" +
			"	^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 7)\n" +
			"	Class<? extends X> c3 = s.getClass();\n" +
			"	                        ^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Class<capture#3-of ? extends String> to Class<? extends X>\n" +
			"----------\n");
	}
	// variation on test0128
	public void test0129() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X { \n" +
				"\n" +
				"    public static void main(String[] args) {\n" +
				"		XY xy = new XY();\n" +
				"		Class c1 = xy.getClass();\n" +
				"		Class<? extends XY> c2 = xy.getClass();\n" +
				"		String s = \"hello\";\n" +
				"		Class<? extends XY> c3 = s.getClass();\n" +
				"		System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class XY extends X {\n" +
				"    public Class <? extends Object> getClass() {\n" +
				"        return super.getClass();\n" +
				"    }\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 5)\n" +
			"	Class c1 = xy.getClass();\n" +
			"	^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 8)\n" +
			"	Class<? extends XY> c3 = s.getClass();\n" +
			"	                         ^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Class<capture#3-of ? extends String> to Class<? extends XY>\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 14)\n" +
			"	public Class <? extends Object> getClass() {\n" +
			"	                                ^^^^^^^^^^\n" +
			"Cannot override the final method from Object\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 14)\n" +
			"	public Class <? extends Object> getClass() {\n" +
			"	                                ^^^^^^^^^^\n" +
			"The method getClass() of type XY should be tagged with @Override since it actually overrides a superclass method\n" +
			"----------\n");
	}
	// getClass on array type
	public void test0130() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X { \n" +
				"\n" +
				"    public static void main(String[] args) {\n" +
				"		X[] x = new X[0];\n" +
				"		Class<? extends X[]> c = x.getClass();\n" +
				"		System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n"
			},
			"SUCCESS");
	}
	// 58979
	public void test0131() {
		this.runNegativeTest(
			new String[] {
				"ArrayList.java",
				" interface List<T> {\n" +
				"	 List<T> foo();\n" +
				"}\n" +
				"\n" +
				" class ArrayList<T> implements List<T> {\n" +
				"	public List<T> foo() {\n" +
				"		List<T> lt = this;\n" +
				"		lt.bar();\n" +
				"		return this;\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in ArrayList.java (at line 8)\n" +
			"	lt.bar();\n" +
			"	   ^^^\n" +
			"The method bar() is undefined for the type List<T>\n" +
			"----------\n");
	}
	public void test0132() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"  <T extends X<W>.Z> foo() {}\n" +
				"}"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	<T extends X<W>.Z> foo() {}\n" +
			"	           ^\n" +
			"The type X is not generic; it cannot be parameterized with arguments <W>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 2)\n" +
			"	<T extends X<W>.Z> foo() {}\n" +
			"	             ^\n" +
			"W cannot be resolved to a type\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 2)\n" +
			"	<T extends X<W>.Z> foo() {}\n" +
			"	                   ^^^^^\n" +
			"Return type for the method is missing\n" +
			"----------\n");
	}
	// bridge method
	public void test0133() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"    public static void main(String[] args) {\n" +
				"        X x = new Y();\n" +
				"        System.out.println(x.foo());\n" +
				"    }\n" +
				"   T foo() {return null;}\n" +
				"   void foo(T t) {}\n" +
				"}\n" +
				"class Y extends X<Object> {\n" +
				"    String foo() {return \"SUCCESS\";}\n" +
				"    void foo(String s) {}\n" +
				"}\n"
			},
			"SUCCESS");
	}
	public void test0134() {
		this.runConformTest(
			new String[] {
				"Z.java",
				"import java.util.ArrayList;\n" +
				"import java.util.List;\n" +
				"\n" +
				"public class Z <T extends List> { \n" +
				"    T t;\n" +
				"    public static void main(String[] args) {\n" +
				"        foo(new Z<ArrayList>().set(new ArrayList<String>()));\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"    Z<T> set(T t) {\n" +
				"        this.t = t;\n" +
				"        return this;\n" +
				"    }\n" +
				"    T get() { \n" +
				"        return this.t; \n" +
				"    }\n" +
				"    \n" +
				"    static void foo(Z<? super ArrayList> za) {\n" +
				"        za.get().isEmpty();\n" +
				"    }\n" +
				"}\n"
			},
			"SUCCESS");
	}
	public void test0135() {
		this.runNegativeTest(
			new String[] {
				"Z.java",
				"public class Z <T extends ZA> { \n" +
				"    public static void main(String[] args) {\n" +
				"        foo(new Z<ZA>());\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"    static void foo(Z<? super String> zs) {\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class ZA {\n" +
				"    void foo() {}\n" +
				"}\n" +
				"\n" +
				"class ZB extends ZA {\n" +
				"}"
			},
			"----------\n" +
			"1. ERROR in Z.java (at line 3)\n" +
			"	foo(new Z<ZA>());\n" +
			"	^^^\n" +
			"The method foo(Z<? super String>) in the type Z<T> is not applicable for the arguments (Z<ZA>)\n" +
			"----------\n" +
			"2. ERROR in Z.java (at line 6)\n" +
			"	static void foo(Z<? super String> zs) {\n" +
			"	                  ^^^^^^^^^^^^^^\n" +
			"Bound mismatch: The type ? super String is not a valid substitute for the bounded parameter <T extends ZA> of the type Z<T>\n" +
			"----------\n");
	}
	public void test0136() {
		this.runNegativeTest(
			new String[] {
				"Z.java",
				"public class Z <T extends ZB> { \n" +
				"    public static void main(String[] args) {\n" +
				"        foo(new Z<ZB>());\n" +
				"    }\n" +
				"    static void foo(Z<? super ZA> zs) {\n" +
				"        zs.foo();\n" +
				"    }\n" +
				"}\n" +
				"class ZA {\n" +
				"}\n" +
				"class ZB extends ZA {\n" +
				"    void foo() {}\n" +
				"}"
			},
			"----------\n" +
			"1. ERROR in Z.java (at line 3)\n" +
			"	foo(new Z<ZB>());\n" +
			"	^^^\n" +
			"The method foo(Z<? super ZA>) in the type Z<T> is not applicable for the arguments (Z<ZB>)\n" +
			"----------\n" +
			"2. ERROR in Z.java (at line 5)\n" +
			"	static void foo(Z<? super ZA> zs) {\n" +
			"	                  ^^^^^^^^^^\n" +
			"Bound mismatch: The type ? super ZA is not a valid substitute for the bounded parameter <T extends ZB> of the type Z<T>\n" +
			"----------\n" +
			"3. ERROR in Z.java (at line 6)\n" +
			"	zs.foo();\n" +
			"	   ^^^\n" +
			"The method foo(Z<? super ZA>) in the type Z<capture#1-of ? super ZA> is not applicable for the arguments ()\n" +
			"----------\n");
	}
	public void test0137() {
		this.runConformTest(
			new String[] {
				"Z.java",
				"import java.util.ArrayList;\n" +
				"import java.util.List;\n" +
				"\n" +
				"public class Z <T extends List> { \n" +
				"    T t;\n" +
				"    public static void main(String[] args) {\n" +
				"        foo(new Z<ArrayList>().set(new ArrayList<String>()));\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"    Z<T> set(T t) {\n" +
				"        this.t = t;\n" +
				"        return this;\n" +
				"    }\n" +
				"    T get() { \n" +
				"        return this.t; \n" +
				"    }\n" +
				"    \n" +
				"    static void foo(Z<? extends ArrayList> za) {\n" +
				"        za.get().isEmpty();\n" +
				"    }\n" +
				"}\n"
			},
			"SUCCESS");
	}
	// unbound wildcard still remembers its variable bound: Z<?> behaves like Z<AX>
	public void test0138() {
		this.runConformTest(
			new String[] {
				"Z.java",
				"public class Z <T extends AX> {\n" +
				"    T t;\n" +
				"    Z(T t){\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"		 Z<AX<String>> zax = new Z<AX<String>>(new AX<String>());\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"	}\n" +
				"    void baz(Z<?> zu){\n" +
				"        zu.t.foo(null);\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class AX<P> {\n" +
				"   void foo(P p) { \n" +
				"		System.out.print(p);\n" +
				"   }\n" +
				"}\n"
			},
			"SUCCESS");
	}
	// extending wildcard considers its bound prior to its corresponding variable
	public void test0139() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T extends AX> {\n" +
				"    T t;\n" +
				"    X(T t) {\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    T get() {\n" +
				"        return this.t;\n" +
				"    }\n" +
				"    void bar(X<? extends BX> x) {\n" +
				"        x.get().afoo();\n" +
				"        x.get().bfoo();\n" +
				"    }\n" +
				"}\n" +
				"class AX {\n" +
				"    void afoo() {}\n" +
				"}\n" +
				"class BX {\n" +
				"    void bfoo() {}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 9)\n" +
			"	void bar(X<? extends BX> x) {\n" +
			"	           ^^^^^^^^^^^^\n" +
			"Bound mismatch: The type ? extends BX is not a valid substitute for the bounded parameter <T extends AX> of the type X<T>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 10)\n" +
			"	x.get().afoo();\n" +
			"	        ^^^^\n" +
			"The method afoo() is undefined for the type capture#1-of ? extends BX\n" +
			"----------\n");
	}
	// extending wildcard considers its bound prior to its corresponding variable
	public void test0140() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T extends AX> {\n" +
				"    T t;\n" +
				"    X(T t) {\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    T get() {\n" +
				"        return this.t;\n" +
				"    }\n" +
				"    void bar(X<? extends BX> x) {\n" +
				"        x.get().afoo();\n" +
				"        x.get().bfoo();\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"	}\n" +
				"}\n" +
				"class AX {\n" +
				"    void afoo() {}\n" +
				"}\n" +
				"class BX extends AX {\n" +
				"    void bfoo() {}\n" +
				"}\n",
			},
			"SUCCESS");
	}
	// super wildcard considers its variable for lookups
	public void test0141() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T extends AX> {\n" +
				"    T t;\n" +
				"    X(T t) {\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    T get() {\n" +
				"        return this.t;\n" +
				"    }\n" +
				"    void bar(X<? super BX> x) {\n" +
				"        x.get().afoo();\n" +
				"        x.get().bfoo();\n" +
				"    }\n" +
				"}\n" +
				"class AX {\n" +
				"    void afoo() {}\n" +
				"}\n" +
				"class BX extends AX {\n" +
				"    void bfoo() {}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 11)\n" +
			"	x.get().bfoo();\n" +
			"	        ^^^^\n" +
			"The method bfoo() is undefined for the type capture#2-of ? super BX\n" +
			"----------\n");
	}
	public void test0142() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T extends AX> {\n" +
				"    T t;\n" +
				"    X(T t) {\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    T get() {\n" +
				"        return this.t;\n" +
				"    }\n" +
				"    void bar(X<? extends X> x) {\n" +
				"        x = identity(x);\n" +
				"    }\n" +
				"    <P extends AX> X<P> identity(X<P> x) {\n" +
				"        return x;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"    }\n" +
				"}\n" +
				"class AX {\n" +
				"    void afoo() {}\n" +
				"}\n" +
				"class BX extends AX {\n" +
				"    void bfoo() {}\n" +
				"}\n",
			},
			this.complianceLevel < ClassFileConstants.JDK1_8 ? 
			"----------\n" +
			"1. ERROR in X.java (at line 9)\n" +
			"	void bar(X<? extends X> x) {\n" +
			"	           ^^^^^^^^^^^\n" +
			"Bound mismatch: The type ? extends X is not a valid substitute for the bounded parameter <T extends AX> of the type X<T>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 9)\n" +
			"	void bar(X<? extends X> x) {\n" +
			"	                     ^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 10)\n" +
			"	x = identity(x);\n" +
			"	    ^^^^^^^^\n" +
			"Bound mismatch: The generic method identity(X<P>) of type X<T> is not applicable for the arguments (X<capture#2-of ? extends X>). The inferred type capture#2-of ? extends X is not a valid substitute for the bounded parameter <P extends AX>\n" +
			"----------\n" :
				"----------\n" + 
				"1. ERROR in X.java (at line 9)\n" + 
				"	void bar(X<? extends X> x) {\n" + 
				"	           ^^^^^^^^^^^\n" + 
				"Bound mismatch: The type ? extends X is not a valid substitute for the bounded parameter <T extends AX> of the type X<T>\n" + 
				"----------\n" + 
				"2. WARNING in X.java (at line 9)\n" + 
				"	void bar(X<? extends X> x) {\n" + 
				"	                     ^\n" + 
				"X is a raw type. References to generic type X<T> should be parameterized\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 10)\n" + 
				"	x = identity(x);\n" + 
				"	    ^^^^^^^^\n" + 
				"The method identity(X<P>) in the type X<T> is not applicable for the arguments (X<capture#2-of ? extends X>)\n" + 
				"----------\n");
	}
	public void test0143() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public static void main(String[] args) {\n" +
				"        Class<? extends X> xx = null;\n" +
				"        Class<? extends Object> xo = xx;\n" +
				"        Class<Object> xo2 = xx;\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	Class<Object> xo2 = xx;\n" +
			"	                    ^^\n" +
			"Type mismatch: cannot convert from Class<capture#2-of ? extends X> to Class<Object>\n" +
			"----------\n");
	}
	public void test0144() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public static void main(String[] args) {\n" +
				"        Class<? extends X> xx = null;\n" +
				"        Class<? extends Object> xo = xx;\n" +
				"        X x = get(xx);\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"    static <P> P get(Class<P> cp) {\n" +
				"        return null;\n" +
				"    }\n" +
				"}\n",
			},
			"SUCCESS");
	}
	// 59641: check assign/invoke with wildcards
	public void test0145() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		XList<?> lx = new XList<X>();\n" +
				"		X x = lx.get();\n" +
				"		lx.add(null);\n" +
				"		lx.add(x);\n" +
				"		lx.slot = x;\n" +
				"		lx.addAll(lx);\n" +
				"    }    	\n" +
				"}\n" +
				"class XList<E extends X> {\n" +
				"    E slot;\n" +
				"    void add(E e) {}\n" +
				"    E get() { return null; \n" +
				"    }\n" +
				"    void addAll(XList<E> le) {}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	lx.add(x);\n" +
			"	   ^^^\n" +
			"The method add(capture#3-of ?) in the type XList<capture#3-of ?> is not applicable for the arguments (X)\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 7)\n" +
			"	lx.slot = x;\n" +
			"	          ^\n" +
			"Type mismatch: cannot convert from X to capture#4-of ?\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 8)\n" +
			"	lx.addAll(lx);\n" +
			"	   ^^^^^^\n" +
			"The method addAll(XList<capture#5-of ?>) in the type XList<capture#5-of ?> is not applicable for the arguments (XList<capture#6-of ?>)\n" +
			"----------\n");
	}
	// 59628
	public void test0146() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.AbstractList;\n" +
				"public class X extends AbstractList {\n" +
				"    public static void main(String[] args) {\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"    public int size() { return 0; }\n" +
				"    public Object get(int index) { return null; }\n" +
				"}\n"
			},
			"SUCCESS");
	}
	// 59723
	public void test0147() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.ArrayList;\n" +
				"\n" +
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"	    char[][] tokens = new char[0][];\n" +
				"	    ArrayList list = new ArrayList();\n" +
				"		list.toArray(tokens);\n" +
				"      System.out.println(\"SUCCESS\");\n" +
				"    }    	\n" +
				"}\n"
			},
			"SUCCESS");
	}
	// bridge method
	public void test0148() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X extends AX<String>{\n" +
				"    \n" +
				"    String foo(String s) {\n" +
				"        System.out.println(s);\n" +
				"        return s;\n" +
				"    }\n" +
				"	public static void main(String[] args) {\n" +
				"	   new X().bar(\"SUCCESS\");\n" +
				"    }    	\n" +
				"}\n" +
				"class AX<T> {\n" +
				"    T foo(T t) {\n" +
				"        return null;\n" +
				"    }\n" +
				"    void bar(T t) {\n" +
				"        foo(t);\n" +
				"    }\n" +
				"}\n"
			},
			"SUCCESS");
	}
	// method compatibility
	public void test0149() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public abstract class X implements java.util.Collection {\n" +
				"	public Object[] toArray(Object[] a) {\n" +
				"		return a;\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"	   System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n"
			},
			"SUCCESS");
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public abstract class X implements java.util.Collection<Object> {\n" +
				"	public Object[] toArray(Object[] a) {\n" +
				"		return a;\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 2)\n" +
			"	public Object[] toArray(Object[] a) {\n" +
			"	       ^^^^^^^^\n" +
			"Type safety: The return type Object[] for toArray(Object[]) from the type X needs unchecked conversion to conform to T[] from the type Collection<E>\n" +
			"----------\n");
	}
	public void test0150() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"public class X {\n" +
				"    \n" +
				"    <T extends X> void foo(T[] ta, List<T> lt) {\n" +
				"    }\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"		new X().foo(args, new ArrayList<String>());\n" +
				"	}\n" +
				"}\n"
			},
			this.complianceLevel < ClassFileConstants.JDK1_8 ?
			"----------\n" +
			"1. ERROR in X.java (at line 8)\n" +
			"	new X().foo(args, new ArrayList<String>());\n" +
			"	        ^^^\n" +
			"Bound mismatch: The generic method foo(T[], List<T>) of type X is not applicable for the arguments (String[], ArrayList<String>). The inferred type String is not a valid substitute for the bounded parameter <T extends X>\n" +
			"----------\n" :
				"----------\n" + 
				"1. ERROR in X.java (at line 8)\n" + 
				"	new X().foo(args, new ArrayList<String>());\n" + 
				"	        ^^^\n" + 
				"The method foo(T[], List<T>) in the type X is not applicable for the arguments (String[], ArrayList<String>)\n" + 
				"----------\n");
	}
	public void test0151() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"public class X <E>{\n" +
				"    \n" +
				"    <T extends X> X(T[] ta, List<T> lt) {\n" +
				"    }\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"		new X<Object>(args, new ArrayList<String>());\n" +
				"	}\n" +
				"}\n"
			},
			this.complianceLevel < ClassFileConstants.JDK1_8 ?
			"----------\n" +
			"1. WARNING in X.java (at line 4)\n" +
			"	<T extends X> X(T[] ta, List<T> lt) {\n" +
			"	           ^\n" +
			"X is a raw type. References to generic type X<E> should be parameterized\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 8)\n" +
			"	new X<Object>(args, new ArrayList<String>());\n" +
			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Bound mismatch: The generic constructor X(T[], List<T>) of type X<E> is not applicable for the arguments (String[], ArrayList<String>). The inferred type String is not a valid substitute for the bounded parameter <T extends X>\n" +
			"----------\n" :
				"----------\n" + 
				"1. WARNING in X.java (at line 4)\n" + 
				"	<T extends X> X(T[] ta, List<T> lt) {\n" + 
				"	           ^\n" + 
				"X is a raw type. References to generic type X<E> should be parameterized\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 8)\n" + 
				"	new X<Object>(args, new ArrayList<String>());\n" + 
				"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"The constructor X<Object>(String[], ArrayList<String>) is undefined\n" + 
				"----------\n");
	}
	// 60556
	public void test0152() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"public class X {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"	}\n" +
				"    List<X> x(List<X> list) {\n" +
				"        return Collections.unmodifiableList(list);\n" +
				"    }\n" +
				"}\n"
			},
			"SUCCESS");
	}
	public void test0153() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        AX<X> ax = new AX<X>();\n" +
				"        AX<X> a = bar(ax);\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"	}\n" +
				"    public static <T> AX<T> bar(AX<? extends T> a) {\n" +
				"		return null;\n" +
				"    }    \n" +
				"}\n" +
				"class AX<E> {\n" +
				"}\n"
			},
			"SUCCESS");
	}
	public void test0154() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        AX<X> ax = new AX<X>();\n" +
				"        AX<X> a = bar(ax);\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"	}\n" +
				"    public static <T> AX<T> bar(AX<? super T> a) {\n" +
				"		return null;\n" +
				"    }    \n" +
				"}\n" +
				"class AX<E> {\n" +
				"}\n"
			},
			"SUCCESS");
	}
	public void test0155() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        AX<X> ax = new AX<X>();\n" +
				"        AX<X> a = bar(ax);\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"	}\n" +
				"    public static <T> AX<T> bar(AX<?> a) {\n" +
				"		return null;\n" +
				"    }    \n" +
				"}\n" +
				"class AX<E> {\n" +
				"}\n"
			},
			"SUCCESS");
	}
	public void test0156() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        AX<X> ax = new AX<X>();\n" +
				"        AX<X> a = bar(ax);\n" +
				"	}\n" +
				"    public static <T> AX<T> bar(AX<?> a) {\n" +
				"		return null;\n" +
				"    }    \n" +
				"}\n" +
				"class AX<E extends X> {\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 7)\n" +
			"	public static <T> AX<T> bar(AX<?> a) {\n" +
			"	                     ^\n" +
			"Bound mismatch: The type T is not a valid substitute for the bounded parameter <E extends X> of the type AX<E>\n" +
			"----------\n");
	}
	public void test0157() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        AX<X> ax = new AX<X>();\n" +
				"        AX<String> as = new AX<String>();\n" +
				"        AX<X> a = bar(ax, as);\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"	}\n" +
				"    public static <T,U> AX<T> bar(AX<? extends U> a, AX<? super U> b) {\n" +
				"		return null;\n" +
				"    }    \n" +
				"}\n" +
				"class AX<E> {\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	AX<X> a = bar(ax, as);\n" +
			"	          ^^^\n" +
			"The method bar(AX<? extends U>, AX<? super U>) in the type X is not applicable for the arguments (AX<X>, AX<String>)\n" +
			"----------\n");
	}
	public void test0158() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        AX<X> ax = new AX<X>();\n" +
				"        AX<String> as = new AX<String>();\n" +
				"        AX<X> a = bar(ax, as);\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"	}\n" +
				"    public static <T,U> AX<T> bar(AX<?> a, AX<? super U> b) {\n" +
				"		return null;\n" +
				"    }    \n" +
				"}\n" +
				"class AX<E> {\n" +
				"}\n"
			},
			"SUCCESS");
	}
	public void test0159() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        AX<X> ax = new AX<X>(new X());\n" +
				"        AX<String> as = new AX<String>(\"SUCCESS\");\n" +
				"        AX<X> a = bar(ax, as);\n" +
				"	}\n" +
				"    public static <T,U> T bar(AX<?> a, AX<? super U> b) {\n" +
				"		return a.get();\n" +
				"    }    \n" +
				"}\n" +
				"class AX<E> {\n" +
				"	 E e;\n" +
				"    AX(E e) { this.e = e; }\n" +
				"    E get() { return this.e; }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 9)\n" +
			"	return a.get();\n" +
			"	       ^^^^^^^\n" +
			"Type mismatch: cannot convert from capture#1-of ? to T\n" +
			"----------\n");
	}
	public void test0160() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        String s = foo(new AX<String>(\"aaa\"));\n" +
				"	}\n" +
				"    static <V> V foo(AX<String> a) {\n" +
				"        return a.get();\n" +
				"    }\n" +
				"}\n" +
				"class AX<E> {\n" +
				"    E e;\n" +
				"    AX(E e) { this.e = e; }\n" +
				"    E get() { return this.e; }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 7)\n" +
			"	return a.get();\n" +
			"	       ^^^^^^^\n" +
			"Type mismatch: cannot convert from String to V\n" +
			"----------\n");
	}
	public void test0161() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        boolean b = foo(new AX<String>(\"aaa\")).equals(args);\n" +
				"	}\n" +
				"    static <V> V foo(AX<String> a) {\n" +
				"        return a.get();\n" +
				"    }\n" +
				"    String bar() {\n" +
				"        return \"bbb\";\n" +
				"    }\n" +
				"}\n" +
				"class AX<E> {\n" +
				"    E e;\n" +
				"    AX(E e) { this.e = e; }\n" +
				"    E get() { return this.e; }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 7)\n" +
			"	return a.get();\n" +
			"	       ^^^^^^^\n" +
			"Type mismatch: cannot convert from String to V\n" +
			"----------\n");
	}
	public void test0162() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        String s = foo(new AX<String>(\"aaa\")).bar();\n" +
				"	}\n" +
				"    static <V> V foo(AX<String> a) {\n" +
				"        return a.get();\n" +
				"    }\n" +
				"    String bar() {\n" +
				"        return \"bbb\";\n" +
				"    }\n" +
				"}\n" +
				"class AX<E> {\n" +
				"    E e;\n" +
				"    AX(E e) { this.e = e; }\n" +
				"    E get() { return this.e; }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	String s = foo(new AX<String>(\"aaa\")).bar();\n" +
			"	                                      ^^^\n" +
			"The method bar() is undefined for the type Object\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 7)\n" +
			"	return a.get();\n" +
			"	       ^^^^^^^\n" +
			"Type mismatch: cannot convert from String to V\n" +
			"----------\n");
	}
	public void test0163() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        String s = foo(new AX<String>(\"aaa\")).bar();\n" +
				"	}\n" +
				"    static <V> V foo(AX<String> a) {\n" +
				"        return a.get();\n" +
				"    }\n" +
				"    String bar() {\n" +
				"        return \"bbb\";\n" +
				"    }\n" +
				"}\n" +
				"class AX<E> {\n" +
				"    E e;\n" +
				"    AX(E e) { this.e = e; }\n" +
				"    E get() { return this.e; }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	String s = foo(new AX<String>(\"aaa\")).bar();\n" +
			"	                                      ^^^\n" +
			"The method bar() is undefined for the type Object\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 7)\n" +
			"	return a.get();\n" +
			"	       ^^^^^^^\n" +
			"Type mismatch: cannot convert from String to V\n" +
			"----------\n");
	}
	public void test0164() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.List;\n" +
				"public class X {\n" +
				"    public static void main(String[] args) {\n" +
				"        foo(new AX<String>(\"SUCCESS\"));\n" +
				"	}\n" +
				"    static <V> List<V> foo(AX<String> a) {\n" +
				"        System.out.println(a.get());\n" +
				"        List<V> v = null;\n" +
				"        if (a == null) v = foo(a); \n" +
				"        return v;\n" +
				"    }\n" +
				"}\n" +
				"class AX<E> {\n" +
				"    E e;\n" +
				"    AX(E e) { this.e = e; }\n" +
				"    E get() { return this.e; }\n" +
				"}\n"
			},
			"SUCCESS");
	}
	public void test0165() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        AX<X> ax = new AX<X>();\n" +
				"        AX<String> a = bar(ax);\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"	}\n" +
				"    public static <T> AX<T> bar(AX<?> a) {\n" +
				"		 if (a == null) {\n" +
				"        	AX<String> as = bar(a);\n" +
				"        	String s = as.get();\n" +
				"		}\n" +
				"		return null;\n" +
				"    }    \n" +
				"}\n" +
				"class AX<E> {\n" +
				"    E get() { return null; }\n" +
				"}\n"
			},
			"SUCCESS");
	}
	public void test0166() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        AX<X> ax = new AX<X>(new X());\n" +
				"        AX<String> a = bar(ax, true);\n" +
				"        String s = a.get();\n" +
				"        System.out.println(s);\n" +
				"	}\n" +
				"    public static <T> AX<T> bar(AX<?> a, boolean recurse) {\n" +
				"        if (recurse) {\n" +
				"	        AX<String> as = bar(a, false);\n" +
				"			String s = as.get();\n" +
				"        }\n" +
				"		return new AX(\"SUCCESS\");\n" +
				"    }    \n" +
				"}\n" +
				"class AX<E> {\n" +
				"    E e;\n" +
				"    AX(E e) { this.e = e; }\n" +
				"    E get() { return this.e; }\n" +
				"}\n"
			},
			"SUCCESS");
	}
	public void test0167() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        AX<String, Thread> a = bar();\n" +
				"        String s = a.get();\n" +
				"        System.out.println(s);\n" +
				"	}\n" +
				"    public static <T, U> AX<T, U> bar() {\n" +
				"		return new AX(\"SUCCESS\");\n" +
				"    }    \n" +
				"}\n" +
				"class AX<E, F> {\n" +
				"    E e;\n" +
				"    AX(E e) { this.e = e; }\n" +
				"    E get() { return this.e; }\n" +
				"}\n"
			},
			"SUCCESS");
	}
	// FAIL ERRMSG (type display)
	public void test0168() {
		if (this.complianceLevel >= ClassFileConstants.JDK1_8)
			return;
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        AX<String, Thread> a = bar();\n" +
				"        String s = a.get();\n" +
				"        System.out.println(s);\n" +
				"	}\n" +
				"    public static <T, U> AX<AX<T, T>, U> bar() {\n" +
				"		return new AX(\"SUCCESS\");\n" +
				"    }    \n" +
				"}\n" +
				"class AX<E, F> {\n" +
				"    E e;\n" +
				"    AX(E e) { this.e = e; }\n" +
				"    E get() { return this.e; }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	AX<String, Thread> a = bar();\n" +
			"	                       ^^^^^\n" +
			"Type mismatch: cannot convert from AX<AX<Object,Object>,Thread> to AX<String,Thread>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 9)\n" +
			"	return new AX(\"SUCCESS\");\n" +
			"	       ^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The constructor AX(Object) belongs to the raw type AX. References to generic type AX<E,F> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 9)\n" +
			"	return new AX(\"SUCCESS\");\n" +
			"	       ^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The expression of type AX needs unchecked conversion to conform to AX<AX<T,T>,U>\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 9)\n" +
			"	return new AX(\"SUCCESS\");\n" +
			"	           ^^\n" +
			"AX is a raw type. References to generic type AX<E,F> should be parameterized\n" +
			"----------\n");
	}
	public void test0169() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        AX<String> a = bar(new X());\n" +
				"        String s = a.get();\n" +
				"        System.out.println(s);\n" +
				"	}\n" +
				"    public static <T> AX<T> bar(T t) {\n" +
				"		return new AX(\"SUCCESS\");\n" +
				"    }    \n" +
				"}\n" +
				"class AX<E> {\n" +
				"    E e;\n" +
				"    AX(E e) { this.e = e; }\n" +
				"    E get() { return this.e; }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	AX<String> a = bar(new X());\n" +
			"	               ^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from AX<X> to AX<String>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 9)\n" +
			"	return new AX(\"SUCCESS\");\n" +
			"	       ^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The constructor AX(Object) belongs to the raw type AX. References to generic type AX<E> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 9)\n" +
			"	return new AX(\"SUCCESS\");\n" +
			"	       ^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The expression of type AX needs unchecked conversion to conform to AX<T>\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 9)\n" +
			"	return new AX(\"SUCCESS\");\n" +
			"	           ^^\n" +
			"AX is a raw type. References to generic type AX<E> should be parameterized\n" +
			"----------\n");
	}
	// Expected type inference for cast operation
	public void test0170() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        AX<X> ax = new AX<X>(new X());\n" +
				"        AX<String> as = new AX<String>(\"\");\n" +
				"        ax = (AX)bar(ax);\n" + // shouldn't complain about unnecessary cast
				"	}\n" +
				"    public static <T> T bar(AX<?> a) {\n" +
				"		return a.get();\n" +
				"    }    \n" +
				"}\n" +
				"class AX<E> {\n" +
				"	 E e;\n" +
				"    AX(E e) { this.e = e; }\n" +
				"    E get() { return this.e; }\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 6)\n" +
			"	ax = (AX)bar(ax);\n" +
			"	     ^^^^^^^^^^^\n" +
			"Type safety: The expression of type AX needs unchecked conversion to conform to AX<X>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 6)\n" +
			"	ax = (AX)bar(ax);\n" +
			"	      ^^\n" +
			"AX is a raw type. References to generic type AX<E> should be parameterized\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 9)\n" +
			"	return a.get();\n" +
			"	       ^^^^^^^\n" +
			"Type mismatch: cannot convert from capture#1-of ? to T\n" +
			"----------\n");
	}
	// Expected type inference for cast operation
	public void test0171() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        AX<X> ax = new AX<X>(new X());\n" +
				"        AX<String> as = new AX<String>(\"\");\n" +
				"        ax = (AX<X>)bar(ax);\n" + // shouldn't complain about unnecessary cast as return type inference do not
				"	}\n" +                                         // work on cast conversion
				"    public static <T> T bar(AX<?> a) {\n" +
				"		return a.get();\n" +
				"    }    \n" +
				"}\n" +
				"class AX<E> {\n" +
				"	 E e;\n" +
				"    AX(E e) { this.e = e; }\n" +
				"    E get() { return this.e; }\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 6)\n" +
			"	ax = (AX<X>)bar(ax);\n" +
			"	     ^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from Object to AX<X>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 9)\n" +
			"	return a.get();\n" +
			"	       ^^^^^^^\n" +
			"Type mismatch: cannot convert from capture#1-of ? to T\n" +
			"----------\n");
	}
	// Expected type inference for cast operation
	public void test0172() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"        AX<X> ax = new AX<X>(new X());\n" +
				"        AX<String> as = new AX<String>(\"SUCCESS\");\n" +
				"        ax = (AX<X>)bar(ax);\n" + // no warn for unsafe cast, since forbidden cast
				"	}\n" +
				"    public static <T> String bar(AX<?> a) {\n" +
				"		return null;\n" +
				"    }    \n" +
				"}\n" +
				"class AX<E> {\n" +
				"	 E e;\n" +
				"    AX(E e) { this.e = e; }\n" +
				"    E get() { return this.e; }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	ax = (AX<X>)bar(ax);\n" +
			"	     ^^^^^^^^^^^^^^\n" +
			"Cannot cast from String to AX<X>\n" +
			"----------\n");
	}
	// Expected type inference for return statement
	public void test0173() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"    	foo();\n" +
				"    	System.out.println(\"SUCCESS\");\n" +
				"	}\n" +
				"    public static <T> T bar(AX<?> a) {\n" +
				"		return null;\n" +
				"    }    \n" +
				"    public static AX<X> foo() {\n" +
				"        AX<X> ax = new AX<X>(new X());\n" +
				"       return bar(ax);\n" + // use return type of enclosing method for type inference
				"    }\n" +
				"}\n" +
				"class AX<E> {\n" +
				"	 E e;\n" +
				"    AX(E e) { this.e = e; }\n" +
				"    E get() { return this.e; }\n" +
				"}\n" +
				"\n"
			},
			"SUCCESS");
	}
	// Expected type inference for field declaration
	public void test0174() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"    	Object o = foo;\n" +
				"    	System.out.println(\"SUCCESS\");\n" +
				"	}\n" +
				"    public static <T> T bar(AX<?> a) {\n" +
				"		return null;\n" +
				"    }    \n" +
				"    static AX<X> foo = bar(new AX<X>(new X()));\n" + // use field type for type inference
				"}\n" +
				"class AX<E> {\n" +
				"	 E e;\n" +
				"    AX(E e) { this.e = e; }\n" +
				"    E get() { return this.e; }\n" +
				"}\n" +
				"\n"
			},
			"SUCCESS");
	}
	// 60563
	public void test0175() {
		this.runConformTest(
			new String[] {
				"X.java",
				"    interface A<T> {\n" +
				"        T[] m1(T x);                          \n" +
				"    }\n" +
				"    public class X { \n" +
				"    	public static void main(String[] args) {\n" +
				"			new X().m2(new A<X>(){ \n" +
				"				public X[] m1(X x) { \n" +
				"					System.out.println(\"SUCCESS\");\n" +
				"					return null;\n" +
				"				}\n" +
				"			});\n" +
				"		}\n" +
				"        void m2(A<X> x) { \n" +
				"            m3(x.m1(new X())); \n" +
				"        }\n" +
				"        void m3(X[] x) {\n" +
				"        }                    \n" +
				"    }\n"
			},
			"SUCCESS");
	}
	// unsafe raw return value
	public void test0176() {
		Map customOptions = getCompilerOptions();
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"\n" +
				"public class X {\n" +
				"    <T> Vector<T> valuesOf(Hashtable<?, T> h) {\n" +
				"        return new Vector();\n" +
				"    }\n" +
				"    Vector<Object> data;\n" +
				"    \n" +
				"    public void t() {\n" +
				"        Vector<Object> v = (Vector<Object>) data.elementAt(0);\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 5)\n" +
			"	return new Vector();\n" +
			"	       ^^^^^^^^^^^^\n" +
			"Type safety: The expression of type Vector needs unchecked conversion to conform to Vector<T>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 5)\n" +
			"	return new Vector();\n" +
			"	           ^^^^^^\n" +
			"Vector is a raw type. References to generic type Vector<E> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 10)\n" +
			"	Vector<Object> v = (Vector<Object>) data.elementAt(0);\n" +
			"	                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from Object to Vector<Object>\n" +
			"----------\n",
			null,
			true,
			customOptions);
	}
	// cast to type variable allowed, can be diagnosed as unnecessary
	public void test0177() {
		Map options = getCompilerOptions();
		runConformTest(
	 		// test directory preparation
			true /* flush output directory */,
			new String[] { /* test files */
				"X.java",
				"public class X <T> {\n" +
				"	\n" +
				"	T foo(T t) {\n" +
				"		return (T) t;\n" +
				"	}\n" +
				"}\n",
			},
			// compiler options
			null /* no class libraries */,
			options /* custom options - happen to be the default not changed by the test suite */,
			// compiler results
			"----------\n" + /* expected compiler log */
			"1. WARNING in X.java (at line 4)\n" +
			"	return (T) t;\n" +
			"	       ^^^^^\n" +
			"Unnecessary cast from T to T\n" +
			"----------\n",
			// runtime results
			null /* do not check output string */,
			null /* do not check error string */,
			// javac options
			JavacTestOptions.Excuse.EclipseHasSomeMoreWarnings /* javac test options */);
	}
	// reject instanceof type variable or parameterized type
	public void test0178() {
		Map customOptions = getCompilerOptions();
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"	\n" +
				"	T foo(T t) {\n" +
				"		if (t instanceof X<T>) {\n" +
				"			return t;\n" +
				"		} else if (t instanceof X<String>) {\n" +
				"			return t;\n" +
				"		} else if (t instanceof X<?>) {\n" +  // ok
				"			return t;\n" +
				"		} else 	if (t instanceof T) {\n" +
				"			return t;\n" +
				"		} else if (t instanceof X) {\n" +
				"			return t;\n" +
				"		}\n" +
				"		return null;\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 4)\n" + 
			"	if (t instanceof X<T>) {\n" + 
			"	    ^^^^^^^^^^^^^^\n" + 
			"Cannot perform instanceof check against parameterized type X<T>. Use the form X<?> instead since further generic type information will be erased at runtime\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 6)\n" + 
			"	} else if (t instanceof X<String>) {\n" + 
			"	           ^^^^^^^^^^^^^^\n" + 
			"Cannot perform instanceof check against parameterized type X<String>. Use the form X<?> instead since further generic type information will be erased at runtime\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 10)\n" + 
			"	} else 	if (t instanceof T) {\n" + 
			"	       	    ^^^^^^^^^^^^^^\n" + 
			"Cannot perform instanceof check against type parameter T. Use its erasure Object instead since further generic type information will be erased at runtime\n" + 
			"----------\n",
			null,
			true,
			customOptions);
	}
	// 61507
	public void test0179() {
		this.runConformTest(
			new String[] {
				"X.java",
				"class U {\n" +
				" static <T> T notNull(T t) { return t; }\n" +
				"}\n" +
				"public class X {\n" +
				" void t() {\n" +
				"  String s = U.notNull(null);\n" +
				" }\n" +
				" public static void main(String[] args) {\n" +
				"	new X().t();\n" +
				"	System.out.println(\"SUCCESS\");\n" +
				"}\n" +
				"}\n",
			},
			"SUCCESS");
	}
	public void test0180() {
		this.runConformTest(
			new String[] {
				"X.java",
				"class U {\n" +
				" static <T> T notNull(T t) { return t; }\n" +
				"}\n" +
				"public class X {\n" +
				" void t() {\n" +
				"  String s = U.notNull(\"\");\n" +
				" }\n" +
				" public static void main(String[] args) {\n" +
				"	new X().t();\n" +
				"	System.out.println(\"SUCCESS\");\n" +
				"}\n" +
				"}\n",
			},
			"SUCCESS");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=61507 - variation computing most specific type with 'null'
	public void test0181() {
		this.runConformTest(
			new String[] {
				"X.java",
				"class U {\n" +
				" static <T> T notNull(T t, V<T> vt) { return t; }\n" +
				"}\n" +
				"class V<T> {}\n" +
				"\n" +
				"public class X {\n" +
				" void t() {\n" +
				"  String s = U.notNull(null, new V<String>());\n" +
				" }\n" +
				" public static void main(String[] args) {\n" +
				"	new X().t();\n" +
				"	System.out.println(\"SUCCESS\");\n" +
				"}\n" +
				"}\n",
			},
			"SUCCESS");
	}
	public void test0182() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<E> {\n" +
				"    X<E> foo() {\n" +
				"    	return (X<E>) this;\n" +
				"    }\n" +
				"    X<String> bar() {\n" +
				"    	return (AX<String>) new X<String>();\n" +
				"    }\n" +
				"    X<String> bar(Object o) {\n" +
				"    	return (AX<String>) o;\n" +
				"    }\n" +
				"    X<E> foo(Object o) {\n" +
				"    	return (AX<E>) o;\n" +
				"    }    \n" +
				"    X<E> baz(Object o) {\n" +
				"    	return (AX<E>) null;\n" +
				"    }\n" +
				"    X<String> baz2(BX bx) {\n" +
				"    	return (X<String>) bx;\n" +
				"    }    \n" +
				"}\n" +
				"class AX<F> extends X<F> {}\n" +
				"class BX extends AX<String> {}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	return (X<E>) this;\n" +
			"	       ^^^^^^^^^^^\n" +
			"Unnecessary cast from X<E> to X<E>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 6)\n" +
			"	return (AX<String>) new X<String>();\n" +
			"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Unnecessary cast from X<String> to AX<String>\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 9)\n" +
			"	return (AX<String>) o;\n" +
			"	       ^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from Object to AX<String>\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 12)\n" +
			"	return (AX<E>) o;\n" +
			"	       ^^^^^^^^^\n" +
			"Type safety: Unchecked cast from Object to AX<E>\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 15)\n" +
			"	return (AX<E>) null;\n" +
			"	       ^^^^^^^^^^^^\n" +
			"Unnecessary cast from null to AX<E>\n" +
			"----------\n" +
			"6. WARNING in X.java (at line 18)\n" +
			"	return (X<String>) bx;\n" +
			"	       ^^^^^^^^^^^^^^\n" +
			"Unnecessary cast from BX to X<String>\n" +
			"----------\n");
	}
	public void test0183() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"\n" +
				"public class X {\n" +
				"	\n" +
				"	{\n" +
				"		Dictionary<String, Integer> d;\n" +
				"		Object o;\n" +
				"		\n" +
				"		Object a1 = (Hashtable<String,Integer>) d;\n" +
				"		Object a2 = (Hashtable) o;\n" +
				"\n" +
				"		Object a3 = (Hashtable<Float, Double>) d;\n" +
				"		Object a4 = (Hashtable<String,Integer>) o;\n" +
				"		\n" +
				"		abstract class Z1 extends Hashtable<String,Integer> {\n" +
				"			private static final long serialVersionUID = 1L;\n" +
				"		}\n" +
				"		Z1 z1;\n" +
				"		Object a5 = (Hashtable<String,Integer>) z1;\n" +
				"\n" +
				"		abstract class Z2 extends Z1 {\n" +
				"			private static final long serialVersionUID = 1L;\n" +
				"		}\n" +
				"		Object a6 = (Z2) z1;\n" +
				"\n" +
				"		abstract class Z3 extends Hashtable {\n" +
				"			private static final long serialVersionUID = 1L;\n" +
				"		}\n" +
				"		Z3 z3;\n" +
				"		Object a7 = (Hashtable<String,Integer>) z3;\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 9)\n" +
			"	Object a1 = (Hashtable<String,Integer>) d;\n" +
			"	            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Unnecessary cast from Dictionary<String,Integer> to Hashtable<String,Integer>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 10)\n" +
			"	Object a2 = (Hashtable) o;\n" +
			"	            ^^^^^^^^^^^^^\n" +
			"Unnecessary cast from Object to Hashtable\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 10)\n" +
			"	Object a2 = (Hashtable) o;\n" +
			"	             ^^^^^^^^^\n" +
			"Hashtable is a raw type. References to generic type Hashtable<K,V> should be parameterized\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 12)\n" +
			"	Object a3 = (Hashtable<Float, Double>) d;\n" +
			"	            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Cannot cast from Dictionary<String,Integer> to Hashtable<Float,Double>\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 12)\n" +
			"	Object a3 = (Hashtable<Float, Double>) d;\n" +
			"	            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Unnecessary cast from Dictionary<String,Integer> to Hashtable<Float,Double>\n" +
			"----------\n" +
			"6. WARNING in X.java (at line 13)\n" +
			"	Object a4 = (Hashtable<String,Integer>) o;\n" +
			"	            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from Object to Hashtable<String,Integer>\n" +
			"----------\n" +
			"7. WARNING in X.java (at line 13)\n" +
			"	Object a4 = (Hashtable<String,Integer>) o;\n" +
			"	            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Unnecessary cast from Object to Hashtable<String,Integer>\n" +
			"----------\n" +
			"8. WARNING in X.java (at line 19)\n" +
			"	Object a5 = (Hashtable<String,Integer>) z1;\n" +
			"	            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Unnecessary cast from Z1 to Hashtable<String,Integer>\n" +
			"----------\n" +
			"9. WARNING in X.java (at line 24)\n" +
			"	Object a6 = (Z2) z1;\n" +
			"	            ^^^^^^^\n" +
			"Unnecessary cast from Z1 to Z2\n" +
			"----------\n" +
			"10. WARNING in X.java (at line 26)\n" +
			"	abstract class Z3 extends Hashtable {\n" +
			"	                          ^^^^^^^^^\n" +
			"Hashtable is a raw type. References to generic type Hashtable<K,V> should be parameterized\n" +
			"----------\n" +
			"11. WARNING in X.java (at line 30)\n" +
			"	Object a7 = (Hashtable<String,Integer>) z3;\n" +
			"	            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from Z3 to Hashtable<String,Integer>\n" +
			"----------\n" +
			"12. WARNING in X.java (at line 30)\n" +
			"	Object a7 = (Hashtable<String,Integer>) z3;\n" +
			"	            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Unnecessary cast from Z3 to Hashtable<String,Integer>\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=62292 - parameterized message send
	public void test0184() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"\n" +
				"	static <T, U> T foo(T t, U u) {\n" +
				"		return t;\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		System.out.println(X.<String,X>foo(\"SUCCESS\", null));\n" +
				"	}\n" +
				"}\n",
			},
			"SUCCESS");
	}
	// parameterized message send - variation on 184 with non-static generic method
	public void test0185() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"\n" +
				"	<T, U> T foo(T t, U u) {\n" +
				"		return t;\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		System.out.println(new X().<String,X>foo(\"SUCCESS\", null));\n" +
				"	}\n" +
				"}\n",
			},
			"SUCCESS");
	}
	// message send parameterized with type not matching parameter bounds
	public void test0186() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"\n" +
				"	<T, U extends String> T foo(T t, U u) {\n" +
				"		return t;\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		System.out.println(new X().<String, X>foo(\"SUCCESS\", null));\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	<T, U extends String> T foo(T t, U u) {\n" +
			"	              ^^^^^^\n" +
			"The type parameter U should not be bounded by the final type String. Final types cannot be further extended\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 7)\n" +
			"	System.out.println(new X().<String, X>foo(\"SUCCESS\", null));\n" +
			"	                                      ^^^\n" +
			"Bound mismatch: The generic method foo(T, U) of type X is not applicable for the arguments (String, null). The inferred type X is not a valid substitute for the bounded parameter <U extends String>\n" +
			"----------\n");
	}
	// invalid type argument arity for parameterized message send
	public void test0187() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"\n" +
				"	<T, U extends String> T foo(T t, U u) {\n" +
				"		return t;\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		System.out.println(new X().<String>foo(\"SUCCESS\", null));\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	<T, U extends String> T foo(T t, U u) {\n" +
			"	              ^^^^^^\n" +
			"The type parameter U should not be bounded by the final type String. Final types cannot be further extended\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 7)\n" +
			"	System.out.println(new X().<String>foo(\"SUCCESS\", null));\n" +
			"	                                   ^^^\n" +
			"Incorrect number of type arguments for generic method <T, U>foo(T, U) of type X; it cannot be parameterized with arguments <String>\n" +
			"----------\n");
	}
	// parameterized invocation of non generic method with incorrect argument count
	public void test0188() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"\n" +
				"	void foo() {\n" +
				"		return;\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		System.out.println(new X().<String>foo(\"SUCCESS\", null));\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 7)\n" +
			"	System.out.println(new X().<String>foo(\"SUCCESS\", null));\n" +
			"	                                   ^^^\n" +
			"The method foo() in the type X is not applicable for the arguments (String, null)\n" +
			"----------\n");
	}
	// parameterized invocation of non generic method
	public void test0189() {
		String expectedOutput = this.complianceLevel < ClassFileConstants.JDK1_7
			? 	"----------\n" +
				"1. ERROR in X.java (at line 7)\n" +
				"	System.out.println(new X().<String>foo());\n" +
				"	                                   ^^^\n" +
				"The method foo() of type X is not generic; it cannot be parameterized with arguments <String>\n" +
				"----------\n"
			: 	"----------\n" +
				"1. ERROR in X.java (at line 7)\n" +
				"	System.out.println(new X().<String>foo());\n" +
				"	           ^^^^^^^\n" +
				"The method println(boolean) in the type PrintStream is not applicable for the arguments (void)\n" +
				"----------\n" +
				"2. WARNING in X.java (at line 7)\n" +
				"	System.out.println(new X().<String>foo());\n" +
				"	                            ^^^^^^\n" +
				"Unused type arguments for the non generic method foo() of type X; it should not be parameterized with arguments <String>\n" +
				"----------\n";

		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"\n" +
				"	void foo() {\n" +
				"		return;\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		System.out.println(new X().<String>foo());\n" +
				"	}\n" +
				"}\n",
			},
			expectedOutput);
	}
	// parameterized allocation
	public void test0190() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public <T> X(T t){\n" +
				"		System.out.println(t);\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		new <String>X(\"SUCCESS\");\n" +
				"	}\n" +
				"}\n",
			},
			"SUCCESS");
	}
	// parameterized allocation - wrong arity
	public void test0191() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public <T> X(T t){\n" +
				"		System.out.println(t);\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		new <String, String>X(\"FAILED\");\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	new <String, String>X(\"FAILED\");\n" +
			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Incorrect number of type arguments for generic constructor <T>X(T) of type X; it cannot be parameterized with arguments <String, String>\n" +
			"----------\n");
	}
	// parameterized allocation - non generic target constructor
	// **
	public void test0192() {
		if (this.complianceLevel < ClassFileConstants.JDK1_7) {
			this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"	public X(String t){\n" +
					"		System.out.println(t);\n" +
					"	}\n" +
					"	public static void main(String[] args) {\n" +
					"		new <String>X(\"FAILED\");\n" +
					"	}\n" +
					"}\n",
				},
				"----------\n" +
				"1. ERROR in X.java (at line 6)\n" +
				"	new <String>X(\"FAILED\");\n" +
				"	^^^^^^^^^^^^^^^^^^^^^^^\n" +
				"The constructor X(String) of type X is not generic; it cannot be parameterized with arguments <String>\n" +
				"----------\n");
			return;
		}
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"	public X(String t){\n" +
					"		System.out.println(t);\n" +
					"	}\n" +
					"	public static void main(String[] args) {\n" +
					"		new <String>X(\"FAILED\");\n" +
					"		Zork z;\n" +
					"	}\n" +
					"}\n",
				},
				"----------\n" +
				"1. WARNING in X.java (at line 6)\n" +
				"	new <String>X(\"FAILED\");\n" +
				"	     ^^^^^^\n" +
				"Unused type arguments for the non generic constructor X(String) of type X; it should not be parameterized with arguments <String>\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 7)\n" +
				"	Zork z;\n" +
				"	^^^^\n" +
				"Zork cannot be resolved to a type\n" +
				"----------\n");
	}
	// parameterized allocation - argument type mismatch
	public void test0193() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public <T> X(T t){\n" +
				"		System.out.println(t);\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		new <String>X(new X(null));\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	new <String>X(new X(null));\n" +
			"	^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"The parameterized constructor <String>X(String) of type X is not applicable for the arguments (X)\n" +
			"----------\n");
	}
	// parameterized invocation - argument type mismatch
	public void test0194() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"\n" +
				"	<T> void foo(T t) {\n" +
				"		return;\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		System.out.println(new X().<String>foo(new X()));\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 7)\n" +
			"	System.out.println(new X().<String>foo(new X()));\n" +
			"	                                   ^^^\n" +
			"The parameterized method <String>foo(String) of type X is not applicable for the arguments (X)\n" +
			"----------\n");
	}
	// parameterized qualified allocation
	public void test0195() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public class MX {\n" +
				"		public <T> MX(T t){\n" +
				"			System.out.println(t);\n" +
				"		}\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		new X().new <String>MX(\"SUCCESS\");\n" +
				"	}\n" +
				"}\n",
			},
			"SUCCESS");
	}
	// parameterized qualified allocation - wrong arity
	public void test0196() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public class MX {\n" +
				"		public <T> MX(T t){\n" +
				"			System.out.println(t);\n" +
				"		}\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		new X().new <String,String>MX(\"FAILED\");\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 8)\n" +
			"	new X().new <String,String>MX(\"FAILED\");\n" +
			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Incorrect number of type arguments for generic constructor <T>MX(T) of type X.MX; it cannot be parameterized with arguments <String, String>\n" +
			"----------\n");
	}
	// parameterized qualified allocation - non generic target constructor
	// **
	public void test0197() {
		if (this.complianceLevel < ClassFileConstants.JDK1_7) {
			this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"	public class MX {\n" +
					"		public MX(String t){\n" +
					"			System.out.println(t);\n" +
					"		}\n" +
					"	}\n" +
					"	public static void main(String[] args) {\n" +
					"		new X().new <String>MX(\"FAILED\");\n" +
					"	}\n" +
					"}\n",
				},
				"----------\n" +
				"1. ERROR in X.java (at line 8)\n" +
				"	new X().new <String>MX(\"FAILED\");\n" +
				"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
				"The constructor MX(String) of type X.MX is not generic; it cannot be parameterized with arguments <String>\n" +
				"----------\n");
			return;
		}
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"	public class MX {\n" +
					"		public MX(String t){\n" +
					"			System.out.println(t);\n" +
					"		}\n" +
					"	}\n" +
					"	public static void main(String[] args) {\n" +
					"		new X().new <String>MX(\"FAILED\");\n" +
					"		Zork z;\n" +
					"	}\n" +
					"}\n",
				},
				"----------\n" +
				"1. WARNING in X.java (at line 8)\n" +
				"	new X().new <String>MX(\"FAILED\");\n" +
				"	             ^^^^^^\n" +
				"Unused type arguments for the non generic constructor X.MX(String) of type X.MX; it should not be parameterized with arguments <String>\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 9)\n" +
				"	Zork z;\n" +
				"	^^^^\n" +
				"Zork cannot be resolved to a type\n" +
				"----------\n");
	}
	// parameterized qualified allocation - argument type mismatch
	public void test0198() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public class MX {\n" +
				"		public <T>MX(T t){\n" +
				"			System.out.println(t);\n" +
				"		}\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		new X().new <String>MX(new X());\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 8)\n" +
			"	new X().new <String>MX(new X());\n" +
			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"The parameterized constructor <String>MX(String) of type X.MX is not applicable for the arguments (X)\n" +
			"----------\n");
	}
	// parameterized explicit constructor call
	public void test0199() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public <T> X(T t){\n" +
				"		System.out.println(t);\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		class Local extends X {\n" +
				"			Local() {\n" +
				"				<String>super(\"SUCCESS\");\n" +
				"			}\n" +
				"		};\n" +
				"		new Local();\n" +
				"	}\n" +
				"}\n",
			},
			"SUCCESS");
	}
	// parameterized explicit constructor call - wrong arity
	public void test0200() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public <T> X(T t){\n" +
				"		System.out.println(t);\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		class Local extends X {\n" +
				"			Local() {\n" +
				"				<String,String>super(\"FAILED\");\n" +
				"			}\n" +
				"		};\n" +
				"		new Local();\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 8)\n" +
			"	<String,String>super(\"FAILED\");\n" +
			"	               ^^^^^^^^^^^^^^^^\n" +
			"Incorrect number of type arguments for generic constructor <T>X(T) of type X; it cannot be parameterized with arguments <String, String>\n" +
			"----------\n");
	}
	// parameterized explicit constructor call - non generic target constructor
	// **
	public void test0201() {
		if (this.complianceLevel < ClassFileConstants.JDK1_7) {
			this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"	public X(String t){\n" +
					"		System.out.println(t);\n" +
					"	}\n" +
					"	public static void main(String[] args) {\n" +
					"		class Local extends X {\n" +
					"			Local() {\n" +
					"				<String>super(\"FAILED\");\n" +
					"			}\n" +
					"		};\n" +
					"		new Local();\n" +
					"	}\n" +
					"}\n",
				},
				"----------\n" +
				"1. ERROR in X.java (at line 8)\n" +
				"	<String>super(\"FAILED\");\n" +
				"	        ^^^^^^^^^^^^^^^^\n" +
				"The constructor X(String) of type X is not generic; it cannot be parameterized with arguments <String>\n" +
				"----------\n");
			return;
		}
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"	public X(String t){\n" +
					"		System.out.println(t);\n" +
					"		Zork z;\n" +
					"	}\n" +
					"	public static void main(String[] args) {\n" +
					"		class Local extends X {\n" +
					"			Local() {\n" +
					"				<String>super(\"FAILED\");\n" +
					"			}\n" +
					"		};\n" +
					"		new Local();\n" +
					"	}\n" +
					"}\n",
				},
				"----------\n" +
				"1. ERROR in X.java (at line 4)\n" +
				"	Zork z;\n" +
				"	^^^^\n" +
				"Zork cannot be resolved to a type\n" +
				"----------\n" +
				"2. WARNING in X.java (at line 9)\n" +
				"	<String>super(\"FAILED\");\n" +
				"	 ^^^^^^\n" +
				"Unused type arguments for the non generic constructor X(String) of type X; it should not be parameterized with arguments <String>\n" +
				"----------\n");
	}
	// parameterized explicit constructor call - argument type mismatch
	public void test0202() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public <T> X(T t){\n" +
				"		System.out.println(t);\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		class Local extends X {\n" +
				"			Local() {\n" +
				"				<String>super(new X(null));\n" +
				"			}\n" +
				"		};\n" +
				"		new Local();\n" +
				"	}\n" +
				"}\n", 			},
			"----------\n" +
			"1. ERROR in X.java (at line 8)\n" +
			"	<String>super(new X(null));\n" +
			"	        ^^^^^^^^^^^^^^^^^^^\n" +
			"The parameterized constructor <String>X(String) of type X is not applicable for the arguments (X)\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=62822 - supertypes partially resolved during bound check
	public void test0203() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		demo.AD ad;\n" +
				"		System.out.println(\"SUCCESS\");\n" +
				"	}\n" +
				"}\n",
				"demo/AD.java",
				"package demo;\n" +
				"public interface AD extends LIST<ADXP> {}\n",
				"demo/ADXP.java",
				"package demo;\n" +
				"public interface ADXP extends BIN {}\n",
				"demo/ANY.java",
				"package demo;\n" +
				"public interface ANY {}\n",
				"demo/BL.java",
				"package demo;\n" +
				"public interface BL extends ANY {}\n",
				"demo/LIST.java",
				"package demo;\n" +
				"public interface LIST<T extends ANY> extends ANY {}\n",
				"demo/BIN.java",
				"package demo;\n" +
				"public interface BIN extends LIST<BL> {}\n",
			},
			"SUCCESS");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=62806
	public void test0204() {
		this.runConformTest(
			new String[] {
				"Function.java",
				"public abstract class Function<Y,X> {\n" +
				"    public abstract Y eval(X x);\n" +
				"\n" +
				"}\n",
				"FunctionMappedComparator.java",
				"import java.util.*;\n" +
				"public class FunctionMappedComparator<Y,X> implements Comparator<X> {\n" +
				"	/*\n" +
				"	 * \'Function\' is highlighted as an error here - the message is:\n" +
				"	 * The type Function is not generic; it cannot be parameterized with arguments <Y, X>\n" +
				"	 */\n" +
				"    protected Function<Y,X> function;\n" +
				"    protected Comparator<Y> comparator;\n" +
				"    public FunctionMappedComparator(Function<Y,X> function,Comparator<Y> comparator ) {\n" +
				"        this.function=function;\n" +
				"        this.comparator=comparator;\n" +
				"    }\n" +
				"\n" +
				"    public int compare(X x1, X x2) {\n" +
				"        return comparator.compare(function.eval(x1),function.eval(x2));\n" +
				"    }\n" +
				"}\n",
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=63555 - reference to static type parameter allowed inside type itself
	public void test0205() {
		this.runConformTest(
			new String[] {
				"Alpha.java",
				"public class Alpha {\n" +
				"	static class Beta<T> {\n" +
				"		T obj;\n" +
				"	}\n" +
				"}\n",
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=63555 - variation on static method type parameter
	public void test0206() {
		this.runConformTest(
			new String[] {
				"Alpha.java",
				"public class Alpha {\n" +
				"	static <T> void Beta(T t) {\n" +
				"	}\n" +
				"}\n",
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=63590 - disallow parameterized type in catch/throws clause
	public void test0207() {
		this.runNegativeTest(
			new String[] {
				"Alpha.java",
				"public class Alpha<T> extends RuntimeException {\n" +
				"	public static void main(String[] args) {\n" +
				"		new Object() {\n" +
				"			public void m() throws Alpha<String> {\n" +
				"				System.out.println(\"SUCCESS\");\n" +
				"			}\n" +
				"		}.m();\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in Alpha.java (at line 1)\n" +
			"	public class Alpha<T> extends RuntimeException {\n" +
			"	             ^^^^^\n" +
			"The serializable class Alpha does not declare a static final serialVersionUID field of type long\n" +
			"----------\n" +
			"2. ERROR in Alpha.java (at line 1)\n" +
			"	public class Alpha<T> extends RuntimeException {\n" +
			"	                              ^^^^^^^^^^^^^^^^\n" +
			"The generic class Alpha<T> may not subclass java.lang.Throwable\n" +
			"----------\n" +
			"3. ERROR in Alpha.java (at line 4)\n" +
			"	public void m() throws Alpha<String> {\n" +
			"	                       ^^^^^\n" +
			"Cannot use the parameterized type Alpha<String> either in catch block or throws clause\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=63590 - disallow parameterized type in catch/throws clause
	public void test0208() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T> extends RuntimeException {\n" +
				"	public static void main(String[] args) {\n" +
				"		try {\n" +
				"			throw new X<String>();\n" +
				"		} catch(X<String> e) {\n" +
				"			System.out.println(\"X<String>\");\n" +
				"		} catch(X<X<String>> e) {\n" +
				"			System.out.println(\"X<X<String>>\");\n" +
				"		} catch(RuntimeException e) {\n" +
				"			System.out.println(\"RuntimeException\");\n" +
				"		}\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 1)\n" +
			"	public class X<T> extends RuntimeException {\n" +
			"	             ^\n" +
			"The serializable class X does not declare a static final serialVersionUID field of type long\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 1)\n" +
			"	public class X<T> extends RuntimeException {\n" +
			"	                          ^^^^^^^^^^^^^^^^\n" +
			"The generic class X<T> may not subclass java.lang.Throwable\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 5)\n" +
			"	} catch(X<String> e) {\n" +
			"	                  ^\n" +
			"Cannot use the parameterized type X<String> either in catch block or throws clause\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 7)\n" +
			"	} catch(X<X<String>> e) {\n" +
			"	                     ^\n" +
			"Cannot use the parameterized type X<X<String>> either in catch block or throws clause\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=63556 - should resolve all occurrences of A to type variable
	public void test0209() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<A,B,C extends java.util.List<A>> {}\n" +
				"class X2<A,C extends java.util.List<A>, B> {}\n" +
				"class X3<B, A,C extends java.util.List<A>> {}\n",
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=68006 - Invalid modifier after parse
	public void test0210() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	void foo(Map<? super Object, ? extends String> m){\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	void foo(Map<? super Object, ? extends String> m){\n" +
			"	         ^^^\n" +
			"Map cannot be resolved to a type\n" +
			"----------\n");
	}
	// test compilation against binaries
	public void test0211() {
		this.runConformTest(
			new String[] {
				"p/Top.java",
				"package p;\n" +
				"public interface Top<T> {}\n",
			},
			"");

		this.runConformTest(
			new String[] {
				"p/Super.java",
				"package p;\n" +
				"public class Super<T> implements Top<T>{\n" +
				"    public static void main(String [] args) {\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n",
			},
			"SUCCESS",
			null,
			false, // do not flush output
			null);
	}
	// check type variable equivalence
	public void test0212() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"\n" +
				"public class X<T>{\n" +
				"    public static void main(String [] args) {\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"	X<T> _recurse; \n" +
				"	public List<T> toList(){\n" +
				"		List<T> result = new ArrayList<T>();\n" +
				"		result.addAll(_recurse.toList()); // should be applicable\n" +
				"		return result;\n" +
				"	}\n" +
				"}\n"
			},
			"SUCCESS");
	}
	public void test0213() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<R,T extends Comparable<T>>{\n" +
				"	T test;\n" +
				"	public Comparable<? extends T> getThis(){\n" +
				"		return test;\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=68133 - verify error
	public void test0214() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.ArrayList;\n" +
				"public class X {\n" +
				"    public static void main(String[] args) {\n" +
				"        ArrayList<Object> l;\n" +
				"        switch (args.length) {\n" +
				"        case 1:\n" +
				"            l = new ArrayList<Object>();\n" +
				"            System.out.println(l);\n" +
				"            break;\n" +
				"        default:\n" +
				"            System.out.println(\"SUCCESS\");\n" +
				"            return;\n" +
				"        }\n" +
				"    }\n" +
				"}\n"
			},
			"SUCCESS");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=68133 variation
	public void test0215() throws Exception {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		java.util.ArrayList<Object> i;	\n" +
				"		outer: {\n" +
				"			if (args == null) {\n" +
				"				i = null;\n" +
				"				break outer;\n" +
				"			}\n" +
				"			return;\n" +
				"		}\n" +
				"		System.out.println(i);	\n" +
				"		System.out.println(\"SUCCESS\");	\n" +
				"	}\n" +
				"}\n",
			},
			"");

		String expectedOutput =
			"  // Method descriptor #15 ([Ljava/lang/String;)V\n" +
			"  // Stack: 2, Locals: 2\n" +
			"  public static void main(java.lang.String[] args);\n" +
			"     0  aload_0 [args]\n" +
			"     1  ifnonnull 9\n" +
			"     4  aconst_null\n" +
			"     5  astore_1 [i]\n" +
			"     6  goto 10\n" +
			"     9  return\n" +
			"    10  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"    13  aload_1 [i]\n" +
			"    14  invokevirtual java.io.PrintStream.println(java.lang.Object) : void [22]\n" +
			"    17  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
			"    20  ldc <String \"SUCCESS\"> [28]\n" +
			"    22  invokevirtual java.io.PrintStream.println(java.lang.String) : void [30]\n" +
			"    25  return\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 5]\n" +
			"        [pc: 4, line: 6]\n" +
			"        [pc: 6, line: 7]\n" +
			"        [pc: 9, line: 9]\n" +
			"        [pc: 10, line: 11]\n" +
			"        [pc: 17, line: 12]\n" +
			"        [pc: 25, line: 13]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 26] local: args index: 0 type: java.lang.String[]\n" +
			"        [pc: 6, pc: 9] local: i index: 1 type: java.util.ArrayList\n" +
			"        [pc: 10, pc: 26] local: i index: 1 type: java.util.ArrayList\n" +
			"      Local variable type table:\n" +
			"        [pc: 6, pc: 9] local: i index: 1 type: java.util.ArrayList<java.lang.Object>\n" +
			"        [pc: 10, pc: 26] local: i index: 1 type: java.util.ArrayList<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);
		}
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=68998 parameterized field constants
	public void test0216() {
		this.runConformTest(
			new String[] {
				"test/cheetah/NG.java",
				"package test.cheetah;\n" +
				"public class NG extends G {\n" +
				"		public static void main(String[] args) {\n" +
				"			System.out.println(\"SUCCESS\");	\n" +
				"		}\n" +
				"    public boolean test() {\n" +
				"        return o == null;\n" +
				"    }\n" +
				"}\n",
				"test/cheetah/G.java",
				"package test.cheetah;\n" +
				"public class G<E> {\n" +
				"    protected Object o;\n" +
				"}\n",
			},
			"SUCCESS");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69135 - unnecessary cast operation
	public void test0217() {
		Map customOptions = getCompilerOptions();
		runConformTest(
			// test directory preparation
			true /* flush output directory */,
			new String[] { /* test files */
				"X.java",
				"import java.util.ArrayList;\n" +
				"public class X {\n" +
				"    public static void main(String [] args) {\n" +
				"		ArrayList<String> l= new ArrayList<String>();\n" +
				"		String string = (String) l.get(0);\n" +
				"    }\n" +
				"}\n",
			},
			// compiler options
			null /* no class libraries */,
			customOptions /* custom options */,
			// compiler results
			"----------\n" + /* expected compiler log */
			"1. WARNING in X.java (at line 5)\n" +
			"	String string = (String) l.get(0);\n" +
			"	                ^^^^^^^^^^^^^^^^^\n" +
			"Unnecessary cast from String to String\n" +
			"----------\n",
			// runtime results
			null /* do not check output string */,
			"java.lang.IndexOutOfBoundsException" /* do not check error string */,
			// javac options
			JavacTestOptions.Excuse.EclipseHasSomeMoreWarnings /* javac test options */);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=64154 visibility issue due to invalid use of parameterized binding
	public void test0218() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T>{\n" +
				"	private final T _data;\n" +
				"	private X(T data){\n" +
				"		_data = data;\n" +
				"	}\n" +
				"	public T getData(){\n" +
				"		return _data;\n" +
				"	}\n" +
				"	public static <E> X<E> create(E data) {\n" +
				"		return new X<E>(data);\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		create(new Object());\n" +
				"		System.out.println(\"SUCCESS\");\n" +
				"	}\n" +
				"}\n",
			},
			"SUCCESS");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=64154 variation
	public void test0219() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T>{\n" +
				"	private final T _data;\n" +
				"	private X(T data){\n" +
				"		_data = data;\n" +
				"	}\n" +
				"	public T getData(){\n" +
				"		return _data;\n" +
				"	}\n" +
				"	public static <E> E create(E data) {\n" +
				"		return new X<E>(data)._data;\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		create(new Object());\n" +
				"		System.out.println(\"SUCCESS\");\n" +
				"	}\n" +
				"}\n",
			},
			"SUCCESS");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69141 unsafe wildcard operation tolerates wildcard with lower bounds
	public void test0220() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.ArrayList;\n" +
				"\n" +
				"public class X {\n" +
				"	void foo() {\n" +
				"		ArrayList<? super Integer> al = new ArrayList<Object>();\n" +
				"		al.add(Integer.valueOf(1)); // (1)\n" +
				"		Integer i = al.get(0);  // (2)\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 7)\n" +
			"	Integer i = al.get(0);  // (2)\n" +
			"	            ^^^^^^^^^\n" +
			"Type mismatch: cannot convert from capture#2-of ? super Integer to Integer\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69141 variation
	public void test0221() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.ArrayList;\n" +
				"\n" +
				"public class X {\n" +
				"	void foo() {\n" +
				"		ArrayList<? extends Integer> al = new ArrayList<Integer>();\n" +
				"		al.add(Integer.valueOf(1)); // (1)\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	al.add(Integer.valueOf(1)); // (1)\n" +
			"	   ^^^\n" +
			"The method add(capture#1-of ? extends Integer) in the type ArrayList<capture#1-of ? extends Integer> is not applicable for the arguments (Integer)\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69141: variation
	public void test0222() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		XList<? super Integer> lx = new XList<Integer>();\n" +
				"		lx.slot = Integer.valueOf(1);\n" +
				"		Integer i = lx.slot;\n" +
				"    }    	\n" +
				"}\n" +
				"class XList<E> {\n" +
				"    E slot;\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	Integer i = lx.slot;\n" +
			"	            ^^^^^^^\n" +
			"Type mismatch: cannot convert from capture#2-of ? super Integer to Integer\n" +
			"----------\n");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69251- instantiating wildcards
	public void test0223() {
		Map customOptions = getCompilerOptions();
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.HashMap;\n" +
				"import java.util.Map;\n" +
				"public class X {\n" +
				"    static final Map<String, Class<? extends Object>> classes \n" +
				"            = new HashMap<String, Class<? extends Object>>();\n" +
				"    \n" +
				"    static final Map<String, Class<? extends Object>> classes2 \n" +
				"            = new HashMap<String, Class>();\n" +
				"    \n" +
				"    class MX<E> {\n" +
				"    	E get() { return null; }\n" +
				"    	void foo(E e) {}\n" +
				"    }\n" +
				"    \n" +
				"    void foo() {\n" +
				"    	MX<Class<? extends Object>> mx1 = new MX<Class<? extends Object>>();\n" +
				"    	MX<Class> mx2 = new MX<Class>();\n" +
				"    	mx1.foo(mx2.get());\n" +
				"    }\n" +
				"}\n"	,
			},
			"----------\n" +
			"1. ERROR in X.java (at line 8)\n" +
			"	= new HashMap<String, Class>();\n" +
			"	  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from HashMap<String,Class> to Map<String,Class<? extends Object>>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 8)\n" +
			"	= new HashMap<String, Class>();\n" +
			"	                      ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 17)\n" +
			"	MX<Class> mx2 = new MX<Class>();\n" +
			"	   ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 17)\n" +
			"	MX<Class> mx2 = new MX<Class>();\n" +
			"	                       ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 18)\n" +
			"	mx1.foo(mx2.get());\n" +
			"	        ^^^^^^^^^\n" +
			"Type safety: The expression of type Class needs unchecked conversion to conform to Class<? extends Object>\n" +
			"----------\n",
			null,
			true,
			customOptions);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=68998 variation
	public void test0224() {
		this.runNegativeTest(
			new String[] {
				"test/cheetah/NG.java",
				"package test.cheetah;\n" +
				"public class NG extends G {\n" +
				"		public static void main(String[] args) {\n" +
				"			System.out.println(\"SUCCESS\");	\n" +
				"		}\n" +
				"    public boolean test() {\n" +
				"        return o == null;\n" +
				"    }\n" +
				"}\n",
				"test/cheetah/G.java",
				"package test.cheetah;\n" +
				"public class G<E> {\n" +
				"    protected final Object o;\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in test\\cheetah\\NG.java (at line 2)\n" +
			"	public class NG extends G {\n" +
			"	                        ^\n" +
			"G is a raw type. References to generic type G<E> should be parameterized\n" +
			"----------\n" +
			"----------\n" +
			"1. ERROR in test\\cheetah\\G.java (at line 3)\n" +
			"	protected final Object o;\n" +
			"	                       ^\n" +
			"The blank final field o may not have been initialized\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69353 - prevent using type parameter in catch block
	public void test0225() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T extends Exception> {\n" +
				"    String foo() throws T {\n" +
				"        return \"SUCCESS\";\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        new X<EX>().baz(new EX());\n" +
				"    }\n" +
				"    void baz(final T t) {\n" +
				"        new Object() {\n" +
				"            void print() {\n" +
				"                try {\n" +
				"	                System.out.println(foo());\n" +
				"                } catch (T t) {\n" +
				"                }\n" +
				"            }\n" +
				"        }.print();\n" +
				"    }\n" +
				"}\n" +
				"class EX extends Exception {\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 13)\n" +
			"	} catch (T t) {\n" +
			"	           ^\n" +
			"Cannot use the type parameter T in a catch block\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 13)\n" +
			"	} catch (T t) {\n" +
			"	           ^\n" +
			"The parameter t is hiding another local variable defined in an enclosing scope\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 19)\n" +
			"	class EX extends Exception {\n" +
			"	      ^^\n" +
			"The serializable class EX does not declare a static final serialVersionUID field of type long\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69170 - invalid generic array creation
	public void test0226() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T>{\n" +
				"	 Object x1= new T[0];\n" +
				"	 Object x2= new X<String>[0];	 \n" +
				"	 Object x3= new X<T>[0];	 \n" +
				"	 Object x4= new X[0];	 \n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	Object x1= new T[0];\n" +
			"	           ^^^^^^^^\n" +
			"Cannot create a generic array of T\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 3)\n" +
			"	Object x2= new X<String>[0];	 \n" +
			"	           ^^^^^^^^^^^^^^^^\n" +
			"Cannot create a generic array of X<String>\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 4)\n" +
			"	Object x3= new X<T>[0];	 \n" +
			"	           ^^^^^^^^^^^\n" +
			"Cannot create a generic array of X<T>\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69359 - unsafe cast diagnosis
	public void test0227() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				" import java.util.*;\n" +
				" public class X {\n" +
				"  List list() { return null; }\n" +
				"  void m() { List<X> l = (List<X>)list(); } // unsafe cast\n" +
				"  void m0() { List<X> l = list(); } // unsafe conversion\n" +
				"  void m1() { for (X a : list()); } // type mismatch\n" +
				"  void m2() { for (Iterator<X> i = list().iterator(); i.hasNext();); }  // unsafe conversion\n" +
				"  void m3() { Collection c = null; List l = (List<X>)c; } // unsafe cast\n" +
				"  void m4() { Collection c = null; List l = (List<?>)c; } // ok\n" +
				"  void m5() { List c = null; List l = (Collection<X>)c; } // type mismatch\n" +
				"  void m6() { List c = null; List l = (Collection<?>)c; } // type mismatch\n" +
				"}\n"	,
			},
			"----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	List list() { return null; }\n" +
			"	^^^^\n" +
			"List is a raw type. References to generic type List<E> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 4)\n" +
			"	void m() { List<X> l = (List<X>)list(); } // unsafe cast\n" +
			"	                       ^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from List to List<X>\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 4)\n" +
			"	void m() { List<X> l = (List<X>)list(); } // unsafe cast\n" +
			"	                       ^^^^^^^^^^^^^^^\n" +
			"Unnecessary cast from List to List<X>\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 5)\n" +
			"	void m0() { List<X> l = list(); } // unsafe conversion\n" +
			"	                        ^^^^^^\n" +
			"Type safety: The expression of type List needs unchecked conversion to conform to List<X>\n" +
			"----------\n" +
			"5. ERROR in X.java (at line 6)\n" +
			"	void m1() { for (X a : list()); } // type mismatch\n" +
			"	                       ^^^^^^\n" +
			"Type mismatch: cannot convert from element type Object to X\n" +
			"----------\n" +
			"6. WARNING in X.java (at line 7)\n" +
			"	void m2() { for (Iterator<X> i = list().iterator(); i.hasNext();); }  // unsafe conversion\n" +
			"	                                 ^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The expression of type Iterator needs unchecked conversion to conform to Iterator<X>\n" +
			"----------\n" +
			"7. WARNING in X.java (at line 8)\n" +
			"	void m3() { Collection c = null; List l = (List<X>)c; } // unsafe cast\n" +
			"	            ^^^^^^^^^^\n" +
			"Collection is a raw type. References to generic type Collection<E> should be parameterized\n" +
			"----------\n" +
			"8. WARNING in X.java (at line 8)\n" +
			"	void m3() { Collection c = null; List l = (List<X>)c; } // unsafe cast\n" +
			"	                                 ^^^^\n" +
			"List is a raw type. References to generic type List<E> should be parameterized\n" +
			"----------\n" +
			"9. WARNING in X.java (at line 8)\n" +
			"	void m3() { Collection c = null; List l = (List<X>)c; } // unsafe cast\n" +
			"	                                          ^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from Collection to List<X>\n" +
			"----------\n" +
			"10. WARNING in X.java (at line 9)\n" +
			"	void m4() { Collection c = null; List l = (List<?>)c; } // ok\n" +
			"	            ^^^^^^^^^^\n" +
			"Collection is a raw type. References to generic type Collection<E> should be parameterized\n" +
			"----------\n" +
			"11. WARNING in X.java (at line 9)\n" +
			"	void m4() { Collection c = null; List l = (List<?>)c; } // ok\n" +
			"	                                 ^^^^\n" +
			"List is a raw type. References to generic type List<E> should be parameterized\n" +
			"----------\n" +
			"12. WARNING in X.java (at line 10)\n" +
			"	void m5() { List c = null; List l = (Collection<X>)c; } // type mismatch\n" +
			"	            ^^^^\n" +
			"List is a raw type. References to generic type List<E> should be parameterized\n" +
			"----------\n" +
			"13. WARNING in X.java (at line 10)\n" +
			"	void m5() { List c = null; List l = (Collection<X>)c; } // type mismatch\n" +
			"	                           ^^^^\n" +
			"List is a raw type. References to generic type List<E> should be parameterized\n" +
			"----------\n" +
			"14. WARNING in X.java (at line 10)\n" +
			"	void m5() { List c = null; List l = (Collection<X>)c; } // type mismatch\n" +
			"	                                    ^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from List to Collection<X>\n" +
			"----------\n" +
			"15. ERROR in X.java (at line 10)\n" +
			"	void m5() { List c = null; List l = (Collection<X>)c; } // type mismatch\n" +
			"	                                    ^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Collection<X> to List\n" +
			"----------\n" +
			"16. WARNING in X.java (at line 11)\n" +
			"	void m6() { List c = null; List l = (Collection<?>)c; } // type mismatch\n" +
			"	            ^^^^\n" +
			"List is a raw type. References to generic type List<E> should be parameterized\n" +
			"----------\n" +
			"17. WARNING in X.java (at line 11)\n" +
			"	void m6() { List c = null; List l = (Collection<?>)c; } // type mismatch\n" +
			"	                           ^^^^\n" +
			"List is a raw type. References to generic type List<E> should be parameterized\n" +
			"----------\n" +
			"18. ERROR in X.java (at line 11)\n" +
			"	void m6() { List c = null; List l = (Collection<?>)c; } // type mismatch\n" +
			"	                                    ^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Collection<capture#2-of ?> to List\n" +
			"----------\n");
	}
	// conversion from raw to X<?> is safe (no unsafe warning)
	public void test0228() {
		this.runConformTest(
			new String[] {
				"X.java",
				" import java.util.*;\n" +
				" public class X {\n" +
				" 	List<?> list = new ArrayList();\n" +
				" }\n",
			},
			"");
	}
	// can resolve member through type variable
	public void test0229() {
		runConformTest(
			true,
			new String[] {
				"X.java",
				" public class X <T extends XC> {\n" +
				" 	T.MXC f;\n" +
				" 	public static void main(String[] args) {\n" +
				"		System.out.println(\"SUCCESS\");\n" +
				"	}\n" +
				" }\n" +
				" class XC {\n" +
				" 	class MXC {}\n" +
				" }\n",
			},
			null,
			"SUCCESS",
			null,
			JavacTestOptions.JavacHasABug.JavacBug6569404);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69375 - equivalence of wildcards
	public void test0230() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.List;\n" +
				"\n" +
				"public class X {\n" +
				"	void foo() {\n" +
				"		List<? extends Integer> li= null;\n" +
				"		List<? extends Number> ln= null;\n" +
				"		ln = li;\n" +
				"		li= ln;\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 8)\n" +
			"	li= ln;\n" +
			"	    ^^\n" +
			"Type mismatch: cannot convert from List<capture#4-of ? extends Number> to List<? extends Integer>\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69170 - variation
	public void test0231() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T>{\n" +
				"	 Object x1= new X<?>[0];	 \n" +
				"	 Object x2= new X<? super String>[0];	 \n" +
				"	 Object x3= new X<? extends Thread>[0];	 \n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	Object x2= new X<? super String>[0];	 \n" +
			"	           ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Cannot create a generic array of X<? super String>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 4)\n" +
			"	Object x3= new X<? extends Thread>[0];	 \n" +
			"	           ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Cannot create a generic array of X<? extends Thread>\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69542 - generic cast should be less strict
	public void test0232() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				" 	static class Container<T>{\n" +
				"	    private T val;\n" +
				"	    public T getVal() {\n" +
				"	        return val;\n" +
				"	    }\n" +
				"	    public void setVal(T val) {\n" +
				"	        this.val = val;\n" +
				"	    }\n" +
				"	}\n" +
				"	public static void badMethod(Container<?> param){\n" +
				"	    Container x=param;\n" +
				"	    x.setVal(\"BAD\");\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"	    Container<Integer> cont=new Container<Integer>();\n" +
				"	    cont.setVal(new Integer(0));\n" +
				"	    badMethod(cont);\n" +
				"	    Object someVal = cont.getVal(); // no cast \n" +
				"	    System.out.println(cont.getVal()); // no cast \n" +
				"	}\n" +
				"}\n",
			},
			"BAD");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69542 - variation
	public void test0233() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				" 	static class Container<T>{\n" +
				"	    private T val;\n" +
				"	    public T getVal() {\n" +
				"	        return val;\n" +
				"	    }\n" +
				"	    public void setVal(T val) {\n" +
				"	        this.val = val;\n" +
				"	    }\n" +
				"	}\n" +
				"	public static void badMethod(Container<?> param){\n" +
				"	    Container x=param;\n" +
				"	    x.setVal(new Long(0));\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"	    Container<Integer> cont=new Container<Integer>();\n" +
				"	    cont.setVal(new Integer(0));\n" +
				"	    badMethod(cont);\n" +
				"	    Number someVal = cont.getVal();// only cast to Number \n" +
				"	    System.out.println(\"SUCCESS\"); \n" +
				"	}\n" +
				"}\n",
			},
			"SUCCESS");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69542 - variation
	public void test0234() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				" 	static class Container<T>{\n" +
				"	    public T val;\n" +
				"	    public T getVal() {\n" +
				"	        return val;\n" +
				"	    }\n" +
				"	    public void setVal(T val) {\n" +
				"	        this.val = val;\n" +
				"	    }\n" +
				"	}\n" +
				"	public static void badMethod(Container<?> param){\n" +
				"	    Container x=param;\n" +
				"	    x.setVal(\"BAD\");\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"	    Container<Integer> cont=new Container<Integer>();\n" +
				"	    cont.setVal(new Integer(0));\n" +
				"	    badMethod(cont);\n" +
				"	    Object someVal = cont.val; // no cast \n" +
				"	    System.out.println(cont.val); // no cast \n" +
				"	}\n" +
				"}\n",
			},
			"BAD");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69542 - variation
	public void test0235() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				" 	static class Container<T>{\n" +
				"	    public T val;\n" +
				"	    public T getVal() {\n" +
				"	        return val;\n" +
				"	    }\n" +
				"	    public void setVal(T val) {\n" +
				"	        this.val = val;\n" +
				"	    }\n" +
				"	}\n" +
				"	public static void badMethod(Container<?> param){\n" +
				"	    Container x=param;\n" +
				"	    x.setVal(new Long(0));\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"	    Container<Integer> cont=new Container<Integer>();\n" +
				"	    cont.setVal(new Integer(0));\n" +
				"	    badMethod(cont);\n" +
				"	    Number someVal = cont.val;// only cast to Number \n" +
				"	    System.out.println(\"SUCCESS\"); \n" +
				"	}\n" +
				"}\n",
			},
			"SUCCESS");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69542 - variation
	public void test0236() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				" 	static class Container<T>{\n" +
				"	    public T val;\n" +
				"	    public T getVal() {\n" +
				"	        return val;\n" +
				"	    }\n" +
				"	    public void setVal(T val) {\n" +
				"	        this.val = val;\n" +
				"	    }\n" +
				"	}\n" +
				"	public static void badMethod(Container<?> param){\n" +
				"	    Container x=param;\n" +
				"	    x.setVal(\"BAD\");\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"	    Container<Integer> cont=new Container<Integer>();\n" +
				"	    cont.setVal(new Integer(0));\n" +
				"	    badMethod(cont);\n" +
				"	    Object someVal = (cont).val; // no cast \n" +
				"	    System.out.println((cont).val); // no cast \n" +
				"	}\n" +
				"}\n",
			},
			"BAD");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69542 - variation
	public void test0237() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				" 	static class Container<T>{\n" +
				"	    public T val;\n" +
				"	    public T getVal() {\n" +
				"	        return val;\n" +
				"	    }\n" +
				"	    public void setVal(T val) {\n" +
				"	        this.val = val;\n" +
				"	    }\n" +
				"	}\n" +
				"	public static void badMethod(Container<?> param){\n" +
				"	    Container x=param;\n" +
				"	    x.setVal(new Long(0));\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"	    Container<Integer> cont=new Container<Integer>();\n" +
				"	    cont.setVal(new Integer(0));\n" +
				"	    badMethod(cont);\n" +
				"	    Number someVal = (cont).val;// only cast to Number \n" +
				"	    System.out.println(\"SUCCESS\"); \n" +
				"	}\n" +
				"}\n",
			},
			"SUCCESS");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69542 - variation
	public void test0238() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				" 	static class Container<T>{\n" +
				"	    public T val;\n" +
				"		Container<T> next;\n" +
				"	    public T getVal() {\n" +
				"	        return val;\n" +
				"	    }\n" +
				"	    public void setVal(T val) {\n" +
				"	        this.val = val;\n" +
				"	    }\n" +
				"	}\n" +
				"	public static void badMethod(Container<?> param){\n" +
				"	    Container x=param;\n" +
				"	    x.setVal(\"BAD\");\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"	    Container<Integer> cont = new Container<Integer>();\n" +
				"		cont.next = new Container<Integer>();\n" +
				"	    cont.next.setVal(new Integer(0));\n" +
				"	    badMethod(cont.next);\n" +
				"	    Object someVal = cont.next.val; // no cast \n" +
				"	    System.out.println(cont.next.val); // no cast \n" +
				"	}\n" +
				"}\n",
			},
			"BAD");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69542 - variation
	public void test0239() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				" 	static class Container<T>{\n" +
				"	    public T val;\n" +
				"		Container<T> next;\n" +
				"	    public T getVal() {\n" +
				"	        return val;\n" +
				"	    }\n" +
				"	    public void setVal(T val) {\n" +
				"	        this.val = val;\n" +
				"	    }\n" +
				"	}\n" +
				"	public static void badMethod(Container<?> param){\n" +
				"	    Container x=param;\n" +
				"	    x.setVal(new Long(0));\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"	    Container<Integer> cont = new Container<Integer>();\n" +
				"		cont.next = new Container<Integer>();\n" +
				"	    cont.next.setVal(new Integer(0));\n" +
				"	    badMethod(cont.next);\n" +
				"	    Number someVal = cont.next.val;// only cast to Number \n" +
				"	    System.out.println(\"SUCCESS\"); \n" +
				"	}\n" +
				"}\n",
			},
			"SUCCESS");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69713 NPE due to length pseudo field
	public void test0240() {
		this.runNegativeTest(
			new String[] {
				"X.java",
			"public class X {\n" +
			"    String[] elements = null;\n" +
			"	\n" +
			"    public X() {\n" +
			"        String s = \"a, b, c, d\";\n" +
			"        elements = s.split(\",\");\n" +
			"        if(elements.length = 3) {\n" +
			"        }\n" +
			"    }\n" +
			"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 7)\n" +
			"	if(elements.length = 3) {\n" +
			"	   ^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from int to boolean\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69776 - missing checkcast on cast operation
	public void test0241() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.HashMap;\n" +
				"import java.util.Map;\n" +
				"public class X {\n" +
				"    private static final Map<String, Class> classes = new HashMap<String, Class>();\n" +
				"    public static void main(String[] args) throws Exception {\n" +
				"    	classes.put(\"test\", X.class);\n" +
				"        final Class<? extends Object> clazz = (Class<? extends Object>) classes.get(\"test\");\n" +
				"        Object o = clazz.newInstance();\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n",
			},
			"SUCCESS");
	}
	// 69776 - variation
	public void test0242() {
		Map<String,String> options = getCompilerOptions();
		options.put(CompilerOptions.OPTION_ReportDeprecation, CompilerOptions.IGNORE);
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.HashMap;\n" +
				"import java.util.Map;\n" +
				"@SuppressWarnings({\"rawtypes\"})\n" +
				"public class X {\n" +
				"    private static final Map<String, Class> classes = new HashMap<String, Class>();\n" +
				"    public static void main(String[] args) throws Exception {\n" +
				"    	classes.put(\"test\", X.class);\n" +
				"        final Class<? extends Object> clazz = (Class<? extends Object>) classes.get(\"test\");\n" +
				"        final Class<? extends String> clazz2 = (Class<? extends String>) classes.get(\"test\");\n" +
				"        final Class<String> clazz3 = (Class<String>) classes.get(\"test\");\n" +
				"        Object o = clazz.newInstance();\n" +
				"    }\n" +
				"}", // =================
			},
			"----------\n" +
			"1. WARNING in X.java (at line 8)\n" +
			"	final Class<? extends Object> clazz = (Class<? extends Object>) classes.get(\"test\");\n" +
			"	                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from Class to Class<? extends Object>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 8)\n" +
			"	final Class<? extends Object> clazz = (Class<? extends Object>) classes.get(\"test\");\n" +
			"	                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Unnecessary cast from Class to Class<? extends Object>\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 9)\n" +
			"	final Class<? extends String> clazz2 = (Class<? extends String>) classes.get(\"test\");\n" +
			"	                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from Class to Class<? extends String>\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 9)\n" +
			"	final Class<? extends String> clazz2 = (Class<? extends String>) classes.get(\"test\");\n" +
			"	                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Unnecessary cast from Class to Class<? extends String>\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 10)\n" +
			"	final Class<String> clazz3 = (Class<String>) classes.get(\"test\");\n" +
			"	                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from Class to Class<String>\n" +
			"----------\n" +
			"6. WARNING in X.java (at line 10)\n" +
			"	final Class<String> clazz3 = (Class<String>) classes.get(\"test\");\n" +
			"	                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Unnecessary cast from Class to Class<String>\n" +
			"----------\n", 
			null, true, options );
	}
	public void test0243() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public X foo() {\n" +
				"        System.out.println(\"Did NOT add bridge method\");\n" +
				"        return this;\n" +
				"    }\n" +
				"    public static void main(String[] args) throws Exception {\n" +
				"        X x = new A();\n" +
				"        x.foo();\n" +
				"        System.out.print(\" + \");\n" +
				"        I i = new A();\n" +
				"        i.foo();\n" +
				"    }\n" +
				"}\n" +
				"interface I {\n" +
				"    public I foo();\n" +
				"}\n" +
				"class A extends X implements I {\n" +
				"    public A foo() {\n" +
				"        System.out.print(\"Added bridge method\");\n" +
				"        return this;\n" +
				"    }\n" +
				"}\n"
			},
			"Added bridge method + Added bridge method");
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public X foo() { return this; }\n" +
				"    public static void main(String[] args) throws Exception {\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n",
				"SubTypes.java",
				"class A extends X {\n" +
				"    @Override public A foo() { return this; }\n" +
				"}\n" +
				"class B extends X {\n" +
				"    @Override public X foo() { return new X(); }\n" +
				"    @Override public B foo() { return this; }\n" +
				"}\n" +
				"class C extends A {\n" +
				"    @Override public X foo() { return new X(); }\n" +
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in SubTypes.java (at line 5)\n" + 
			"	@Override public X foo() { return new X(); }\n" + 
			"	                   ^^^^^\n" + 
			"Duplicate method foo() in type B\n" + 
			"----------\n" + 
			"2. ERROR in SubTypes.java (at line 6)\n" + 
			"	@Override public B foo() { return this; }\n" + 
			"	                   ^^^^^\n" + 
			"Duplicate method foo() in type B\n" + 
			"----------\n" + 
			"3. ERROR in SubTypes.java (at line 9)\n" + 
			"	@Override public X foo() { return new X(); }\n" + 
			"	                 ^\n" + 
			"The return type is incompatible with A.foo()\n" + 
			"----------\n");
	}
	// generic method of raw type
	public void test0244() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T> { \n" +
				"	<G> T foo(G g) {\n" +
				"		return null;\n" +
				"	}\n" +
				"	\n" +
				"	public static void main(String[] args) {\n" +
				"		X rx = new X();\n" +
				"		rx.foo(\"hello\");\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 7)\n" +
			"	X rx = new X();\n" +
			"	^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 7)\n" +
			"	X rx = new X();\n" +
			"	           ^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 8)\n" +
			"	rx.foo(\"hello\");\n" +
			"	^^^^^^^^^^^^^^^\n" +
			"Type safety: The method foo(Object) belongs to the raw type X. References to generic type X<T> should be parameterized\n" +
			"----------\n");
	}
	// generic method of raw type
	public void test0245() {
		if (this.complianceLevel < ClassFileConstants.JDK1_7) {
			this.runNegativeTest(
					new String[] {
						"X.java",
						"public class X <T> { \n" + 
						"        <G> T foo(G g) {\n" + 
						"            return null;\n" + 
						"        }\n" + 
						"        T bar(T t) {\n" + 
						"        	return zork;\n" + 
						"        }\n" + 
						"\n" + 
						"        public static void main(String[] args) {\n" + 
						"                X rx = new X();\n" + 
						"                rx.<String>foo(\"hello\"); // Eclipse error here\n" + 
						"                rx.<String>bar(\"hello\"); // Eclipse error here\n" + 
						"        }\n" + 
						"}\n"
					},
					"----------\n" + 
					"1. ERROR in X.java (at line 6)\n" + 
					"	return zork;\n" + 
					"	       ^^^^\n" + 
					"zork cannot be resolved to a variable\n" + 
					"----------\n" + 
					"2. WARNING in X.java (at line 10)\n" + 
					"	X rx = new X();\n" + 
					"	^\n" + 
					"X is a raw type. References to generic type X<T> should be parameterized\n" + 
					"----------\n" + 
					"3. WARNING in X.java (at line 10)\n" + 
					"	X rx = new X();\n" + 
					"	           ^\n" + 
					"X is a raw type. References to generic type X<T> should be parameterized\n" + 
					"----------\n" + 
					"4. ERROR in X.java (at line 11)\n" + 
					"	rx.<String>foo(\"hello\"); // Eclipse error here\n" + 
					"	           ^^^\n" + 
					"The method foo(Object) of raw type X is no longer generic; it cannot be parameterized with arguments <String>\n" + 
					"----------\n" + 
					"5. ERROR in X.java (at line 12)\n" + 
					"	rx.<String>bar(\"hello\"); // Eclipse error here\n" + 
					"	           ^^^\n" + 
					"The method bar(Object) of type X is not generic; it cannot be parameterized with arguments <String>\n" + 
					"----------\n",
					JavacTestOptions.EclipseHasABug.EclipseBug236242);
			return;
		}
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X <T> { \n" + 
					"        <G> T foo(G g) {\n" + 
					"            return null;\n" + 
					"        }\n" + 
					"        T bar(T t) {\n" + 
					"        	return zork;\n" + 
					"        }\n" + 
					"\n" + 
					"        public static void main(String[] args) {\n" + 
					"                X rx = new X();\n" + 
					"                rx.<String>foo(\"hello\"); // Eclipse error here\n" + 
					"                rx.<String>bar(\"hello\"); // Eclipse error here\n" + 
					"        }\n" + 
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 6)\n" + 
				"	return zork;\n" + 
				"	       ^^^^\n" + 
				"zork cannot be resolved to a variable\n" + 
				"----------\n" + 
				"2. WARNING in X.java (at line 10)\n" + 
				"	X rx = new X();\n" + 
				"	^\n" + 
				"X is a raw type. References to generic type X<T> should be parameterized\n" + 
				"----------\n" + 
				"3. WARNING in X.java (at line 10)\n" + 
				"	X rx = new X();\n" + 
				"	           ^\n" + 
				"X is a raw type. References to generic type X<T> should be parameterized\n" + 
				"----------\n" + 
				"4. WARNING in X.java (at line 11)\n" + 
				"	rx.<String>foo(\"hello\"); // Eclipse error here\n" + 
				"	^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Type safety: The method foo(Object) belongs to the raw type X. References to generic type X<T> should be parameterized\n" + 
				"----------\n" + 
				"5. WARNING in X.java (at line 12)\n" + 
				"	rx.<String>bar(\"hello\"); // Eclipse error here\n" + 
				"	^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Type safety: The method bar(Object) belongs to the raw type X. References to generic type X<T> should be parameterized\n" + 
				"----------\n" + 
				"6. WARNING in X.java (at line 12)\n" + 
				"	rx.<String>bar(\"hello\"); // Eclipse error here\n" + 
				"	    ^^^^^^\n" + 
				"Unused type arguments for the non generic method bar(Object) of type X; it should not be parameterized with arguments <String>\n" + 
				"----------\n",
				JavacTestOptions.EclipseHasABug.EclipseBug236242);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69320 parameterized type compatibility
	public void test0246() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X { \n" +
				"    class MX<E> {\n" +
				"    }\n" +
				"    void foo() {\n" +
				"      MX<Class<? extends Object>> mx2 = new MX<Class>();\n" +
				"    }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	MX<Class<? extends Object>> mx2 = new MX<Class>();\n" +
			"	                                  ^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from X.MX<Class> to X.MX<Class<? extends Object>>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 5)\n" +
			"	MX<Class<? extends Object>> mx2 = new MX<Class>();\n" +
			"	                                         ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69320 variation
	public void test0247() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X { \n" +
				"    void foo() {\n" +
				"      MX<Class<? extends Object>> mx2 = new MX<Class>(); // wrong\n" +
				"      MX<Class<? extends Object>> mx3 = new MX<Class<? extends String>>(); // wrong\n" +
				"      MX<Class<? extends Object>> mx4 = new MX<Class<String>>(); // wrong\n" +
				"      MX<? extends Class> mx5 = new MX<Class>(); // ok\n" +
				"      MX<? super Class> mx6 = new MX<Class>(); // ok\n" +
				"      MX<Class<? extends Class>> mx7 = new MX<Class<Class>>(); // wrong\n" +
				"      MX<MX<? extends Class>> mx8 = new MX<MX<Class>>(); // wrong\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class MX<E> {\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	MX<Class<? extends Object>> mx2 = new MX<Class>(); // wrong\n" +
			"	                                  ^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from MX<Class> to MX<Class<? extends Object>>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 3)\n" +
			"	MX<Class<? extends Object>> mx2 = new MX<Class>(); // wrong\n" +
			"	                                         ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 4)\n" +
			"	MX<Class<? extends Object>> mx3 = new MX<Class<? extends String>>(); // wrong\n" +
			"	                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from MX<Class<? extends String>> to MX<Class<? extends Object>>\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 5)\n" +
			"	MX<Class<? extends Object>> mx4 = new MX<Class<String>>(); // wrong\n" +
			"	                                  ^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from MX<Class<String>> to MX<Class<? extends Object>>\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 6)\n" +
			"	MX<? extends Class> mx5 = new MX<Class>(); // ok\n" +
			"	             ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"6. WARNING in X.java (at line 6)\n" +
			"	MX<? extends Class> mx5 = new MX<Class>(); // ok\n" +
			"	                                 ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"7. WARNING in X.java (at line 7)\n" +
			"	MX<? super Class> mx6 = new MX<Class>(); // ok\n" +
			"	           ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"8. WARNING in X.java (at line 7)\n" +
			"	MX<? super Class> mx6 = new MX<Class>(); // ok\n" +
			"	                               ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"9. WARNING in X.java (at line 8)\n" +
			"	MX<Class<? extends Class>> mx7 = new MX<Class<Class>>(); // wrong\n" +
			"	                   ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"10. ERROR in X.java (at line 8)\n" +
			"	MX<Class<? extends Class>> mx7 = new MX<Class<Class>>(); // wrong\n" +
			"	                                 ^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from MX<Class<Class>> to MX<Class<? extends Class>>\n" +
			"----------\n" +
			"11. WARNING in X.java (at line 8)\n" +
			"	MX<Class<? extends Class>> mx7 = new MX<Class<Class>>(); // wrong\n" +
			"	                                              ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"12. WARNING in X.java (at line 9)\n" +
			"	MX<MX<? extends Class>> mx8 = new MX<MX<Class>>(); // wrong\n" +
			"	                ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"13. ERROR in X.java (at line 9)\n" +
			"	MX<MX<? extends Class>> mx8 = new MX<MX<Class>>(); // wrong\n" +
			"	                              ^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from MX<MX<Class>> to MX<MX<? extends Class>>\n" +
			"----------\n" +
			"14. WARNING in X.java (at line 9)\n" +
			"	MX<MX<? extends Class>> mx8 = new MX<MX<Class>>(); // wrong\n" +
			"	                                        ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=70247 check type variable is bound during super type resolution
	public void test0248() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"public class X<T> extends Vector<? super X<int[]>>{}\n"			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	public class X<T> extends Vector<? super X<int[]>>{}\n" +
			"	                          ^^^^^^\n" +
			"The type X cannot extend or implement Vector<? super X<int[]>>. A supertype may not specify any wildcard\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=70247 variation
	public void test0249() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"public class X<T> implements List<? super X<int[]>>{}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	public class X<T> implements List<? super X<int[]>>{}\n" +
			"	                             ^^^^\n" +
			"The type X cannot extend or implement List<? super X<int[]>>. A supertype may not specify any wildcard\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=70295 Class<? extends Object> is compatible with Class<?>
	public void test0250() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    void test(Object o) {\n" +
				"        X.class.isAssignableFrom(o.getClass());\n" +
				"    }\n" +
				"}\n"
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69800 '? extends Object' is not compatible with A
	public void test0251() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"@SuppressWarnings(\"deprecation\")\n" +
				"public class X { \n" +
				"    static class A {\n" +
				"    }\n" +
				"    A test() throws Exception {\n" +
				"        Class<? extends Object> clazz = null;\n" +
				"        return clazz.newInstance(); // ? extends Object\n" +
				"    }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 7)\n" +
			"	return clazz.newInstance(); // ? extends Object\n" +
			"	       ^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from capture#1-of ? extends Object to X.A\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69799 NPE in foreach checkcast
	// effective result may change depending upon
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=148241
	// **
	public void test0252() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		Set<X> channel = channels.get(0);\n" +
				"	    for (Iterator<X> iter = channel.iterator(); iter.hasNext();) {\n" +
				"	        Set<X> element;\n" +
				"	        element = (Set<X>) iter.next();\n" +
				"		}\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	Set<X> channel = channels.get(0);\n" +
			"	                 ^^^^^^^^\n" +
			"channels cannot be resolved\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 7)\n" +
			"	element = (Set<X>) iter.next();\n" +
			"	          ^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from X to Set<X>\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=70243 unsafe cast when wildcards
	public void test0253() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"public class X {\n" +
				"    public static void main(String[] args) {\n" +
				"        List<Integer> li= new ArrayList<Integer>();\n" +
				"        List<? extends Number> ls= li;       \n" +
				"        List<Number> x2= (List<Number>)ls;//unsafe\n" +
				"        x2.add(Float.valueOf(1.0f));\n" +
				"        \n" +
				"        Integer i= li.get(0);//ClassCastException!\n" +
				"        \n" +
				"        List<Number> ls2 = (List<? extends Number>)ls;\n" +
				"        List<? extends Number> ls3 = (List<? extends Number>) li;\n" +
				"    }\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 6)\n" +
			"	List<Number> x2= (List<Number>)ls;//unsafe\n" +
			"	                 ^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from List<capture#1-of ? extends Number> to List<Number>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 11)\n" +
			"	List<Number> ls2 = (List<? extends Number>)ls;\n" +
			"	                   ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from List<capture#3-of ? extends Number> to List<Number>\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 12)\n" +
			"	List<? extends Number> ls3 = (List<? extends Number>) li;\n" +
			"	                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Unnecessary cast from List<Integer> to List<? extends Number>\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=70053 missing checkcast in string concatenation
	public void test0254() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"public class X {\n" +
				" public static void main(String[] args) {\n" +
				"  X x = new X();\n" +
				"  System.out.print(\"S\" + x.a() + \"U\" + x.b().get(0) + \"C\" + x.a() + \"C\");\n" +
				"  System.out.println(new StringBuilder(\"E\").append(x.a()).append(\"S\").append(x.b().get(0)).append(\"S\").append(x.a()).append(\"!\"));  \n" +
				" }\n" +
				" String a() { return \"\"; }\n" +
				" List<String> b() { \n" +
				"  ArrayList<String> als = new ArrayList<String>(1);\n" +
				"  als.add(a());\n" +
				"  return als;\n" +
				" }\n" +
				"}\n"
			},
			"SUCCESS!");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69351 generic type cannot extend Throwable
	public void test0255() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T, U> extends Throwable {\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 1)\n" +
			"	public class X<T, U> extends Throwable {\n" +
			"	             ^\n" +
			"The serializable class X does not declare a static final serialVersionUID field of type long\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 1)\n" +
			"	public class X<T, U> extends Throwable {\n" +
			"	                             ^^^^^^^^^\n" +
			"The generic class X<T,U> may not subclass java.lang.Throwable\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=70616 - reference to binary Enum
	public void test0256() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	\n" +
				"	public static void main(String[] args) {\n" +
				"\n" +
				"		Enum<X> ex = null;\n" +
				"		String s = ex.name();\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	Enum<X> ex = null;\n" +
			"	     ^\n" +
			"Bound mismatch: The type X is not a valid substitute for the bounded parameter <E extends Enum<E>> of the type Enum<E>\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=70618 - reference to variable allowed in parameterized super type
	public void test0257() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"    public abstract class M extends java.util.AbstractList<T> {}\n" +
				"}\n" +
				"class Y<T> extends T {}\n" +
				"class Z<T> {\n" +
				"    class M extends T {}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	class Y<T> extends T {}\n" +
			"	                   ^\n" +
			"Cannot refer to the type parameter T as a supertype\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 6)\n" +
			"	class M extends T {}\n" +
			"	                ^\n" +
			"Cannot refer to the type parameter T as a supertype\n" +
			"----------\n");
	}
	public void test0258() {
		this.runConformTest(
			new String[] {
				"X.java",
				"abstract class X<K,V> implements java.util.Map<K,V> {\n" +
				"    static abstract class M<K,V> implements Entry<K,V> {}\n" +
				"}\n"
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=70767 - NPE compiling code with explicit constructor invocation
	public void test0259() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<E> {\n" +
				"	\n" +
				"	<E> X(E e) {\n" +
				"		<E> this();\n" +
				"	}\n" +
				"	\n" +
				"	<E> X() {\n" +
				"	}\n" +
				"}\n"
			},
			"");
	}
	public void test0260() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <E> {\n" +
				"	class MX <F> {\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class XC<G> extends X<G> {\n" +
				"	class MXC<H> extends MX<H> {\n" +
				"	}\n" +
				"}\n"
			},
			"");
	}
	public void test0261() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <E> {\n" +
				"	void foo(){\n" +
				"		X<Integer> xi = (X<Integer>) new X<String>();\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	X<Integer> xi = (X<Integer>) new X<String>();\n" +
			"	                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Cannot cast from X<String> to X<Integer>\n" +
			"----------\n");
	}
	public void test0262() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <E,F> {\n" +
				"	void foo(){\n" +
				"		X<E,String> xe = (X<E,String>) new X<String,String>();\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	X<E,String> xe = (X<E,String>) new X<String,String>();\n" +
			"	                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from X<String,String> to X<E,String>\n" +
			"----------\n");
	}
	public void test0263() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <E,F> {\n" +
				"	void foo(){\n" +
				"		XC<E,String> xe = (XC<E,String>) new X<String,String>();\n" +
				"	}\n" +
				"}\n" +
				"class XC<G,H> extends X<G,H> {\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	XC<E,String> xe = (XC<E,String>) new X<String,String>();\n" +
			"	                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from X<String,String> to XC<E,String>\n" +
			"----------\n");
	}
	public void test0264() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <E,F> {\n" +
				"	void foo(){\n" +
				"		XC<E,String> xe = (XC<E,String>) new X<String,Integer>();\n" +
				"	}\n" +
				"}\n" +
				"class XC<G,H> extends X<G,H> {\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	XC<E,String> xe = (XC<E,String>) new X<String,Integer>();\n" +
			"	                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Cannot cast from X<String,Integer> to XC<E,String>\n" +
			"----------\n");
	}
	public void test0265() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <E> {\n" +
				"	<U> void foo(){\n" +
				"			XC<U> xcu = (XC<U>) new X<E>();\n" +
				"			XC<U> xcu1 = (XC<?>) new X<E>();			\n" +
				"			XC<?> xcu2 = (XC<? extends X>) new X<E>();						\n" +
				"	}\n" +
				"}\n" +
				"class XC<G> extends X<G> {\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	XC<U> xcu = (XC<U>) new X<E>();\n" +
			"	            ^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from X<E> to XC<U>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 4)\n" +
			"	XC<U> xcu1 = (XC<?>) new X<E>();			\n" +
			"	             ^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from XC<capture#1-of ?> to XC<U>\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 5)\n" +
			"	XC<?> xcu2 = (XC<? extends X>) new X<E>();						\n" +
			"	             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from X<E> to XC<? extends X>\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 5)\n" +
			"	XC<?> xcu2 = (XC<? extends X>) new X<E>();						\n" +
			"	                           ^\n" +
			"X is a raw type. References to generic type X<E> should be parameterized\n" +
			"----------\n");
	}
	public void test0266() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <E> {\n" +
				"	void bar() {\n" +
				"		X<? extends E> xe = new X<E>();\n" +
				"	}\n" +
				"}\n"
			},
			"");
	}
	public void test0267() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"	static void foo(X<?> xany) { \n" +
				"		System.out.println(\"SUCCESS\");\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		foo(new X<Object[]>());\n" +
				"	}\n" +
				"}\n"
			},
			"SUCCESS");
	}
	public void test0268() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.ArrayList;\n" +
				"public class X <T> {\n" +
				"	X[] foo() {\n" +
				"		ArrayList<X> list = new ArrayList();\n" +
				"		return list.toArray(new X[list.size()]);\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	X[] foo() {\n" +
			"	^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 4)\n" +
			"	ArrayList<X> list = new ArrayList();\n" +
			"	          ^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 4)\n" +
			"	ArrayList<X> list = new ArrayList();\n" +
			"	                    ^^^^^^^^^^^^^^^\n" +
			"Type safety: The expression of type ArrayList needs unchecked conversion to conform to ArrayList<X>\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 4)\n" +
			"	ArrayList<X> list = new ArrayList();\n" +
			"	                        ^^^^^^^^^\n" +
			"ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=70975 - test compilation against binary generic method
	public void test0269() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"\n" +
				"	<U> U[] bar(U[] u)  { \n" +
				"		System.out.println(\"SUCCESS\");\n" +
				"		return null; }\n" +
				"\n" +
				"	static String[] foo() {\n" +
				"		X<String> xs = new X<String>();\n" +
				"		return xs.bar(new String[0]);\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		foo();\n" +
				"	}\n" +
				"}\n",
			},
			"SUCCESS");

		this.runConformTest(
			new String[] {
				"Y.java",
				"public class Y {\n" +
				"    public static void main(String [] args) {\n" +
				"		X<String> xs = new X<String>();\n" +
				"		String[] s = xs.bar(new String[0]);\n" +
				"    }\n" +
				"}\n",
			},
			"SUCCESS",
			null,
			false, // do not flush output
			null);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=70969 - lub(List<String>, List<Object>) --> List<? extends Object>
	public void test0270() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.ArrayList;\n" +
				"\n" +
				"public class X {\n" +
				"    public void test(boolean param) {\n" +
				"        ArrayList<?> ls = (param) \n" +
				"        		? new ArrayList<String>()\n" +
				"        		: new ArrayList<Object>();\n" +
				"        		\n" +
				"        X x = param ? new XY() : new XZ();\n" +
				"        XY y = (XY) new XZ();\n" +
				"    }\n" +
				"}\n" +
				"class XY extends X {}\n" +
				"class XZ extends X {}\n"
			},

			"----------\n" +
			"1. ERROR in X.java (at line 10)\n" +
			"	XY y = (XY) new XZ();\n" +
			"	       ^^^^^^^^^^^^^\n" +
			"Cannot cast from XZ to XY\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=71080 - parameter bound <T extends Enum<T>> should be allowed
	public void test0271() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T extends Enum<T>> {\n" +
				"}\n"
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=71080 - variation
	public void test0272() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T extends XY<T>> {\n" +
				"}\n" +
				"\n" +
				"class XY<U extends Cloneable> implements Cloneable {\n" +
				"}\n"
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=71080 - variation
	public void test0273() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T extends XY<T> & Cloneable> {\n" +
				"}\n" +
				"\n" +
				"class XY<U extends Cloneable> {\n" +
				"}\n"
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=71241
	public void test0274() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.List;\n" +
				"public class X {\n" +
				"    public List useList(List l) {\n" +
				"        l.add(\"asdf\");\n" +
				"        return l;\n" +
				"    }\n" +
				"}\n" +
				"class Y extends X {\n" +
				"    public List<String> useList(List<String> l) {\n" +
				"        l.add(\"asdf\");\n" +
				"        return l;\n" +
				"    }\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	public List useList(List l) {\n" +
			"	       ^^^^\n" +
			"List is a raw type. References to generic type List<E> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 3)\n" +
			"	public List useList(List l) {\n" +
			"	                    ^^^^\n" +
			"List is a raw type. References to generic type List<E> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 4)\n" +
			"	l.add(\"asdf\");\n" +
			"	^^^^^^^^^^^^^\n" +
			"Type safety: The method add(Object) belongs to the raw type List. References to generic type List<E> should be parameterized\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 9)\n" +
			"	public List<String> useList(List<String> l) {\n" +
			"	                    ^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Name clash: The method useList(List<String>) of type Y has the same erasure as useList(List) of type X but does not override it\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=71241 - variation
	public void test0275() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.List;\n" +
				"public class X {\n" +
				"    public List<String> useList(List<String> l) {\n" +
				"        l.add(\"asdf\");\n" +
				"        return l;\n" +
				"    }\n" +
				"}\n" +
				"class Y extends X {\n" +
				"    public List useList(List l) {\n" +
				"        l.add(\"asdf\");\n" +
				"        return l;\n" +
				"    }\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 9)\n" +
			"	public List useList(List l) {\n" +
			"	       ^^^^\n" +
			"List is a raw type. References to generic type List<E> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 9)\n" +
			"	public List useList(List l) {\n" +
			"	       ^^^^\n" +
			"Type safety: The return type List for useList(List) from the type Y needs unchecked conversion to conform to List<String> from the type X\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 9)\n" +
			"	public List useList(List l) {\n" +
			"	            ^^^^^^^^^^^^^^^\n" +
			"The method useList(List) of type Y should be tagged with @Override since it actually overrides a superclass method\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 9)\n" +
			"	public List useList(List l) {\n" +
			"	                    ^^^^\n" +
			"List is a raw type. References to generic type List<E> should be parameterized\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 10)\n" +
			"	l.add(\"asdf\");\n" +
			"	^^^^^^^^^^^^^\n" +
			"Type safety: The method add(Object) belongs to the raw type List. References to generic type List<E> should be parameterized\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=71241 - variation
	public void test0276() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.List;\n" +
				"public class X {\n" +
				"    public void useList(List l) {}\n" +
				"}\n" +
				"class Y extends X {\n" +
				"    public void useList(List<String> l) {\n" +
				"		super.useList(l);\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	public void useList(List l) {}\n" +
			"	                    ^^^^\n" +
			"List is a raw type. References to generic type List<E> should be parameterized\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 6)\n" +
			"	public void useList(List<String> l) {\n" +
			"	            ^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Name clash: The method useList(List<String>) of type Y has the same erasure as useList(List) of type X but does not override it\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=71241 - variation
	public void test0277() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.List;\n" +
				"public class X {\n" +
				"    public void useList(List<String> l) {}\n" +
				"}\n" +
				"class Y extends X {\n" +
				"    public void useList(List l) {\n" +
				"		super.useList(l);\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 6)\n" +
			"	public void useList(List l) {\n" +
			"	            ^^^^^^^^^^^^^^^\n" +
			"The method useList(List) of type Y should be tagged with @Override since it actually overrides a superclass method\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 6)\n" +
			"	public void useList(List l) {\n" +
			"	                    ^^^^\n" +
			"List is a raw type. References to generic type List<E> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 7)\n" +
			"	super.useList(l);\n" +
			"	              ^\n" +
			"Type safety: The expression of type List needs unchecked conversion to conform to List<String>\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=71241 - variation
	public void test0278() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T> implements I {\n" +
				"    public Class<T> getDeclaringClass() { return null; }\n" +
				"}\n" +
				"class Y implements I {\n" +
				"    public Class<?> getDeclaringClass() { return null; }\n" +
				"}\n" +
				"interface I {\n" +
				"	public Class getDeclaringClass();\n" +
				"}\n"
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=69901
	public void test0279() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X implements ISomething {\n" +
				"    public Class getSomething() { return null; }\n" +
				"}\n" +
				"class Y {}\n" +
				"interface ISomething {\n" +
				"    public Class<? extends Y> getSomething();\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 2)\n" +
			"	public Class getSomething() { return null; }\n" +
			"	       ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 2)\n" +
			"	public Class getSomething() { return null; }\n" +
			"	       ^^^^^\n" +
			"Type safety: The return type Class for getSomething() from the type X needs unchecked conversion to conform to Class<? extends Y> from the type ISomething\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=62822
	public void test0280() {
		this.runConformTest(
			new String[] {
				"X.java",
				"interface X<T1 extends Y<T2>, T2 extends Z> {}\n" +
				"interface Y<T3 extends Z> {}\n" +
				"interface Z {}\n"
			},
			"");
	}
	public void test0281() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"interface X<T1 extends Y<T2>, T2 extends Z> {}\n" +
				"interface Y<T3 extends Comparable> {}\n" +
				"interface Z {}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 1)\n" +
			"	interface X<T1 extends Y<T2>, T2 extends Z> {}\n" +
			"	                         ^^\n" +
			"Bound mismatch: The type T2 is not a valid substitute for the bounded parameter <T3 extends Comparable> of the type Y<T3>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 2)\n" +
			"	interface Y<T3 extends Comparable> {}\n" +
			"	                       ^^^^^^^^^^\n" +
			"Comparable is a raw type. References to generic type Comparable<T> should be parameterized\n" +
			"----------\n");
	}
	public void test0282() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X extends Y.Member<String> {}\n" +
				"class Y { static class Member<T> {} }\n"
			},
			"");
		this.runConformTest(
			new String[] {
				"p1/X.java",
				"package p1;\n" +
				"public class X extends p1.Y.Member<String> {}\n" +
				"class Y { static class Member<T> {} }\n"
			},
			"");
	}
	public void test0283() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X extends Y.Missing<String> {}\n" +
				"class Y { static class Member<T> {} }\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 1)\n" +
			"	public class X extends Y.Missing<String> {}\n" +
			"	                       ^^^^^^^^^\n" +
			"Y.Missing cannot be resolved to a type\n" +
			"----------\n");
		this.runNegativeTest(
			new String[] {
				"p1/X.java",
				"package p1;\n" +
				"public class X extends Y.Missing<String> {}\n" +
				"class Y { static class Member<T> {} }\n"
			},
			"----------\n" +
			"1. ERROR in p1\\X.java (at line 2)\n" +
			"	public class X extends Y.Missing<String> {}\n" +
			"	                       ^^^^^^^^^\n" +
			"Y.Missing cannot be resolved to a type\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=72083
	public void test0284() {
		this.runConformTest(
			new String[] {
				"p1/A.java",
				"package p1;\n" +
				"public class A <T1 extends A<T1, T2>, T2 extends B<T1, T2>> {\n" +
				"    public static void main(String [] args) {\n" +
				"		System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n",
				"p1/B.java",
				"package p1;\n" +
				"public class B <T3 extends A<T3, T4>, T4 extends B<T3, T4>> {}\n"
			},
			"SUCCESS");
		this.runConformTest(
			new String[] {
				"p1/A.java",
				"package p1;\n" +
				"public class A <T1 extends B<T1, T2>, T2 extends A<T1, T2>> {\n" +
				"    public static void main(String [] args) {\n" +
				"		System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n",
				"p1/B.java",
				"package p1;\n" +
				"public class B <T3 extends B<T3, T4>, T4 extends A<T3, T4>> {}\n"
			},
			"SUCCESS");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=73530
	public void test0285() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.Vector;\n" +
				"public class X {\n" +
				"  public static void main(String[] args){\n" +
				"    Vector<Integer[]> v = new Vector<Integer[]>();\n" +
				"    Integer[] array1 = new Integer[5];\n" +
				"    array1[0] = new Integer(17);\n" +
				"    array1[1] = new Integer(42);\n" +
				"    v.add(array1);\n" +
				"    Integer twentyfour = v.get(0)[1];  // responsible for the crash\n" +
				"    System.out.println(twentyfour);\n" +
				"  }\n" +
				"}"
			},
			"42");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=72644
	// TODO (philippe) we need a way to test these 2 methods & find them 'equivalent'... right isEquivalentTo return false
	public void test0286() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	<T extends Object> T foo(Class<T> c) {return null;}\n" +
				"}\n" +
				"class Y extends X {\n" +
				"	<T extends Object> T foo(Class<T> c) {return null;}\n" +
				"}"
			},
			"");
	}
	public void test0287() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"\n" +
				"	public class A <U> {\n" +
				"		\n" +
				"		public class B <V> {\n" +
				"			\n" +
				"		}\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		\n" +
				"		X.A.B<String> bs;\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 11)\n" +
			"	X.A.B<String> bs;\n" +
			"	^^^^^\n" +
			"The member type X.A.B<String> must be qualified with a parameterized type, since it is not static\n" +
			"----------\n");
	}
	public void test0288() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"\n" +
				"	public static class A <U> {\n" +
				"		\n" +
				"		public static class B <V> {\n" +
				"			\n" +
				"		}\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		\n" +
				"		X.A.B<String> bs;\n" +
				"	}\n" +
				"}\n"
			},
			"");
	}
	public void test0289() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"\n" +
				"	public class A <U> {\n" +
				"		\n" +
				"		public class B <V> {\n" +
				"			\n" +
				"		}\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		\n" +
				"		X<String>.A.B<String> bs;\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 11)\n" +
			"	X<String>.A.B<String> bs;\n" +
			"	^^^^^^^^^^^\n" +
			"The member type X<String>.A must be parameterized, since it is qualified with a parameterized type\n" +
			"----------\n");
	}
	public void test0290() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"\n" +
				"	public static class A <U> {\n" +
				"		\n" +
				"		public class B <V> {\n" +
				"			\n" +
				"		}\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		\n" +
				"		X<String>.A.B<String> bs;\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 11)\n" +
			"	X<String>.A.B<String> bs;\n" +
			"	^^^^^^^^^^^\n" +
			"The member type X.A<U> cannot be qualified with a parameterized type, since it is static. Remove arguments from qualifying type X<String>\n" +
			"----------\n");
	}
	// ensure bound check deals with supertype (and their enclosing type)
	public void test0291() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T extends Iterable>{\n" +
				"	class MX<U extends Iterable> {\n" +
				"	}\n" +
				"}\n" +
				"class SX extends X<Thread>.MX<Object> {\n" +
				"	SX(X x){\n" +
				"		x.super();\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 1)\n" +
			"	public class X <T extends Iterable>{\n" +
			"	                          ^^^^^^^^\n" +
			"Iterable is a raw type. References to generic type Iterable<T> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 2)\n" +
			"	class MX<U extends Iterable> {\n" +
			"	                   ^^^^^^^^\n" +
			"Iterable is a raw type. References to generic type Iterable<T> should be parameterized\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 5)\n" +
			"	class SX extends X<Thread>.MX<Object> {\n" +
			"	                   ^^^^^^\n" +
			"Bound mismatch: The type Thread is not a valid substitute for the bounded parameter <T extends Iterable> of the type X<T>\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 5)\n" +
			"	class SX extends X<Thread>.MX<Object> {\n" +
			"	                              ^^^^^^\n" +
			"Bound mismatch: The type Object is not a valid substitute for the bounded parameter <U extends Iterable> of the type X<T>.MX<U>\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 6)\n" +
			"	SX(X x){\n" +
			"	   ^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n");
	}
	public void test0292() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"	class Y {\n" +
				"		class Z<U> {\n" +
				"		}\n" +
				"	}\n" +
				"    public static void main(String[] args) {\n" +
				"		X<Object>.Y.Z<Object> zo;\n" +
				"	}\n" +
				"}\n"
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=73837
	public void test0293() {
		this.runConformTest(
			new String[] {
				"B.java", //---------------------------
				"public class B<X>{\n"+
				"    public B(X str,D dValue){}\n"+
				"    public static void main(String [] args) {\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n"	,
				"D.java", //---------------------------
				"public class D<Y>{}\n",
			},
			"SUCCESS");

		this.runConformTest(
			new String[] {
				"C.java", //---------------------------
				"public class C<Z,Y> {\n" +
				"    public B<Z> test(Z zValue,D<Y> yValue){ return new B<Z>(zValue,yValue); }\n" +
				"    public static void main(String [] args) {\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n",
			},
			"SUCCESS",
			null,
			false, // do not flush output
			null);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=73837 variation
	public void test0294() {
		this.runConformTest(
			new String[] {
				"B.java", //---------------------------
				"public class B<X>{\n"+
				"    public B(X str, B<D> dValue){}\n"+
				"    public static void main(String [] args) {\n" +
				"        System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"}\n"	,
				"D.java", //---------------------------
				"public class D<Y>{}\n",
			},
			"SUCCESS");

		this.runNegativeTest(
			new String[] {
				"C.java", //---------------------------
				"public class C<Z,Y> {\n" +
				"    public B<Z> test(Z zValue,B<D<Y>> yValue){ return new B<Z>(zValue,yValue); }\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in C.java (at line 2)\n" +
			"	public B<Z> test(Z zValue,B<D<Y>> yValue){ return new B<Z>(zValue,yValue); }\n" +
			"	                                                  ^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"The constructor B<Z>(Z, B<D<Y>>) is undefined\n" +
			"----------\n",
			null,
			false, // do not flush output
			null);
	}
	// non-static method #start() gets its type substituted when accessed through raw type
	public void test0295() {
		this.runNegativeTest(
			new String[] {
				"C.java", //---------------------------
				"public class C<U> {\n" +
				"\n" +
				"	void bar() {\n" +
				"		new B().start().get(new B().start()).get(new B().start());\n" +
				"	}\n" +
				"}\n",
				"B.java", //---------------------------
				"public class B<X>{\n" +
				"	X get(B<X> bx) { return null; }\n" +
				"	B<B<D>> start() { return null; }\n" +
				"}",
				"D.java", //---------------------------
				"public class D<Y>{}\n",
			},
			"----------\n" +
			"1. WARNING in C.java (at line 4)\n" +
			"	new B().start().get(new B().start()).get(new B().start());\n" +
			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The method get(B) belongs to the raw type B. References to generic type B<X> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in C.java (at line 4)\n" +
			"	new B().start().get(new B().start()).get(new B().start());\n" +
			"	    ^\n" +
			"B is a raw type. References to generic type B<X> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in C.java (at line 4)\n" +
			"	new B().start().get(new B().start()).get(new B().start());\n" +
			"	                        ^\n" +
			"B is a raw type. References to generic type B<X> should be parameterized\n" +
			"----------\n" +
			"4. ERROR in C.java (at line 4)\n" +
			"	new B().start().get(new B().start()).get(new B().start());\n" +
			"	                                     ^^^\n" +
			"The method get(B) is undefined for the type Object\n" +
			"----------\n" +
			"5. WARNING in C.java (at line 4)\n" +
			"	new B().start().get(new B().start()).get(new B().start());\n" +
			"	                                             ^\n" +
			"B is a raw type. References to generic type B<X> should be parameterized\n" +
			"----------\n" +
			"----------\n" +
			"1. WARNING in B.java (at line 3)\n" +
			"	B<B<D>> start() { return null; }\n" +
			"	    ^\n" +
			"D is a raw type. References to generic type D<Y> should be parameterized\n" +
			"----------\n");
	}
	// static method #start() gets its type does not get substituted when accessed through raw type
	public void test0296() {
		this.runNegativeTest(
			new String[] {
				"C.java", //---------------------------
				"public class C<U> {\n" +
				"\n" +
				"	void bar() {\n" +
				"		new B().start().get(new B().start()).get(new B().start());\n" +
				"	}\n" +
				"}\n",
				"B.java", //---------------------------
				"public class B<X>{\n" +
				"	X get(B<X> bx) { return null; }\n" +
				"	static B<B<D>> start() { return null; }\n" +
				"}",
				"D.java", //---------------------------
				"public class D<Y>{}\n",
			},
			"----------\n" +
			"1. WARNING in C.java (at line 4)\n" +
			"	new B().start().get(new B().start()).get(new B().start());\n" +
			"	^^^^^^^^^^^^^^^\n" +
			"The static method start() from the type B should be accessed in a static way\n" +
			"----------\n" +
			"2. WARNING in C.java (at line 4)\n" +
			"	new B().start().get(new B().start()).get(new B().start());\n" +
			"	    ^\n" +
			"B is a raw type. References to generic type B<X> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in C.java (at line 4)\n" +
			"	new B().start().get(new B().start()).get(new B().start());\n" +
			"	                    ^^^^^^^^^^^^^^^\n" +
			"The static method start() from the type B should be accessed in a static way\n" +
			"----------\n" +
			"4. WARNING in C.java (at line 4)\n" +
			"	new B().start().get(new B().start()).get(new B().start());\n" +
			"	                        ^\n" +
			"B is a raw type. References to generic type B<X> should be parameterized\n" +
			"----------\n" +
			"5. ERROR in C.java (at line 4)\n" +
			"	new B().start().get(new B().start()).get(new B().start());\n" +
			"	                                     ^^^\n" +
			"The method get(B<D>) in the type B<D> is not applicable for the arguments (B<B<D>>)\n" +
			"----------\n" +
			"6. WARNING in C.java (at line 4)\n" +
			"	new B().start().get(new B().start()).get(new B().start());\n" +
			"	                                         ^^^^^^^^^^^^^^^\n" +
			"The static method start() from the type B should be accessed in a static way\n" +
			"----------\n" +
			"7. WARNING in C.java (at line 4)\n" +
			"	new B().start().get(new B().start()).get(new B().start());\n" +
			"	                                             ^\n" +
			"B is a raw type. References to generic type B<X> should be parameterized\n" +
			"----------\n" +
			"----------\n" +
			"1. WARNING in B.java (at line 3)\n" +
			"	static B<B<D>> start() { return null; }\n" +
			"	           ^\n" +
			"D is a raw type. References to generic type D<Y> should be parameterized\n" +
			"----------\n");
	}
	public void test0297() {
		this.runConformTest(
			new String[] {
				"X.java", //---------------------------
				"import java.util.HashMap;\n" +
				"import java.util.Iterator;\n" +
				"import java.util.Map;\n" +
				"\n" +
				"public class X {\n" +
				"		 public static void main(String[] args) {\n" +
				"		 		 Map<String, String> map = new HashMap<String, String>();\n" +
				"		 		 \n" +
				"		 		 map.put(\"foo\", \"bar\");\n" +
				"		 		 \n" +
				"		 		 // Error reported on the following line\n" +
				"		 		 Iterator<Map.Entry<String,String>> i = map.entrySet().iterator();\n" +
				"		 		 while (i.hasNext()) {\n" +
				"		 		 		 Map.Entry<String, String> entry = i.next();\n" +
				"		 		 		 System.out.println(entry.getKey() + \", \" + entry.getValue());\n" +
				"		 		 }\n" +
				"		 }\n" +
				"}\n",
			},
			"foo, bar");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=72644
	public void test0298() {
		this.runNegativeTest(
			new String[] {
				"X.java", //---------------------------
				"import java.util.Collection;\n" +
				"import java.util.Map;\n" +
				"import java.util.Set;\n" +
				"\n" +
				"public class X<V> implements Map<String, V> {\n" +
				"   private Map<String, V> backingMap;\n" +
				"   public int size() { return 0; }\n" +
				"   public boolean isEmpty() { return false; }\n" +
				"   public boolean containsKey(Object key) { return false; }\n" +
				"   public boolean containsValue(Object value) { return false; }\n" +
				"   public V get(Object key) { return null; }\n" +
				"   public V put(String key, V value) { return null; }\n" +
				"   public V remove(Object key) { return null; }\n" +
				"   public void clear() { }\n" +
				"   public Set<String> keySet() { return null; }\n" +
				"   public Collection<V> values() { return null; }\n" +
				"   public void putAll(Map<String, ? extends V> t) { }\n" +
				"   public Set<Map.Entry<String, V>> entrySet() {\n" +
				"      return this.backingMap.entrySet();\n" +
				"   }\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	public class X<V> implements Map<String, V> {\n" +
			"	             ^\n" +
			"The type X<V> must implement the inherited abstract method Map<String,V>.putAll(Map<? extends String,? extends V>)\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 17)\n" +
			"	public void putAll(Map<String, ? extends V> t) { }\n" +
			"	            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Name clash: The method putAll(Map<String,? extends V>) of type X<V> has the same erasure as putAll(Map<? extends K,? extends V>) of type Map<K,V> but does not override it\n" +
			"----------\n");
		this.runConformTest(
			new String[] {
				"X.java", //---------------------------
				"public abstract class X<S, V> implements java.util.Map<Object, Object> {\n" +
				"   public void putAll(java.util.Map<?, ?> t) { }\n" +
				"}\n",
			},
			"");
		this.runNegativeTest(
			new String[] {
				"X.java", //---------------------------
				"public abstract class X<S, V> implements java.util.Map<S, V> {\n" +
				"   public void putAll(java.util.Map<? extends String, ? extends V> t) { }\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	public void putAll(java.util.Map<? extends String, ? extends V> t) { }\n" +
			"	            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Name clash: The method putAll(Map<? extends String,? extends V>) of type X<S,V> has the same erasure as putAll(Map<? extends K,? extends V>) of type Map<K,V> but does not override it\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=74244
	public void test0299() {
		this.runConformTest(
			new String[] {
				"X.java", //---------------------------
				"public class X {\n" +
				" public static void main(String argv[]) {\n" +
				" 	System.out.println(Boolean.class == boolean.class ? \"FAILED\" : \"SUCCESS\");\n" +
				" }\n" +
				"}\n",
			},
			"SUCCESS");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=74119
	public void test0300() {
		this.runConformTest(
			new String[] {
				"X.java", //---------------------------
				"public class X {\n" +
				"    static interface I extends Visitible<I> {\n" +
				"    }\n" +
				"    static interface Visitible<T> {\n" +
				"        void acceptVisitor(Visitor<? super T> visitor);\n" +
				"    }\n" +
				"    static interface Visitor<T> {\n" +
				"        void visit(T t);\n" +
				"    }\n" +
				"    static class C implements I {\n" +
				"        public void acceptVisitor(Visitor<? super I> visitor) {\n" +
				"            visitor.visit(this); // should be ok\n" +
				"            visitor.visit((I) this); // (2) This is a workaround\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=74320: check no complaint for unused private method
	public void test0301() {
		this.runNegativeTest(
			new String[] {
				"X.java", //---------------------------
				"import java.util.List;\n" +
				"public class X {\n" +
				"	public static void reverse(List<?> list) { \n" +
				"		rev(list);\n" +
				"	}\n" +
				"	private static <T> void rev(List<T> list) {\n" +
				"	}\n" +
				"	Zork foo() {\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 8)\n" +
			"	Zork foo() {\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=74514
	public void test0302() {
		this.runNegativeTest(
			new String[] {
				"X.java", //---------------------------
				"import java.util.ArrayList;\n" +
				"import java.util.Enumeration;\n" +
				"import java.util.Iterator;\n" +
				"import java.util.List;\n" +
				"public class X {\n" +
				"	public void test02() {\n" +
				"		List<String> l= new ArrayList<String>();\n" +
				"		for (Iterator<String> i= l.iterator(); i.next(); ) {\n" +
				"		}\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 8)\n" +
			"	for (Iterator<String> i= l.iterator(); i.next(); ) {\n" +
			"	                                       ^^^^^^^^\n" +
			"Type mismatch: cannot convert from String to boolean\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=74544
	public void test0303() {
		this.runConformTest(
			new String[] {
				"X.java", //---------------------------
				"public  class X {\n" +
				"  	public static void main(String[] args) {\n" +
				"  		Y<String> ys = new Y<String>();\n" +
				"	    Y<String>.Member m = ys.new Member();\n" +
				"	    m.foo();\n" +
				"  	}    \n" +
				"  }\n" +
				"  class Y<T> {\n" +
				"    class Member {\n" +
				"    	void foo(){\n" +
				"    		System.out.println(\"SUCCESS\");\n" +
				"    	}\n" +
				"    }\n" +
				"  }\n" +
				"\n",
			},
			"SUCCESS");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=74592
	public void test0304() {
		this.runConformTest(
			new String[] {
				"X.java", //---------------------------
				"public class X<T extends Y> {}\n" +
				"class Y extends X {}"
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=74420
	public void test0305() {
		this.runConformTest(
			new String[] {
				"X.java", //---------------------------
				"public class X<T> {\n" +
				"  	T x;\n" +
				"  	<U extends T> T foo(U u) { return u; }\n" +
				"}\n"
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=74096
	public void test0306() {
		this.runNegativeTest(
			new String[] {
				"X.java", //---------------------------
				"public class X<T extends X<T>> {\n" +
				"  	static int CONSTANT = 1;\n" +
				"  	private int i = 1;\n" +
				"  	private int i() {return i;}\n" +
				"  	private static class M { private static int j = 2; }\n" +
				"  	public int foo(T t) { return t.i + t.i() + T.M.j; }\n" +
				"  	public int foo2(T t) { return T.CONSTANT; }\n" + // why is this allowed?
				"}\n" +
				"class Y extends Zork {\n" +
				"}\n"
			},
			this.complianceLevel <= ClassFileConstants.JDK1_6 ?
			"----------\n" +
			"1. WARNING in X.java (at line 6)\n" +
			"	public int foo(T t) { return t.i + t.i() + T.M.j; }\n" +
			"	                                               ^\n" +
			"Read access to enclosing field X.M.j is emulated by a synthetic accessor method\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 9)\n" +
			"	class Y extends Zork {\n" +
			"	                ^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n"
			// 5: operator + cannot be applied to int,<any>.j
			// 5: incompatible type, found : <nulltype>, required: int
			:
				
			// 1.7+ output, see https://bugs.eclipse.org/bugs/show_bug.cgi?id=334622
			"----------\n" + 
			"1. ERROR in X.java (at line 6)\n" + 
			"	public int foo(T t) { return t.i + t.i() + T.M.j; }\n" + 
			"	                               ^\n" + 
			"The field X<T>.i is not visible\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 6)\n" + 
			"	public int foo(T t) { return t.i + t.i() + T.M.j; }\n" + 
			"	                                     ^\n" + 
			"The method i() from the type X<T> is not visible\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 6)\n" + 
			"	public int foo(T t) { return t.i + t.i() + T.M.j; }\n" + 
			"	                                           ^^^\n" + 
			"The type T.M is not visible\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 9)\n" + 
			"	class Y extends Zork {\n" + 
			"	                ^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n"
		);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=72583
	public void test0307() {
		this.runConformTest(
			new String[] {
				"X.java", //---------------------------
				"public class X {\n" +
				"	static <T> T foo(T t1, T t2){ return t1; }\n" +
				"	public static void main(String[] args) {\n" +
				"		IX s = null;\n" +
				"		 foo(new Object(), s);\n" +
				"	}\n" +
				"}\n" +
				"interface IX {}\n"
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=73696
	public void test0308() {
		this.runConformTest(
			new String[] {
				"p/X.java",
				"package p;\n" +
					"public class X<T> {\n" +
					"	class Member {}\n" +
					"}\n",
				"p/Y.java",
				"package p;\n" +
					"public class Y {\n" +
					"	p.X.Member m;\n" +
					"	p.X<String>.Member ms = m;\n" +
					"}\n"
			});
	}
	public void test0309() {
		this.runConformTest(
			new String[] {
				"p/X.java",
				"package p;\n" +
					"public class X<T> {\n" +
					"	class Member {\n" +
					"		class Sub {}\n" +
					"	}\n" +
					"}\n",
				"p/Y.java",
				"package p;\n" +
					"public class Y {\n" +
					"	p.X.Member.Sub s;\n" +
					"	p.X<Exception>.Member.Sub es = s;\n" +
					"}\n"
			});
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=75156 - should report name clash
	public void test0310() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.List;\n" +
				"public class X extends X2 {\n" +
				"	void foo(List<X> lx) { }\n" +
				"}\n" +
				"\n" +
				"abstract class X2 {\n" +
				"	void foo(List<Object> lo) { }\n" +
				"}"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	void foo(List<X> lx) { }\n" +
			"	     ^^^^^^^^^^^^^^^\n" +
			"Name clash: The method foo(List<X>) of type X has the same erasure as foo(List<Object>) of type X2 but does not override it\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=75156 variation - should report name clash and ambiguity
	public void test0311() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.List;\n" +
				"public class X extends X2 {\n" +
				"	void foo(List<X> lx) { }\n" +
				"	void bar(){\n" +
				"		this.foo((List)null);\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"abstract class X2 {\n" +
				"	void foo(List<Object> lo) { }\n" +
				"}"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	void foo(List<X> lx) { }\n" +
			"	     ^^^^^^^^^^^^^^^\n" +
			"Name clash: The method foo(List<X>) of type X has the same erasure as foo(List<Object>) of type X2 but does not override it\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 5)\n" +
			"	this.foo((List)null);\n" +
			"	     ^^^\n" +
			"The method foo(List<X>) is ambiguous for the type X\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 5)\n" +
			"	this.foo((List)null);\n" +
			"	          ^^^^\n" +
			"List is a raw type. References to generic type List<E> should be parameterized\n" +
			"----------\n");
	}
	// 75156 variation - should report name clash instead of final method override
	public void test0312() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.List;\n" +
				"public class X extends X2 {\n" +
				"	void foo(List<X> lx) { }\n" +
				"}\n" +
				"\n" +
				"abstract class X2 {\n" +
				"	final void foo(List<Object> lo) { }\n" +
				"}"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	void foo(List<X> lx) { }\n" +
			"	     ^^^^^^^^^^^^^^^\n" +
			"Name clash: The method foo(List<X>) of type X has the same erasure as foo(List<Object>) of type X2 but does not override it\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=73963
	public void test0313() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.net.Inet6Address;\n" +
				"import java.net.InetAddress;\n" +
				"import java.util.AbstractList;\n" +
				"import java.util.ArrayList;\n" +
				"import java.util.List;\n" +
				"\n" +
				"public class X {\n" +
				"void takeAbstract(AbstractList<? extends InetAddress> arg) { }\n" +
				"\n" +
				"void takeList(List<? extends InetAddress> arg) { }\n" +
				"\n" +
				"void construct() {\n" +
				"	AbstractList<InetAddress> a= new ArrayList<InetAddress>();\n" +
				"	takeAbstract(a);\n" +
				"	takeAbstract(new ArrayList<InetAddress>()); // a inlined: error 1:\n" +
				"//The method takeAbstract(AbstractList<? extends InetAddress>) in the type A\n" +
				"// is not applicable for the arguments (ArrayList<InetAddress>)\n" +
				"	\n" +
				"	List<InetAddress> l= new ArrayList<InetAddress>();\n" +
				"	takeList(l);\n" +
				"	takeList(new ArrayList<InetAddress>()); // l inlined: ok\n" +
				"	\n" +
				"	ArrayList<? extends InetAddress> aw= new ArrayList<InetAddress>();\n" +
				"	takeAbstract(aw);\n" +
				"	takeAbstract(new ArrayList<Inet6Address>()); // aw inlined: error 2:\n" +
				"//The method takeAbstract(AbstractList<? extends InetAddress>) in the type A\n" +
				"// is not applicable for the arguments (ArrayList<Inet6Address>)\n" +
				"\n" +
				"	takeList(aw);\n" +
				"	takeList(new ArrayList<Inet6Address>()); //aw inlined: ok\n" +
				"}\n" +
				"}"
			},
			"");
	}
	public void test0314() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <E> {\n" +
				"	static class XMember<F> {}\n" +
				"\n" +
				"	// with toplevel element type\n" +
				"	void foo() {\n" +
				"		XIter<XElement<E>> iter = fooSet().iterator();\n" +
				"	}\n" +
				"	XSet<XElement<E>> fooSet()	 { return null; }\n" +
				"\n" +
				"	// with member element type\n" +
				"	void bar() {\n" +
				"		XIter<XMember<E>> iter = barSet().iterator();\n" +
				"	}\n" +
				"	XSet<XMember<E>> barSet()	 { return null; }\n" +
				"\n" +
				"	\n" +
				"}\n" +
				"\n" +
				"class XSet<G> {\n" +
				"	XIter<G> iterator() { return null; }\n" +
				"}\n" +
				"class XIter<H> {\n" +
				"}\n" +
				"class XElement<I> {\n" +
				"}\n"
			},
			"");
	}
	public void test0315() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <E> {\n" +
				"	static class XMember<F> {}\n" +
				"\n" +
				"	// with member element type\n" +
				"	void bar() {\n" +
				"		XIter<X.XMember<E>> iter = barSet().iterator();\n" +
				"	}\n" +
				"	XSet<XMember<E>> barSet()	 { return null; }\n" +
				"\n" +
				"	\n" +
				"}\n" +
				"\n" +
				"class XSet<G> {\n" +
				"	XIter<G> iterator() { return null; }\n" +
				"}\n" +
				"class XIter<H> {\n" +
				"}\n" +
				"class XElement<I> {\n" +
				"}\n"
			},
			"");
	}
	public void test0316() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.List;\n" +
				"\n" +
				"public class X <E extends List & Runnable> {\n" +
				"	\n" +
				"	E element() { return null; }\n" +
				"	\n" +
				"	void bar(X<E> xe) {\n" +
				"		xe.element().add(this);\n" +
				"		xe.element().run();\n" +
				"	}\n" +
				"	void foo(X<?> xe) {\n" +
				"		xe.element().add(this);\n" +
				"		xe.element().run();\n" +
				"	}\n" +
				"	void baz(X<? extends XM> xe) {\n" +
				"		xe.element().add(this);\n" +
				"		xe.element().run();\n" +
				"	}\n" +
				"	abstract class XM implements List, Runnable {}\n" +
				"  Zork z;\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	public class X <E extends List & Runnable> {\n" +
			"	                          ^^^^\n" +
			"List is a raw type. References to generic type List<E> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 8)\n" +
			"	xe.element().add(this);\n" +
			"	^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The method add(Object) belongs to the raw type List. References to generic type List<E> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 12)\n" +
			"	xe.element().add(this);\n" +
			"	^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The method add(Object) belongs to the raw type List. References to generic type List<E> should be parameterized\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 16)\n" +
			"	xe.element().add(this);\n" +
			"	^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The method add(Object) belongs to the raw type List. References to generic type List<E> should be parameterized\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 19)\n" +
			"	abstract class XM implements List, Runnable {}\n" +
			"	                             ^^^^\n" +
			"List is a raw type. References to generic type List<E> should be parameterized\n" +
			"----------\n" +
			"6. ERROR in X.java (at line 20)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}
	public void test0317() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.List;\n" +
				"\n" +
				"public class X <E extends List & Runnable> {\n" +
				"	\n" +
				"	E element() { return null; }\n" +
				"	\n" +
				"	void foo(X<? extends XI> xe) {\n" +
				"		xe.element().add(this);\n" +
				"		xe.element().run();\n" +
				"	}\n" +
				"	void baz(X<? extends XM> xe) {\n" +
				"		xe.element().add(this);\n" +
				"		xe.element().run();\n" +
				"	}\n" +
				"	interface XI extends Runnable {}\n" +
				"	\n" +
				"	class XM {\n" +
				"		void foo() {}\n" +
				"	}\n" +
				"  Zork z;\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	public class X <E extends List & Runnable> {\n" +
			"	                          ^^^^\n" +
			"List is a raw type. References to generic type List<E> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 8)\n" +
			"	xe.element().add(this);\n" +
			"	^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The method add(Object) belongs to the raw type List. References to generic type List<E> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 12)\n" +
			"	xe.element().add(this);\n" +
			"	^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The method add(Object) belongs to the raw type List. References to generic type List<E> should be parameterized\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 20)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=75548
	public void test0318() {
		this.runConformTest(
			new String[] {
				"MyCache.java",
				"class Cache<K, V> {\n" +
				"}\n" +
				"\n" +
				"class Index<K, V> {\n" +
				"  public Index(Cache<?, V> parentCache) {\n" +
				"  }\n" +
				"}\n" +
				"\n" +
				"public class MyCache extends Cache<Integer, String> {\n" +
				"  class AnIndex extends Index<String, String> {\n" +
				"    public AnIndex() {\n" +
				"      super(MyCache.this); // <-- Eclipse cannot find the constructor!\n" +
				"    }\n" +
				"  }\n" +
				"}\n"
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=76729
	public void test0319() {
		this.runConformTest(
			new String[] {
				"test/Test1.java",
				"package test;\n" +
				"\n" +
				"class A<BB extends B>\n" +
				"{}\n" +
				"\n" +
				"class B<AA extends A>\n" +
				"{}\n" +
				"\n" +
				"public interface Test1<C extends B<?>, D extends A<?>>\n" +
				"{}\n" +
				"\n" +
				"class AbstractA extends A<AbstractB> {};\n" +
				"class AbstractB extends B<AbstractA> {};\n" +
				"\n" +
				"class Test2<E extends AbstractB, F extends AbstractA> implements Test1<E, F>\n" +
				"{}"
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=74032
	public void test0320() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.ArrayList;\n" +
				"import java.util.List;\n" +
				"class TestElement extends ArrayList implements Runnable {\n" +
				"  public void run() {\n" +
				"  }\n" +
				"}\n" +
				"public class X <E extends List & Runnable> {\n" +
				"  public X(E element) {\n" +
				"    element.run();\n" +
				"  }\n" +
				"  public static void main(String[] args) {\n" +
				"    new X<TestElement>(new TestElement());\n" +
				"    System.out.println(\"SUCCESS\");\n" +
				"  }\n" +
				"}\n"
			},
			"SUCCESS");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=74032 - variation with wildcard
	public void test0321() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.ArrayList;\n" +
				"import java.util.List;\n" +
				"class TestElement extends ArrayList implements Runnable {\n" +
				"  static final long serialVersionUID = 1l;\n" +
				"  public void run() {\n" +
				"  	// empty\n" +
				"  }\n" +
				"}\n" +
				"public class X <E extends List & Runnable> {\n" +
				"	E element;\n" +
				"  public X(E element) {\n" +
				"  	this.element = element;\n" +
				"    element.run();\n" +
				"  }\n" +
				"  public X(X<?> x) {\n" +
				"    x.element.run();\n" + // should be able to bind to #run()
				"  }\n" +
				"  public static void main(String[] args) {\n" +
				"    new X<TestElement>(new TestElement());\n" +
				"    System.out.println(\"SUCCESS\");\n" +
				"  }\n" +
				"}\n"
			},
			"SUCCESS");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=75134
	public void test0322() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"public class X<A> {\n" +
				"\n" +
				"  A v2;\n" +
				"  X(A a) { v2 = a; }\n" +
				"  \n" +
				"  void func() {\n" +
				"    List<B<A>> l = new ArrayList<B<A>>();\n" +
				"  }\n" +
				"\n" +
				"  class B<T> {\n" +
				"    T v1;\n" +
				"    B(T b) {  v1 = b; }\n" +
				"  }\n" +
				"  \n" +
				"}\n"
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=76359 - also check warnings for raw conversion
	public void test0323() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"class G<T> {\n" +
				"	class Member {}\n" +
				"}\n" +
				"public class X {\n" +
				"	G<String> g = new G();\n" +
				"	G<String>.Member gsm = g.new Member();\n" +
				"	G.Member gm = null;\n" +
				"	G<Thread>.Member gtm = gm;\n" +
				"	Zork z;\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 5)\n" +
			"	G<String> g = new G();\n" +
			"	              ^^^^^^^\n" +
			"Type safety: The expression of type G needs unchecked conversion to conform to G<String>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 5)\n" +
			"	G<String> g = new G();\n" +
			"	                  ^\n" +
			"G is a raw type. References to generic type G<T> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 7)\n" +
			"	G.Member gm = null;\n" +
			"	^^^^^^^^\n" +
			"G.Member is a raw type. References to generic type G<T>.Member should be parameterized\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 8)\n" +
			"	G<Thread>.Member gtm = gm;\n" +
			"	                       ^^\n" +
			"Type safety: The expression of type G.Member needs unchecked conversion to conform to G<Thread>.Member\n" +
			"----------\n" +
			"5. ERROR in X.java (at line 9)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=72998
	public void test0324() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.Iterator;\n" +
				"import java.util.Set;\n" +
				"\n" +
				"public class X<E> {\n" +
				"   private TreeNode<E> root;\n" +
				"\n" +
				"   public void doSomething() {\n" +
				"      for (TreeNode<E> child : root.children()) {\n" +
				"         // root.children() should work??\n" +
				"      }\n" +
				"   }\n" +
				"\n" +
				"   public void doSomethingElse() {\n" +
				"      for (Iterator<TreeNode<E>> it = root.children().iterator(); it.hasNext();) {\n" +
				"         // this also should work\n" +
				"      }\n" +
				"   }\n" +
				"}\n" +
				"\n" +
				"class TreeNode<E> {\n" +
				"   private Set<TreeNode<E>> children;\n" +
				"   \n" +
				"   public Set<TreeNode<E>> children() {\n" +
				"      return children;\n" +
				"   }\n" +
				"}\n"
			},
			"");
	}
	public void test0325() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"	void foo1() {\n" +
				"		X<String>.Item<Thread> i = new X<Exception>().new Item<Thread>();\n" +
				"	}\n" +
				"	void foo2() {\n" +
				"		X<Exception>.Item<Thread> j = new X<Exception>.Item<Thread>();\n" + // allowed per grammar
				"	}\n" +
				"	void foo3() {\n" +
				"		X.Item k = new X.Item();\n" +
				"	}\n" +
				"	static void foo4() {\n" +
				"		X.Item k = new X.Item();\n" +
				"	}\n" +
				"	class Item <E> {}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	X<String>.Item<Thread> i = new X<Exception>().new Item<Thread>();\n" +
			"	                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from X<Exception>.Item<Thread> to X<String>.Item<Thread>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 6)\n" +
			"	X<Exception>.Item<Thread> j = new X<Exception>.Item<Thread>();\n" +
			"	                                  ^^^^^^^^^^^^^^^^^\n" +
			"Cannot allocate the member type X<Exception>.Item<Thread> using a parameterized compound name; use its simple name and an enclosing instance of type X<Exception>\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 9)\n" +
			"	X.Item k = new X.Item();\n" +
			"	^^^^^^\n" +
			"X.Item is a raw type. References to generic type X<T>.Item<E> should be parameterized\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 9)\n" +
			"	X.Item k = new X.Item();\n" +
			"	               ^^^^^^\n" +
			"X.Item is a raw type. References to generic type X<T>.Item<E> should be parameterized\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 12)\n" +
			"	X.Item k = new X.Item();\n" +
			"	^^^^^^\n" +
			"X.Item is a raw type. References to generic type X<T>.Item<E> should be parameterized\n" +
			"----------\n" +
			"6. ERROR in X.java (at line 12)\n" +
			"	X.Item k = new X.Item();\n" +
			"	           ^^^^^^^^^^^^\n" +
			"No enclosing instance of type X<T> is accessible. Must qualify the allocation with an enclosing instance of type X<T> (e.g. x.new A() where x is an instance of X<T>).\n" +
			"----------\n" +
			"7. WARNING in X.java (at line 12)\n" +
			"	X.Item k = new X.Item();\n" +
			"	               ^^^^^^\n" +
			"X.Item is a raw type. References to generic type X<T>.Item<E> should be parameterized\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=75400
	public void test0326() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T> implements I<T> {\n" +
				"    public I.A foo() {\n" +
				"        return a;\n" +
				"    }\n" +
				"}    \n" +
				"interface I<T> {\n" +
				"    A a = new A();\n" +
				"    class A {\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class XM<T> {\n" +
				"    A a = new A();\n" +
				"    class A {\n" +
				"    }\n" +
				"}	\n" +
				"\n" +
				"class XMSub<T> extends XM<T> {\n" +
				"    public XM.A foo() {\n" +
				"        return a;\n" +
				"    }\n" +
				"}    \n" +
				"\n"
			},
			"");
	}
	// wildcard captures bound and variable superinterfaces
	public void test0327() {
		this.runConformTest(
	 		// test directory preparation
			new String[] { /* test files */
				"X.java",
				"public class X<T extends IFoo> {\n" +
				"	\n" +
				"	T element() { return null; }\n" +
				"	void baz(X<? extends IBar> x) {\n" +
				"		x.element().foo();\n" +
				"		x.element().bar();\n" +
				"	}\n" +
				"}\n" +
				"interface IFoo {\n" +
				"	void foo();\n" +
				"}\n" +
				"interface IBar {\n" +
				"	void bar();\n" +
				"}\n"
			},
			// javac options
			JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
	}
	// wildcard captures bound and variable superinterfaces
	public void test0328() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T extends IFoo> {\n" +
				"	T element;\n" +
				"	X(T element) { \n" +
				"		this.element = element; \n" +
				"	}\n" +
				"	static void baz(X<? extends IBar> x) {\n" +
				"		x.element.foo();\n" +
				"		x.element.bar();\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		X<Foo> x1 = new X<Foo>(new Foo());\n" +
				"		baz(x1);\n" +
				"		X<Bar> x2 = new X<Bar>(new Bar());\n" +
				"		baz(x2);\n" +
				"		X<FooBar> x3 = new X<FooBar>(new FooBar());\n" +
				"		baz(x3);\n" +
				"	}\n" +
				"}\n" +
				"interface IFoo {\n" +
				"	void foo();\n" +
				"}\n" +
				"interface IBar {\n" +
				"	void bar();\n" +
				"}\n" +
				"class Foo implements IFoo {\n" +
				"	public void foo() {\n" +
				"		System.out.print(\"FOO\");\n" +
				"	}\n" +
				"}\n" +
				"class Bar implements IBar {\n" +
				"	public void bar() {\n" +
				"		System.out.print(\"BAR\");\n" +
				"	}\n" +
				"}\n" +
				"class FooBar extends Foo implements IBar {\n" +
				"	public void bar() {\n" +
				"		System.out.print(\"BAR\");\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 12)\n" +
			"	baz(x1);\n" +
			"	^^^\n" +
			"The method baz(X<? extends IBar>) in the type X<T> is not applicable for the arguments (X<Foo>)\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 13)\n" +
			"	X<Bar> x2 = new X<Bar>(new Bar());\n" +
			"	  ^^^\n" +
			"Bound mismatch: The type Bar is not a valid substitute for the bounded parameter <T extends IFoo> of the type X<T>\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 13)\n" +
			"	X<Bar> x2 = new X<Bar>(new Bar());\n" +
			"	                  ^^^\n" +
			"Bound mismatch: The type Bar is not a valid substitute for the bounded parameter <T extends IFoo> of the type X<T>\n" +
			"----------\n");
	}
	// wildcard captures bound and variable superinterfaces
	public void test0329() {
		this.runConformTest(
			// test directory preparation
			true /* flush output directory */,
			new String[] { /* test files */
				"X.java",
				"public class X<T extends IFoo> {\n" +
				"	T element;\n" +
				"	X(T element) { \n" +
				"		this.element = element; \n" +
				"	}\n" +
				"	static void baz(X<? extends IBar> x) {\n" +
				"		x.element.foo();\n" +
				"		x.element.bar();\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		X<FooBar> x3 = new X<FooBar>(new FooBar());\n" +
				"		baz(x3);\n" +
				"	}\n" +
				"}\n" +
				"interface IFoo {\n" +
				"	void foo();\n" +
				"}\n" +
				"interface IBar {\n" +
				"	void bar();\n" +
				"}\n" +
				"class FooBar implements IFoo, IBar {\n" +
				"	public void foo() {\n" +
				"		System.out.print(\"FOO\");\n" +
				"	}\n" +
				"	public void bar() {\n" +
				"		System.out.print(\"BAR\");\n" +
				"	}\n" +
				"}\n",
			},
			// compiler results
			null /* do not check compiler log */,
			// runtime results
			"FOOBAR" /* expected output string */,
			null /* do not check error string */,
			// javac options
			JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
	}
	// wildcard captures bound superclass and variable superclass
	public void test0330() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T extends Foo> {\n" +
				"	T element;\n" +
				"	X(T element) { \n" +
				"		this.element = element; \n" +
				"	}\n" +
				"	static void baz(X<? extends FooBar> x) {\n" +
				"		x.element.foo();\n" +
				"		x.element.bar();\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		X<FooBar> x3 = new X<FooBar>(new FooBar());\n" +
				"		baz(x3);\n" +
				"	}\n" +
				"}\n" +
				"interface IBar {\n" +
				"	void bar();\n" +
				"}\n" +
				"class Foo {\n" +
				"	public void foo() {\n" +
				"		System.out.print(\"FOO\");\n" +
				"	}\n" +
				"}\n" +
				"class FooBar extends Foo implements IBar {\n" +
				"	public void bar() {\n" +
				"		System.out.print(\"BAR\");\n" +
				"	}\n" +
				"}\n",
			},
			"FOOBAR");
	}
	// wildcard captures bound superclass and variable superclass
	public void test0331() {
		this.runConformTest(
			// test directory preparation
			true /* flush output directory */,
			new String[] { /* test files */
				"X.java",
				"public class X<T extends Foo> {\n" +
				"	T element;\n" +
				"	X(T element) { \n" +
				"		this.element = element; \n" +
				"	}\n" +
				"	static void baz(X<? extends IBar> x) {\n" +
				"		x.element.foo();\n" +
				"		x.element.bar();\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		X<FooBar> x3 = new X<FooBar>(new FooBar());\n" +
				"		baz(x3);\n" +
				"	}\n" +
				"}\n" +
				"interface IBar {\n" +
				"	void bar();\n" +
				"}\n" +
				"class Foo {\n" +
				"	public void foo() {\n" +
				"		System.out.print(\"FOO\");\n" +
				"	}\n" +
				"}\n" +
				"class FooBar extends Foo implements IBar {\n" +
				"	public void bar() {\n" +
				"		System.out.print(\"BAR\");\n" +
				"	}\n" +
				"}\n",
			},
			// compiler results
			null /* do not check compiler log */,
			// runtime results
			"FOOBAR" /* expected output string */,
			null /* do not check error string */,
			// javac options
			JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
	}
	// wildcard considers bound superclass or variable superclass
	public void test0332() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T extends Foo> {\n" +
				"	T element;\n" +
				"	X(T element) { \n" +
				"		this.element = element; \n" +
				"	}\n" +
				"	static void baz(X<? extends IBar> x) {\n" + // captures Foo & IBar
				"		x.element.foo();\n" +
				"		x.element.bar();\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		baz(new X<FooBar>(new FooBar()));\n" +
				"		baz(new X<Bar>(new Bar()));\n" +
				"	}\n" +
				"}\n" +
				"interface IBar {\n" +
				"	void bar();\n" +
				"}\n" +
				"\n" +
				"class Bar implements IBar {\n" +
				"	public void bar() {\n" +
				"		System.out.print(\"BAR\");\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class Foo {\n" +
				"	public void foo() {\n" +
				"		System.out.print(\"FOO\");\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class FooBar extends Foo implements IBar {\n" +
				"	public void bar() {\n" +
				"		System.out.print(\"BAR\");\n" +
				"	}\n" +
				"}\n"	,
			},
		"----------\n" +
		"1. ERROR in X.java (at line 12)\n" +
		"	baz(new X<Bar>(new Bar()));\n" +
		"	          ^^^\n" +
		"Bound mismatch: The type Bar is not a valid substitute for the bounded parameter <T extends Foo> of the type X<T>\n" +
		"----------\n");
	}
	// receveir generic cast matches receiver type (not declaring class)
	public void test0333() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"	T element;\n" +
				"	X(T element) { this.element = element; }\n" +
				"	T element() { return this.element; }\n" +
				"	public static void main(String[] args) {\n" +
				"		new X<XB>(new XB()).element().afoo();\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class XA {\n" +
				"	void afoo() {\n" +
				"		System.out.println(\"SUCCESS\");\n" +
				"   }\n" +
				"}\n" +
				"class XB extends XA {\n" +
				"	void bfoo() {}\n" +
				"}\n"	,
			},
		"SUCCESS");
	}
	// check cannot allocate type parameters
	public void test0334() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <E> {\n" +
				"  public X() {\n" +
				"  	new E();\n" +
				"  	new E() {\n" +
				"  		void perform() {\n" +
				"  			run();\n" +
				"  		}\n" +
				"  	}.perform();\n" +
				"  }\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	new E();\n" +
			"	    ^\n" +
			"Cannot instantiate the type E\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 4)\n" +
			"	new E() {\n" +
			"  		void perform() {\n" +
			"  			run();\n" +
			"  		}\n" +
			"  	}.perform();\n" +
			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Cannot refer to the type parameter E as a supertype\n" +
			"----------\n");
	}
	// variation - check cannot allocate type parameters
	public void test0335() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <E extends String> {\n" + // firstBound is class, still cannot be instantiated
				"  public X() {\n" +
				"  	new E();\n" +
				"  	new E() {\n" +
				"  		void perform() {\n" +
				"  			run();\n" +
				"  		}\n" +
				"  	}.perform();\n" +
				"  }\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 1)\n" +
			"	public class X <E extends String> {\n" +
			"	                          ^^^^^^\n" +
			"The type parameter E should not be bounded by the final type String. Final types cannot be further extended\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 3)\n" +
			"	new E();\n" +
			"	    ^\n" +
			"Cannot instantiate the type E\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 4)\n" +
			"	new E() {\n" +
			"  		void perform() {\n" +
			"  			run();\n" +
			"  		}\n" +
			"  	}.perform();\n" +
			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Cannot refer to the type parameter E as a supertype\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=74669
	public void test0336() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"interface IMyInterface {\n" +
				"}\n" +
				"class MyClass <Type> {\n" +
				"\n" +
				"	public <Type> Type myMethod(Object obj, Class type) {\n" +
				"		return null;\n" +
				"	}\n" +
				"	public static <Type> Type myStaticMethod(Object obj, Class type) {\n" +
				"		return null;\n" +
				"	}\n" +
				"}\n" +
				"public class X {\n" +
				"    public IMyInterface getThis() {\n" +
				"		if (true)\n" +
				"			return new MyClass().myMethod(this, IMyInterface.class);\n" +
				"		else\n" +
				"			return MyClass.myStaticMethod(this, IMyInterface.class);\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 5)\n" +
			"	public <Type> Type myMethod(Object obj, Class type) {\n" +
			"	        ^^^^\n" +
			"The type parameter Type is hiding the type Type\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 5)\n" +
			"	public <Type> Type myMethod(Object obj, Class type) {\n" +
			"	                                        ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 8)\n" +
			"	public static <Type> Type myStaticMethod(Object obj, Class type) {\n" +
			"	                                                     ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 15)\n" +
			"	return new MyClass().myMethod(this, IMyInterface.class);\n" +
			"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Object to IMyInterface\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 15)\n" +
			"	return new MyClass().myMethod(this, IMyInterface.class);\n" +
			"	           ^^^^^^^\n" +
			"MyClass is a raw type. References to generic type MyClass<Type> should be parameterized\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=77078
	public void test0337() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.Vector;\n" +
				"public class X {\n" +
				"    public void foo() {\n" +
				"        Vector<Object> objectVector = new Vector<Object>() {\n" +
				"            protected void bar() {\n" +
				"                baz(this); /* ERROR */\n" +
				"            }\n" +
				"        };\n" +
				"        baz(objectVector);\n" +
				"        baz(new Vector<Object>());\n" +
				"    }\n" +
				"    public void baz(Vector<?> mysteryVector) { }\n" +
				"}\n",
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=77052
	public void test0338() {
		this.runConformTest(
			new String[] {
				"X.java",
				"interface M<X> { }\n" +
				"\n" +
				"class N<C> { \n" +
				"  M<N<C>> pni = null;\n" +
				"}\n" +
				"\n" +
				"public class X<I> {\n" +
				"  N<I> var1 = null;\n" +
				"\n" +
				"  M<N<I>> var2 = var1.pni;\n" +
				"  // Above line reports as error in Eclipse. \n" +
				"  // \"var2\" is underlined and the error message is: \n" +
				"  // Type mismatch: cannot convert from M<N<C>> to M<N<I>>\n" +
				"}\n",
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=77052 - variation
	public void test0339() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.Iterator;\n" +
				"import java.util.Set;\n" +
				"\n" +
				"class X <K, V> {\n" +
				"	static class Entry<K, V> {}\n" +
				"	void foo() {\n" +
				"		Iterator<Entry<K,V>> i = entrySet().iterator();\n" +
				"	}\n" +
				"	Set<Entry<K,V>> entrySet()	 { return null; }\n" +
				"}\n",
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=76313
	public void test0340() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"	private T data;\n" +
				"	private X(T data){ this.data=data; }\n" +
				"	public static <S> X<S> createObject(S data){\n" +
				"		System.out.println(data);\n" +
				"		return new X<S>(data);\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		X<String> res=X.createObject(\"Hallo\");\n" +
				"	}\n" +
				"}\n",
			},
			"Hallo");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=77118
	public void test0341() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public Object getItem() { return null; }\n" +
				"}\n",
				"Y.java",
				"public class Y extends X {\n" +
				"	public String getItem() { return null; }\n" +
				"}\n",
				"Z.java",
				"public class Z extends X {\n" +
				"	public Comparable getItem() { return null; }\n" +
				"}\n",
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=77142 - check no raw unsafe warning is issued when accessing generic method from raw type
	public void test0342() {
		this.runNegativeTest(
			new String[] {
				"Test.java",
				"class MyClass<T> {\n" +
				"		 \n" +
				"		 private T thing;\n" +
				"       { Zork z; }\n" +
				"		 \n" +
				"		 public\n" +
				"		 MyClass(T thing) {\n" +
				"		 		 this.thing = thing;\n" +
				"		 }\n" +
				"		 \n" +
				"		 public static <U> MyClass<U>\n" +
				"		 factoryMakeMyClass(U thing)		 {\n" +
				"		 		 return new MyClass<U>(thing);\n" +
				"		 }\n" +
				"}\n" +
				"\n" +
				"class External {\n" +
				"\n" +
				"		 public static <U> MyClass<U>\n" +
				"		 factoryMakeMyClass(U thing)		 {\n" +
				"		 		 return new MyClass<U>(thing);\n" +
				"		 }\n" +
				"}\n" +
				"\n" +
				"public class Test {\n" +
				"		 public static void\n" +
				"		 test()\n" +
				"		 {\n" +
				"		 		 // No problem with this line:\n" +
				"		 		 MyClass<String> foo = External.factoryMakeMyClass(\"hi\");\n" +
				"		 		 \n" +
				"		 		 // This line gives me an error:\n" +
				"		 		 // Type mismatch: cannot convert from MyClass<Object> to MyClass<String>\n" +
				"		 		 MyClass<String> bar = MyClass.factoryMakeMyClass(\"hi\");\n" +
				"		 		 MyClass<String> bar2 = MyClass.<String>factoryMakeMyClass(\"hi\");\n" +
				"		 }\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in Test.java (at line 4)\n" +
			"	{ Zork z; }\n" +
			"	  ^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=74588
	public void test0343() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T extends Number> {\n" +
				"    T m;\n" +
				"\n" +
				"    class Y<T> {\n" +
				"        void test() {\n" +
				"            new Y<Integer>() {\n" +
				"                void test() {\n" +
				"                    System.out.println(X.this.m);\n" +
				"                }\n" +
				"            }.test();\n" +
				"        }\n" +
				"    }\n" +
				"}\n" +
				"\n",
			},
			"");
	}
	// checking scenario where generic type and method share the same type parameter name
	public void test0344() {
		if (this.complianceLevel < ClassFileConstants.JDK1_7) {
			this.runNegativeTest(
				new String[] {
					"X.java",
					"import java.io.IOException;\n" +
					"\n" +
					"public abstract class X<T extends Runnable> {\n" +
					"	\n" +
					"	public abstract <T extends Exception> T bar(T t);\n" +
					"\n" +
					"	static void foo(X x) {\n" +
					"		x.<Exception>bar(null);\n" +
					"		\n" +
					"		class R implements Runnable {\n" +
					"			public void run() {\n" +
					"			}\n" +
					"		}\n" +
					"		X<R> xr = new X<R>(){  \n" +
					"			public <T> T bar(T t) { \n" +
					"				return t; \n" +
					"			}\n" +
					"		};\n" +
					"		IOException e = xr.bar(new IOException());\n" +
					"	}\n" +
					"}\n"
				},
				"----------\n" + 
				"1. WARNING in X.java (at line 5)\n" + 
				"	public abstract <T extends Exception> T bar(T t);\n" + 
				"	                 ^\n" + 
				"The type parameter T is hiding the type T\n" + 
				"----------\n" + 
				"2. WARNING in X.java (at line 7)\n" + 
				"	static void foo(X x) {\n" + 
				"	                ^\n" + 
				"X is a raw type. References to generic type X<T> should be parameterized\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 8)\n" + 
				"	x.<Exception>bar(null);\n" + 
				"	             ^^^\n" + 
				"The method bar(Exception) of raw type X is no longer generic; it cannot be parameterized with arguments <Exception>\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 14)\n" + 
				"	X<R> xr = new X<R>(){  \n" + 
				"	              ^^^^^^\n" + 
				"The type new X<R>(){} must implement the inherited abstract method X<R>.bar(T)\n" + 
				"----------\n");
			return;
		}
		this.runNegativeTest(
				new String[] {
					"X.java",
					"import java.io.IOException;\n" +
					"\n" +
					"public abstract class X<T extends Runnable> {\n" +
					"	\n" +
					"	public abstract <T extends Exception> T bar(T t);\n" +
					"\n" +
					"	static void foo(X x) {\n" +
					"		x.<Exception>bar(null);\n" +
					"		\n" +
					"		class R implements Runnable {\n" +
					"			public void run() {\n" +
					"			}\n" +
					"		}\n" +
					"		X<R> xr = new X<R>(){  \n" +
					"			public <T> T bar(T t) { \n" +
					"				return t; \n" +
					"			}\n" +
					"		};\n" +
					"		IOException e = xr.bar(new IOException());\n" +
					"	}\n" +
					"}\n"
				},
				"----------\n" + 
				"1. WARNING in X.java (at line 5)\n" + 
				"	public abstract <T extends Exception> T bar(T t);\n" + 
				"	                 ^\n" + 
				"The type parameter T is hiding the type T\n" + 
				"----------\n" + 
				"2. WARNING in X.java (at line 7)\n" + 
				"	static void foo(X x) {\n" + 
				"	                ^\n" + 
				"X is a raw type. References to generic type X<T> should be parameterized\n" + 
				"----------\n" + 
				"3. WARNING in X.java (at line 8)\n" + 
				"	x.<Exception>bar(null);\n" + 
				"	^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Type safety: The method bar(Exception) belongs to the raw type X. References to generic type X<T> should be parameterized\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 14)\n" + 
				"	X<R> xr = new X<R>(){  \n" + 
				"	              ^^^^^^\n" + 
				"The type new X<R>(){} must implement the inherited abstract method X<R>.bar(T)\n" + 
				"----------\n");		
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=74594
	public void test0345() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public static void main(String argv[]) {\n" +
				"       X1<Integer> o1 = new X1<Integer>();\n" +
				"        ((J<Integer>)o1).get();\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class X1<T> implements I<T> {\n" +
				"    public X1 get() {\n" +
				"    	System.out.println(\"SUCCESS\");\n" +
				"        return this;\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"interface I<T> extends J<T> {\n" +
				"    I get();\n" +
				"}\n" +
				"\n" +
				"interface J<T>  {\n" +
				"    J get();\n" +
				"}",
			},
			"SUCCESS");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=74594
	public void test0346() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public static void main(String argv[]) {\n" +
				"       X1<Integer> o1 = new X1<Integer>(new Integer(4));\n" +
				"        System.out.println(o1.get().t);\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class X1<T> implements I<T> {\n" +
				"    T t;\n" +
				"    X1(T arg) {\n" +
				"        t = arg;\n" +
				"    }\n" +
				"    public X1 get() {\n" +
				"        return this;\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"interface I<T> extends J<T> {\n" +
				"    I get();\n" +
				"}\n" +
				"\n" +
				"interface J<T>  {\n" +
				"    J get();\n" +
				"}"
	,
			},
			"4");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=74594
	public void test0347() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public static void main(String argv[]) {\n" +
				"        X1<Integer> o = new X1<Integer>(new Integer(4));\n" +
				"        System.out.println(o.get().t);\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class X1<T> implements I<T> {\n" +
				"    T t;\n" +
				"    X1(T arg) {\n" +
				"        t = arg;\n" +
				"    }\n" +
				"    public X1 get() {\n" +
				"        return this;\n" +
				"    }\n" +
				"}    \n" +
				"\n" +
				"interface I<T> extends K<T>, L<T> {\n" +
				"    I get();\n" +
				"}\n" +
				"\n" +
				"interface J<T>  {\n" +
				"    J get();\n" +
				"}\n" +
				"\n" +
				"interface K<T> extends J<T> {\n" +
				"}\n" +
				"\n" +
				"interface L<T>  {\n" +
				"    K get();\n" +
				"}",
			},
			"4");
	}
	// checking scenario where generic type and method share the same type parameter name
	public void test0348() {
		if (this.complianceLevel < ClassFileConstants.JDK1_7) {
			this.runNegativeTest(
				new String[] {
					"X.java",
					"import java.io.IOException;\n" +
					"public abstract class X<T extends Runnable> {\n" +
					"	public abstract <T extends Exception> T bar(T t);\n" +
					"	static void foo(X x) {\n" +
					"		x.<Exception>bar(null);\n" +
					"		class R implements Runnable {\n" +
					"			public void run() {}\n" +
					"		}\n" +
					"		X<R> xr = new X<R>(){  \n" +
					"			public <T extends Exception> T bar(T t) { return t; }\n" +
					"		};\n" +
					"		IOException e = xr.bar(new IOException());\n" +
					"	}\n" +
					"}\n"
				},
				"----------\n" +
				"1. WARNING in X.java (at line 3)\n" +
				"	public abstract <T extends Exception> T bar(T t);\n" +
				"	                 ^\n" +
				"The type parameter T is hiding the type T\n" +
				"----------\n" +
				"2. WARNING in X.java (at line 4)\n" +
				"	static void foo(X x) {\n" +
				"	                ^\n" +
				"X is a raw type. References to generic type X<T> should be parameterized\n" +
				"----------\n" +
				"3. ERROR in X.java (at line 5)\n" +
				"	x.<Exception>bar(null);\n" +
				"	             ^^^\n" +
				"The method bar(Exception) of raw type X is no longer generic; it cannot be parameterized with arguments <Exception>\n" +
				"----------\n" +
				"4. WARNING in X.java (at line 10)\n" +
				"	public <T extends Exception> T bar(T t) { return t; }\n" +
				"	                               ^^^^^^^^\n" +
				"The method bar(T) of type new X<R>(){} should be tagged with @Override since it actually overrides a superclass method\n" +
				"----------\n",
				JavacTestOptions.EclipseHasABug.EclipseBug236242);
			return;
		}
		this.runNegativeTest(
				new String[] {
					"X.java",
					"import java.io.IOException;\n" +
					"public abstract class X<T extends Runnable> {\n" +
					"	public abstract <T extends Exception> T bar(T t);\n" +
					"	static void foo(X x) {\n" +
					"		x.<Exception>bar(null);\n" +
					"		class R implements Runnable {\n" +
					"			public void run() { zork = 0; }\n" +
					"		}\n" +
					"		X<R> xr = new X<R>(){  \n" +
					"			public <T extends Exception> T bar(T t) { return t; }\n" +
					"		};\n" +
					"		IOException e = xr.bar(new IOException());\n" +
					"	}\n" +
					"}\n"
				},
				"----------\n" + 
				"1. WARNING in X.java (at line 3)\n" + 
				"	public abstract <T extends Exception> T bar(T t);\n" + 
				"	                 ^\n" + 
				"The type parameter T is hiding the type T\n" + 
				"----------\n" + 
				"2. WARNING in X.java (at line 4)\n" + 
				"	static void foo(X x) {\n" + 
				"	                ^\n" + 
				"X is a raw type. References to generic type X<T> should be parameterized\n" + 
				"----------\n" + 
				"3. WARNING in X.java (at line 5)\n" + 
				"	x.<Exception>bar(null);\n" + 
				"	^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Type safety: The method bar(Exception) belongs to the raw type X. References to generic type X<T> should be parameterized\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 7)\n" + 
				"	public void run() { zork = 0; }\n" + 
				"	                    ^^^^\n" + 
				"zork cannot be resolved to a variable\n" + 
				"----------\n" + 
				"5. WARNING in X.java (at line 10)\n" + 
				"	public <T extends Exception> T bar(T t) { return t; }\n" + 
				"	                               ^^^^^^^^\n" + 
				"The method bar(T) of type new X<R>(){} should be tagged with @Override since it actually overrides a superclass method\n" + 
				"----------\n",
				JavacTestOptions.EclipseHasABug.EclipseBug236242);		
	}
	// test wildcard compatibilities
	public void test0349() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"	T element;\n" +
				"	static void foo(X<? super Exception> out, X1<? extends Exception> in) {\n" +
				"		out.element = in.element;\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		System.out.println(\"SUCCESS\");\n" +
				"	}\n" +
				"}\n" +
				"class X1<U>{\n" +
				"	U element;\n" +
				"}\n",
			},
			"SUCCESS");
	}
	// test wildcard compatibilities
	public void test0350() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"	T element;\n" +
				"	static void foo(X<?> out, X1<?> in) {\n" +
				"		out.element = in.element;\n" +
				"	}\n" +
				"}\n" +
				"class X1<U>{\n" +
				"	U element;\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	out.element = in.element;\n" +
			"	              ^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from capture#2-of ? to capture#1-of ?\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=75328
	public void test0351() {
		this.runConformTest(
			new String[] {
				"X.java",
				"interface Intf<D extends Comparable<D>, I extends Comparable<D>> { \n" +
				"  public void f(Intf<D,?> val);\n" +
				"}\n" +
				"\n" +
				"public class X <M extends Comparable<M>, P extends Comparable<M>>  implements Intf<M,P> {\n" +
				"\n" +
				"  public void f(Intf<M,?> val) { } \n" +
				"}\n",
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=77051
	public void test0352() {
		this.runConformTest(
			new String[] {
				"X.java",
				"interface C<A> { }\n" +
				"interface PC<X> extends C<X> { } \n" +
				"interface PO<Y>  {  \n" +
				"	  C<Y> proc1();\n" +
				"	  C<? super Y> proc2();\n" +
				"	  C<? extends Y> proc3();\n" +
				"}\n" +
				"abstract class X<Z> implements PO<Z> {\n" +
				"	  public C<Z> proc1() { return result1; }\n" +
				"	  private final PC<Z> result1 = null;\n" +
				"	  public C<? super Z> proc2() { return result2; }\n" +
				"	  private final PC<? super Z> result2 = null;\n" +
				"	  public C<? extends Z> proc3() { return result3; }\n" +
				"	  private final PC<? extends Z> result3 = null;\n" +
				"}\n",
			},
			"");
	}
	public void test0353() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X extends Y {\n" +
				"	<T> T foo(Class<T> c) { return null; }\n" +
				"}\n" +
				"class Y {\n" +
				"	<T> T foo(Class<T> c) { return null; }\n" +
				"}"
			},
			"");
	}
	public void test0354() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X extends Y {\n" +
				"	<T, S> S foo(Class<T> c) { return null; }\n" +
				"}\n" +
				"class Y {\n" +
				"	<S, T> T foo(Class<S> c) { return null; }\n" +
				"}"
			},
			"");
	}
	public void test0355() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X extends Y {\n" +
				"	<T, S> S foo(Class<S> c) { return null; }\n" +
				"}\n" +
				"class Y {\n" +
				"	<S, T> S foo(Class<S> c) { return null; }\n" +
				"}"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	<T, S> S foo(Class<S> c) { return null; }\n" +
			"	         ^^^^^^^^^^^^^^^\n" +
			"Name clash: The method foo(Class<S>) of type X has the same erasure as foo(Class<S>) of type Y but does not override it\n" +
			"----------\n");
	}
	public void test0356() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X extends Y {\n" +
				"	<T, S> T foo(Class<T> c) { return null; }\n" +
				"}\n" +
				"class Y {\n" +
				"	<T> T foo(Class<T> c) { return null; }\n" +
				"}"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	<T, S> T foo(Class<T> c) { return null; }\n" +
			"	         ^^^^^^^^^^^^^^^\n" +
			"Name clash: The method foo(Class<T>) of type X has the same erasure as foo(Class<T>) of type Y but does not override it\n" +
			"----------\n");
	}
	public void test0357() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X extends Y {\n" +
				"	<T> T foo(Class<T> c) { return null; }\n" +
				"}\n" +
				"class Y {\n" +
				"	<T, S> T foo(Class<T> c) { return null; }\n" +
				"}"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	<T> T foo(Class<T> c) { return null; }\n" +
			"	      ^^^^^^^^^^^^^^^\n" +
			"Name clash: The method foo(Class<T>) of type X has the same erasure as foo(Class<T>) of type Y but does not override it\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=76720
	public void test0358() {
		this.runConformTest(
			new String[] {
				"MyClass.java",
				"public class MyClass {}\n",
				"A.java",
				"public interface A<M extends MyClass> {}\n",
				"B.java",
				"public interface B<M extends MyClass> extends A<M> {}\n",
				"C.java",
				"public class C implements B<MyClass> {}\n", // compile against sources
				"D.java",
				"public class D implements A<MyClass>{}\n", // compile against sources
			},
			"");
		// compile against generated binaries
		this.runConformTest(
			new String[] {
				"C.java",
				"public class C implements B<MyClass> {}\n",
				"D.java",
				"public class D implements A<MyClass>{}\n",
			},
			"",
			null,
			false,
			null);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=76790
	public void test0359() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
					"public class X {\n" +
					"    class List1<E> extends LinkedList<E> {};\n" +
					"    public static void main (String[] args) {\n" +
					"        Map<String, List<Integer>> x = new HashMap<String, List<Integer>>();\n" +
					"        Map<String, List1<Integer>> m = new HashMap<String, List1<Integer>>();\n" +
					"    }\n" +
					"}"
			}
		);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=76786
	public void test0360() {
		this.runConformTest(
			new String[] {
				"Test.java",
				"import java.lang.Comparable;\n" +
					"public class Test {\n" +
					"    private static final class X<T1, T2> implements Comparable<X<T1, T2>> {\n" +
					"        public int compareTo(X<T1, T2> arg0) { return 0; }\n" +
					"    };\n" +
					"    private static class Y<T1, T2> {};\n" +
					"    private static final class Z<T1, T2> extends Y<T1, T2> implements Comparable<Z<T1, T2>> {\n" +
					"        public int compareTo(Z<T1, T2> arg0) { return 0; }\n" +
					"    };\n" +
					"    public static <T> void doSomething(Comparable<? super T> a, Comparable<? super T> b) {}\n" +
					"    public static <V1, V2> void doSomethingElse(Z<V1, V2> a, Z<V1, V2> b) {\n" +
					"        doSomething(a, b);\n" +
					"    }\n" +
					"    private static final class W { };\n" +
					"    public static void main(String[] args) {\n" +
					"        doSomething(new X<Integer, String>(), new X<Integer, String>());\n" +
					"        doSomething(new Z<Integer, String>(), new Z<Integer, String>());\n" +
					"        doSomethingElse(new Z<Integer, String>(), new Z<Integer, String>());\n" +
					"        doSomethingElse(new Z<W, String>(), new Z<W, String>());\n" +
					"        // The next line won\'t compile.  It\'s the generic<generic which seems\n" +
					"        // to be the problem\n" +
					"        doSomethingElse(new Z<X<W, W>, String>(), new Z<X<W, W>, String>());\n" +
					"    }\n" +
					"}"
			}
		);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=75525
	public void test0361() {
		this.runConformTest(
			new String[] {
				"Test.java",
				"import java.util.AbstractSet;\n" +
					"import java.util.Iterator;\n" +
					"import java.util.Map.Entry;\n" +
					"public class Test extends AbstractSet<Entry<String,Integer>> {\n" +
					"	public Iterator<Entry<String, Integer>> iterator() {\n" +
					"		return new Iterator<Entry<String,Integer>>() {\n" +
					"			public boolean hasNext() {return false;}\n" +
					"			public Entry<String, Integer> next() {return null;}\n" +
					"			public void remove() {}	\n" +
					"		};\n" +
					"	}\n" +
					"	public int size() {return 0;}\n" +
					"}"
			}
		);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=72643
	public void test0362() {
		Map customOptions= getCompilerOptions();
		customOptions.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.ERROR);
		this.runConformTest(
			new String[] {
				"Test.java",
				"import java.util.ArrayList;\n" +
					"import java.util.List;\n" +
					"public class Test {\n" +
					"   public void a() {\n" +
					"      List<String> list1 = new ArrayList<String>();\n" +
					"      List<String> list2 = new ArrayList<String>();\n" +
					"      compare(list1, list2);\n" +
					"   }\n" +
					"   private <E> void compare(List<E> list1, List<E> list2) {\n" +
					"      // do some comparing logic...\n" +
					"   }\n" +
					"}\n" +
					"\n"
			},
		"",
		null,
		true,
		null,
		customOptions,
		null/*no custom requestor*/);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=76434
	public void test0363() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.Map;\n" +
				"import java.util.Set;\n" +
				"public class X {\n" +
				"  Set<Map.Entry<Integer, ?>> m_values;\n" +
				"  X(Map<Integer, ?> values) {\n" +
				"    m_values = values.entrySet();\n" +
				"  }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	m_values = values.entrySet();\n" +
			"	           ^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Set<Map.Entry<Integer,capture#1-of ?>> to Set<Map.Entry<Integer,?>>\n" +
			"----------\n");
	}
	// check param type equivalences
	public void test0364() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X { \n" +
				"	\n" +
				"	void bar1(MX<Class<? extends String>> mxcs, MX<Class<? extends Object>> mxco) {\n" +
				"		mxco = mxcs;\n" + // wrong
				"	}\n" +
				"	void bar1(Class<? extends String> cs, Class<? extends Object> co) {\n" +
				"		co = cs;\n" + // ok
				"	}\n" +
				"	\n" +
				"}\n" +
				"class MX<E> {\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	mxco = mxcs;\n" +
			"	       ^^^^\n" +
			"Type mismatch: cannot convert from MX<Class<? extends String>> to MX<Class<? extends Object>>\n" +
			"----------\n");
	}
	// check param type equivalences
	public void test0365() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T extends Runnable> {\n" +
				"	\n" +
				"	class MX <U> {\n" +
				"	}\n" +
				"	\n" +
				"	MX<T> createMX() { return new MX<T>(); }\n" +
				"\n" +
				"	void foo(X<?> x, MX<?> mx) {\n" +
				"		mx = x.createMX();\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 9)\n" +
			"	mx = x.createMX();\n" +
			"	     ^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from X<capture#2-of ?>.MX<capture#2-of ?> to X<T>.MX<?>\n" +
			"----------\n");
	}
	// check param type equivalences
	public void test0366() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X { \n" +
				"	\n" +
				"	void foo1(MX<Class<? extends Object>> target, MX<Class> value) {\n" +
				"		target= value; // foo1 - wrong\n" +
				"	}\n" +
				"	void foo2(MX<Class<? extends Object>> target, MX<Class<? extends String>> value) {\n" +
				"		target= value; // foo2 - wrong\n" +
				"	}\n" +
				"	void foo3(MX<Class<? extends Object>> target, MX<Class<? extends String>> value) {\n" +
				"		target= value; // foo3 - wrong\n" +
				"	}\n" +
				"	void foo4(MX<Class<? extends Object>> target, MX<Class<String>> value) {\n" +
				"		target= value; // foo4 - wrong\n" +
				"	}\n" +
				"	void foo5(MX<? extends Class> target, MX<Class> value) {\n" +
				"		target= value; // foo5\n" +
				"	}\n" +
				"	void foo6(MX<? super Class> target, MX<Class> value) {\n" +
				"		target= value; // foo6\n" +
				"	}\n" +
				"	void foo7(MX<Class<? extends Class>> target, MX<Class<Class>> value) {\n" +
				"		target= value; // foo7 - wrong\n" +
				"	}\n" +
				"	void foo8(MX<MX<? extends Class>> target, MX<MX<Class>> value) {\n" +
				"		target= value; // foo8 - wrong\n" +
				"	}\n" +
				"	void foo9(MX<? extends Object> target, MX<? extends String> value) {\n" +
				"		target= value; // foo9\n" +
				"	}\n" +
				"	void foo10(MX<? extends String> target, MX<? extends Object> value) {\n" +
				"		target= value; // foo10 - wrong\n" +
				"	}\n" +
				"	void foo11(MX<? super Object> target, MX<? super String> value) {\n" +
				"		target= value; // foo11 - wrong\n" +
				"	}\n" +
				"	void foo12(MX<? super String> target, MX<? super Object> value) {\n" +
				"		target= value; // foo12\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class MX<E> {\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	void foo1(MX<Class<? extends Object>> target, MX<Class> value) {\n" +
			"	                                                 ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 4)\n" +
			"	target= value; // foo1 - wrong\n" +
			"	        ^^^^^\n" +
			"Type mismatch: cannot convert from MX<Class> to MX<Class<? extends Object>>\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 7)\n" +
			"	target= value; // foo2 - wrong\n" +
			"	        ^^^^^\n" +
			"Type mismatch: cannot convert from MX<Class<? extends String>> to MX<Class<? extends Object>>\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 10)\n" +
			"	target= value; // foo3 - wrong\n" +
			"	        ^^^^^\n" +
			"Type mismatch: cannot convert from MX<Class<? extends String>> to MX<Class<? extends Object>>\n" +
			"----------\n" +
			"5. ERROR in X.java (at line 13)\n" +
			"	target= value; // foo4 - wrong\n" +
			"	        ^^^^^\n" +
			"Type mismatch: cannot convert from MX<Class<String>> to MX<Class<? extends Object>>\n" +
			"----------\n" +
			"6. WARNING in X.java (at line 15)\n" +
			"	void foo5(MX<? extends Class> target, MX<Class> value) {\n" +
			"	                       ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"7. WARNING in X.java (at line 15)\n" +
			"	void foo5(MX<? extends Class> target, MX<Class> value) {\n" +
			"	                                         ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"8. WARNING in X.java (at line 18)\n" +
			"	void foo6(MX<? super Class> target, MX<Class> value) {\n" +
			"	                     ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"9. WARNING in X.java (at line 18)\n" +
			"	void foo6(MX<? super Class> target, MX<Class> value) {\n" +
			"	                                       ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"10. WARNING in X.java (at line 21)\n" +
			"	void foo7(MX<Class<? extends Class>> target, MX<Class<Class>> value) {\n" +
			"	                             ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"11. WARNING in X.java (at line 21)\n" +
			"	void foo7(MX<Class<? extends Class>> target, MX<Class<Class>> value) {\n" +
			"	                                                      ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"12. ERROR in X.java (at line 22)\n" +
			"	target= value; // foo7 - wrong\n" +
			"	        ^^^^^\n" +
			"Type mismatch: cannot convert from MX<Class<Class>> to MX<Class<? extends Class>>\n" +
			"----------\n" +
			"13. WARNING in X.java (at line 24)\n" +
			"	void foo8(MX<MX<? extends Class>> target, MX<MX<Class>> value) {\n" +
			"	                          ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"14. WARNING in X.java (at line 24)\n" +
			"	void foo8(MX<MX<? extends Class>> target, MX<MX<Class>> value) {\n" +
			"	                                                ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"15. ERROR in X.java (at line 25)\n" +
			"	target= value; // foo8 - wrong\n" +
			"	        ^^^^^\n" +
			"Type mismatch: cannot convert from MX<MX<Class>> to MX<MX<? extends Class>>\n" +
			"----------\n" +
			"16. ERROR in X.java (at line 31)\n" +
			"	target= value; // foo10 - wrong\n" +
			"	        ^^^^^\n" +
			"Type mismatch: cannot convert from MX<capture#6-of ? extends Object> to MX<? extends String>\n" +
			"----------\n" +
			"17. ERROR in X.java (at line 34)\n" +
			"	target= value; // foo11 - wrong\n" +
			"	        ^^^^^\n" +
			"Type mismatch: cannot convert from MX<capture#7-of ? super String> to MX<? super Object>\n" +
			"----------\n");
	}
	// check param type equivalences
	public void test0367() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X { \n" +
				"	\n" +
				"	void foo1(MX<? extends MX> target, MX<MX<String>> value) {\n" +
				"		target= value; // foo1\n" +
				"	}\n" +
				"	void foo2(MX<?> target, MX<MX<String>> value) {\n" +
				"		target= value; // foo2\n" +
				"	}\n" +
				"	void foo3(MX<? super MX> target, MX<MX<String>> value) {\n" +
				"		target= value; // foo3\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class MX<E> {\n" +
				"}\n"	,
			},
			"----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	void foo1(MX<? extends MX> target, MX<MX<String>> value) {\n" +
			"	                       ^^\n" +
			"MX is a raw type. References to generic type MX<E> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 9)\n" +
			"	void foo3(MX<? super MX> target, MX<MX<String>> value) {\n" +
			"	                     ^^\n" +
			"MX is a raw type. References to generic type MX<E> should be parameterized\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 10)\n" +
			"	target= value; // foo3\n" +
			"	        ^^^^^\n" +
			"Type mismatch: cannot convert from MX<MX<String>> to MX<? super MX>\n" +
			"----------\n");
	}
	// check param type equivalences
	public void test0368() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T extends Runnable> {\n" +
				"	\n" +
				"	static class MX <U> {\n" +
				"	}\n" +
				"	\n" +
				"	MX<T> createMX() { return new MX<T>(); }\n" +
				"\n" +
				"	void foo(X<?> x, MX<?> mx) {\n" +
				"		mx = x.createMX();\n" +
				"	}\n" +
				"}\n"	,
			},
			"");
	}
	// bound check for Enum<T>
	public void test0369() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	\n" +
				"	<T extends Enum<T>> T foo(T t) { return null; }\n" +
				"}\n",
			},
			"");
	}
	// decoding raw binary type
	public void test0370() {
		this.runConformTest(
    		new String[] {
				"p/B.java",
				"package p;\n" +
				"import java.util.Map;\n" +
				"public class B {\n" +
				"	public static Map<Class, String> foo(byte[] byteArray, Object o, Class c) {\n" +
				"		return null;\n" +
				"	}\n" +
				"}"
    		},
			"");

		this.runConformTest(
    		new String[] {
    			"X.java",
				"import java.util.Map;\n" +
				"\n" +
				"import p.B;\n" +
				"\n" +
				"public class X {\n" +
				"	{\n" +
				"		Map<Class, String> map = B.foo(null, null, null);\n" +
				"	}\n" +
				"}\n",
    		},
			"",
			null,
			false,
			null);
	}
	// X<? extends Y> is not compatible with X<Y>
	public void test0371() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"   	public void foo(XC<Runnable> target, XC<? extends Runnable> value) {\n" +
				"   		target = value;\n" +
				"   	}\n" +
				"}\n" +
				"class XC <E>{\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	target = value;\n" +
			"	         ^^^^^\n" +
			"Type mismatch: cannot convert from XC<capture#1-of ? extends Runnable> to XC<Runnable>\n" +
			"----------\n");
	}
	public void test0372() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.Iterator;\n" +
				"import java.util.Map;\n" +
				"import java.util.Map.Entry;\n" +
				"\n" +
				"public class X <K, V> {\n" +
				"\n" +
				"	void foo(Iterator<Map.Entry<K,V>> iter) {\n" +
				"		new XA.MXA<K,V>(iter.next());\n" +
				"	}\n" +
				"}\n" +
				"class XA <K, V> {\n" +
				"	static class MXA <K, V>  implements Entry<K,V> {\n" +
				"		MXA(Entry<K,V> e) {\n" +
				"		}\n" +
				"		public K getKey() {\n" +
				"			return null;\n" +
				"		}\n" +
				"		public V getValue() {\n" +
				"			return null;\n" +
				"		}\n" +
				"		public V setValue(V value) {\n" +
				"			return null;\n" +
				"		}\n" +
				"	}\n" +
				"}\n"	,
			},
			"");
	}
	public void test0373() {
		this.runConformTest(
			new String[] {
				"XA.java",
				"import java.util.Map.Entry;\n" +
				"\n" +
				"public class XA <K, V> {\n" +
				"	static class MXA <K, V>  implements Entry<K,V> {\n" +
				"		MXA(Entry<K,V> e) {\n" +
				"		}\n" +
				"		public K getKey() {\n" +
				"			return null;\n" +
				"		}\n" +
				"		public V getValue() {\n" +
				"			return null;\n" +
				"		}\n" +
				"		public V setValue(V value) {\n" +
				"			return null;\n" +
				"		}\n" +
				"	}\n" +
				"}\n"	,
			},
			"");
		// compile against binaries
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.Iterator;\n" +
				"import java.util.Map;\n" +
				"import java.util.Map.Entry;\n" +
				"\n" +
				"public class X <K, V> {\n" +
				"\n" +
				"	void foo(Iterator<Map.Entry<K,V>> iter) {\n" +
				"		new XA.MXA<K,V>(iter.next());\n" +
				"	}\n" +
				"}\n"	,
			},
			"",
			null,
			false,
			null);
	}
	// wildcard with no upper bound uses type variable as upper bound
	public void test0374() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T extends Exception> {\n" +
				"\n" +
				"	void foo1(X <? extends Exception> target, X<?> value) {\n" +
				"		target = value; // foo1\n" +
				"	}\n" +
				"	void foo2(X <? extends Exception> target, X<? super RuntimeException> value) {\n" +
				"		target = value;  // foo2\n" +
				"	}	\n" +
				"}\n",
			},
			"");
	}
	public void test0375() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"\n" +
				"	void foo1(X <? super Exception> target, X<? extends Exception> value) {\n" +
				"		target = value; // foo1\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	target = value; // foo1\n" +
			"	         ^^^^^\n" +
			"Type mismatch: cannot convert from X<capture#2-of ? extends Exception> to X<? super Exception>\n" +
			"----------\n");
	}
	public void test0376() {
		this.runConformTest(
			new String[] {
				"XA.java",
				"import java.util.Map.Entry;\n" +
				"\n" +
				"public class XA <K, V> {\n" +
				"   XA<K,V> self() { return this; } \n" +
				"	static class MXA <K, V>  implements Entry<K,V> {\n" +
				"		MXA(Entry<K,V> e) {\n" +
				"		}\n" +
				"		public K getKey() {\n" +
				"			return null;\n" +
				"		}\n" +
				"		public V getValue() {\n" +
				"			return null;\n" +
				"		}\n" +
				"		public V setValue(V value) {\n" +
				"			return null;\n" +
				"		}\n" +
				"	}\n" +
				"}\n"	,
			},
			"");
		// compile against binaries
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.Iterator;\n" +
				"import java.util.Map;\n" +
				"import java.util.Map.Entry;\n" +
				"\n" +
				"public class X <K, V> {\n" +
				"\n" +
				"	void foo(Iterator<Map.Entry<K,V>> iter) {\n" +
				"		new XA.MXA<K,V>(iter.next());\n" +
				"	}\n" +
				"}\n"	,
			},
			"",
			null,
			false,
			null);
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=76601
	public void test0377() {
		this.runConformTest(
			new String[] {
				"Test.java",
				"public class Test {\n" +
					" public static void main (String[] args) {\n" +
					"  final String val = (args == null||args.length==0 ? \"SUCC\" : args[0]) + \"ESS\";\n" +
					"  class AllegedBoundMismatch<E2 extends SuperI<E2>> {\n" +
					"   String field = val;\n" +
					"  }\n" +
					"  System.out.println(new Object() {\n" +
					"   AllegedBoundMismatch<SubI<Q>> trial = new AllegedBoundMismatch<SubI<Q>>();\n" +
					"  }.trial.field);\n" +
					" }\n" +
					"}\n" +
					"class Q {}\n" +
					"interface SubI<Q> extends SuperI<SubI<Q>> {}\n" +
					"interface SuperI<Q> {}"
			},
		"SUCCESS");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=76219
	public void test0378() {
		this.runConformTest(
			new String[] {
				"BB.java",
				"interface AA<W, Z extends AA<W, Z>> { \n" +
					" public boolean m(AA<W, ?> that); \n" +
					" public Z z(); \n" +
					" public boolean b(); \n" +
					"}\n" +
					"abstract class BB<U, V extends AA<U, V>> implements AA<U,V> { \n" +
					" public boolean m(AA<U, ?> wht) { return wht.z().b(); } \n" +
					"}\n"}
		);
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=71612
	public void test0379() {
		this.runConformTest(
			new String[] {
				"Test.java",
				"import java.util.AbstractSet;\n" +
				"import java.util.Iterator;\n" +
				"public class Test extends AbstractSet<Runnable>{\n" +
				"    public static void main(String[] args) {\n" +
				"        Test t=new Test();\n" +
				"        t.add(null);\n" +
				"    }\n" +
				"    public boolean add(Runnable run) {\n" +
				"        System.out.println(\"success\");\n" +
				"        return true;\n" +
				"    }\n" +
				"    public Iterator<Runnable> iterator() {return null;}\n" +
				"    public int size() {return 0;}\n" +
				"}"
				}
		);
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=77327
	public void test0380() {
		this.runConformTest(
			new String[] {
				"Test.java",
				"import java.util.List;\n" +
				"public class Test {\n" +
				"	List<? super Number> wsn= null; // Contravariance\n" +
				"	List<? super Integer> wsi= wsn; // should work!\n" +
				"}\n"
				}
		);
	}

	public void test0381() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X extends Y {\n" +
				"	void foo(Class<? extends String> s) {}\n" +
				"}\n" +
				"class Y {\n" +
				"	void foo(Class<String> s) {}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	void foo(Class<? extends String> s) {}\n" +
			"	     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Name clash: The method foo(Class<? extends String>) of type X has the same erasure as foo(Class<String>) of type Y but does not override it\n" +
			"----------\n");
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X extends Y {\n" +
				"	void foo(Class<String> s) {}\n" +
				"}\n" +
				"class Y {\n" +
				"	void foo(Class<? extends String> s) {}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	void foo(Class<String> s) {}\n" +
			"	     ^^^^^^^^^^^^^^^^^^^^\n" +
			"Name clash: The method foo(Class<String>) of type X has the same erasure as foo(Class<? extends String>) of type Y but does not override it\n" +
			"----------\n");
	}
	public void test0382() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X extends Y implements I {}\n" +
				"interface I { void foo(Class<? extends String> s); }\n" +
				"class Y { void foo(Class<String> s) {} }\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 1)\n" +
			"	public class X extends Y implements I {}\n" +
			"	             ^\n" +
			"Name clash: The method foo(Class<String>) of type Y has the same erasure as foo(Class<? extends String>) of type I but does not override it\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 1)\n" +
			"	public class X extends Y implements I {}\n" +
			"	             ^\n" +
			"The type X must implement the inherited abstract method I.foo(Class<? extends String>)\n" +
			"----------\n");
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public abstract class X extends Y implements I {}\n" +
				"interface I { void foo(Class<String> s); }\n" +
				"class Y { void foo(Class<? extends String> s) {} }\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 1)\n" +
			"	public abstract class X extends Y implements I {}\n" +
			"	                      ^\n" +
			"Name clash: The method foo(Class<? extends String>) of type Y has the same erasure as foo(Class<String>) of type I but does not override it\n" +
			"----------\n");
	}
	public void test0383() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X extends Y implements I { public <T> void foo(Class<T> s) {} }\n" +
				"interface I { <T, S> void foo(Class<T> s); }\n" +
				"class Y { public <T> void foo(Class<T> s) {} }\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 1)\n" +
			"	public class X extends Y implements I { public <T> void foo(Class<T> s) {} }\n" +
			"	             ^\n" +
			"The type X must implement the inherited abstract method I.foo(Class<T>)\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 1)\n" +
			"	public class X extends Y implements I { public <T> void foo(Class<T> s) {} }\n" +
			"	                                                        ^^^^^^^^^^^^^^^\n" +
			"Name clash: The method foo(Class<T>) of type X has the same erasure as foo(Class<T>) of type I but does not override it\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 1)\n" +
			"	public class X extends Y implements I { public <T> void foo(Class<T> s) {} }\n" +
			"	                                                        ^^^^^^^^^^^^^^^\n" +
			"The method foo(Class<T>) of type X should be tagged with @Override since it actually overrides a superclass method\n" +
			"----------\n");
			/*
			X.java:1: X is not abstract and does not override abstract method <T,S>foo(java.lang.Class<T>) in I
			public class X extends Y implements I { public <T> void foo(Class<T> s) {} }
			       ^
       		*/
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X extends Y implements I {}\n" +
				"interface I { <T, S> void foo(Class<T> s); }\n" +
				"class Y { public <T> void foo(Class<T> s) {} }\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 1)\n" +
			"	public class X extends Y implements I {}\n" +
			"	             ^\n" +
			"Name clash: The method foo(Class<T>) of type Y has the same erasure as foo(Class<T>) of type I but does not override it\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 1)\n" +
			"	public class X extends Y implements I {}\n" +
			"	             ^\n" +
			"The type X must implement the inherited abstract method I.foo(Class<T>)\n" +
			"----------\n");
			/*
			X.java:1: X is not abstract and does not override abstract method <T,S>foo(java.lang.Class<T>) in I
			public class X extends Y implements I {}
			       ^
			*/
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public abstract class X extends Y implements I {}\n" + // NOTE: X is abstract
				"interface I { <T> void foo(Class<T> s); }\n" +
				"class Y { public <T, S> void foo(Class<T> s) {} }\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 1)\n" +
			"	public abstract class X extends Y implements I {}\n" +
			"	                      ^\n" +
			"Name clash: The method foo(Class<T>) of type Y has the same erasure as foo(Class<T>) of type I but does not override it\n" +
			"----------\n");
			/*
			X.java:1: name clash: <T,S>foo(java.lang.Class<T>) in Y and <T>foo(java.lang.Class<T>) in I have the same erasure, yet neither overrides the other
			public abstract class X extends Y implements I {}
			                ^
			 */
	}
	public void test0384a() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X extends Y {\n" +
				"	<T> java.util.List<T> foo3(java.util.List<T> t) { return t; }\n" +
				"	Class<String> foo4() { return null; }\n" +
				"	Class<String>[] foo5() { return null; }\n" +
				"}\n" +
				"class Y {\n" +
				"	<T> java.util.List<T> foo3(java.util.List<T> t) { return t; }\n" +
				"	Class<? extends String> foo4() { return null; }\n" +
				"	Class<? extends String>[] foo5() { return null; }\n" +
				"}\n"
			},
			"");
	}
	public void test0384b() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X extends Y {\n" +
				"	@Override Class<? extends String> foo() { return null; }\n" +
				"	@Override Class<? extends String>[] foo2() { return null; }\n" +
				"}\n" +
				"class Y {\n" +
				"	Class<String> foo() { return null; }\n" +
				"	Class<String>[] foo2() { return null; }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	@Override Class<? extends String> foo() { return null; }\n" +
			"	          ^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"The return type is incompatible with Y.foo()\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 3)\n" +
			"	@Override Class<? extends String>[] foo2() { return null; }\n" +
			"	          ^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"The return type is incompatible with Y.foo2()\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=77496
	public void test0385() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.List;\n" +
				"interface IDoubles { List<Double> getList(); }\n" +
				"class A implements IDoubles {\n" +
				"	public List<String> getList() { return null; }\n" +
				"}\n" +
				"class B {\n" +
				"	 public List<String> getList() { return null; }\n" +
				"}\n" +
				"class C extends B implements IDoubles {\n" +
				"	void use() { List<String> l= getList(); }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	public List<String> getList() { return null; }\n" +
			"	       ^^^^^^^^^^^^\n" +
			"The return type is incompatible with IDoubles.getList()\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 9)\n" +
			"	class C extends B implements IDoubles {\n" +
			"	      ^\n" +
			"The return types are incompatible for the inherited methods IDoubles.getList(), B.getList()\n" +
			"----------\n");
			/*
			X.java:3: A is not abstract and does not override abstract method getList() in IDoubles
			class A implements IDoubles {
			^
			X.java:4: getList() in A cannot implement getList() in IDoubles; attempting to use incompatible return type
			found   : java.util.List<java.lang.String>
			required: java.util.List<java.lang.Double>
				public List<String> getList() { return null; }
			                            ^
			X.java:9: C is not abstract and does not override abstract method getList() in IDoubles
			class C extends B implements IDoubles {
			 */
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=77325
	public void test0386() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"class X <R,U,V, T> {\n" +
					"	private U u;\n" +
					"	private V v;\n" +
					"	public X(U u,V v) { this.u= u; this.v= v; }\n" +
					"	public R getU() { return (R)u; } // Warning\n" +
					"	public R getV() { return (R)v; } // Warning\n" +
					"	Object o;\n" +
					"	public T getT() { return (T)o; } // Warning\n" +
					"}"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 5)\n" +
			"	public R getU() { return (R)u; } // Warning\n" +
			"	                         ^^^^\n" +
			"Type safety: Unchecked cast from U to R\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 6)\n" +
			"	public R getV() { return (R)v; } // Warning\n" +
			"	                         ^^^^\n" +
			"Type safety: Unchecked cast from V to R\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 8)\n" +
			"	public T getT() { return (T)o; } // Warning\n" +
			"	                         ^^^^\n" +
			"Type safety: Unchecked cast from Object to T\n" +
			"----------\n");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=77422 - generic varargs method
	public void test0387() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"\n" +
				"public class X<T>\n" +
				"{\n" +
				"\n" +
				"	public boolean test1()\n" +
				"	{\n" +
				"			test2(\"test\", null, 0);\n" +
				"	}\n" +
				"\n" +
				"	public <F> List<F> test2(final List<F> list, final String... strings)\n" +
				"	{\n" +
				"		return null;\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 8)\n" +
			"	test2(\"test\", null, 0);\n" +
			"	^^^^^\n" +
			"The method test2(List<F>, String...) in the type X<T> is not applicable for the arguments (String, null, int)\n" +
			"----------\n");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=77422 - variation
	public void test0388() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"\n" +
				"public class X<T>\n" +
				"{\n" +
				"\n" +
				"	public boolean test01()\n" +
				"	{\n" +
				"			test02(null, null, \"test\");\n" +
				"			return false;\n" +
				"	}\n" +
				"\n" +
				"	public <F> List<F> test02(final List<F> list, final String... strings)\n" +
				"	{\n" +
				"		return null;\n" +
				"	}\n" +
				"}\n"
			},
			""
		);
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=77422 - variation
	public void test0389() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"\n" +
				"	public boolean test01()	{\n" +
				"		String s = foo(\"hello\");\n" +
				"		return s != null;\n" +
				"	}\n" +
				"\n" +
				"	public <F> F foo(F f, F... others) {\n" +
				"		return f;\n" +
				"	}\n" +
				"}\n"
			},
			""
		);
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=77422 - variation
	public void test0390() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"\n" +
				"	public boolean test01()	{\n" +
				"		String s = foo(null, \"hello\");\n" +
				"		return s != null;\n" +
				"	}\n" +
				"\n" +
				"	public <F> F foo(F f, F... others) {\n" +
				"		return f;\n" +
				"	}\n" +
				"}\n"
			},
			""
		);
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=77422 - variation
	public void test0391() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"\n" +
				"	public boolean test01()	{\n" +
				"		String[] s = foo(null, new String[]{ \"hello\" });\n" +
				"		return s != null;\n" +
				"	}\n" +
				"\n" +
				"	public <F> F foo(F f, F... others) {\n" +
				"		return f;\n" +
				"	}\n" +
				"}\n"
			},
			this.complianceLevel < ClassFileConstants.JDK1_7 ?
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	String[] s = foo(null, new String[]{ \"hello\" });\n" +
			"	             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from String to String[]\n" +
			"----------\n" :
				"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	String[] s = foo(null, new String[]{ \"hello\" });\n" + 
				"	             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Type mismatch: cannot convert from String to String[]\n" + 
				"----------\n" + 
				"2. WARNING in X.java (at line 8)\n" + 
				"	public <F> F foo(F f, F... others) {\n" + 
				"	                           ^^^^^^\n" + 
				"Type safety: Potential heap pollution via varargs parameter others\n" + 
				"----------\n"
		);
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=77422 - variation
	public void test0392() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"\n" +
				"	public boolean test01()	{\n" +
				"		foo(null, \"hello\");\n" + // no inference on expected type
				"		return true;\n" +
				"	}\n" +
				"\n" +
				"	public <F> F foo(F f, F... others) {\n" +
				"		return f;\n" +
				"	}\n" +
				"}\n"
			},
			""
		);
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=78049 - chech invalid array initializer
	public void test0393() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"\n" +
				"	public boolean test01()	{\n" +
				"		foo(null, \"hello\");\n" + // no inference on expected type
				"		return true;\n" +
				"	}\n" +
				"\n" +
				"	public <F> F foo(F f, F... others) {\n" +
				"		return f;\n" +
				"	}\n" +
				"}\n"
			},
			""
		);
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=78027
	public void test0394() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X \n" +
				"{\n" +
				"}\n" +
				"\n" +
				"interface ITest<C extends X>\n" +
				"{ \n" +
				"}\n" +
				"\n" +
				"abstract class Test<C extends X> implements ITest<C>\n" +
				"{\n" +
				"  protected Manager<C> m_manager;\n" +
				"  \n" +
				"  public ITest<C> get()\n" +
				"  {\n" +
				"    return m_manager.getById(getClass(), new Integer(1));\n" +
				"  }\n" +
				"    \n" +
				"  public static class Manager<C extends X>\n" +
				"  {\n" +
				"    public <T extends ITest<C>> T getById(Class<T> cls, Integer id)\n" +
				"    {\n" +
				"      return null;\n" +
				"    }\n" +
				"  }\n" +
				"}\n"
			},
			""
		);
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=74119 - variation
	public void test0395() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T extends Exception> {\n" +
				"	T element;\n" +
				"	\n" +
				"	void foo(X<? super NullPointerException> xnpe) {\n" +
				"		xnpe.element = new java.io.IOException();\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	xnpe.element = new java.io.IOException();\n" +
			"	               ^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from IOException to capture#1-of ? super NullPointerException\n" +
			"----------\n");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=78139 - downcast generic method inference
	public void test0396() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.Collection;\n" +
				"import java.util.List;\n" +
				"import java.util.ArrayList;\n" +
				"\n" +
				"public class X\n" +
				"{\n" +
				"    public static <T> List<T> emptyList() {\n" +
				"        return new ArrayList<T>();\n" +
				"    }\n" +
				"    public static <T> Collection<T> emptyCollection() {\n" +
				"        return new ArrayList<T>();\n" +
				"    }\n" +
				"    public static <T> Iterable<T> emptyIterable() {\n" +
				"        return new ArrayList<T>();\n" +
				"    }\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"    	 // generic inference using expected lhs type: T --> String\n" +
				"        final List<String> lL = emptyList(); // 1\n" +
				"        \n" +
				"    	 // generic inference using expected cast type: T --> String\n" +
				"        final Collection<String> cL = (Collection<String>)emptyList(); // 2\n" +
				"        \n" +
				"    	 // generic inference using expected cast type: T --> String\n" +
				"        final Iterable<String> iL = (Iterable<String>)emptyList(); // 3\n" +
				"        \n" +
				"    	 // generic inference using expected lhs type: T --> String\n" +
				"        final Collection<String> cC = emptyCollection(); // 4\n" +
				"        \n" +
				"    	 // generic inference using expected cast type: T --> String\n" +
				"        final Iterable<String> iC = (Iterable<String>)emptyCollection(); // 5\n" +
				"        \n" +
				"    	 // generic inference using expected lhs type: T --> String\n" +
				"        final Iterable<String> iI = emptyIterable(); // 6\n" +
				"        \n" +
				"    	 // generic inference using expected lhs type: T --> String\n" +
				"        final Collection<String> cL2 = emptyList(); // 7\n" +
				"        \n" +
				"    	 // generic inference using expected lhs type: T --> String\n" +
				"        final Iterable<String> iC2 = emptyCollection(); // 8\n" +
				"    }\n" +
				"}"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 22)\n" +
			"	final Collection<String> cL = (Collection<String>)emptyList(); // 2\n" +
			"	                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Cannot cast from List<Object> to Collection<String>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 25)\n" +
			"	final Iterable<String> iL = (Iterable<String>)emptyList(); // 3\n" +
			"	                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Cannot cast from List<Object> to Iterable<String>\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 31)\n" +
			"	final Iterable<String> iC = (Iterable<String>)emptyCollection(); // 5\n" +
			"	                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Cannot cast from Collection<Object> to Iterable<String>\n" +
			"----------\n");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=76132
	public void test0397() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"interface K1<A> { \n" +
				"        public <B extends A> void kk(K1<B> x); \n" +
				"} \n" +
				" \n" +
				"class K2<C> implements K1<C> { \n" +
				"        public <D extends C> void kk(K1<D> y) { \n" +
				"                System.out.println(\"K2::kk(\" + y.toString() + \")\"); \n" +
				"        } \n" +
				"} \n" +
				" \n" +
				"// --------------------------------------------------- \n" +
				" \n" +
				"interface L1<E> { \n" +
				"        public void ll(L1<? extends E> a); \n" +
				"} \n" +
				" \n" +
				"class L2<KK> implements L1<KK> { \n" +
				"        public void ll(L1<? extends KK> b) { \n" +
				"                ll2(b); \n" +
				"        } \n" +
				" \n" +
				"        private <LL extends KK> void ll2(L1<LL> c) { \n" +
				"                System.out.println(\"L2::ll2(\" + c.toString() + \")\"); \n" +
				"        } \n" +
				"} \n" +
				" \n" +
				"// --------------------------------------------------- \n" +
				" \n" +
				"interface M1<H> { \n" +
				"        public void mm(M1<? extends H> p); \n" +
				"} \n" +
				" \n" +
				"class M2<I> implements M1<I> { \n" +
				"        public <J extends I> void mm(M1<J> q) { \n" +
				"                System.out.println(\"M2::mm(\" + q.toString() + \")\"); \n" +
				"        } \n" +
				"} \n" +
				" \n" +
				"// =================================================== \n" +
				" \n" +
				"class XX            { public String toString() { return \"XX\"; } } \n" +
				"class YY extends XX { public String toString() { return \"YY\"; } } \n" +
				"class ZZ extends YY { public String toString() { return \"ZZ\"; } } \n" +
				" \n" +
				"// --------------------------------------------------- \n" +
				" \n" +
				"public class X { \n" +
				"        public static void main(String arg[]) { \n" +
				"                goK(new K2<YY>()); \n" +
				"                goL(new L2<YY>()); \n" +
				"                goM(new M2<YY>()); \n" +
				"        } \n" +
				" \n" +
				" \n" +
				"        public static void goK(K1<YY> k) { \n" +
				"                // k.kk(new K2<XX>()); // Would fail \n" +
				"                k.kk(new K2<YY>()); \n" +
				"                k.kk(new K2<ZZ>()); \n" +
				"        } \n" +
				" \n" +
				" \n" +
				"        public static void goL(L1<YY> l) { \n" +
				"                // l.ll(new L2<XX>()); // Would fail \n" +
				"                l.ll(new L2<YY>()); \n" +
				"                l.ll(new L2<ZZ>()); \n" +
				"        } \n" +
				" \n" +
				" \n" +
				"        public static void goM(M1<YY> m) { \n" +
				"                // m.mm(new M2<XX>()); // Would fail \n" +
				"                m.mm(new M2<YY>()); \n" +
				"                m.mm(new M2<ZZ>()); \n" +
				"        } \n" +
				"}"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 33)\n" +
			"	class M2<I> implements M1<I> { \n" +
			"	      ^^\n" +
			"The type M2<I> must implement the inherited abstract method M1<I>.mm(M1<? extends I>)\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 34)\n" +
			"	public <J extends I> void mm(M1<J> q) { \n" +
			"	                          ^^^^^^^^^^^\n" +
			"Name clash: The method mm(M1<J>) of type M2<I> has the same erasure as mm(M1<? extends H>) of type M1<H> but does not override it\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 41)\n" +
			"	class XX            { public String toString() { return \"XX\"; } } \n" +
			"	                                    ^^^^^^^^^^\n" +
			"The method toString() of type XX should be tagged with @Override since it actually overrides a superclass method\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 42)\n" +
			"	class YY extends XX { public String toString() { return \"YY\"; } } \n" +
			"	                                    ^^^^^^^^^^\n" +
			"The method toString() of type YY should be tagged with @Override since it actually overrides a superclass method\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 43)\n" +
			"	class ZZ extends YY { public String toString() { return \"ZZ\"; } } \n" +
			"	                                    ^^^^^^^^^^\n" +
			"The method toString() of type ZZ should be tagged with @Override since it actually overrides a superclass method\n" +
			"----------\n");
	}
	// cannot allocate parameterized type with wildcards
	public void test0398() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"    X(){\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"		new X<?>();\n" +
				"		new X<? extends String>();\n" +
				"		new X<?>(){};\n" +
				"		new X<? extends String>(){};\n" +
				"	}\n" +
				"}\n"	,
			},
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	new X<?>();\n" +
			"	    ^\n" +
			"Cannot instantiate the type X<?>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 6)\n" +
			"	new X<? extends String>();\n" +
			"	    ^\n" +
			"Cannot instantiate the type X<? extends String>\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 7)\n" +
			"	new X<?>(){};\n" +
			"	    ^\n" +
			"The type new X(){} cannot extend or implement X<?>. A supertype may not specify any wildcard\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 8)\n" +
			"	new X<? extends String>(){};\n" +
			"	    ^\n" +
			"The type new X(){} cannot extend or implement X<? extends String>. A supertype may not specify any wildcard\n" +
			"----------\n");
	}

	public void test0399() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"    T t;\n" +
				"    X(T t){\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"		X<? extends AX> x = new X<AX<Math>>(new AX<String>());\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class AX<P> {\n" +
				"    P foo() { return null; }\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 7)\n" +
			"	X<? extends AX> x = new X<AX<Math>>(new AX<String>());\n" +
			"	            ^^\n" +
			"AX is a raw type. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 7)\n" +
			"	X<? extends AX> x = new X<AX<Math>>(new AX<String>());\n" +
			"	                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"The constructor X<AX<Math>>(AX<String>) is undefined\n" +
			"----------\n");
	}

	public void test0400() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"    T t;\n" +
				"    X(X<? extends T> xt){\n" +
				"        this.t = xt.t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"		X<? extends AX> x = new X<AX<Math>>(new X<AX<String>>(null));\n" +
				"	}\n" +
				"}\n" +
				"class AX<P> {\n" +
				"    P foo() { return null; }\n" +
				"}",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 7)\n" +
			"	X<? extends AX> x = new X<AX<Math>>(new X<AX<String>>(null));\n" +
			"	            ^^\n" +
			"AX is a raw type. References to generic type AX<P> should be parameterized\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 7)\n" +
			"	X<? extends AX> x = new X<AX<Math>>(new X<AX<String>>(null));\n" +
			"	                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"The constructor X<AX<Math>>(X<AX<String>>) is undefined\n" +
			"----------\n");
	}

	// legal to allocate/inherit from a type with wildcards, as long as non direct arguments
	public void test0401() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"	void foo() {\n" +
				"		new X<X<?>>();\n" +
				"		new X<X<? extends String>>();\n" +
				"		new X<X<?>>(){};\n" +
				"		new X<X<? extends String>>(){};\n" +
				"	}\n" +
				"}",
			},
			"");
	}

	// legal to inherit from a type with wildcards, as long as non direct arguments
	public void test0402() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X extends Y<Y<?>> {\n" +
				"}\n" +
				"class Y<T> {}",
			},
			"");
	}
	// check cast between generic types
	public void test0403() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"	\n" +
				"	void foo(X<X<? extends String>> xs) {\n" +
				"		X<X<String>> x = (X<X<String>>) xs;\n" +
				"		Zork z;\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	X<X<String>> x = (X<X<String>>) xs;\n" +
			"	                 ^^^^^^^^^^^^^^^^^\n" +
			"Cannot cast from X<X<? extends String>> to X<X<String>>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 5)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}

	// check cast between generic types
	public void test0404() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <T> {\n" +
				"	\n" +
				"	void foo(X<? extends String> xs) {\n" +
				"		X<String> x = (X<String>) xs;\n" +
				"		Zork z;\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 4)\n" +
			"	X<String> x = (X<String>) xs;\n" +
			"	              ^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from X<capture#1-of ? extends String> to X<String>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 5)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}

	// check cast between generic types
	public void test0405() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X <E> {\n" +
				"	\n" +
				"	<T> void foo(X<X<T>> xs) {\n" +
				"		X<X<String>> x = (X<X<String>>) xs;\n" +
				"	}\n" +
				"	<T> void bar(X<T> xs) {\n" +
				"		X<String> x = (X<String>) xs;\n" +
				"	}	\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	X<X<String>> x = (X<X<String>>) xs;\n" +
			"	                 ^^^^^^^^^^^^^^^^^\n" +
			"Cannot cast from X<X<T>> to X<X<String>>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 7)\n" +
			"	X<String> x = (X<String>) xs;\n" +
			"	              ^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from X<T> to X<String>\n" +
			"----------\n");
	}

	public void test0406() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public abstract class X<K1,V1> implements M<K1,V1> {\n" +
				"	abstract M<K1,V1> other();\n" +
				"	public S<E<K1,V1>> entrySet() {\n" +
				"		return other().entrySet();\n" +
				"	}\n" +
				"}\n" +
				"interface M<K2,V2> {\n" +
				"	 interface E<K3,V3> { }\n" +
				"	 S<E<K2, V2>> entrySet();\n" +
				"}\n" +
				"interface S<T> {}",
			},
			"");
	}

	public void test0407() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public abstract class X<K1,V1> implements M<K1,V1> {\n" +
				"	abstract M<K1,V1> other();\n" +
				"	public S<M.E<K1,V1>> entrySet() {\n" + // qualified M.E...
				"		return other().entrySet();\n" +
				"	}\n" +
				"}\n" +
				"interface M<K2,V2> {\n" +
				"	 interface E<K3,V3> { }\n" +
				"	 S<E<K2, V2>> entrySet();\n" +
				"}\n" +
				"interface S<T> {}",
			},
			"");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=78008
	public void test0408() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"public class X {\n" +
				"    public Integer[] getTypes() {\n" +
				"        List<Integer> list = new ArrayList<Integer>();\n" +
				"        return list == null \n" +
				"            ? new Integer[0] \n" +
				"            : list.toArray(new Integer[list.size()]);\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        Class clazz = null;\n" +
				"        try {\n" +
				"            clazz = Class.forName(\"X\");\n" +
				"    	     System.out.println(\"SUCCESS\");\n" +
				"        } catch (Throwable e) {\n" +
				"            e.printStackTrace();\n" +
				"        }\n" +
				"    }\n" +
				"}",
			},
			"SUCCESS");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=78008
	public void test0409() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"public class X {\n" +
				"    public Number getTypes() {\n" +
				"        List<Integer> list = new ArrayList<Integer>();\n" +
				"        return list == null \n" +
				"            ? Float.valueOf(0)\n" +
				"            : list.get(0);\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"        Class clazz = null;\n" +
				"        try {\n" +
				"            clazz = Class.forName(\"X\");\n" +
				"    	     System.out.println(\"SUCCESS\");\n" +
				"        } catch (Throwable e) {\n" +
				"            e.printStackTrace();\n" +
				"        }\n" +
				"    }\n" +
				"}",
			},
			"SUCCESS");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=74178
	public void test0410() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.List;\n" +
				"\n" +
				"public class X {\n" +
				"\n" +
				"public void write(List<? super Exception> list) {\n" +
				"	\n" +
				"  list.add(new RuntimeException());             // works\n" +
				"  list.add(new IllegalMonitorStateException()); // works\n" +
				"  Exception exc = new Exception();\n" +
				"  list.add(exc);                                // works\n" +
				"  list.add(new Object());                       // should fail\n" +
				"  list.add(new Throwable());                    // should fail\n" +
				"  list.add(new Exception());                    // works\n" +
				"}\n" +
				"}",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 11)\n" +
			"	list.add(new Object());                       // should fail\n" +
			"	     ^^^\n" +
			"The method add(capture#4-of ? super Exception) in the type List<capture#4-of ? super Exception> is not applicable for the arguments (Object)\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 12)\n" +
			"	list.add(new Throwable());                    // should fail\n" +
			"	     ^^^\n" +
			"The method add(capture#5-of ? super Exception) in the type List<capture#5-of ? super Exception> is not applicable for the arguments (Throwable)\n" +
			"----------\n");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=78015
	public void test0411() {
		this.runConformTest(
			new String[] {
				"X.java",
				"interface I<T> {\n" +
				"    void m1(T t);\n" +
				"    void m2(T t);\n" +
				"}\n" +
				"\n" +
				"class A {};\n" +
				"\n" +
				"class B implements I<A> {\n" +
				"    public void m1(A a) {\n" +
				"    	System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"    public void m2(A a) {}\n" +
				"}\n" +
				"\n" +
				"public class X {\n" +
				"    public static void main(String[] args) {\n" +
				"        m(new B());\n" +
				"    }\n" +
				"\n" +
				"    public static void m(I<A> x) {\n" +
				"        x.m1(null);\n" +
				"    }\n" +
				"}",
			},
			"SUCCESS");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=78467
	public void test0412() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"\n" +
				"    public static <T> T first(T... args) {\n" +
				"        return args[0];\n" +
				"    }\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"    	if (false) { \n" +
				"    		String s = first(); \n" +
				"    		int i; \n" +
				"    		i++; \n" +
				"    	}\n" +
				"        System.out.println(first(\"SUCCESS\", \"List\"));\n" +
				"    }\n" +
				"   Zork z;\n" +
				"}",
			},
			this.complianceLevel < ClassFileConstants.JDK1_7 ?
			"----------\n" +
			"1. ERROR in X.java (at line 15)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n" : 
				"----------\n" + 
				"1. WARNING in X.java (at line 3)\n" + 
				"	public static <T> T first(T... args) {\n" + 
				"	                               ^^^^\n" + 
				"Type safety: Potential heap pollution via varargs parameter args\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 15)\n" + 
				"	Zork z;\n" + 
				"	^^^^\n" + 
				"Zork cannot be resolved to a type\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=78467 - variation
	public void test0412a() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"public class X {\n" +
				"\n" +
				"    public static <T> T first(T... args) {\n" +
				"        return args[0];\n" +
				"    }\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"    	if (false) { \n" +
				"    		List<String> ls = first(); \n" +
				"    		int i; \n" +
				"    		i++; \n" +
				"    	}\n" +
				"        System.out.println(first(\"SUCCESS\", \"List\"));\n" +
				"    }\n" +
				"   Zork z;\n" +
				"}",
			},
			this.complianceLevel < ClassFileConstants.JDK1_7 ?
			"----------\n" +
			"1. WARNING in X.java (at line 10)\n" +
			"	List<String> ls = first(); \n" +
			"	                  ^^^^^^^\n" +
			"Type safety: A generic array of List<String> is created for a varargs parameter\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 16)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n" : 
				"----------\n" + 
				"1. WARNING in X.java (at line 4)\n" + 
				"	public static <T> T first(T... args) {\n" + 
				"	                               ^^^^\n" + 
				"Type safety: Potential heap pollution via varargs parameter args\n" + 
				"----------\n" + 
				"2. WARNING in X.java (at line 10)\n" + 
				"	List<String> ls = first(); \n" + 
				"	                  ^^^^^^^\n" + 
				"Type safety: A generic array of List<String> is created for a varargs parameter\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 16)\n" + 
				"	Zork z;\n" + 
				"	^^^^\n" + 
				"Zork cannot be resolved to a type\n" + 
				"----------\n");
	}

	public void test0413() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"	static class TLM {\n" +
				"	}\n" +
				"    TLM getMap(TL t) {\n" +
				"        return t.tls;\n" +
				"    }\n" +
				"    static TLM createInheritedMap(TLM parentMap) {\n" +
				"        return new TLM();\n" +
				"    }  \n" +
				"}\n" +
				"\n" +
				"class TL {\n" +
				"   X.TLM tls = null;\n" +
				"}",
			},
			"");
	}

	public void test0414() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	void foo(L l, C<? super X> c) {\n" +
				"		bar(l, c);\n" +
				"	}\n" +
				"	<T> void bar(L<T> l, C<? super T> c) { \n" +
				"	}	\n" +
				"}\n" +
				"class C<E> {}\n" +
				"class L<E> {}",
			},
			"");
	}

	public void test0415() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public S<M.E<Object,Object>> foo(HM hm) {\n" +
				"		return C.bar(hm).foo();\n" +
				"    }\n" +
				"}\n" +
				"class C {\n" +
				"    public static <K,V> M<K,V> bar(M<? extends K,? extends V> m) {\n" +
				"		return null;\n" +
				"    }\n" +
				"}\n" +
				"class S<E> {\n" +
				"}\n" +
				"abstract class HM<U,V> implements M<U,V>{\n" +
				"}\n" +
				"interface M<A,B> {\n" +
				"	static class E<S,T> {}\n" +
				"	S<E<A,B>> foo();	\n" +
				"}",
			},
			"");
	}

	public void test0416() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public S<M.E<Object,String>> foo(HM hm) {\n" +
				"    	M<Object, String> m = C.bar(hm);\n" +
				"    	if (false) return m.foo();\n" +
				"		return C.bar(hm).foo();\n" +
				"    }\n" +
				"}\n" +
				"class C {\n" +
				"    public static <K,V> M<K,V> bar(M<? extends K,? extends V> m) {\n" +
				"		return null;\n" +
				"    }\n" +
				"}\n" +
				"class S<E> {\n" +
				"}\n" +
				"abstract class HM<U,V> implements M<U,V>{\n" +
				"}\n" +
				"interface M<A,B> {\n" +
				"	static class E<S,T> {}\n" +
				"	S<E<A,B>> foo();	\n" +
				"}",
			},
			"");
	}

	public void test0417() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<E> {\n" +
				"	\n" +
				"	<T> X<T> foo(X<T> xt) {\n" +
				"		return null;\n" +
				"	}\n" +
				"	X<E> identity() {\n" +
				"		return this;\n" +
				"	}\n" +
				"	void bar(X x) {\n" +
				"		X<String> xs = foo(x).identity();\n" +
				"	}\n" +
				"}\n",
			},
			"");
	}

	public void test0418() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<E> {\n" +
				"	\n" +
				"	<T> X<T> foo(X<T> xt, X<T> xt2) {\n" +
				"		return null;\n" +
				"	}\n" +
				"	X<E> identity() {\n" +
				"		return this;\n" +
				"	}\n" +
				"	void bar(X x, X<String> xs) {\n" +
				"		X<String> xs2 = foo(x, xs).identity();\n" +
				"	}\n" +
				"}\n",
			},
			"");
	}

	public void test0419() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<E> {\n" +
				"	\n" +
				"	<T,U> X<T> foo(X<T> xt, X<U> xt2) {\n" +
				"		return null;\n" +
				"	}\n" +
				"	X<E> identity() {\n" +
				"		return this;\n" +
				"	}\n" +
				"	void bar(X x, X<String> xs) {\n" +
				"		X<String> xs2 = foo(x, xs).identity();\n" +
				"	}\n" +
				"}\n",
			},
			"");
	}

	public void test0420() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<E> {\n" +
				"	\n" +
				"	<T,U> X<U> foo(X<T> xt, X<U> xt2) {\n" +
				"		return null;\n" +
				"	}\n" +
				"	X<E> identity() {\n" +
				"		return this;\n" +
				"	}\n" +
				"	void bar(X x, X<String> xs) {\n" +
				"		X<String> xs2 = foo(x, xs).identity();\n" +
				"	}\n" +
				"}\n",
			},
			"");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=78863
	public void test0421() {
		this.runConformTest(
			new String[] {
				"Test.java",
				"import java.util.HashMap;\n" +
				"import java.util.List;\n" +
				"import java.util.Map;\n" +
				"\n" +
				"public class Test\n" +
				"{\n" +
				"  protected Map<Class<? extends Object>, List<Object>> m_test\n" +
				"    = new HashMap<Class<? extends Object>, List<Object>>();\n" +
				"}\n",
				"Test2.java",
				"import java.util.List;\n" +
				"import java.util.Map;\n" +
				"\n" +
				"public class Test2 extends Test\n" +
				"{\n" +
				"  public Map<Class<? extends Object>, List<Object>> test()\n" +
				"  {\n" +
				"    return m_test;\n" +
				"  }\n" +
				"}\n",
			},
			"");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=78704
	public void test0422() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"	String foo() {\n" +
				"		return new X();\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	return new X();\n" +
			"	       ^^^^^^^\n" +
			"Type mismatch: cannot convert from X to String\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 3)\n" +
			"	return new X();\n" +
			"	           ^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n");
	}

	public void test0423() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"\n" +
				"    static <T extends X> T bar() {\n" +
				"        return null;\n" +
				"    }\n" +
				"    static <U extends X&Runnable> U foo() {\n" +
				"        return null;\n" +
				"    }\n" +
				"\n" +
				"    public static void main(String argv[]) {\n" +
				"    	bar();\n" +
				"        foo();\n" +
				"    }\n" +
				"\n" +
				"}",
			},
			"");
	}

	public void test0424() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	\n" +
				"	<T extends A> T foo(T t) {\n" +
				"		return t;\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		new X().bar();\n" +
				"	}\n" +
				"	void bar() {\n" +
				"		B b = foo(new B());\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class A {}\n" +
				"class B extends A {}\n" +
				"\n",
			},
		"");
	}

	// check tiebreak eliminates related generic methods which are less specific
	public void test0425() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.io.IOException;\n" +
				"\n" +
				"public class X {\n" +
				"    static <E extends A> void m(E e) { System.out.println(\"A:\"+e.getClass()); }\n" +
				"    static <F extends B> void m(F f) throws Exception { System.out.println(\"B:\"+f.getClass()); }\n" +
				"    static <G extends C> void m(G g) throws IOException { System.out.println(\"C:\"+g.getClass()); }\n" +
				"\n" +
				"    public static void main(String[] args) {\n" +
				"        m(new A());\n" +
				"        m(new B());\n" +
				"        m(new C());\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class A {}\n" +
				"class B extends A {}\n" +
				"class C extends A {}\n" +
				"\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 10)\n" +
			"	m(new B());\n" +
			"	^^^^^^^^^^\n" +
			"Unhandled exception type Exception\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 11)\n" +
			"	m(new C());\n" +
			"	^^^^^^^^^^\n" +
			"Unhandled exception type IOException\n" +
			"----------\n");
	}

	// check inferred return types are truly based on arguments, and not on parameter erasures
	public void test0426() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    static <E extends A> E m(E e) { System.out.print(\"[A:\"+e.getClass()+\"]\"); return e; }\n" +
				"\n" +
				"    public static void main(String[] args) {\n" +
				"        A a = m(new A());\n" +
				"        B b = m(new B());\n" +
				"        C c = m(new C());\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class A {}\n" +
				"class B extends A {}\n" +
				"class C extends A {}\n",
			},
			"[A:class A][A:class B][A:class C]");
	}

	// check inferred return types are truly based on arguments, and not on parameter erasures
	public void test0427() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    static <E extends A> E m(E e, E... e2) { System.out.print(\"[A:\"+e.getClass()+\"]\"); return e; }\n" +
				"    static <F extends B> F m(F f, F... f2) { System.out.print(\"[B:\"+f.getClass()+\"]\"); return f; }\n" +
				"    static <G extends C> G m(G g, G... g2) { System.out.print(\"[C:\"+g.getClass()+\"]\"); return g; }\n" +
				"\n" +
				"    public static void main(String[] args) {\n" +
				"        A a = m(new A(), new A());\n" +
				"        B b = m(new B(), new B());\n" +
				"        C c = m(new C(), new C());\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class A {}\n" +
				"class B extends A {}\n" +
				"class C extends A {}\n",
			},
			"[A:class A][B:class B][C:class C]");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=79390
	public void test0428() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"   Zork z;\n" +
				"	public static void foo() {\n" +
				"		class A<T extends Number> {\n" +
				"			T t = null;\n" +
				"			T get() {\n" +
				"				return t;\n" +
				"			}\n" +
				"		}\n" +
				"		A<Long> a = new A<Long>() {\n" +
				"			@Override\n" +
				"			Long get() {\n" +
				"				return Long.valueOf(5);\n" +
				"			}\n" +
				"		};\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=78293
	public void test0429() {
		this.runConformTest(
			new String[] {
				"X1.java",
				"class X1 <T extends Y & Comparable<Y>> {}\n" +
				"abstract class Y implements Comparable<Y> {}",
			},
			""
		);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=78293
	public void test0429a() {
		this.runConformTest(
			new String[] {
				"X2.java",
				"class X2 <T extends Y & Comparable<Y>> {}\n" +
				"abstract class Y extends Z {}\n" +
				"abstract class Z implements Comparable<Y> {}",
			},
			""
		);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=78293
	public void test0429b() {
		this.runConformTest(
			new String[] {
				"X3.java",
				"class X3 <T extends Y & Comparable<Z>> {}\n" +
				"abstract class Y extends Z {}\n" +
				"abstract class Z implements Comparable<Z> {}",
			},
			""
		);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=78293
	public void test0429c() {
		runNegativeTest(
			// test directory preparation
			new String[] { /* test files */
				"X4.java",
				"class X4 <T extends Comparable<Z> & Comparable<Z>> {}\n" +
				"abstract class Y extends Z {}\n" +
				"abstract class Z implements Comparable<Z> {}",
			},
			// compiler results
			"----------\n" + /* expected compiler log */
			"1. ERROR in X4.java (at line 1)\n" +
			"	class X4 <T extends Comparable<Z> & Comparable<Z>> {}\n" +
			"	                                    ^^^^^^^^^^\n" +
			"Duplicate bound Comparable<Z>\n" +
			"----------\n",
				// no complaints about duplicates if they are both parameterized with same args
				// but you cannot extend Comparable & Comparable so we'll report an error
			// javac options
			JavacTestOptions.JavacHasABug.JavacBugFixed_7 /* javac test options */);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=78293
	public void test0429d() {
		this.runNegativeTest(
			new String[] {
				"X5.java",
				"class X5 <T extends Y & Comparable<X5>> {}\n" +
				"abstract class Y implements Comparable<Y> {}",
			},
			"----------\n" +
			"1. ERROR in X5.java (at line 1)\n" +
			"	class X5 <T extends Y & Comparable<X5>> {}\n" +
			"	                        ^^^^^^^^^^\n" +
			"The interface Comparable cannot be implemented more than once with different arguments: Comparable<X5> and Comparable<Y>\n" +
			"----------\n" +
			"2. WARNING in X5.java (at line 1)\n" +
			"	class X5 <T extends Y & Comparable<X5>> {}\n" +
			"	                                   ^^\n" +
			"X5 is a raw type. References to generic type X5<T> should be parameterized\n" +
			"----------\n"
			// Comparable cannot be inherited with different arguments: <X5> and <Y>
		);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=78293
	public void test0429e() {
		this.runNegativeTest(
			new String[] {
				"X6.java",
				"class X6 <T extends Y & Comparable<X6>> {}\n" +
				"abstract class Y extends Z {}\n" +
				"abstract class Z implements Comparable<Z> {}",
			},
			"----------\n" +
			"1. ERROR in X6.java (at line 1)\n" +
			"	class X6 <T extends Y & Comparable<X6>> {}\n" +
			"	                        ^^^^^^^^^^\n" +
			"The interface Comparable cannot be implemented more than once with different arguments: Comparable<X6> and Comparable<Z>\n" +
			"----------\n" +
			"2. WARNING in X6.java (at line 1)\n" +
			"	class X6 <T extends Y & Comparable<X6>> {}\n" +
			"	                                   ^^\n" +
			"X6 is a raw type. References to generic type X6<T> should be parameterized\n" +
			"----------\n"
			// Comparable cannot be inherited with different arguments: <X6> and <Y>
		);
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=78293
	public void test0429f() {
		this.runNegativeTest(
			new String[] {
				"X7.java",
				"class X7 <T extends Comparable<Z> & Comparable<X7>> {}\n" +
				"abstract class Y extends Z {}\n" +
				"abstract class Z implements Comparable<Z> {}",
			},
			"----------\n" +
			"1. ERROR in X7.java (at line 1)\n" +
			"	class X7 <T extends Comparable<Z> & Comparable<X7>> {}\n" +
			"	                                    ^^^^^^^^^^\n" +
			"The interface Comparable cannot be implemented more than once with different arguments: Comparable<X7> and Comparable<Z>\n" +
			"----------\n" +
			"2. WARNING in X7.java (at line 1)\n" +
			"	class X7 <T extends Comparable<Z> & Comparable<X7>> {}\n" +
			"	                                               ^^\n" +
			"X7 is a raw type. References to generic type X7<T> should be parameterized\n" +
			"----------\n"
			// Comparable cannot be inherited with different arguments: <Z> and <X7>
		);
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=78293
	public void test0429g() {
		this.runNegativeTest(new String[] {
				"X.java",
				"interface I<T> {}\n" +
				"\n" +
				"class A implements I<A>, I<A> {}\n" +
				"public class X<E extends A & I<E> & I<E>>  {\n" +
				"}"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	class A implements I<A>, I<A> {}\n" +
			"	                         ^\n" +
			"Duplicate interface I<A> for the type A\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 4)\n" +
			"	public class X<E extends A & I<E> & I<E>>  {\n" +
			"	                             ^\n" +
			"The interface I cannot be implemented more than once with different arguments: I<E> and I<A>\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 4)\n" +
			"	public class X<E extends A & I<E> & I<E>>  {\n" +
			"	                                    ^\n" +
			"Duplicate bound I<E>\n" +
			"----------\n");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=79797
	public void test0430() {
		this.runConformTest(
			new String[] {
				"p/MMM.java",
				"package p;\n" +
				"public interface MMM< F extends MMM<F,G>, G extends NNN> { } \n",
				"p/NNN.java",
				"package p;\n" +
				"public interface NNN { } \n",
			},
			"");

		this.runConformTest(
			new String[] {
				"X.java",
				"import p.MMM;\n" +
				"import p.NNN;\n" +
				"\n" +
				"interface RRR< A extends MMM<A, B>, B extends NNN> {}\n" +
				"\n" +
				"class J1 implements MMM<J1, J2> { }\n" +
				"class J2 implements NNN { }\n" +
				"\n" +
				"class J3 implements RRR<J1,J2> {} \n" +
				"\n" +
				"public class X {\n" +
				"  public static void main(String[] args) {\n" +
				"    J3 thing = null;\n" +
				"  }\n" +
				"}\n",
			},
			"",
			null,
			false, // do not flush output
			null);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=79891
	public void test0431() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<Type> {\n" +
				"  private class Element {\n" +
				"  }\n" +
				"  public X() {\n" +
				"    Element[] eArray = new Element[10];\n" +
				"  }\n" +
				"}\n",
			},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	Element[] eArray = new Element[10];\n" +
		"	                   ^^^^^^^^^^^^^^^\n" +
		"Cannot create a generic array of X<Type>.Element\n" +
		"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=79891
	public void test0432() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<Type> {\n" +
				"  private static class Element {\n" +
				"  }\n" +
				"  public X() {\n" +
				"    Element[] eArray = new Element[10];\n" +
				"  }\n" +
				"}\n",
			},
		"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=80144
	public void test0433() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"\n" +
				"interface Alpha<\n" +
				"	A1 extends Alpha<A1, B1>, \n" +
				"	B1 extends Beta<A1, B1>> {\n" +
				"}\n" +
				"interface Beta<\n" +
				"	A2 extends Alpha<A2, B2>, \n" +
				"	B2 extends Beta<A2, B2>> {\n" +
				"}\n" +
				"interface Phi<\n" +
				"	A3 extends Alpha<A3, B3>, \n" +
				"	B3 extends Beta<A3, B3>> {\n" +
				"	\n" +
				"	public void latinize(A3 s);\n" +
				"}\n" +
				"\n" +
				"public class X<\n" +
				"	A extends Alpha<A, B>, \n" +
				"	B extends Beta<A, B>, \n" +
				"	P extends Phi<A, B>> extends ArrayList<P> implements Phi<A, B> {\n" +
				"	\n" +
				"	public final void latinize(A a) {\n" +
				"		frenchify(this, a); // (X<A,B,P>, A)\n" +
				"	}\n" +
				"	// -----------------------------------------------------------------\n" +
				"	public static final <AA extends Alpha<AA, BB>, BB extends Beta<AA, BB>> \n" +
				"	void frenchify(Collection< ? extends Phi<AA, BB>> phis, AA aa) {\n" +
				"		for (final Phi<AA, BB> phi : phis)\n" +
				"			phi.latinize(aa);\n" +
				"	}\n" +
				"}\n",
			},
		"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=80083
	public void test0434() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.ArrayList;\n" +
				"\n" +
				"public class X\n" +
				"{\n" +
				"\n" +
				"  public static void main(String[] args)\n" +
				"  {\n" +
				"    ArrayList<String> l = new ArrayList<String>();\n" +
				"    l.add(\"x\");\n" +
				"    String s = \"\";\n" +
				"    s += l.get(0); // X\n" +
				"    System.out.println(\"SUCCESS\");\n" +
				"  }\n" +
				"\n" +
				"}\n",
			},
		"SUCCESS");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=80765
	public void test0435() {
		this.runNegativeTest(
			new String[] {
				"Test.java",//===============================
				"import java.lang.reflect.InvocationTargetException;\n" +
				"import java.lang.reflect.Method;\n" +
				"\n" +
				"import orders.DiscreteOrder;\n" +
				"import orders.impl.IntegerOrder;\n" +
				"import orders.impl.IntegerOrder2;\n" +
				"\n" +
				"public class Test {\n" +
				"\n" +
				"    public static void main(String[] args) throws SecurityException,\n" +
				"            NoSuchMethodException, IllegalArgumentException,\n" +
				"            IllegalAccessException {\n" +
				"        Test test = new Test();\n" +
				"\n" +
				"        for (String method : new String[] { \"test01\", \"test02\", \"test03\", \"test04\" }) {\n" +
				"            Method m = test.getClass().getMethod(method);\n" +
				"            try {\n" +
				"                m.invoke(test);\n" +
				"                System.out.print(\"*** \" + m + \": success\");\n" +
				"            } catch (InvocationTargetException e) {\n" +
				"                System.out.print(\"*** \" + m + \": failed, stacktrace follows\");\n" +
				"                e.getCause().printStackTrace(System.out);\n" +
				"            }\n" +
				"        }\n" +
				"    }\n" +
				"\n" +
				"    public void test01() { // works\n" +
				"        new IntegerOrder().next(Integer.valueOf(0)); // works\n" +
				"    }\n" +
				"\n" +
				"    public void test02() { // doesn\'t work\n" +
				"        final DiscreteOrder<Integer> order = new IntegerOrder();\n" +
				"        order.next(Integer.valueOf(0));\n" +
				"    }\n" +
				"\n" +
				"    public void test03() { // works\n" +
				"        new IntegerOrder2().next(Integer.valueOf(0)); // works\n" +
				"    }\n" +
				"\n" +
				"    public void test04() { // doesn\'t work\n" +
				"        final DiscreteOrder<Integer> order = new IntegerOrder2();\n" +
				"        order.next(Integer.valueOf(0));\n" +
				"    }\n" +
				"}\n",
				"orders/DiscreteOrder.java",//===============================
				"package orders;\n" +
				"public interface DiscreteOrder<E extends Comparable<E>> {\n" +
				"    /**\n" +
				"     * @return The element immediately before <code>element</code> in the\n" +
				"     *         discrete ordered space.\n" +
				"     */\n" +
				"    public E previous(E element);\n" +
				"    /**\n" +
				"     * @return The element immediately after <code>element</code> in the\n" +
				"     *         discrete ordered space.\n" +
				"     */\n" +
				"    public E next(E element);\n" +
				"}\n",
				"orders/impl/IntegerOrder.java",//===============================
				"package orders.impl;\n" +
				"import orders.DiscreteOrder;\n" +
				"\n" +
				"public class IntegerOrder implements DiscreteOrder<Integer> {\n" +
				"\n" +
				"    public IntegerOrder() {\n" +
				"        super();\n" +
				"    }\n" +
				"\n" +
				"    public Integer previous(Integer arg0) {\n" +
				"        return Integer.valueOf(arg0.intValue() - 1);\n" +
				"    }\n" +
				"\n" +
				"    public Integer next(Integer arg0) {\n" +
				"        return Integer.valueOf(arg0.intValue() + 1);\n" +
				"    }\n" +
				"}\n",
				"orders/impl/IntegerOrder2.java",//===============================
				"package orders.impl;\n" +
				"\n" +
				"\n" +
				"public class IntegerOrder2 extends IntegerOrder {\n" +
				"\n" +
				"    public IntegerOrder2() {\n" +
				"        super();\n" +
				"    }\n" +
				"\n" +
				"    public Comparable previous(Comparable arg0) {\n" +
				"        return previous((Integer) arg0);\n" +
				"    }\n" +
				"\n" +
				"    public Comparable next(Comparable arg0) {\n" +
				"        return next((Integer) arg0);\n" +
				"    }\n" +
				"\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in orders\\impl\\IntegerOrder2.java (at line 10)\n" +
			"	public Comparable previous(Comparable arg0) {\n" +
			"	       ^^^^^^^^^^\n" +
			"Comparable is a raw type. References to generic type Comparable<T> should be parameterized\n" +
			"----------\n" +
			"2. ERROR in orders\\impl\\IntegerOrder2.java (at line 10)\n" +
			"	public Comparable previous(Comparable arg0) {\n" +
			"	                  ^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Name clash: The method previous(Comparable) of type IntegerOrder2 has the same erasure as previous(E) of type DiscreteOrder<E> but does not override it\n" +
			"----------\n" +
			"3. WARNING in orders\\impl\\IntegerOrder2.java (at line 10)\n" +
			"	public Comparable previous(Comparable arg0) {\n" +
			"	                           ^^^^^^^^^^\n" +
			"Comparable is a raw type. References to generic type Comparable<T> should be parameterized\n" +
			"----------\n" +
			"4. WARNING in orders\\impl\\IntegerOrder2.java (at line 14)\n" +
			"	public Comparable next(Comparable arg0) {\n" +
			"	       ^^^^^^^^^^\n" +
			"Comparable is a raw type. References to generic type Comparable<T> should be parameterized\n" +
			"----------\n" +
			"5. ERROR in orders\\impl\\IntegerOrder2.java (at line 14)\n" +
			"	public Comparable next(Comparable arg0) {\n" +
			"	                  ^^^^^^^^^^^^^^^^^^^^^\n" +
			"Name clash: The method next(Comparable) of type IntegerOrder2 has the same erasure as next(E) of type DiscreteOrder<E> but does not override it\n" +
			"----------\n" +
			"6. WARNING in orders\\impl\\IntegerOrder2.java (at line 14)\n" +
			"	public Comparable next(Comparable arg0) {\n" +
			"	                       ^^^^^^^^^^\n" +
			"Comparable is a raw type. References to generic type Comparable<T> should be parameterized\n" +
			"----------\n"
			// "*** public void Test.test01(): success*** public void Test.test02(): success*** public void Test.test03(): success*** public void Test.test04(): success"
			// name clash: next(java.lang.Comparable) in orders.impl.IntegerOrder2 and next(E) in orders.DiscreteOrder<java.lang.Integer> have the same erasure, yet neither overrides the other
		);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=80028
	public void test0436() {
		this.runConformTest(
			new String[] {
				"A.java",
				"public class A {\n" +
				"	public static void main(String[] args) {\n" +
				"		Number n= new Integer(1);\n" +
				"		X x = new X<Number>();\n" +
				"		x.m(n);\n" +
				"		x.m(new Integer(2));\n" +
				"		Y y= new Y();\n" +
				"		y.m(n);\n" +
				"		y.m(new Integer(2));\n" +
				"	}\n" +
				"}\n",
				"X.java",
				"class X<T> {\n" +
				"	public void m(Number num) { System.out.print(\"X.m(Number) = \" + num + ','); }\n" +
				"	public void m(T t) { System.out.print(\"X.m(T) = \" + t + ','); }\n" +
				"}\n",
				"Y.java",
				"class Y extends X<Number> {\n" +
				"	public void m(Number num) { System.out.print(\"Y.m(Number) = \" + num + ','); }\n" +
				"}\n",
			},
		"X.m(Number) = 1,X.m(Number) = 2,Y.m(Number) = 1,Y.m(Number) = 2,");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=80028
	public void test0437() {
		this.runConformTest(
			new String[] {
				"A.java",
				"public class A {\n" +
				"	public static void main(String[] args) {\n" +
				"		Number n= new Integer(1);\n" +
				"		X x = new X<Number>();\n" +
				"		x.m(n);\n" +
				"		x.m(new Integer(2));\n" +
				"		Y y= new Y();\n" +
				"		y.m(n);\n" +
				"		y.m(new Integer(2));\n" +
				"	}\n" +
				"}\n",
				"X.java",
				"class X<T> {\n" +
				"	public void m(Number num) { System.out.print(\"X.m(Number) = \" + num + ','); }\n" +
				"	public void m(T t) { System.out.print(\"X.m(T) = \" + t + ','); }\n" +
				"}\n",
				"Y.java",
				"class Y extends X<Number> {\n" +
				"	public void m(Number num) { System.out.print(\"Y.m(Number) = \" + num + ','); }\n" +
				"}\n",
			},
		"X.m(Number) = 1,X.m(Number) = 2,Y.m(Number) = 1,Y.m(Number) = 2,");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=78591
	public void test0438() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.List;\n" +
				"public class X<T> {\n" +
				"    Zork z;\n" +
				"    List<T> list;\n" +
				"    void add(Object abs) {\n" +
				"        list.add((T) list.get(0)); // checked cast\n" +
				"        list.add((T) abs); // unchecked cast\n" +
				"    }\n" +
				"    void bar(List<? extends T> other) {\n" +
				"    	list.add((T) other.get(0)); // checked cast\n" +
				"    }\n" +
				"    void baz(List<? super T> other) {\n" +
				"    	list.add((T) other.get(0)); // unchecked cast\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 6)\n" +
			"	list.add((T) list.get(0)); // checked cast\n" +
			"	         ^^^^^^^^^^^^^^^\n" +
			"Unnecessary cast from T to T\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 7)\n" +
			"	list.add((T) abs); // unchecked cast\n" +
			"	         ^^^^^^^\n" +
			"Type safety: Unchecked cast from Object to T\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 10)\n" +
			"	list.add((T) other.get(0)); // checked cast\n" +
			"	         ^^^^^^^^^^^^^^^^\n" +
			"Unnecessary cast from capture#1-of ? extends T to T\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 13)\n" +
			"	list.add((T) other.get(0)); // unchecked cast\n" +
			"	         ^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from capture#2-of ? super T to T\n" +
			"----------\n");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=78592
	public void test0439() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"class Node {\n" +
				"}\n" +
				"class Composite<E> {\n" +
				"}\n" +
				"class Concrete extends Composite {\n" +
				"}\n" +
				"public class X {\n" +
				"    Composite<Node> comp = new Concrete(); // unchecked cast\n" +
				"    Zork z;\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 5)\n" +
			"	class Concrete extends Composite {\n" +
			"	                       ^^^^^^^^^\n" +
			"Composite is a raw type. References to generic type Composite<E> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 8)\n" +
			"	Composite<Node> comp = new Concrete(); // unchecked cast\n" +
			"	                       ^^^^^^^^^^^^^^\n" +
			"Type safety: The expression of type Concrete needs unchecked conversion to conform to Composite<Node>\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 9)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}

	public void test0440() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"	class Y<U> {\n" +
				"		public void foo(X<T> xt) {\n" +
				"			U u = (U) xt;\n" +
				"		}\n" +
				"	}\n" +
				"  Zork z;\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 4)\n" +
			"	U u = (U) xt;\n" +
			"	      ^^^^^^\n" +
			"Type safety: Unchecked cast from X<T> to U\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 7)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}

	public void test0441() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T extends Number> {\n" +
				"    T[] array;\n" +
				"    X(int s) {\n" +
				"        array = (T[]) new Number[s];   // Unnecessary cast from Number[] to T[]\n" +
				"        array = new Number[s];   // Type mismatch: cannot convert from Number[] to T[]\n" +
				"     }\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 4)\n" +
			"	array = (T[]) new Number[s];   // Unnecessary cast from Number[] to T[]\n" +
			"	        ^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from Number[] to T[]\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 5)\n" +
			"	array = new Number[s];   // Type mismatch: cannot convert from Number[] to T[]\n" +
			"	        ^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Number[] to T[]\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=82053
	public void test0442() {
		this.runConformTest(
			new String[] {
				"X.java",
				"class Foo {\n" +
				"	public interface Model {\n" +
				"	}\n" +
				"	public interface View<M extends Model> {\n" +
				"		M getTarget() ;\n" +
				"	}\n" +
				"}\n" +
				"class Bar {\n" +
				"	public interface Model extends Foo.Model {\n" +
				"	}\n" +
				"	public interface View<M extends Model> extends Foo.View<M> {\n" +
				"	}\n" +
				"}\n" +
				"public class X {\n" +
				"	public void baz() {\n" +
				"		Bar.View<?> bv = null ;\n" +
				"		Bar.Model m = bv.getTarget() ;\n" +
				"	}\n" +
				"}\n",
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=81757
	public void test0443() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.Iterator;\n" +
				"public class X implements Iterator<String> {\n" +
				"    public boolean hasNext() { return false; }\n" +
				"    public String next() { return null; }\n" +
				"    public void remove() {}\n" +
				"}\n",
			},
			"");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=81824
	public void test0444() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X implements I<Integer>, I<String> {}\n" +
				"interface I<T> {}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 1)\n" +
			"	public class X implements I<Integer>, I<String> {}\n" +
			"	             ^\n" +
			"The interface I cannot be implemented more than once with different arguments: I<String> and I<Integer>\n" +
			"----------\n");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=78810
	public void test0445() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public abstract class X {\n" +
				"    public abstract Object getProperty(final Object src, final String name);\n" +
				"    Zork z;\n" +
				"    public <T> T getTheProperty(final Object src, final String name)\n" +
				"    {\n" +
				"        final T val = (T) getProperty(src, name); // this gives erroneous cast warning\n" +
				"        return val;\n" +
				"    }\n" +
				"}\n"	,
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 6)\n" +
			"	final T val = (T) getProperty(src, name); // this gives erroneous cast warning\n" +
			"	              ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from Object to T\n" +
			"----------\n");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=82159
	public void test0446() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<A> {\n" +
				"  class Inner<B> { }\n" +
				"\n" +
				"  void method() {\n" +
				"    X<String>.Inner<Integer> a= new X<String>().new Inner<Integer>();\n" +
				"    Inner<Integer> b= new X<A>().new Inner<Integer>();\n" +
				"    Inner<Integer> c= new Inner<Integer>();\n" +
				"    // OK\n" +
				"\n" +
				"    X<String>.Inner<Integer> d= new X<String>.Inner<Integer>();\n" +
				"    //eclipse: OK\n" +
				"    //other: error: \'(\' or \'[\' expected\n" +
				"\n" +
				"    X<A>.Inner<Integer> e= new X<A>().new Inner<Integer>();\n" +
				"    X<A>.Inner<Integer> f= new Inner<Integer>();\n" +
				"    e= b;\n" +
				"    f= c;\n" +
				"    //other: OK\n" +
				"    //eclipse: Type mismatch: cannot convert from X<A>.Inner<Integer> to X<A>.Inner<Integer>\n" +
				"\n" +
				"  }\n" +
				"}\n" +
				"\n" +
				"class External {\n" +
				"  void m() {\n" +
				"    X<String>.Inner<Integer> x= new X<String>().new Inner<Integer>();\n" +
				"    // OK\n" +
				"  }\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 10)\n" +
			"	X<String>.Inner<Integer> d= new X<String>.Inner<Integer>();\n" +
			"	                                ^^^^^^^^^^^^^^^\n" +
			"Cannot allocate the member type X<String>.Inner<Integer> using a parameterized compound name; use its simple name and an enclosing instance of type X<String>\n" +
			"----------\n",
			JavacTestOptions.EclipseHasABug.EclipseBug236243);
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=82159 - variation
	public void test0447() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<A> {\n" +
				"  class Inner<B> { }\n" +
				"\n" +
				"  void method() {\n" +
				"    X<String>.Inner<Integer> d1 = new X<String>.Inner<Integer>();\n" +
				"    X.Inner d2 = new X.Inner();\n" +
				"    X.Inner<Integer> d3 = new X.Inner<Integer>();\n" +
				"    d1 = d2;\n" +
				"    d2 = d1;\n" +
				"    d1 = d3;\n" +
				"    d3 = d1;\n" +
				"    d2 = d3;\n" +
				"    d3 = d2;\n" +
				"\n" +
				"  }\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	X<String>.Inner<Integer> d1 = new X<String>.Inner<Integer>();\n" +
			"	                                  ^^^^^^^^^^^^^^^\n" +
			"Cannot allocate the member type X<String>.Inner<Integer> using a parameterized compound name; use its simple name and an enclosing instance of type X<String>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 6)\n" +
			"	X.Inner d2 = new X.Inner();\n" +
			"	^^^^^^^\n" +
			"X.Inner is a raw type. References to generic type X<A>.Inner<B> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 6)\n" +
			"	X.Inner d2 = new X.Inner();\n" +
			"	                 ^^^^^^^\n" +
			"X.Inner is a raw type. References to generic type X<A>.Inner<B> should be parameterized\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 7)\n" +
			"	X.Inner<Integer> d3 = new X.Inner<Integer>();\n" +
			"	^^^^^^^\n" +
			"The member type X.Inner<Integer> must be qualified with a parameterized type, since it is not static\n" +
			"----------\n" +
			"5. ERROR in X.java (at line 7)\n" +
			"	X.Inner<Integer> d3 = new X.Inner<Integer>();\n" +
			"	                          ^^^^^^^\n" +
			"The member type X.Inner<Integer> must be qualified with a parameterized type, since it is not static\n" +
			"----------\n" +
			"6. WARNING in X.java (at line 8)\n" +
			"	d1 = d2;\n" +
			"	     ^^\n" +
			"Type safety: The expression of type X.Inner needs unchecked conversion to conform to X<String>.Inner<Integer>\n" +
			"----------\n" +
			"7. ERROR in X.java (at line 10)\n" +
			"	d1 = d3;\n" +
			"	     ^^\n" +
			"Type mismatch: cannot convert from X.Inner<Integer> to X<String>.Inner<Integer>\n" +
			"----------\n" +
			"8. ERROR in X.java (at line 11)\n" +
			"	d3 = d1;\n" +
			"	     ^^\n" +
			"Type mismatch: cannot convert from X<String>.Inner<Integer> to X.Inner<Integer>\n" +
			"----------\n" +
			"9. WARNING in X.java (at line 13)\n" +
			"	d3 = d2;\n" +
			"	     ^^\n" +
			"Type safety: The expression of type X.Inner needs unchecked conversion to conform to X.Inner<Integer>\n" +
			"----------\n");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=82159 - variation
	public void test0448() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<A> {\n" +
				"  static class Inner<B> { }\n" +
				"\n" +
				"  void method() {\n" +
				"    X.Inner<Integer> d = new X.Inner<Integer>();    \n" +
				"  }\n" +
				"}\n",
			},
			"");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=82159 - variation
	public void test0448a() {
		runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"public class X<T> {\n" +
			"	class Y {}\n" +
			"	X<?>.Y[] tab = new X<?>.Y[] {};\n" +
			"}"
		},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_7 /* javac test options */);
	}


	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=82159 - variation
	public void test0449() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<A> {\n" +
				"  class Inner<B> { \n" +
				"  }\n" +
				"\n" +
				"  void method() {\n" +
				"    X<String>.Inner<Integer> d4 = new X.Inner<Integer>();\n" +
				"  }\n" +
				"}\n" ,
			},
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	X<String>.Inner<Integer> d4 = new X.Inner<Integer>();\n" +
			"	                              ^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from X.Inner<Integer> to X<String>.Inner<Integer>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 6)\n" +
			"	X<String>.Inner<Integer> d4 = new X.Inner<Integer>();\n" +
			"	                                  ^^^^^^^\n" +
			"The member type X.Inner<Integer> must be qualified with a parameterized type, since it is not static\n" +
			"----------\n");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=82159 - variation
	public void test0450() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<A> {\n" +
				"  static class Inner<B> { \n" +
				"  }\n" +
				"\n" +
				"  void method() {\n" +
				"    X<String>.Inner<Integer> d4 = new X<String>.Inner<Integer>();\n" +
				"  }\n" +
				"}\n" ,
			},
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	X<String>.Inner<Integer> d4 = new X<String>.Inner<Integer>();\n" +
			"	^^^^^^^^^^^^^^^\n" +
			"The member type X.Inner<B> cannot be qualified with a parameterized type, since it is static. Remove arguments from qualifying type X<String>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 6)\n" +
			"	X<String>.Inner<Integer> d4 = new X<String>.Inner<Integer>();\n" +
			"	                                  ^^^^^^^^^^^^^^^\n" +
			"The member type X.Inner<B> cannot be qualified with a parameterized type, since it is static. Remove arguments from qualifying type X<String>\n" +
			"----------\n");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=82159 - variation
	public void test0451() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<A> {\n" +
				"  class Inner<B> { \n" +
				"  }\n" +
				"\n" +
				"  void method() {\n" +
				"    X<String>.Inner<Integer> d4 = new X<String>.Inner<Integer>() {};\n" +
				"  }\n" +
				"}\n" ,
			},
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	X<String>.Inner<Integer> d4 = new X<String>.Inner<Integer>() {};\n" +
			"	                                  ^^^^^^^^^^^^^^^\n" +
			"Cannot allocate the member type X<String>.Inner<Integer> using a parameterized compound name; use its simple name and an enclosing instance of type X<String>\n" +
			"----------\n",
			JavacTestOptions.EclipseHasABug.EclipseBug236243);
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=82187
	public void test0452() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"\n" +
				"public class X {\n" +
				"	\n" +
				"	 public <E extends Object, S extends Collection<E>> S test01(S param){\n" +
				"	 	System.out.println(\"SUCCESS\");\n" +
				"	 	return null;\n" +
				"	 }\n" +
				"	 \n" +
				"	 public void test02() {\n" +
				"	 	test01(new Vector<String>());\n" +
				"	 }\n" +
				"\n" +
				"	 public static void main(String[] args) {\n" +
				"		new X().test02();\n" +
				"	}\n" +
				"}\n" ,
			},
			"SUCCESS");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=82250
	public void test0453() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T extends I & I> {}\n" +
				"interface I {}\n" ,
			},
			"----------\n" +
			"1. ERROR in X.java (at line 1)\n" +
			"	public class X<T extends I & I> {}\n" +
			"	                             ^\n" +
			"Duplicate bound I\n" +
			"----------\n"
		);
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=82504
	public void test0454() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T, U extends X> {\n" +
				"	Object[] objectArr;\n" +
				"	void foo(T t) {\n" +
				"		T x1= (T) objectArr;\n" +
				"		U x2= (U) objectArr;\n" +
				"		int[] x= (int[]) t;\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 1)\n" +
			"	public class X<T, U extends X> {\n" +
			"	                            ^\n" +
			"X is a raw type. References to generic type X<T,U> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 4)\n" +
			"	T x1= (T) objectArr;\n" +
			"	      ^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from Object[] to T\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 5)\n" +
			"	U x2= (U) objectArr;\n" +
			"	      ^^^^^^^^^^^^^\n" +
			"Cannot cast from Object[] to U\n" +
			"----------\n");
	}


	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=81719
	public void test0455() {
		this.runConformTest(
			new String[] {
				"AbstractTest.java",
				"public abstract class AbstractTest<T> {\n" +
				"  abstract void array(T[] a);\n" +
				"  abstract void type(T a);\n" +
				"  abstract T[] foo();\n" +
				"}\n",
			},
			"");

		this.runConformTest(
			new String[] {
				"Test.java",
				"public class Test<T> extends AbstractTest<T> {\n" +
				"  void array(T[] a) {}\n" +
				"  void type(T a) {}\n" +
				"  T[] foo() { return null; }\n" +
				"}\n",
			},
			"",
			null,
			false, // do not flush output
			null);
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=81721
	public void test0456() {
		this.runConformTest(
			new String[] {
				"X.java",
				"interface I<T> {\n" +
				"	<S extends T> void doTest(S[] a);\n" +
				"}\n" +
				"\n" +
				"abstract class AbstractTest<U> implements I<U> {\n" +
				"	public <V extends U> void doTest(V[] a) {}\n" +
				"}\n" +
				"\n" +
				"public class X<M> extends AbstractTest<M> {}\n",
			},
			"");
	}

	public void test0457() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.List;\n" +
				"\n" +
				"public class X {\n" +
				"	\n" +
				" void add(List<? super X> l) { \n" +
				" 	l.add(new X()); \n" +
				" }\n" +
				" void add2(List<? extends X> l) { \n" +
				" 	l.add(new X()); \n" +
				" }\n" +
				" \n" +
				" static <T> void add3(List<T> l, List<T> l2) { \n" +
				" }\n" +
				" public static void main(String[] args) {\n" +
				"	List<X> lx = null;\n" +
				"	List<String> ls = null;\n" +
				"	add3(lx, ls);\n" +
				" } \n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 9)\n" +
			"	l.add(new X()); \n" +
			"	  ^^^\n" +
			"The method add(capture#2-of ? extends X) in the type List<capture#2-of ? extends X> is not applicable for the arguments (X)\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 17)\n" +
			"	add3(lx, ls);\n" +
			"	^^^^\n" +
			"The method add3(List<T>, List<T>) in the type X is not applicable for the arguments (List<X>, List<String>)\n" +
			"----------\n");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=82243
	public void test0458() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"interface A<E>{\n" +
				"	E getOne();\n" +
				"}\n" +
				"\n" +
				"\n" +
				"abstract class B<T extends Number> implements A<T> {\n" +
				"	Number getTwo() {\n" +
				"		return getOne(); // succeeds\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"abstract class C extends B<Integer> {\n" +
				"}\n" +
				"\n" +
				"public class X {\n" +
				"	void foo(A a, B b, C c){\n" +
				"		Object o= a.getOne();\n" +
				"		Number n1= b.getOne(); // fails\n" +
				"		Number n2= b.getTwo(); // succeeds, but inlining fails\n" +
				"		Integer i = c.getOne(); // succeeds\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 16)\n" +
			"	void foo(A a, B b, C c){\n" +
			"	         ^\n" +
			"A is a raw type. References to generic type A<E> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 16)\n" +
			"	void foo(A a, B b, C c){\n" +
			"	              ^\n" +
			"B is a raw type. References to generic type B<T> should be parameterized\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 18)\n" +
			"	Number n1= b.getOne(); // fails\n" +
			"	           ^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Object to Number\n" +
			"----------\n");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=78027 - variation (check unchecked warnings)
	public void test0459() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X \n" +
				"{\n" +
				"Zork z;\n" +
				"}\n" +
				"\n" +
				"interface ITest<C extends X>\n" +
				"{ \n" +
				"}\n" +
				"\n" +
				"abstract class Test<C extends X> implements ITest<C>\n" +
				"{\n" +
				"  protected Manager<C> m_manager;\n" +
				"  \n" +
				"  public ITest<C> get()\n" +
				"  {\n" +
				"    return m_manager.getById(getClass(), Integer.valueOf(1));\n" +
				"  }\n" +
				"    \n" +
				"  public static class Manager<C extends X>\n" +
				"  {\n" +
				"    public <T extends ITest<C>> T getById(Class<T> cls, Integer id)\n" +
				"    {\n" +
				"      return null;\n" +
				"    }\n" +
				"  }\n" +
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 3)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 16)\n" + 
			"	return m_manager.getById(getClass(), Integer.valueOf(1));\n" + 
			"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation getById(Class<capture#1-of ? extends Test>, Integer) of the generic method getById(Class<T>, Integer) of type Test.Manager<C>\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 16)\n" + 
			"	return m_manager.getById(getClass(), Integer.valueOf(1));\n" + 
			"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: The expression of type Test needs unchecked conversion to conform to ITest<C>\n" + 
			"----------\n");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=82439
	public void test0460() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"\n" +
				"public class X {\n" +
				"\n" +
				"	public <E extends Object, S extends Collection<E>> S test(S param) {\n" +
				"		\n" +
				"		Class<? extends Collection> c = param.getClass(); // ok\n" +
				"		Class<? extends Collection> d = getClazz(); // ko\n" +
				"		return null;\n" +
				"	}\n" +
				"	Class<? extends Object> getClazz() {\n" +
				"		return null;\n" +
				"	}\n" +
				"}\n" +
				"abstract class Z implements Collection<String> {\n" +
				"	void foo() {\n" +
				"		Class<? extends Collection> c = getClass(); // ok\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 7)\n" +
			"	Class<? extends Collection> c = param.getClass(); // ok\n" +
			"	                ^^^^^^^^^^\n" +
			"Collection is a raw type. References to generic type Collection<E> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 8)\n" +
			"	Class<? extends Collection> d = getClazz(); // ko\n" +
			"	                ^^^^^^^^^^\n" +
			"Collection is a raw type. References to generic type Collection<E> should be parameterized\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 8)\n" +
			"	Class<? extends Collection> d = getClazz(); // ko\n" +
			"	                                ^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Class<capture#2-of ? extends Object> to Class<? extends Collection>\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 17)\n" +
			"	Class<? extends Collection> c = getClass(); // ok\n" +
			"	                ^^^^^^^^^^\n" +
			"Collection is a raw type. References to generic type Collection<E> should be parameterized\n" +
			"----------\n");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=82844
	public void test0461() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T extends int[]> {\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 1)\n" +
			"	public class X<T extends int[]> {\n" +
			"	                         ^^^^^\n" +
			"The array type int[] cannot be used as a type parameter bound\n" +
			"----------\n");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=79628
	public void test0462() {
		this.runConformTest(
			new String[] {
				"PropertiedObject.java",
				"interface PropertiedObject<B extends PropertiedObject<B>> {}\n" +
				"interface Model extends PropertiedObject<Model> {}\n" +
				"interface View<T extends Model,U> extends PropertiedObject<View<?,?>> {}\n"
			},
			"");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=79144
	public void test0463() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.Set;\n" +
				"public class X {\n" +
				"   Zork z;\n" +
				"	public Set<String>[] test() {\n" +
				"	   Set[] sets = new Set[10];\n" +
				"	   return sets;\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 5)\n" +
			"	Set[] sets = new Set[10];\n" +
			"	^^^\n" +
			"Set is a raw type. References to generic type Set<E> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 6)\n" +
			"	return sets;\n" +
			"	       ^^^^\n" +
			"Type safety: The expression of type Set[] needs unchecked conversion to conform to Set<String>[]\n" +
			"----------\n");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=79144
	// SHOULD FAIL AT 1.8 (RET): Type mismatch: cannot convert from List<String> to List
	public void test0464() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"\n" +
				"public class X {\n" +
				"    Zork z;\n" +
				"    public static void main(String[] args) {\n" +
				"        List<Integer>[] nums = new List[] {Collections.singletonList(\"Uh oh\")};\n" +
				"        System.out.println(nums[0].get(0).intValue());\n" +
				"    } \n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 6)\n" +
			"	List<Integer>[] nums = new List[] {Collections.singletonList(\"Uh oh\")};\n" +
			"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The expression of type List[] needs unchecked conversion to conform to List<Integer>[]\n" +
			"----------\n");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=82547
	public void test0465() {
		this.runNegativeTest(
			new String[] {
				"Cla.java",
				"class Cla<T> {\n" +
				"    T getT() {\n" +
				"        return null;\n" +
				"    }\n" +
				"    \n" +
				"    void m() {\n" +
				"        String s= new Cla<String>.getT();\n" +
				"    }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in Cla.java (at line 7)\n" +
			"	String s= new Cla<String>.getT();\n" +
			"	              ^^^^^^^^^^^^^^^^\n" +
			"Cla.getT cannot be resolved to a type\n" +
			"----------\n");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=83096
	public void test0466() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<A, A> { }\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 1)\n" +
			"	public class X<A, A> { }\n" +
			"	                  ^\n" +
			"Duplicate type parameter A\n" +
			"----------\n"
		);
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=82671
	public void test0467() {
		this.runConformTest(
			new String[] {
				"test/Foo.java",
				"package test; \n" +
				"public class Foo { \n" +
				"   protected String s; \n" +
				"   protected String dosomething(){ return \"done\"; } \n" +
				"   protected class Bar {} \n" +
				"} \n",
				"test02/FooBar.java",
				"package test02; \n" +
				"import test.Foo; \n" +
				"public class FooBar<R> extends Foo { \n" +
				"   void fail() { \n" +
				"      FooBar f = new FooBar(); \n" +
				"      f.s = \"foo\"; \n" +
				"      this.s = \"foo\";\n" +
				"      f.dosomething(); \n" +
				"      this.dosomething();  \n" +
				"      Bar b1; \n" +
				"      FooBar.Bar b2; \n" +
				"      Foo.Bar b3; \n" +
				"   } \n" +
				"}\n"
			},
			""
		);
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=82671 - variation
	public void test0468() {
		this.runConformTest(
			new String[] {
				"test/Foo.java",
				"package test; \n" +
				"public class Foo { \n" +
				"   String s; \n" +
				"   String dosomething(){ return \"done\"; } \n" +
				"   class Bar {} \n" +
				"} \n",
				"test/FooBar.java",
				"package test; \n" +
				"import test.Foo; \n" +
				"public class FooBar<R> extends Foo { \n" +
				"   void fail() { \n" +
				"      FooBar f = new FooBar(); \n" +
				"      f.s = \"foo\"; \n" +
				"      this.s = \"foo\";\n" +
				"      f.dosomething(); \n" +
				"      this.dosomething();  \n" +
				"      Bar b1; \n" +
				"      FooBar.Bar b2; \n" +
				"      Foo.Bar b3; \n" +
				"   } \n" +
				"}\n"
			},
			""
		);
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=83083
	public void test0469() {
		this.runConformTest(
			new String[] {
				"a/C.java",
				"package a; \n" +
				"import p.B; \n" +
				"public class C extends B { \n" +
				"	public void foo(Object obj) {} \n" +
				"} \n",
				"p/B.java",
				"package p; \n" +
				"public class B<E> extends A<E> {} \n",
				"p/A.java",
				"package p; \n" +
				"public class A<E> { \n" +
				"	public void foo(E e) {} \n" +
				"}\n",
			},
			""
		);
		this.runConformTest(
			new String[] {
				"a/C.java",
				"package a; \n" +
				"import p.B; \n" +
				"public class C extends B { \n" +
				"	public void foo(Object obj) {} \n" +
				"} \n",
				"p/A.java",
				"package p; \n" +
				"public class A<E> { \n" +
				"	public void foo(E e) {} \n" +
				"}\n",
			},
			"",
			null,
			false, // do not flush output
			null);
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=83225
	public void test0470() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public static <T> T choose(boolean b, T t1, T t2) {\n" +
				"		if (b)\n" +
				"			return t1;\n" +
				"		return t2;\n" +
				"	}\n" +
				"\n" +
				"	public static void foo() {\n" +
				"		Comparable s1 = choose(true, \"string\", Integer.valueOf(1));\n" +
				"		Number s2 = choose(true, Integer.valueOf(1), Float.valueOf(2));\n" +
				"		Comparable s3 = choose(true, Integer.valueOf(1), Float.valueOf(2));\n" +
				"		Cloneable s4 = choose(true, Integer.valueOf(1), Float.valueOf(2));\n" +
				"		Cloneable s5 = choose(true, \"string\", Integer.valueOf(1));\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 9)\n" +
			"	Comparable s1 = choose(true, \"string\", Integer.valueOf(1));\n" +
			"	^^^^^^^^^^\n" +
			"Comparable is a raw type. References to generic type Comparable<T> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 11)\n" +
			"	Comparable s3 = choose(true, Integer.valueOf(1), Float.valueOf(2));\n" +
			"	^^^^^^^^^^\n" +
			"Comparable is a raw type. References to generic type Comparable<T> should be parameterized\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 12)\n" +
			"	Cloneable s4 = choose(true, Integer.valueOf(1), Float.valueOf(2));\n" +
			"	               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from "+intersection("Number","Comparable<?>")+" to Cloneable\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 13)\n" +
			"	Cloneable s5 = choose(true, \"string\", Integer.valueOf(1));\n" +
			"	               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from "+intersection("Object","Serializable","Comparable<?>")+" to Cloneable\n" +
			"----------\n");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=82671 - variation
	public void test0471() {
		this.runNegativeTest(
			new String[] {
				"test/Foo.java",
				"package test; \n" +
				"public class Foo<R> { \n" +
				"   protected R s; \n" +
				"   protected R dosomething(){ return s; } \n" +
				"   protected class Bar {} \n" +
				"} \n",
				"test02/FooBar.java",
				"package test02; \n" +
				"import test.Foo; \n" +
				"public class FooBar<R> extends Foo<R> { \n" +
				"   void fail() { \n" +
				"      FooBar<String> f = new FooBar<String>(); \n" +
				"      f.s = \"foo\"; \n" +
				"      this.s = \"foo\";\n" +
				"      f.dosomething(); \n" +
				"      this.dosomething();  \n" +
				"      Bar b1; \n" +
				"      FooBar<String>.Bar b2; \n" +
				"      Foo<String>.Bar b3; \n" +
				"   } \n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in test02\\FooBar.java (at line 7)\n" +
			"	this.s = \"foo\";\n" +
			"	         ^^^^^\n" +
			"Type mismatch: cannot convert from String to R\n" +
			"----------\n"	);
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=82671 - variation
	public void test0472() {
		this.runNegativeTest(
			new String[] {
				"test/Foo.java",
				"package test; \n" +
				"public class Foo<R> { \n" +
				"   private R s; \n" +
				"   private R dosomething(){ return s; } \n" +
				"   private class Bar {} \n" +
				"} \n",
				"test02/FooBar.java",
				"package test02; \n" +
				"import test.Foo; \n" +
				"public class FooBar<R> extends Foo<R> { \n" +
				"   void fail() { \n" +
				"      FooBar<String> f = new FooBar<String>(); \n" +
				"      f.s = \"foo\"; \n" +
				"      this.s = \"foo\";\n" +
				"      f.dosomething(); \n" +
				"      this.dosomething();  \n" +
				"      Bar b1; \n" +
				"      FooBar<String>.Bar b2; \n" +
				"      Foo<String>.Bar b3; \n" +
				"   } \n" +
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in test02\\FooBar.java (at line 6)\n" + 
			"	f.s = \"foo\"; \n" + 
			"	  ^\n" + 
			"The field Foo<String>.s is not visible\n" + 
			"----------\n" + 
			"2. ERROR in test02\\FooBar.java (at line 7)\n" + 
			"	this.s = \"foo\";\n" + 
			"	     ^\n" + 
			"The field Foo<R>.s is not visible\n" + 
			"----------\n" + 
			"3. ERROR in test02\\FooBar.java (at line 7)\n" + 
			"	this.s = \"foo\";\n" + 
			"	         ^^^^^\n" + 
			"Type mismatch: cannot convert from String to R\n" + 
			"----------\n" + 
			"4. ERROR in test02\\FooBar.java (at line 8)\n" + 
			"	f.dosomething(); \n" + 
			"	  ^^^^^^^^^^^\n" + 
			"The method dosomething() from the type Foo<String> is not visible\n" + 
			"----------\n" + 
			"5. ERROR in test02\\FooBar.java (at line 9)\n" + 
			"	this.dosomething();  \n" + 
			"	     ^^^^^^^^^^^\n" + 
			"The method dosomething() from the type Foo<R> is not visible\n" + 
			"----------\n" + 
			"6. ERROR in test02\\FooBar.java (at line 10)\n" + 
			"	Bar b1; \n" + 
			"	^^^\n" + 
			"The type Bar is not visible\n" + 
			"----------\n" + 
			"7. ERROR in test02\\FooBar.java (at line 11)\n" + 
			"	FooBar<String>.Bar b2; \n" + 
			"	^^^^^^^^^^^^^^^^^^\n" + 
			"The type FooBar.Bar is not visible\n" + 
			"----------\n" + 
			"8. ERROR in test02\\FooBar.java (at line 12)\n" + 
			"	Foo<String>.Bar b3; \n" + 
			"	^^^^^^^^^^^^^^^\n" + 
			"The type Foo.Bar is not visible\n" + 
			"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=81594
	public void test0473() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"public class X\n" +
				"{\n" +
				"	List<B> itsList;\n" +
				"	B itsB;\n" +
				"	MyTyped itsTyped;\n" +
				"	\n" +
				"	\n" +
				"	public void test()\n" +
				"	{\n" +
				"		method (itsList, itsB, itsTyped);\n" +
				"	}\n" +
				"	\n" +
				"	public <T> void method (List<? extends T> arg1, T arg2, Typed<? super T> arg3)\n" +
				"	{\n" +
				"	}\n" +
				"	\n" +
				"	interface A{}\n" +
				"	class B implements A{}\n" +
				"	class Typed<T>{}\n" +
				"	class MyTyped extends Typed<A>{}\n" +
				"\n" +
				"}\n"
			},
			"");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=81594 - variation
	public void test0474() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	Typed<B> itsList;\n" +
				"	Typed<A> itsTyped;\n" +
				"	public void test() {\n" +
				"		method(itsList, itsTyped);\n" +
				"	}\n" +
				"	public <T> void method(Typed<? extends T> arg1, Typed<? super T> arg3) {\n" +
				"	}\n" +
				"	interface A {\n" +
				"	}\n" +
				"	class B implements A {\n" +
				"	}\n" +
				"	class Typed<T> {\n" +
				"	}\n" +
				"}\n"
			},
			"");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=83398
	public void test0475() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.List;\n" +
				"\n" +
				"public class X {\n" +
				"    void method(List<? super Number> list) {\n" +
				"        list.add(new Object());   // should fail\n" +
				"        list.add(Integer.valueOf(3)); // correct\n" +
				"    }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	list.add(new Object());   // should fail\n" +
			"	     ^^^\n" +
			"The method add(capture#1-of ? super Number) in the type List<capture#1-of ? super Number> is not applicable for the arguments (Object)\n" +
			"----------\n");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=83398 - variation
	public void test0476() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.List;\n" +
				"\n" +
				"public class X {\n" +
				"    void method(List<? super Number> list, List<Object> lo) {\n" +
				"    	list = lo;\n" +
				"    	lo = list;\n" +
				"    }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	lo = list;\n" +
			"	     ^^^^\n" +
			"Type mismatch: cannot convert from List<capture#2-of ? super Number> to List<Object>\n" +
			"----------\n");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=83398 - variation
	public void test0477() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"public class X<T extends Number> {\n" +
				"	List<? super T> lhs;\n" +
				"	List<? extends Number> rhs;\n" +
				"	{\n" +
				"		lhs.add(rhs.get(0));\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	lhs.add(rhs.get(0));\n" +
			"	    ^^^\n" +
			"The method add(capture#1-of ? super T) in the type List<capture#1-of ? super T> is not applicable for the arguments (capture#2-of ? extends Number)\n" +
			"----------\n");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=83398 - variation
	public void test0478() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"public class X<U extends Number> {\n" +
				"	List<? super Number> lhs;\n" +
				"	List<? super U> rhs;\n" +
				"	{\n" +
				"		lhs.add(rhs.get(0));\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	lhs.add(rhs.get(0));\n" +
			"	    ^^^\n" +
			"The method add(capture#1-of ? super Number) in the type List<capture#1-of ? super Number> is not applicable for the arguments (capture#2-of ? super U)\n" +
			"----------\n");
	}


	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=83398 - variation
	public void test0479() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"public class X<U extends Number> {\n" +
				"	List<? super Number> lhs;\n" +
				"	List<? extends U> rhs;\n" +
				"	{\n" +
				"		lhs.add(rhs.get(0));\n" +
				"	}\n" +
				"}\n"
			},
			"");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=83398 - variation
	public void test0480() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"public class X<U extends Number> {\n" +
				"	List<? super Integer> lhs;\n" +
				"	List<? extends Number> rhs;\n" +
				"	{\n" +
				"		lhs.add(rhs.get(0));\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	lhs.add(rhs.get(0));\n" +
			"	    ^^^\n" +
			"The method add(capture#1-of ? super Integer) in the type List<capture#1-of ? super Integer> is not applicable for the arguments (capture#2-of ? extends Number)\n" +
			"----------\n");
	}


	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=83398 - variation
	public void test0481() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"public class X<U extends Number> {\n" +
				"	List<? super Number> lhs;\n" +
				"	List<? super Integer> rhs;\n" +
				"	{\n" +
				"		lhs.add(rhs.get(0));\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	lhs.add(rhs.get(0));\n" +
			"	    ^^^\n" +
			"The method add(capture#1-of ? super Number) in the type List<capture#1-of ? super Number> is not applicable for the arguments (capture#2-of ? super Integer)\n" +
			"----------\n");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=83799
	public void test0482() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public final class X {\n" +
				"	public <T> void testEquals(final String x, T one, T two) {\n" +
				"	}\n" +
				"\n" +
				"	public <T1, T2> void testEqualsAlt(final String x, T1 one, T2 two) {\n" +
				"	}\n" +
				"\n" +
				"	public interface Fooey {\n" +
				"	}\n" +
				"\n" +
				"	public interface Bar extends Fooey {\n" +
				"	}\n" +
				"\n" +
				"	public interface GenericFooey<T> {\n" +
				"	}\n" +
				"\n" +
				"	public interface GenericBar<T> extends GenericFooey<T> {\n" +
				"	}\n" +
				"\n" +
				"	public void testGeneric() {\n" +
				"		testEquals(\"Should work\", new GenericBar<Long>() {\n" +
				"		}, new GenericBar<Long>() {\n" +
				"		});\n" +
				"		final GenericBar<Long> child = new GenericBar<Long>() {\n" +
				"		};\n" +
				"		final GenericFooey<Long> parent = child;\n" +
				"		testEquals(\"Doesn\'t work but should\", child, parent); // this\n" +
				"		// fails\n" +
				"		// but should work it\'s identical to next line.\n" +
				"		testEquals(\"Doesn\'t work but should\", (GenericFooey<Long>) child, parent);\n" +
				"		testEqualsAlt(\"Should work\", child, parent);\n" +
				"	}\n" +
				"	public void test() {\n" +
				"		testEquals(\"Should work\", new Bar() {\n" +
				"		}, new Bar() {\n" +
				"		});\n" +
				"		final Bar child = new Bar() {\n" +
				"		};\n" +
				"		final Fooey parent = child;\n" +
				"		testEquals(\"Doesn\'t work but should\", child, parent);\n" +
				"		testEquals(\"Doesn\'t work but should\", (Fooey) child, parent);\n" +
				"		testEqualsAlt(\"Should work\", child, parent);\n" +
				"	}\n" +
				"}\n"
			},
			"");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=83904
	public void test0483() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"class Y<T extends Number> {\n" +
				"}\n" +
				"\n" +
				"public class X {\n" +
				"    public static void main(String argv[]) {\n" +
				"        m(new Y<Short>(), new Y<Integer>());\n" +
				"    }\n" +
				"\n" +
				"    public static <T extends Number> void m(Y<T> x, Y<T> y) {\n" +
				"    }\n" +
				"}\n" +
				"\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	m(new Y<Short>(), new Y<Integer>());\n" +
			"	^\n" +
			"The method m(Y<T>, Y<T>) in the type X is not applicable for the arguments (Y<Short>, Y<Integer>)\n" +
			"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=82349
	public void test0484() {
		this.runConformTest(
			new String[] {
				"X.java",
				"class Base<T> {\n" +
				"	public class Inner {\n" +
				"	}\n" +
				"	Inner a;\n" +
				"}\n" +
				"\n" +
				"public class X extends Base<Integer> {\n" +
				"	class DerivedInner extends Inner {\n" +
				"	}\n" +
				"	X() {\n" +
				"		a = new DerivedInner();\n" +
				"	}\n" +
				"}\n"
			},
			"");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=82349 - variation
	public void test0485() {
		this.runConformTest(
			new String[] {
				"X.java",
				"class Base<T> {\n" +
				"	public class Inner<U> {\n" +
				"	}\n" +
				"	Inner a;\n" +
				"}\n" +
				"\n" +
				"public class X extends Base<Integer> {\n" +
				"	class DerivedInner extends Inner {\n" +
				"	}\n" +
				"	X() {\n" +
				"		a = new DerivedInner();\n" +
				"	}\n" +
				"}\n"
			},
			"");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=82349 - variation
	public void test0486() {
		this.runConformTest(
			new String[] {
				"X.java",
				"class Base<T> {\n" +
				"	public class Inner<U> {\n" +
				"	}\n" +
				"	Inner a;\n" +
				"}\n" +
				"\n" +
				"public class X extends Base<Integer> {\n" +
				"	class DerivedInner extends Inner<Float> {\n" +
				"	}\n" +
				"	X() {\n" +
				"		a = new DerivedInner();\n" +
				"	}\n" +
				"}\n"
			},
			"");
	}
	public void test0487() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"\n" +
				"public class X {\n" +
				"	void foo(List<String> ls) {\n" +
				"		List<?> l = ls;\n" +
				"		bar(l, \"\"); \n" +
				"	}\n" +
				"	<T> void bar(List<? super T> l, T t) {\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	bar(l, \"\"); \n" +
			"	^^^\n" +
			"The method bar(List<? super T>, T) in the type X is not applicable for the arguments (List<capture#1-of ?>, String)\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=84496
	public void test0488() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public static void main(String[] args) {\n" +
				"        Foo<?> f1 = new Foo<Integer>();\n" +
				"        Foo<?> f2 = new Foo<String>();\n" +
				"        f1.bar = f2.bar;\n" +
				"    }\n" +
				"    static class Foo<T> {\n" +
				"       Bar<T> bar = new Bar<T>();\n" +
				"    }\n" +
				"    static class Bar<T> {\n" +
				"        T t;\n" +
				"    }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	f1.bar = f2.bar;\n" +
			"	         ^^^^^^\n" +
			"Type mismatch: cannot convert from X.Bar<capture#2-of ?> to X.Bar<capture#1-of ?>\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=84496
	public void test0489() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public static void main(String[] args) {\n" +
				"        Foo<?> f1 = new Foo<Integer>();\n" +
				"        f1.bar = f1.bar;\n" +
				"    }\n" +
				"    static class Foo<T> {\n" +
				"       Bar<T> bar = new Bar<T>();\n" +
				"    }\n" +
				"    static class Bar<T> {\n" +
				"        T t;\n" +
				"    }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	f1.bar = f1.bar;\n" +
			"	         ^^^^^^\n" +
			"Type mismatch: cannot convert from X.Bar<capture#2-of ?> to X.Bar<capture#1-of ?>\n" +
			"----------\n");
	}
	public void test0490() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"	T t;\n" +
				"	void foo(X<?> lhs, X<?> rhs) {\n" +
				"		lhs = rhs;\n" +
				"		lhs.t = rhs.t;\n" +
				"	}\n" +
				"	void bar(X<X<?>> lhs, X<X<?>> rhs) {\n" +
				"		lhs = rhs;\n" +
				"		lhs.t = rhs.t;\n" +
				"	}}\n" +
				"\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	lhs.t = rhs.t;\n" +
			"	        ^^^^^\n" +
			"Type mismatch: cannot convert from capture#4-of ? to capture#3-of ?\n" +
			"----------\n");
	}

	public void test0491() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"	T t;\n" +
				"	void foo(X<?> lhs, X<?> rhs) {\n" +
				"		lhs = rhs;\n" +
				"		lhs.t = rhs.t;\n" +
				"	}\n" +
				"	void bar(X<X<?>> lhs, X<X<?>> rhs) {\n" +
				"		lhs = rhs;\n" +
				"		lhs.t = rhs.t;\n" +
				"	}\n" +
				"	void baz(X<? super Number> lhs, X<? extends Number> rhs) {\n" +
				"		lhs = rhs;\n" +
				"		lhs.t = rhs.t;\n" +
				"	}\n" +
				"	void baz2(X<? extends Number> lhs, X<? extends Number> rhs) {\n" +
				"		lhs = rhs;\n" +
				"		lhs.t = rhs.t;\n" +
				"	}\n" +
				"	void baz3(X<? extends Number> lhs, X<? super Number> rhs) {\n" +
				"		lhs = rhs;\n" +
				"		lhs.t = rhs.t;\n" +
				"	}\n" +
				"	void baz4(X<? super Number> lhs, X<? super Number> rhs) {\n" +
				"		lhs = rhs;\n" +
				"		lhs.t = rhs.t;\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	lhs.t = rhs.t;\n" +
			"	        ^^^^^\n" +
			"Type mismatch: cannot convert from capture#4-of ? to capture#3-of ?\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 12)\n" +
			"	lhs = rhs;\n" +
			"	      ^^^\n" +
			"Type mismatch: cannot convert from X<capture#8-of ? extends Number> to X<? super Number>\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 17)\n" +
			"	lhs.t = rhs.t;\n" +
			"	        ^^^^^\n" +
			"Type mismatch: cannot convert from capture#14-of ? extends Number to capture#13-of ? extends Number\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 20)\n" +
			"	lhs = rhs;\n" +
			"	      ^^^\n" +
			"Type mismatch: cannot convert from X<capture#16-of ? super Number> to X<? extends Number>\n" +
			"----------\n" +
			"5. ERROR in X.java (at line 21)\n" +
			"	lhs.t = rhs.t;\n" +
			"	        ^^^^^\n" +
			"Type mismatch: cannot convert from capture#18-of ? super Number to capture#17-of ? extends Number\n" +
			"----------\n" +
			"6. ERROR in X.java (at line 25)\n" +
			"	lhs.t = rhs.t;\n" +
			"	        ^^^^^\n" +
			"Type mismatch: cannot convert from capture#22-of ? super Number to capture#21-of ? super Number\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=81576
	public void test0492() {
		this.runConformTest(
			new String[] {
				"SuperType.java",//====================================
				"public class SuperType<T> {\n" +
				"	protected InnerType valueWrapper;\n" +
				"	protected class InnerType {\n" +
				"		private T value;\n" +
				"		protected InnerType(T value) {\n" +
				"			this.value = value;\n" +
				"		}\n" +
				"	}\n" +
				"	public SuperType(T value) {\n" +
				"		/*\n" +
				"		 * This constructor exists only to show that the usage of the inner\n" +
				"		 * class within its enclosing class makes no problems\n" +
				"		 */\n" +
				"		this.valueWrapper = new InnerType(value);\n" +
				"	}\n" +
				"	protected SuperType() {\n" +
				"		// Provided for the convenience of subclasses\n" +
				"	}\n" +
				"}\n",
				"SubType.java",//====================================
				"public class SubType<T> extends SuperType<T> {\n" +
				"\n" +
				"	public SubType(T value) {\n" +
				"\n" +
				"		/* The constructor SuperType <T>.InnerType(T) is undefined */\n" +
				"		InnerType localValueWrapper = new InnerType(value);\n" +
				"\n" +
				"		/*\n" +
				"		 * Type mismatch: cannot convert from SuperType <T>.InnerType to\n" +
				"		 * SuperType <T>.InnerType\n" +
				"		 * \n" +
				"		 * Type safety: The expression of raw type SuperType.InnerType is\n" +
				"		 * converted to SuperType <T>.InnerType. References to generic type\n" +
				"		 * SuperType <T>.InnerType should be parametrized.\n" +
				"		 */\n" +
				"		localValueWrapper = super.valueWrapper;\n" +
				"	}\n" +
				"\n" +
				"}\n"
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=83611
	public void test0493() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public class M<T> { M(Class<T> templateClass) {} }\n" +
				"}\n",
				"Y.java",
				"public class Y extends X {\n" +
				"	void test() { M<X> m = new M<X>(X.class); }\n" +
				"}\n"
			},
			""
		);
		this.runConformTest(
			new String[] {
				"Y.java",
				"public class Y extends X {\n" +
				"	void test() { M<X> m = new M<X>(X.class); }\n" +
				"}\n"
			},
			"",
			null,
			false,
			null
		);
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=83615
	public void test0494() {
		String xSource =
				"public class X {\n" +
				"\n" +
				"	public static void main(String[] args) {\n" +
				"		Number n= null;\n" +
				"		Integer i= null;\n" +
				"		new X().nextTry(i, n);\n" +
				"		new X().nextTry2(n, i);\n" +
				"	}	\n" +
				"	\n" +
				"	<I, N extends I> void nextTry(I i, N n) {}\n" +
				"	\n" +
				"	<N, I extends N> void nextTry2(N n, I i) {}	\n" +
				"}\n";
		if (this.complianceLevel < ClassFileConstants.JDK1_8) {
			this.runNegativeTest(
				new String[] {
					"X.java",
					xSource
				},
				"----------\n" +
				"1. ERROR in X.java (at line 6)\n" +
				"	new X().nextTry(i, n);\n" +
				"	        ^^^^^^^\n" +
				"Bound mismatch: The generic method nextTry(I, N) of type X is not applicable for the arguments (Integer, Number). The inferred type Number is not a valid substitute for the bounded parameter <N extends I>\n" +
				"----------\n");
		} else {
			runConformTest(new String[] { "X.java", xSource });
		}
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=84422
	public void test0495() {
		this.runConformTest(
			new String[] {
				"X.java",//====================================
				"import java.util.*;\n" +
				"\n" +
				"public class X {\n" +
				"	List l= null; \n" +
				"\n" +
				"	void add(String s) {\n" +
				"		l.add(s);\n" +
				"	}\n" +
				"	\n" +
				"	void addAll(String[] ss) {\n" +
				"		l.addAll(Arrays.asList(ss));\n" +
				"	}\n" +
				"	\n" +
				"	String[] get() {\n" +
				"		return (String[])l.toArray(new String[l.size()]);\n" +
				"	}\n" +
				"}\n"
			},
			"");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=84593
	public void test0496() {
		this.runConformTest(
			new String[] {
				"X.java",//====================================
				"class Super<S> {\n" +
				"	class A<E> { }\n" +
				"	<T> void take(A<S> o) {\n" +
				"		System.out.println(\"SUCCESS\");\n" +
				"	}\n" +
				"}\n" +
				"class Sub extends Super<Double> {\n" +
				"	void test() {\n" +
				"		take(new A());\n" +
				"	}\n" +
				"}\n" +
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		new Sub().test();\n" +
				"	}\n" +
				"}\n"
			},
			"SUCCESS");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=84593 - variation - uncheck warnings
	public void test0497() {
		this.runNegativeTest(
			new String[] {
				"X.java",//====================================
				"class Super<S> {\n" +
				"	class A<E> { }\n" +
				"	<T> void take(A<S> o) {\n" +
				"	}\n" +
				"}\n" +
				"class Sub extends Super<Double> {\n" +
				"	void test() {\n" +
				"		take(new A());\n" +
				"	}\n" +
				"}\n" +
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		new Sub().test();\n" +
				"		Zork z;\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 8)\n" + 
			"	take(new A());\n" + 
			"	^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation take(Super.A) of the generic method take(Super<S>.A<S>) of type Super<Double>\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 8)\n" + 
			"	take(new A());\n" + 
			"	     ^^^^^^^\n" + 
			"Type safety: The expression of type Super.A needs unchecked conversion to conform to Super<Double>.A<Double>\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 8)\n" + 
			"	take(new A());\n" + 
			"	         ^\n" + 
			"Super.A is a raw type. References to generic type Super<S>.A<E> should be parameterized\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 14)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
	}

// https://bugs.eclipse.org/bugs/show_bug.cgi?id=84743 - variation in -source 1.4 mode but 1.5 compliance (ignore covariance)
public void test0498(){
	Map customOptions = getCompilerOptions();
	customOptions.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_4);
	runNegativeTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"X.java",
			"interface I {\n" +
			"   String foo();\n" +
			"}\n" +
			"interface J {\n" +
			"   Object foo();\n" +
			"}\n" +
			" \n" +
			"public class X implements I {\n" +
			"   public String foo() {\n" +
			" 	return \"\";\n" +
			"   }\n" +
			"   public static void main(String[] args) {\n" +
			"         I i = new X();\n" +
			"         try {\n" +
			"	        J j = (J) i;\n" +
			"         } catch(ClassCastException e) {\n" +
			"	        System.out.println(\"SUCCESS\");\n" +
			"         }\n" +
			"  }\n" +
			"}\n"
		},
		// compiler options
		null /* no class libraries */,
		customOptions /* custom options */,
		// compiler results
		"----------\n" + /* expected compiler log */
		"1. ERROR in X.java (at line 15)\n" +
		"	J j = (J) i;\n" +
		"	      ^^^^^\n" +
		"Cannot cast from I to J\n" +
		"----------\n",
		// javac options
		RUN_JAVAC ? /* javac test options */
			new JavacTestOptions("-source 1.4") :
			JavacTestOptions.DEFAULT );
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=85157
public void test0499(){
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"		 public static void main(String argv[]) {\n" +
			"		 		 String[] tab1 = new String[0];\n" +
			"		 		 Integer[] tab2 = new Integer[0];\n" +
			"		 		 boolean cond = true;\n" +
			"		 		 Integer[] var = cond ? tab1 : tab2;\n" +
			"		 		 System.out.println(var);\n" +
			"		 }\n" +
			"}\n"
		},
		this.complianceLevel < ClassFileConstants.JDK1_8 ? 
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	Integer[] var = cond ? tab1 : tab2;\n" +
			"	                ^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Object&Serializable&" +
			"" + intersection("Comparable<? extends Object&Serializable&" + intersection("Comparable<?>") + ">") +
			"[] to Integer[]\n" +
			"----------\n": 
				"----------\n" + 
				"1. ERROR in X.java (at line 6)\n" + 
				"	Integer[] var = cond ? tab1 : tab2;\n" + 
				"	                       ^^^^\n" + 
				"Type mismatch: cannot convert from String[] to Integer[]\n" + 
				"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=84251
public void test0500(){
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.ArrayList;\n" +
			"import java.util.Collection;\n" +
			"\n" +
			"interface Sink<T> { \n" +
			"	void flush(T t);\n" +
			"}\n" +
			"class SimpleSinkImpl<T> implements Sink<T> {\n" +
			"	public void flush(T t) {}\n" +
			"}\n" +
			"public class X {\n" +
			"\n" +
			"    private <T> T writeAll(Collection<T> coll, Sink<? super T> snk) { \n" +
			"        T last = null;\n" +
			"        for (T t : coll) { \n" +
			"            last = t;\n" +
			"            snk.flush(last);\n" +
			"        }\n" +
			"        return last;\n" +
			"    }\n" +
			"\n" +
			"    public void test01() {\n" +
			"        Sink<Object> s = new SimpleSinkImpl<Object>();\n" +
			"        Collection<String> cs = new ArrayList<String>();\n" +
			"        cs.add(\"hello!\");\n" +
			"        cs.add(\"goodbye\");\n" +
			"        cs.add(\"see you\");\n" +
			"        \n" +
			"        String str = this.writeAll(cs, s);  \n" +
			"    }\n" +
			"\n" +
			"    public static void main(String[] args) {\n" +
			"        X test = new X();\n" +
			"        \n" +
			"        test.test01();\n" +
			"    }\n" +
			"}\n"
		},
		"");
}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=85303 - variation
	public void test0501() throws Exception {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T extends AX> {\n" +
				"    T t;\n" +
				"    X(T t){\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"		X<? extends BX> x = new X<BX<String>>(new BX<String>());\n" +
				"		System.out.print(x.t.ax);\n" +
				"		System.out.print(x.t.bx);\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class AX<P> {\n" +
				"	P ax;\n" +
				"}\n" +
				"\n" +
				"class BX<Q> extends AX<Q> {\n" +
				"	Q bx;\n" +
				"}\n",
			},
			"nullnull");
		String expectedOutput =
			"  // Method descriptor #25 ([Ljava/lang/String;)V\n" +
			"  // Stack: 4, Locals: 2\n" +
			"  public static void main(java.lang.String[] args);\n" +
			"     0  new X [1]\n" +
			"     3  dup\n" +
			"     4  new BX [26]\n" +
			"     7  dup\n" +
			"     8  invokespecial BX() [28]\n" +
			"    11  invokespecial X(AX) [29]\n" +
			"    14  astore_1 [x]\n" +
			"    15  getstatic java.lang.System.out : java.io.PrintStream [31]\n" +
			"    18  aload_1 [x]\n" +
			"    19  getfield X.t : AX [16]\n" +
			"    22  checkcast BX [26]\n" +
			"    25  getfield BX.ax : java.lang.Object [37]\n" +
			"    28  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [41]\n" +
			"    31  getstatic java.lang.System.out : java.io.PrintStream [31]\n" +
			"    34  aload_1 [x]\n" +
			"    35  getfield X.t : AX [16]\n" +
			"    38  checkcast BX [26]\n" +
			"    41  getfield BX.bx : java.lang.Object [47]\n" +
			"    44  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [41]\n" +
			"    47  return\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 7]\n" +
			"        [pc: 15, line: 8]\n" +
			"        [pc: 31, line: 9]\n" +
			"        [pc: 47, line: 10]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 48] local: args index: 0 type: java.lang.String[]\n" +
			"        [pc: 15, pc: 48] local: x index: 1 type: X\n" +
			"      Local variable type table:\n" +
			"        [pc: 15, pc: 48] local: x index: 1 type: X<? extends BX>\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=85303 - variation
	public void test0502() throws Exception {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X <T extends AX> {\n" +
				"    T t;\n" +
				"    X(T t){\n" +
				"        this.t = t;\n" +
				"    }\n" +
				"    public static void main(String[] args) {\n" +
				"		X<? extends BX> x = new X<BX<String>>(new BX<String>());\n" +
				"		System.out.print(x.self().t.ax);\n" +
				"		System.out.print(x.self().t.bx);\n" +
				"	}\n" +
				"	X<T> self() {\n" +
				"		return this;\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class AX<P> {\n" +
				"	P ax;\n" +
				"}\n" +
				"\n" +
				"class BX<Q> extends AX<Q> {\n" +
				"	Q bx;\n" +
				"}\n",
			},
			"nullnull");
		String expectedOutput =
			"  // Method descriptor #25 ([Ljava/lang/String;)V\n" +
			"  // Stack: 4, Locals: 2\n" +
			"  public static void main(java.lang.String[] args);\n" +
			"     0  new X [1]\n" +
			"     3  dup\n" +
			"     4  new BX [26]\n" +
			"     7  dup\n" +
			"     8  invokespecial BX() [28]\n" +
			"    11  invokespecial X(AX) [29]\n" +
			"    14  astore_1 [x]\n" +
			"    15  getstatic java.lang.System.out : java.io.PrintStream [31]\n" +
			"    18  aload_1 [x]\n" +
			"    19  invokevirtual X.self() : X [37]\n" +
			"    22  getfield X.t : AX [16]\n" +
			"    25  checkcast BX [26]\n" +
			"    28  getfield BX.ax : java.lang.Object [41]\n" +
			"    31  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [45]\n" +
			"    34  getstatic java.lang.System.out : java.io.PrintStream [31]\n" +
			"    37  aload_1 [x]\n" +
			"    38  invokevirtual X.self() : X [37]\n" +
			"    41  getfield X.t : AX [16]\n" +
			"    44  checkcast BX [26]\n" +
			"    47  getfield BX.bx : java.lang.Object [51]\n" +
			"    50  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [45]\n" +
			"    53  return\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 7]\n" +
			"        [pc: 15, line: 8]\n" +
			"        [pc: 34, line: 9]\n" +
			"        [pc: 53, line: 10]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 54] local: args index: 0 type: java.lang.String[]\n" +
			"        [pc: 15, pc: 54] local: x index: 1 type: X\n" +
			"      Local variable type table:\n" +
			"        [pc: 15, pc: 54] local: x index: 1 type: X<? extends BX>\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=85303 - variation
	public void test0503() throws Exception {
		this.runConformTest(
				new String[] {
					"X.java",
					"class XA {}\n" + 
					"interface XB {\n" + 
					"	XB CONST = new XB(){ public String toString() { return \"SUCCESS\"; }};\n" + 
					"}\n" + 
					"class XAB extends XA implements XB {}\n" + 
					"\n" + 
					"public class X <E extends XA&XB> {\n" + 
					"	E e;\n" + 
					"  public static void main(String[] args) {\n" + 
					"	  System.out.print(new X<XAB>().e.CONST);\n" + 
					"	  new X<XAB>().foo();\n" + 
					"  }\n" + 
					"  public void foo() {\n" + 
					"    System.out.print(this.e.CONST);\n" + 
					"  }\n" + 
					"}\n",
				},
				"SUCCESSSUCCESS");		
			String expectedOutput =
				"// Signature: <E:LXA;:LXB;>Ljava/lang/Object;\n" + 
				"public class X {\n" + 
				"  \n" + 
				"  // Field descriptor #6 LXA;\n" + 
				"  // Signature: TE;\n" + 
				"  XA e;\n" + 
				"  \n" + 
				"  // Method descriptor #10 ()V\n" + 
				"  // Stack: 1, Locals: 1\n" + 
				"  public X();\n" + 
				"    0  aload_0 [this]\n" + 
				"    1  invokespecial java.lang.Object() [12]\n" + 
				"    4  return\n" + 
				"      Line numbers:\n" + 
				"        [pc: 0, line: 7]\n" + 
				"      Local variable table:\n" + 
				"        [pc: 0, pc: 5] local: this index: 0 type: X\n" + 
				"      Local variable type table:\n" + 
				"        [pc: 0, pc: 5] local: this index: 0 type: X<E>\n" + 
				"  \n" + 
				"  // Method descriptor #21 ([Ljava/lang/String;)V\n" + 
				"  // Stack: 3, Locals: 1\n" + 
				"  public static void main(java.lang.String[] args);\n" + 
				"     0  getstatic java.lang.System.out : java.io.PrintStream [22]\n" + 
				"     3  new X [1]\n" + 
				"     6  dup\n" + 
				"     7  invokespecial X() [28]\n" + 
				"    10  getfield X.e : XA [29]\n" + 
				"    13  checkcast XAB [31]\n" + 
				"    16  pop\n" + 
				"    17  getstatic XAB.CONST : XB [33]\n" + 
				"    20  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [37]\n" + 
				"    23  new X [1]\n" + 
				"    26  dup\n" + 
				"    27  invokespecial X() [28]\n" + 
				"    30  invokevirtual X.foo() : void [43]\n" + 
				"    33  return\n" + 
				"      Line numbers:\n" + 
				"        [pc: 0, line: 10]\n" + 
				"        [pc: 23, line: 11]\n" + 
				"        [pc: 33, line: 12]\n" + 
				"      Local variable table:\n" + 
				"        [pc: 0, pc: 34] local: args index: 0 type: java.lang.String[]\n" + 
				"  \n" + 
				"  // Method descriptor #10 ()V\n" + 
				"  // Stack: 2, Locals: 1\n" + 
				"  public void foo();\n" + 
				"     0  getstatic java.lang.System.out : java.io.PrintStream [22]\n" + 
				"     3  aload_0 [this]\n" + 
				"     4  getfield X.e : XA [29]\n" + 
				"     7  checkcast XB [48]\n" + 
				"    10  pop\n" + 
				"    11  getstatic XB.CONST : XB [50]\n" + 
				"    14  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [37]\n" + 
				"    17  return\n" + 
				"      Line numbers:\n" + 
				"        [pc: 0, line: 14]\n" + 
				"        [pc: 17, line: 15]\n" + 
				"      Local variable table:\n" + 
				"        [pc: 0, pc: 18] local: this index: 0 type: X\n" + 
				"      Local variable type table:\n" + 
				"        [pc: 0, pc: 18] local: this index: 0 type: X<E>\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=85303 - variation
	public void test0504() throws Exception {
		this.runConformTest(
				new String[] {
					"X.java",
					"class XA {}\n" + 
					"interface XB {\n" + 
					"	XB CONST = new XB(){ public String toString() { return \"SUCCESS\"; }};\n" + 
					"}\n" + 
					"class XAB extends XA implements XB {}\n" + 
					"\n" + 
					"public class X <E extends XA&XB> {\n" + 
					"  E e() { return null; }\n" + 
					"  public static void main(String[] args) {\n" + 
					"	  System.out.print(new X<XAB>().e().CONST);\n" + 
					"	  new X<XAB>().foo();\n" + 
					"  }\n" + 
					"  public void foo() {\n" + 
					"    System.out.print(this.e().CONST);\n" + 
					"  }\n" + 
					"}\n",
				},
				"SUCCESSSUCCESS");		
			String expectedOutput =
				"// Signature: <E:LXA;:LXB;>Ljava/lang/Object;\n" + 
				"public class X {\n" + 
				"  \n" + 
				"  // Method descriptor #6 ()V\n" + 
				"  // Stack: 1, Locals: 1\n" + 
				"  public X();\n" + 
				"    0  aload_0 [this]\n" + 
				"    1  invokespecial java.lang.Object() [8]\n" + 
				"    4  return\n" + 
				"      Line numbers:\n" + 
				"        [pc: 0, line: 7]\n" + 
				"      Local variable table:\n" + 
				"        [pc: 0, pc: 5] local: this index: 0 type: X\n" + 
				"      Local variable type table:\n" + 
				"        [pc: 0, pc: 5] local: this index: 0 type: X<E>\n" + 
				"  \n" + 
				"  // Method descriptor #17 ()LXA;\n" + 
				"  // Signature: ()TE;\n" + 
				"  // Stack: 1, Locals: 1\n" + 
				"  XA e();\n" + 
				"    0  aconst_null\n" + 
				"    1  areturn\n" + 
				"      Line numbers:\n" + 
				"        [pc: 0, line: 8]\n" + 
				"      Local variable table:\n" + 
				"        [pc: 0, pc: 2] local: this index: 0 type: X\n" + 
				"      Local variable type table:\n" + 
				"        [pc: 0, pc: 2] local: this index: 0 type: X<E>\n" + 
				"  \n" + 
				"  // Method descriptor #21 ([Ljava/lang/String;)V\n" + 
				"  // Stack: 3, Locals: 1\n" + 
				"  public static void main(java.lang.String[] args);\n" + 
				"     0  getstatic java.lang.System.out : java.io.PrintStream [22]\n" + 
				"     3  new X [1]\n" + 
				"     6  dup\n" + 
				"     7  invokespecial X() [28]\n" + 
				"    10  invokevirtual X.e() : XA [29]\n" + 
				"    13  checkcast XAB [31]\n" + 
				"    16  pop\n" + 
				"    17  getstatic XAB.CONST : XB [33]\n" + 
				"    20  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [37]\n" + 
				"    23  new X [1]\n" + 
				"    26  dup\n" + 
				"    27  invokespecial X() [28]\n" + 
				"    30  invokevirtual X.foo() : void [43]\n" + 
				"    33  return\n" + 
				"      Line numbers:\n" + 
				"        [pc: 0, line: 10]\n" + 
				"        [pc: 23, line: 11]\n" + 
				"        [pc: 33, line: 12]\n" + 
				"      Local variable table:\n" + 
				"        [pc: 0, pc: 34] local: args index: 0 type: java.lang.String[]\n" + 
				"  \n" + 
				"  // Method descriptor #6 ()V\n" + 
				"  // Stack: 2, Locals: 1\n" + 
				"  public void foo();\n" + 
				"     0  getstatic java.lang.System.out : java.io.PrintStream [22]\n" + 
				"     3  aload_0 [this]\n" + 
				"     4  invokevirtual X.e() : XA [29]\n" + 
				"     7  checkcast XB [48]\n" + 
				"    10  pop\n" + 
				"    11  getstatic XB.CONST : XB [50]\n" + 
				"    14  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [37]\n" + 
				"    17  return\n" + 
				"      Line numbers:\n" + 
				"        [pc: 0, line: 14]\n" + 
				"        [pc: 17, line: 15]\n" + 
				"      Local variable table:\n" + 
				"        [pc: 0, pc: 18] local: this index: 0 type: X\n" + 
				"      Local variable type table:\n" + 
				"        [pc: 0, pc: 18] local: this index: 0 type: X<E>\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=85303 - variation
	public void test0505() throws Exception {
		this.runConformTest(
			new String[] {
				"X.java",
				"class XA {}\n" +
				"interface XB {\n" +
				"	XB CONST = new XB(){ public String toString() { return \"SUCCESS\"; }};\n" +
				"}\n" +
				"class XAB extends XA implements XB {}\n" +
				"\n" +
				"public class X <E extends XA&XB> {\n" +
				"  E e;\n" +
				"  public static void main(String[] args) {\n" +
				"	  new X<XAB>().foo();\n" +
				"  }\n" +
				"  public void foo() {\n" +
				"	new Object() {\n" +
				"		void run() {\n" +
				"			System.out.print(e.CONST);\n" +
				"		}\n" +
				"	}.run();\n" +
				"    System.out.print(e.CONST);\n" +
				"  }\n" +
				"}\n",
			},
			"SUCCESSSUCCESS");
		String expectedOutput =
			"// Signature: <E:LXA;:LXB;>Ljava/lang/Object;\n" +
			"public class X {\n" +
			"  \n" +
			"  // Field descriptor #6 LXA;\n" +
			"  // Signature: TE;\n" +
			"  XA e;\n" +
			"  \n" +
			"  // Method descriptor #10 ()V\n" +
			"  // Stack: 1, Locals: 1\n" +
			"  public X();\n" +
			"    0  aload_0 [this]\n" +
			"    1  invokespecial java.lang.Object() [12]\n" +
			"    4  return\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 7]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 5] local: this index: 0 type: X\n" +
			"      Local variable type table:\n" +
			"        [pc: 0, pc: 5] local: this index: 0 type: X<E>\n" +
			"  \n" +
			"  // Method descriptor #21 ([Ljava/lang/String;)V\n" +
			"  // Stack: 2, Locals: 1\n" +
			"  public static void main(java.lang.String[] args);\n" +
			"     0  new X [1]\n" +
			"     3  dup\n" +
			"     4  invokespecial X() [22]\n" +
			"     7  invokevirtual X.foo() : void [23]\n" +
			"    10  return\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 10]\n" +
			"        [pc: 10, line: 11]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 11] local: args index: 0 type: java.lang.String[]\n" +
			"  \n" +
			"  // Method descriptor #10 ()V\n" +
			"  // Stack: 3, Locals: 1\n" +
			"  public void foo();\n" +
			"     0  new X$1 [28]\n" +
			"     3  dup\n" +
			"     4  aload_0 [this]\n" +
			"     5  invokespecial X$1(X) [30]\n" +
			"     8  invokevirtual X$1.run() : void [33]\n" +
			"    11  getstatic java.lang.System.out : java.io.PrintStream [36]\n" +
			"    14  aload_0 [this]\n" +
			"    15  getfield X.e : XA [42]\n" +
			"    18  checkcast XB [44]\n" +
			"    21  pop\n" +
			"    22  getstatic XB.CONST : XB [46]\n" +
			"    25  invokevirtual java.io.PrintStream.print(java.lang.Object) : void [50]\n" +
			"    28  return\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 13]\n" +
			"        [pc: 8, line: 17]\n" +
			"        [pc: 11, line: 18]\n" +
			"        [pc: 28, line: 19]\n" +
			"      Local variable table:\n" +
			"        [pc: 0, pc: 29] local: this index: 0 type: X\n" +
			"      Local variable type table:\n" +
			"        [pc: 0, pc: 29] local: this index: 0 type: X<E>\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=85477
	public void test0506() {
		this.runNegativeTest(
			new String[] {
				"X.java",//====================================
				"import java.util.Collections;\n" +
				"import java.util.Comparator;\n" +
				"import java.util.List;\n" +
				"\n" +
				"public final class X<E> {\n" +
				"	public void test(List list,final Comparator comparator, X x) {\n" +
				"		foo(list, comparator);\n" +
				"		bar(list, comparator);\n" +
				"		\n" +
				"		x.foo(list, comparator);\n" +
				"		x.bar(list, comparator);\n" +
				"	}\n" +
				"\n" +
				"	<T> void foo(List<T> lt, Comparator<? super T> ct) {\n" +
				"	}\n" +
				"	static <T> void bar(List<T> lt, Comparator<? super T> ct) {\n" +
				"	}\n" +
				" Zork z;\n" +
				"}\n"
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 6)\n" + 
			"	public void test(List list,final Comparator comparator, X x) {\n" + 
			"	                 ^^^^\n" + 
			"List is a raw type. References to generic type List<E> should be parameterized\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 6)\n" + 
			"	public void test(List list,final Comparator comparator, X x) {\n" + 
			"	                                 ^^^^^^^^^^\n" + 
			"Comparator is a raw type. References to generic type Comparator<T> should be parameterized\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 6)\n" + 
			"	public void test(List list,final Comparator comparator, X x) {\n" + 
			"	                                                        ^\n" + 
			"X is a raw type. References to generic type X<E> should be parameterized\n" + 
			"----------\n" + 
			"4. WARNING in X.java (at line 7)\n" + 
			"	foo(list, comparator);\n" + 
			"	^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation foo(List, Comparator) of the generic method foo(List<T>, Comparator<? super T>) of type X<E>\n" + 
			"----------\n" + 
			"5. WARNING in X.java (at line 7)\n" + 
			"	foo(list, comparator);\n" + 
			"	    ^^^^\n" + 
			"Type safety: The expression of type List needs unchecked conversion to conform to List<Object>\n" + 
			"----------\n" + 
			"6. WARNING in X.java (at line 7)\n" + 
			"	foo(list, comparator);\n" + 
			"	          ^^^^^^^^^^\n" + 
			"Type safety: The expression of type Comparator needs unchecked conversion to conform to Comparator<? super Object>\n" + 
			"----------\n" + 
			"7. WARNING in X.java (at line 8)\n" + 
			"	bar(list, comparator);\n" + 
			"	^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation bar(List, Comparator) of the generic method bar(List<T>, Comparator<? super T>) of type X<E>\n" + 
			"----------\n" + 
			"8. WARNING in X.java (at line 8)\n" + 
			"	bar(list, comparator);\n" + 
			"	    ^^^^\n" + 
			"Type safety: The expression of type List needs unchecked conversion to conform to List<Object>\n" + 
			"----------\n" + 
			"9. WARNING in X.java (at line 8)\n" + 
			"	bar(list, comparator);\n" + 
			"	          ^^^^^^^^^^\n" + 
			"Type safety: The expression of type Comparator needs unchecked conversion to conform to Comparator<? super Object>\n" + 
			"----------\n" + 
			"10. WARNING in X.java (at line 10)\n" + 
			"	x.foo(list, comparator);\n" + 
			"	^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: The method foo(List, Comparator) belongs to the raw type X. References to generic type X<E> should be parameterized\n" + 
			"----------\n" + 
			"11. WARNING in X.java (at line 11)\n" + 
			"	x.bar(list, comparator);\n" + 
			"	^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"The static method bar(List<Object>, Comparator<? super Object>) from the type X should be accessed in a static way\n" + 
			"----------\n" + 
			"12. WARNING in X.java (at line 11)\n" + 
			"	x.bar(list, comparator);\n" + 
			"	^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation bar(List, Comparator) of the generic method bar(List<T>, Comparator<? super T>) of type X\n" + 
			"----------\n" + 
			"13. WARNING in X.java (at line 11)\n" + 
			"	x.bar(list, comparator);\n" + 
			"	      ^^^^\n" + 
			"Type safety: The expression of type List needs unchecked conversion to conform to List<Object>\n" + 
			"----------\n" + 
			"14. WARNING in X.java (at line 11)\n" + 
			"	x.bar(list, comparator);\n" + 
			"	            ^^^^^^^^^^\n" + 
			"Type safety: The expression of type Comparator needs unchecked conversion to conform to Comparator<? super Object>\n" + 
			"----------\n" + 
			"15. ERROR in X.java (at line 18)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
	}
	// array bound for wildcard
	public void test0507() {
		this.runConformTest(
			new String[] {
				"X.java",//====================================
				"import java.io.Serializable;\n" +
				"import java.util.List;\n" +
				"\n" +
				"public class X {\n" +
				"	void foo1(List<? extends int[]> l) {\n" +
				"		int i = l.get(0).length;\n" +
				"	}\n" +
				"	void foo2(List<? extends int[]> l) {\n" +
				"		Object o = l.get(0).toString();\n" +
				"	}\n" +
				"	void foo3(List<? extends int[]> l, Serializable s) {\n" +
				"		boolean b = true;\n" +
				"		Serializable s2 = b ? l.get(0) : s;\n" +
				"	}\n" +
				"}\n"
			},
			"");
	}
	// array bound for wildcard
	public void test0508() {
		this.runNegativeTest(
			new String[] {
				"X.java",//====================================
				"import java.io.Serializable;\n" +
				"import java.util.List;\n" +
				"\n" +
				"public class X {\n" +
				"	void foo1(List<? super int[]> l) {\n" +
				"		int i = l.get(0).length;\n" +
				"	}\n" +
				"	void foo2(List<? super int[]> l) {\n" +
				"		Object o = l.get(0).toString();\n" +
				"	}\n" +
				"	void foo3(List<? super int[]> l, Serializable s) {\n" +
				"		boolean b = true;\n" +
				"		Serializable s2 = b ? l.get(0) : s;\n" +
				"	}\n" +
				"}\n"
			},
			this.complianceLevel < ClassFileConstants.JDK1_8 ? 
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	int i = l.get(0).length;\n" +
			"	                 ^^^^^^\n" +
			"length cannot be resolved or is not a field\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 13)\n" +
			"	Serializable s2 = b ? l.get(0) : s;\n" +
			"	                  ^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Object to Serializable\n" +
			"----------\n" :
				"----------\n" + 
				"1. ERROR in X.java (at line 6)\n" + 
				"	int i = l.get(0).length;\n" + 
				"	                 ^^^^^^\n" + 
				"length cannot be resolved or is not a field\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 13)\n" + 
				"	Serializable s2 = b ? l.get(0) : s;\n" + 
				"	                      ^^^^^^^^\n" + 
				"Type mismatch: cannot convert from capture#3-of ? super int[] to Serializable\n" + 
				"----------\n");
	}
	// type parameter hiding
	public void test0509() {
		this.runNegativeTest(
			new String[] {
				"X.java",//====================================
				"import java.util.*;\n" +
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"        List<MyTigerSimpleObject> list = new ArrayList<MyTigerSimpleObject>();\n" +
				"        list.add(new MyTigerSimpleObject(\"a\"));\n" +
				"        list.add(new MyTigerSimpleObject(\"b\"));\n" +
				"        \n" +
				"        for (MyTigerSimpleObject so : list)\n" +
				"            System.out.println(so.getSomeAttribute());		\n" +
				"	}\n" +
				"}\n" +
				"class MyTigerSimpleObject<E> {\n" +
				"	MyTigerSimpleObject(String s) {}\n" +
				"	E getSomeAttribute() { return null; }\n" +
				"}\n" +
				"\n" +
				"class TigerList<MyTigerSimpleObject> extends ArrayList<MyTigerSimpleObject> {\n" +
				"    public void listAll() {\n" +
				"        for (MyTigerSimpleObject so : this)\n" +
				"            System.out.println(so.getSomeAttribute());\n" +
				"    }\n" +
				"	\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 4)\n" +
			"	List<MyTigerSimpleObject> list = new ArrayList<MyTigerSimpleObject>();\n" +
			"	     ^^^^^^^^^^^^^^^^^^^\n" +
			"MyTigerSimpleObject is a raw type. References to generic type MyTigerSimpleObject<E> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 4)\n" +
			"	List<MyTigerSimpleObject> list = new ArrayList<MyTigerSimpleObject>();\n" +
			"	                                               ^^^^^^^^^^^^^^^^^^^\n" +
			"MyTigerSimpleObject is a raw type. References to generic type MyTigerSimpleObject<E> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 5)\n" +
			"	list.add(new MyTigerSimpleObject(\"a\"));\n" +
			"	             ^^^^^^^^^^^^^^^^^^^\n" +
			"MyTigerSimpleObject is a raw type. References to generic type MyTigerSimpleObject<E> should be parameterized\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 6)\n" +
			"	list.add(new MyTigerSimpleObject(\"b\"));\n" +
			"	             ^^^^^^^^^^^^^^^^^^^\n" +
			"MyTigerSimpleObject is a raw type. References to generic type MyTigerSimpleObject<E> should be parameterized\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 8)\n" +
			"	for (MyTigerSimpleObject so : list)\n" +
			"	     ^^^^^^^^^^^^^^^^^^^\n" +
			"MyTigerSimpleObject is a raw type. References to generic type MyTigerSimpleObject<E> should be parameterized\n" +
			"----------\n" +
			"6. WARNING in X.java (at line 17)\n" +
			"	class TigerList<MyTigerSimpleObject> extends ArrayList<MyTigerSimpleObject> {\n" +
			"	      ^^^^^^^^^\n" +
			"The serializable class TigerList does not declare a static final serialVersionUID field of type long\n" +
			"----------\n" +
			"7. WARNING in X.java (at line 17)\n" +
			"	class TigerList<MyTigerSimpleObject> extends ArrayList<MyTigerSimpleObject> {\n" +
			"	                ^^^^^^^^^^^^^^^^^^^\n" +
			"The type parameter MyTigerSimpleObject is hiding the type MyTigerSimpleObject<E>\n" +
			"----------\n" +
			"8. ERROR in X.java (at line 20)\n" +
			"	System.out.println(so.getSomeAttribute());\n" +
			"	                      ^^^^^^^^^^^^^^^^\n" +
			"The method getSomeAttribute() is undefined for the type MyTigerSimpleObject\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=84355
	public void test0510() {
		this.runConformTest(
			new String[] {
				"X.java",//====================================
				"import java.io.Serializable;\n" +
				"\n" +
				"public class X {\n" +
				"	public X() {\n" +
				"		String[] strings = new String[]{\"test\"};\n" +
				"\n" +
				"		// this fails\n" +
				"		Object obj = ClassB.doSomething((String) strings[0]);\n" +
				"\n" +
				"		// this works fine\n" +
				"		String intermediate = ClassB.doSomething((String) strings[0]);\n" +
				"		Object obj1 = intermediate;\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class ClassB {\n" +
				"	public static <T extends Serializable> T doSomething(String value) {\n" +
				"		return (T) value;\n" +
				"	}\n" +
				"}\n"
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=82407
	public void test0511() {
		this.runConformTest(
			new String[] {
				"X.java",//====================================
				"import java.util.HashMap;\n" +
				"\n" +
				"public class X {\n" +
				"\n" +
				"	static HashMap<Character, Character> substitutionList(String s1, String s2) {\n" +
				"\n" +
				"		HashMap<Character, Character> subst = new HashMap<Character, Character>();\n" +
				"\n" +
				"		for (int i = 0; i < s1.length(); i++) {\n" +
				"			char key = s1.charAt(i);\n" +
				"			char value = s2.charAt(i);\n" +
				"			if (subst.containsKey(key)) {\n" +
				"				if (value != subst.get(key)) {\n" +
				"					return null;\n" +
				"				}\n" +
				"			} else if (subst.containsValue(value)) {\n" +
				"				return null;\n" +
				"			} else {\n" +
				"				subst.put(key, value);\n" +
				"			}\n" +
				"		}\n" +
				"\n" +
				"		return subst;\n" +
				"	}\n" +
				"\n" +
				"	public static void main(String[] args) {\n" +
				"		System.out.println(\"SUCCESS\");\n" +
				"	}\n" +
				"}\n"
			},
			"SUCCESS");
	}
	public void test0512() {
		this.runConformTest(
			new String[] {
				"X.java",//====================================
				"public class X { \n" +
				"    public static void main(String argv[]) {\n" +
				"		\n" +
				"		new X().new M<Exception>(null) {\n" +
				"			void run() {\n" +
				"				Exception e = ex;\n" +
				"				System.out.println(\"SUCCESS\");\n" +
				"			}\n" +
				"		}.run();\n" +
				"    }\n" +
				"    class M<E extends Throwable> {\n" +
				"        E ex;\n" +
				"        M(E ex) {\n" +
				"            this.ex = ex;\n" +
				"        }\n" +
				"    }\n" +
				"}\n"
			},
			"SUCCESS");
	}
	public void test0513() {
		this.runNegativeTest(
			new String[] {
				"X.java",//====================================
				"public class X { \n" +
				"    public static void main(String argv[]) {\n" +
				"		\n" +
				"		new X().new M(null) {\n" +
				"			void run() {\n" +
				"				Exception e = ex;\n" +
				"				System.out.println(\"SUCCESS\");\n" +
				"			}\n" +
				"		}.run();\n" +
				"    }\n" +
				"    class M<E extends Throwable> {\n" +
				"        E ex;\n" +
				"        M(E ex) {\n" +
				"            this.ex = ex;\n" +
				"        }\n" +
				"    }\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 4)\n" +
			"	new X().new M(null) {\n" +
			"			void run() {\n" +
			"				Exception e = ex;\n" +
			"				System.out.println(\"SUCCESS\");\n" +
			"			}\n" +
			"		}.run();\n" +
			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The constructor X.M(Throwable) belongs to the raw type X.M. References to generic type X.M<E> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 4)\n" +
			"	new X().new M(null) {\n" +
			"	            ^\n" +
			"X.M is a raw type. References to generic type X.M<E> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 4)\n" +
			"	new X().new M(null) {\n" +
			"	            ^^^^^^^\n" +
			"Type safety: The constructor X.M(Throwable) belongs to the raw type X.M. References to generic type X.M<E> should be parameterized\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 6)\n" +
			"	Exception e = ex;\n" +
			"	              ^^\n" +
			"Type mismatch: cannot convert from Throwable to Exception\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=82955
	public void test0514(){
		runConformTest(
			new String[] {
				"Test.java",
				"public class Test {\n" +
				"	static <T extends Base> T infer( T t1, T t2 ) { return null; }\n" +
				"	public static void main( String [] args ) {\n" +
				"		Base base = infer( new Sub1(), new Sub2() );\n" +
				"		// Note: Eclipse 3.1 says this is an error, but it\'s not\n" +
				"		Runnable runnable = infer( new Sub1(), new Sub2() );\n" +
				"	}\n" +
				"}\n" +
				"class Base { }\n" +
				"class Sub1 extends Base implements Runnable { public void run() { } }\n" +
				"class Sub2 extends Base implements Runnable { public void run() { } }\n"
			}
		);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=84348
	public void test0515(){
		runConformTest(
			new String[] {
				"Test.java",
				"public class Test {\n" +
				"	public static <T> void myMethod(final List<? extends File> fileList) {\n" +
				"		Collections.sort(fileList, new Comparator<File>(){\n" +
				"			public int compare(File f1, File f2) { return 0; }\n" +
				"		});\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class List<T> {}\n" +
				"class File {}\n" +
				"interface Comparator<T> {}\n" +
				"class Collections {\n" +
				"	static <T> void sort(List<T> list, Comparator<? super T> c) {}\n" +
				"}"
			}
		);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=84944
	public void test0516(){
		runConformTest(
			new String[] {
				"parser/AbstractParser.java",
				"package parser;\n" +
				"public abstract class AbstractParser<T> implements ValueParser<T> {\n" +
				"	public T parse( final String string ) {\n" +
				"		return valueOf(string); \n" +
				"	}\n" +
				"	protected abstract T valueOf(final String string);	\n" +
				"}\n" +
				"interface ValueParser<T> {\n" +
				"	T parse(final String string);\n" +
				"}\n",
				"parser/BooleanParser.java",
				"package parser;\n" +
				"public class BooleanParser extends AbstractParser<Boolean> {\n" +
				"	protected Boolean valueOf(final String string ) {\n" +
				"		return Boolean.valueOf(string); 		\n" +
				"	}\n" +
				"}\n"
			}
		);
		runConformTest(
			new String[] {
				"test/BooleanParserTest.java",
				"package test;\n" +
				"import parser.BooleanParser;\n" +
				"public class BooleanParserTest {\n" +
				"	static final boolean getBoolean(final String value) {\n" +
				"		return new BooleanParser().parse(value).booleanValue(); // The type Boolean is not visible\n" +
				"	}\n" +
				"}\n"
			},
			null,
			null,
			false, // do not flush output directory
			null
		);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=84944 - check no warning for using raw member
	public void test0517(){
		runNegativeTest(
			new String[] {
				"X.java",
				"class Base<T> {\n" +
				"	class InnerBase {\n" +
				"		java.util.List<String> list;\n" +
				"	}\n" +
				"  Zork z;\n" +
				"}\n" +
				"\n" +
				"public class X extends Base<Integer> {\n" +
				"	class InnerDerived extends InnerBase {\n" +
				"		void method() {\n" +
				"			list.add(\"Hi\"); // Warning on this method call\n" +
				"		}\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=85930 - check no warning for using raw member
	public void test0518(){
		runNegativeTest(
			new String[] {
				"X.java",
				"interface Callable<T> {\n" +
				"	public enum Result {\n" +
				"		GOOD, BAD\n" +
				"	};\n" +
				"	public Result call(T arg);\n" +
				"}\n" +
				"\n" +
				"public class X implements Callable<String> {\n" +
				"	public Result call(String arg) {\n" +
				"		return Result.GOOD;\n" +
				"	}\n" +
				"  Zork z;\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 12)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=85262
	public void test0519(){
		runConformTest(
			new String[] {
				"FooImpl.java",
				"interface Bar<R extends Foo<R>>  {} \n" +
				" \n" +
				"class BarImpl<S extends Foo<S>> implements Bar<S> {} \n" +
				" \n" +
				"interface Foo<T extends Foo<T>> extends Bar<T> {} \n" +
				" \n" +
				"public class FooImpl<U extends Foo<U>> extends BarImpl<U> implements Foo<U> {}\n" +
				"\n"
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=85262 - variation
	public void test0520(){
		runConformTest(
			new String[] {
				"Bar.java",
				"public interface Bar<R extends Foo<R>>  {} \n",
				"BarImpl.java",
				"public class BarImpl<S extends Foo<S>> implements Bar<S> {} \n",
				"Foo.java",
				"public interface Foo<T extends Foo<T>> extends Bar<T> {} \n",
			},
			"");
		runConformTest(
			new String[] {
				"FooImpl.java",
				"public class FooImpl<U extends Foo<U>> extends BarImpl<U> implements Foo<U> {}\n",
			},
			"",
			null,
			false, // do not flush output directory
			null);
	}
	public void test0521(){
		runConformTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"\n" +
				"public class X {\n" +
				"	static public <T extends Collection> void addAll(T a, T b) {\n" +
				"		a.addAll(b);\n" +
				"	}\n" +
				"	static public void main(String[] args) {\n" +
				"		Collection<Integer> a = new ArrayList<Integer>();\n" +
				"		Collection<String> b = new ArrayList<String>();\n" +
				"		b.add(\"string\");\n" +
				"		addAll(a, b);\n" +
				"		try {\n" +
				"			System.out.println(a.iterator().next().intValue()); // ClassCastException\n" +
				"		} catch(ClassCastException e) {\n" +
				"			System.out.println(\"SUCCESS\");\n" +
				"		}\n" +
				"	}\n" +
				"}\n"
			},
			"SUCCESS");
	}
	// variation on test0521, check issuing of unchecked warning **
	public void test0522(){
		runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"\n" +
				"public class X {\n" +
				"	static public <T extends Collection> void addAll(T a, T b) {\n" +
				"		a.addAll(b);\n" +
				"	}\n" +
				"	static public void main(String[] args) {\n" +
				"		Collection<Integer> a = new ArrayList<Integer>();\n" +
				"		Collection<String> b = new ArrayList<String>();\n" +
				"		b.add(\"string\");\n" +
				"		addAll(a, b);\n" +
				"		try {\n" +
				"			System.out.println(a.iterator().next().intValue()); // ClassCastException\n" +
				"		} catch(ClassCastException e) {\n" +
				"			System.out.println(\"SUCCESS\");\n" +
				"		}\n" +
				"	}\n" +
				"  Zork z;\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 4)\n" +
			"	static public <T extends Collection> void addAll(T a, T b) {\n" +
			"	                         ^^^^^^^^^^\n" +
			"Collection is a raw type. References to generic type Collection<E> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 5)\n" +
			"	a.addAll(b);\n" +
			"	^^^^^^^^^^^\n" +
			"Type safety: The method addAll(Collection) belongs to the raw type Collection. References to generic type Collection<E> should be parameterized\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 18)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}
	public void test0523(){
		runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"public class X {\n" +
				"	public X() {\n" +
				"		M m = new M();\n" +
				"		List<String> ls = m.list(); // rawified even though wasn\'t using T parameter\n" +
				"	}\n" +
				"	Zork z;\n" +
				"	static class M<T> {\n" +
				"		List<String> list() {\n" +
				"			return null;\n" +
				"		}\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 4)\n" +
			"	M m = new M();\n" +
			"	^\n" +
			"X.M is a raw type. References to generic type X.M<T> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 4)\n" +
			"	M m = new M();\n" +
			"	          ^\n" +
			"X.M is a raw type. References to generic type X.M<T> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 5)\n" +
			"	List<String> ls = m.list(); // rawified even though wasn\'t using T parameter\n" +
			"	                  ^^^^^^^^\n" +
			"Type safety: The expression of type List needs unchecked conversion to conform to List<String>\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 7)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}
	// ensure there is no unchecked warning **
	public void test0524(){
		runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"class MyList extends ArrayList<String> {\n" +
				"}\n" +
				"\n" +
				"public class X {\n" +
				"    public static void main(String[] args) {\n" +
				"        List<? extends String> a = new MyList();\n" +
				"        List<String> b = (MyList) a;     \n" +
				"    }\n" +
				"	Zork z;\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 2)\n" +
			"	class MyList extends ArrayList<String> {\n" +
			"	      ^^^^^^\n" +
			"The serializable class MyList does not declare a static final serialVersionUID field of type long\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 10)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}
	public void test0525(){
		runConformTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"\n" +
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		try {\n" +
				"			List list = new ArrayList();\n" +
				"			String s = \"this shouldn\'t work\";\n" +
				"			list.add(s);\n" +
				"			List<Integer> listInt = list;\n" +
				"			int i = listInt.get(0);\n" +
				"		} catch(ClassCastException e) {\n" +
				"			System.out.println(\"SUCCESS\");\n" +
				"		}\n" +
				"	}\n" +
				"}\n"
			},
			"SUCCESS");
	}
	public void test0526(){
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    Zork z;\n" +
				"    <T> T f(Object o) {\n" +
				"	return (T) o; // OK\n" +
				"    }\n" +
				"\n" +
				"    <U, T extends U> T g(Object o) {\n" +
				"	return (T) o; // bug???\n" +
				"    }\n" +
				"\n" +
				"    <U, T extends U> T h(Object o) {\n" +
				"	return X.<T>castTo(o); // workaround\n" +
				"    }\n" +
				"\n" +
				"    private static <T> T castTo(Object o) {\n" +
				"	return (T) o;\n" +
				"    }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 4)\n" +
			"	return (T) o; // OK\n" +
			"	       ^^^^^\n" +
			"Type safety: Unchecked cast from Object to T\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 8)\n" +
			"	return (T) o; // bug???\n" +
			"	       ^^^^^\n" +
			"Type safety: Unchecked cast from Object to T\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 16)\n" +
			"	return (T) o;\n" +
			"	       ^^^^^\n" +
			"Type safety: Unchecked cast from Object to T\n" +
			"----------\n");
	}
	// should not produce unchecked errors **
	public void test0527(){
		runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	<T, U extends T, V extends T> T foo(U u, V v) {\n" +
				"		return this == null ? (T) u : (T)v;\n" +
				"	}\n" +
				"	Zork z;\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=86217
	public void test0528() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T extends X.M> extends Y {}\n" +
				"class Y { static class M {} }\n",
			},
			""
		);
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=86463
	public void test0529() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"public class X<T extends List> {\n" +
				"	void bar() {\n" +
				"		T t = new ArrayList(); // BUG!!!\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 2)\n" +
			"	public class X<T extends List> {\n" +
			"	                         ^^^^\n" +
			"List is a raw type. References to generic type List<E> should be parameterized\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 4)\n" +
			"	T t = new ArrayList(); // BUG!!!\n" +
			"	      ^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from ArrayList to T\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 4)\n" +
			"	T t = new ArrayList(); // BUG!!!\n" +
			"	          ^^^^^^^^^\n" +
			"ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized\n" +
			"----------\n");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=86463
	public void test0530() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"\n" +
				"abstract class Foo<T extends List>\n" +
				" {\n" +
				"  abstract void foo(T t);\n" +
				"  void foo2()\n" +
				"  {\n" +
				"    List l = new LinkedList();\n" +
				"    foo(l); // BUG!!!\n" +
				"  }\n" +
				"}\n" +
				"\n" +
				"public class X extends Foo<ArrayList>\n" +
				"{\n" +
				"  void foo(ArrayList l)\n" +
				"  {\n" +
				"    System.out.println(l);\n" +
				"  }\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	abstract class Foo<T extends List>\n" +
			"	                             ^^^^\n" +
			"List is a raw type. References to generic type List<E> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 8)\n" +
			"	List l = new LinkedList();\n" +
			"	^^^^\n" +
			"List is a raw type. References to generic type List<E> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 8)\n" +
			"	List l = new LinkedList();\n" +
			"	             ^^^^^^^^^^\n" +
			"LinkedList is a raw type. References to generic type LinkedList<E> should be parameterized\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 9)\n" +
			"	foo(l); // BUG!!!\n" +
			"	^^^\n" +
			"The method foo(T) in the type Foo<T> is not applicable for the arguments (List)\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 13)\n" +
			"	public class X extends Foo<ArrayList>\n" +
			"	                           ^^^^^^^^^\n" +
			"ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized\n" +
			"----------\n" +
			"6. WARNING in X.java (at line 15)\n" +
			"	void foo(ArrayList l)\n" +
			"	     ^^^^^^^^^^^^^^^^\n" +
			"The method foo(ArrayList) of type X should be tagged with @Override since it actually overrides a superclass method\n" +
			"----------\n" +
			"7. WARNING in X.java (at line 15)\n" +
			"	void foo(ArrayList l)\n" +
			"	         ^^^^^^^^^\n" +
			"ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized\n" +
			"----------\n");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=86646
	public void test0531() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.Vector;\n" +
				"\n" +
				"public class X<T> {\n" +
				"	public T f1(T l) {\n" +
				"		Vector<T> v = new Vector<T>();\n" +
				"		v.add(l);\n" +
				"		return (T) v.get(0); // Expect warning here\n" +
				"	}\n" +
				"  Zork z;\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 7)\n" +
			"	return (T) v.get(0); // Expect warning here\n" +
			"	       ^^^^^^^^^^^^\n" +
			"Unnecessary cast from T to T\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 9)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=84944
	public void test0532() {
		this.runConformTest(
			new String[] {
				"p/X.java",
				"package p;\n" +
				"public class X extends Z<Boolean> {\n" +
				"	@Override public Boolean value() { return true; }\n" +
				"}\n" +
				"abstract class Z<T> {\n" +
				"	public T foo() { return value(); }\n" +
				"	public abstract T value();\n" +
				"}\n",
			},
			""
		);
		this.runConformTest(
			new String[] {
				"Y.java",
				"import p.X;\n" +
				"public class Y { boolean test() { return new X().foo().booleanValue(); } }\n",
			},
			"",
			null,
			false, // do not flush output
			null
		);
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=86838
	public void test0533() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.EnumSet;\n" +
				"\n" +
				"enum Foo {\n" +
				"	blargh, baz, boz;\n" +
				"}\n" +
				"\n" +
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		Class c = Foo.class;\n" +
				"		EnumSet<Enum> eSet = EnumSet.allOf(c);\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 9)\n" + 
			"	Class c = Foo.class;\n" + 
			"	^^^^^\n" + 
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 10)\n" + 
			"	EnumSet<Enum> eSet = EnumSet.allOf(c);\n" + 
			"	        ^^^^\n" + 
			"Enum is a raw type. References to generic type Enum<E> should be parameterized\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 10)\n" + 
			"	EnumSet<Enum> eSet = EnumSet.allOf(c);\n" + 
			"	        ^^^^\n" + 
			"Bound mismatch: The type Enum is not a valid substitute for the bounded parameter <E extends Enum<E>> of the type EnumSet<E>\n" + 
			"----------\n" + 
			"4. WARNING in X.java (at line 10)\n" + 
			"	EnumSet<Enum> eSet = EnumSet.allOf(c);\n" + 
			"	                     ^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation allOf(Class) of the generic method allOf(Class<E>) of type EnumSet\n" + 
			"----------\n" + 
			"5. WARNING in X.java (at line 10)\n" + 
			"	EnumSet<Enum> eSet = EnumSet.allOf(c);\n" + 
			"	                     ^^^^^^^^^^^^^^^^\n" + 
			"Type safety: The expression of type EnumSet needs unchecked conversion to conform to EnumSet<Enum>\n" + 
			"----------\n" + 
			"6. WARNING in X.java (at line 10)\n" + 
			"	EnumSet<Enum> eSet = EnumSet.allOf(c);\n" + 
			"	                                   ^\n" + 
			(this.complianceLevel < ClassFileConstants.JDK1_8
			? "Type safety: The expression of type Class needs unchecked conversion to conform to Class<Enum>\n"
			: "Type safety: The expression of type Class needs unchecked conversion to conform to Class<Enum<Enum<E>>>\n") + 
			"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=86838 - variation
	public void test0534() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.EnumSet;\n" +
				"\n" +
				"enum Foo {\n" +
				"	blargh, baz, boz;\n" +
				"}\n" +
				"\n" +
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		Class c = Foo.class;\n" +
				"		EnumSet<Foo> eSet = EnumSet.allOf(c);\n" +
				"	}\n" +
				"}\n",
			},
			""
		);
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=86838 - variation
	public void test0535() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.EnumSet;\n" +
				"\n" +
				"enum Foo {\n" +
				"	blargh, baz, boz;\n" +
				"}\n" +
				"\n" +
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		Class c = Foo.class;\n" +
				"		EnumSet<? extends Enum> eSet = EnumSet.allOf(c);\n" +
				"	}\n" +
				"}\n",
			},
			""
		);
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=86838 - variation
	public void test0536() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.EnumSet;\n" +
				"\n" +
				"enum Foo {\n" +
				"	blargh, baz, boz;\n" +
				"}\n" +
				"\n" +
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		Class c = Foo.class;\n" +
				"		EnumSet<?> eSet = (EnumSet<?>) EnumSet.allOf(c);\n" +
				"	}\n" +
				"  Zork z;\n" +
				"}\n",
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 9)\n" + 
			"	Class c = Foo.class;\n" + 
			"	^^^^^\n" + 
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 10)\n" + 
			"	EnumSet<?> eSet = (EnumSet<?>) EnumSet.allOf(c);\n" + 
			"	                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Unnecessary cast from EnumSet to EnumSet<?>\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 10)\n" + 
			"	EnumSet<?> eSet = (EnumSet<?>) EnumSet.allOf(c);\n" + 
			"	                               ^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation allOf(Class) of the generic method allOf(Class<E>) of type EnumSet\n" + 
			"----------\n" + 
			"4. WARNING in X.java (at line 10)\n" + 
			"	EnumSet<?> eSet = (EnumSet<?>) EnumSet.allOf(c);\n" + 
			"	                                             ^\n" + 
			"Type safety: The expression of type Class needs unchecked conversion to conform to Class<Enum<Enum<E>>>\n" + 
			"----------\n" + 
			"5. ERROR in X.java (at line 12)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n"
		);
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=86838 - variation
	public void test0537() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.EnumSet;\n" +
				"\n" +
				"enum Foo {\n" +
				"	blargh, baz, boz;\n" +
				"}\n" +
				"\n" +
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		Class c = Foo.class;\n" +
				"		EnumSet<?> eSet = EnumSet.allOf(c);\n" +
				"	}\n" +
				"  Zork z;\n" +
				"}\n",
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 9)\n" + 
			"	Class c = Foo.class;\n" + 
			"	^^^^^\n" + 
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 10)\n" + 
			"	EnumSet<?> eSet = EnumSet.allOf(c);\n" + 
			"	                  ^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation allOf(Class) of the generic method allOf(Class<E>) of type EnumSet\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 10)\n" + 
			"	EnumSet<?> eSet = EnumSet.allOf(c);\n" + 
			"	                                ^\n" + 
			"Type safety: The expression of type Class needs unchecked conversion to conform to Class<Enum<Enum<E>>>\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 12)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=86838 - variation
	public void test0538() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.EnumSet;\n" +
				"\n" +
				"enum Foo {\n" +
				"	blargh, baz, boz;\n" +
				"}\n" +
				"\n" +
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		Class c = Foo.class;\n" +
				"		EnumSet<Enum<?>> eSet = EnumSet.allOf(c);\n" +
				"	}\n" +
				"}\n",
			},
			this.complianceLevel < ClassFileConstants.JDK1_8 ?
			"----------\n" + 
			"1. WARNING in X.java (at line 9)\n" + 
			"	Class c = Foo.class;\n" + 
			"	^^^^^\n" + 
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 10)\n" + 
			"	EnumSet<Enum<?>> eSet = EnumSet.allOf(c);\n" + 
			"	        ^^^^\n" + 
			"Bound mismatch: The type Enum<?> is not a valid substitute for the bounded parameter <E extends Enum<E>> of the type EnumSet<E>\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 10)\n" + 
			"	EnumSet<Enum<?>> eSet = EnumSet.allOf(c);\n" + 
			"	                        ^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation allOf(Class) of the generic method allOf(Class<E>) of type EnumSet\n" + 
			"----------\n" + 
			"4. WARNING in X.java (at line 10)\n" + 
			"	EnumSet<Enum<?>> eSet = EnumSet.allOf(c);\n" + 
			"	                        ^^^^^^^^^^^^^^^^\n" + 
			"Type safety: The expression of type EnumSet needs unchecked conversion to conform to EnumSet<Enum<?>>\n" + 
			"----------\n" + 
			"5. WARNING in X.java (at line 10)\n" + 
			"	EnumSet<Enum<?>> eSet = EnumSet.allOf(c);\n" + 
			"	                                      ^\n" + 
			"Type safety: The expression of type Class needs unchecked conversion to conform to Class<Enum<?>>\n" + 
			"----------\n" :
				"----------\n" + 
				"1. WARNING in X.java (at line 9)\n" + 
				"	Class c = Foo.class;\n" + 
				"	^^^^^\n" + 
				"Class is a raw type. References to generic type Class<T> should be parameterized\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 10)\n" + 
				"	EnumSet<Enum<?>> eSet = EnumSet.allOf(c);\n" + 
				"	        ^^^^\n" + 
				"Bound mismatch: The type Enum<?> is not a valid substitute for the bounded parameter <E extends Enum<E>> of the type EnumSet<E>\n" + 
				"----------\n" + 
				"3. WARNING in X.java (at line 10)\n" + 
				"	EnumSet<Enum<?>> eSet = EnumSet.allOf(c);\n" + 
				"	                        ^^^^^^^^^^^^^^^^\n" + 
				"Type safety: Unchecked invocation allOf(Class) of the generic method allOf(Class<E>) of type EnumSet\n" + 
				"----------\n" + 
				"4. WARNING in X.java (at line 10)\n" + 
				"	EnumSet<Enum<?>> eSet = EnumSet.allOf(c);\n" + 
				"	                        ^^^^^^^^^^^^^^^^\n" + 
				"Type safety: The expression of type EnumSet needs unchecked conversion to conform to EnumSet<Enum<?>>\n" + 
				"----------\n" + 
				"5. WARNING in X.java (at line 10)\n" + 
				"	EnumSet<Enum<?>> eSet = EnumSet.allOf(c);\n" + 
				"	                                      ^\n" + 
				"Type safety: The expression of type Class needs unchecked conversion to conform to Class<Enum<Enum<E>>>\n" + 
				"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=86838 - variation
	public void test0539() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"		 static class B<C> {\n" +
				"		 		 public <T extends I1> T willBe(Class<T> c) {\n" +
				"		 		 		 return (T)null;\n" +
				"		 		 }\n" +
				"		 }\n" +
				"		 interface I1  {\n" +
				"		 }\n" +
				"		 interface I2  extends I1 {\n" +
				"		 }\n" +
				"		 \n" +
				"		 public static void m1(String[] args) {\n" +
				"		 		 B b = new B();\n" +
				"		 		 I2 v = b.willBe(I2.class);\n" +
				"		 }\n" +
				"		 public static void m2(String[] args) {\n" +
				"		 		 B<Void> b = new B<Void>();\n" +
				"		 		 I2 v = b.willBe(I2.class);\n" +
				"		 }\n" +
				"\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 4)\n" +
			"	return (T)null;\n" +
			"	       ^^^^^^^\n" +
			"Unnecessary cast from null to T\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 13)\n" +
			"	B b = new B();\n" +
			"	^\n" +
			"X.B is a raw type. References to generic type X.B<C> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 13)\n" +
			"	B b = new B();\n" +
			"	          ^\n" +
			"X.B is a raw type. References to generic type X.B<C> should be parameterized\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 14)\n" +
			"	I2 v = b.willBe(I2.class);\n" +
			"	       ^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The method willBe(Class) belongs to the raw type X.B. References to generic type X.B<C> should be parameterized\n" +
			"----------\n" +
			"5. ERROR in X.java (at line 14)\n" +
			"	I2 v = b.willBe(I2.class);\n" +
			"	       ^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from X.I1 to X.I2\n" +
			"----------\n");
	}
	// test paramtype argument compatibility
	public void test0540() {
		this.runNegativeTest(
			new String[] {
				"Baz.java",
				"import java.util.*;\n" +
				"interface Foo<X> {}\n" +
				"interface Bar extends Foo {\n" +
				"}\n" +
				"public class Baz<R,D>  {\n" +
				"    public R visit(Collection<? extends Foo<?>> trees, D d) {\n" +
				"	return null;\n" +
				"    }\n" +
				"    R test(Collection<Bar> c, D d) {\n" +
				"	return visit(c, d);\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in Baz.java (at line 3)\n" +
			"	interface Bar extends Foo {\n" +
			"	                      ^^^\n" +
			"Foo is a raw type. References to generic type Foo<X> should be parameterized\n" +
			"----------\n" +
			"2. ERROR in Baz.java (at line 10)\n" +
			"	return visit(c, d);\n" +
			"	       ^^^^^\n" +
			"The method visit(Collection<? extends Foo<?>>, D) in the type Baz<R,D> is not applicable for the arguments (Collection<Bar>, D)\n" +
			"----------\n");
	}
	public void test0541() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.Map;\n" +
				"public class X {\n" +
				"   public static void main(String[] args) {\n" +
				"     Map m = null;\n" +
				"	 try {\n" +
				"	     Map m2 = m.getClass().newInstance();\n" +
				"	 } catch(Exception e) {\n" +
				"	 }\n" +
				"   }\n" +
				"}\n",
			},
			"");
	}
	public void test0542() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	static <T> boolean isOK(T x) {\n" +
				"		return isOK(x);\n" +
				"	}\n" +
				"\n" +
				"	static <T> boolean isStillOK(T x) {\n" +
				"		return true && isOK(x);\n" +
				"	}\n" +
				"\n" +
				"	static <T> boolean isNoMoreOK(T x) {\n" +
				"		return true && isNoMoreOK(x);\n" +
				"	}\n" +
				"\n" +
				"	static <T> boolean isOKAgain(T x) {\n" +
				"		boolean res;\n" +
				"		return true && (res = isOKAgain(x));\n" +
				"	}\n" +
				"}\n",
			},
			"");
	}
	public void test0543() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.List;\n" +
				"\n" +
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		Object obj = null;\n" +
				"		List<String> ls = (List<String>) obj;\n" +
				"	}\n" +
				"  Zork z;\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 6)\n" +
			"	List<String> ls = (List<String>) obj;\n" +
			"	                  ^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from Object to List<String>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 8)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}
	public void test0544() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.Vector;\n" +
				"\n" +
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		Vector<Integer> a = new Vector<Integer>();\n" +
				"		Vector b = new Vector();\n" +
				"		b.add(new Object());\n" +
				"		a = b;\n" +
				"		Zork z;\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 6)\n" +
			"	Vector b = new Vector();\n" +
			"	^^^^^^\n" +
			"Vector is a raw type. References to generic type Vector<E> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 6)\n" +
			"	Vector b = new Vector();\n" +
			"	               ^^^^^^\n" +
			"Vector is a raw type. References to generic type Vector<E> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 7)\n" +
			"	b.add(new Object());\n" +
			"	^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The method add(Object) belongs to the raw type Vector. References to generic type Vector<E> should be parameterized\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 8)\n" +
			"	a = b;\n" +
			"	    ^\n" +
			"Type safety: The expression of type Vector needs unchecked conversion to conform to Vector<Integer>\n" +
			"----------\n" +
			"5. ERROR in X.java (at line 9)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=86898
	public void test0545() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"class B extends A<Object> {\n" +
				"	void m2() {\n" +
				"		m3((X2) m());  // A<Object>.m() --> X<? extends Object> - cannot cast to X2\n" +
				"	}\n" +
				"	void m3(X2 i) {}\n" +
				"}\n" +
				"class A<T> {\n" +
				"	X<? extends T> m() {\n" +
				"		return null;\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class X2 extends X<String> {\n" +
				"}\n" +
				"\n" +
				"public class X<T> {\n" +
				"	void foo(X<String> lhs, X<? extends Object> rhs) {\n" +
				"		lhs = rhs; // cannot convert\n" +
				"	}\n" +
				"	void bar(X2 lhs, X<? extends Object> rhs) {\n" +
				"		lhs = rhs; // cannot convert\n" +
				"	}\n" +
				"}\n" +
				"class C {\n" +
				"	void foo(X<? extends Object> xo) {}\n" +
				"	void bar(X<String> xs) {}\n" +
				"}\n" +
				"class D extends C {\n" +
				"	void foo(X<String> xs) {}\n" +
				"	void bar(X<? extends Object> xo) {}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 18)\n" +
			"	lhs = rhs; // cannot convert\n" +
			"	      ^^^\n" +
			"Type mismatch: cannot convert from X<capture#2-of ? extends Object> to X<String>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 21)\n" +
			"	lhs = rhs; // cannot convert\n" +
			"	      ^^^\n" +
			"Type mismatch: cannot convert from X<capture#3-of ? extends Object> to X2\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 29)\n" +
			"	void foo(X<String> xs) {}\n" +
			"	     ^^^^^^^^^^^^^^^^^\n" +
			"Name clash: The method foo(X<String>) of type D has the same erasure as foo(X<? extends Object>) of type C but does not override it\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 30)\n" +
			"	void bar(X<? extends Object> xo) {}\n" +
			"	     ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Name clash: The method bar(X<? extends Object>) of type D has the same erasure as bar(X<String>) of type C but does not override it\n" +
			"----------\n");
	}
	// ensure no unsafe cast warning **
	public void test0546() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"class StringList extends java.util.LinkedList<String> {\n" +
				"}\n" +
				"\n" +
				"public class X {\n" +
				"    public static void main(String[] args) {\n" +
				"        java.util.List<? extends String> a = new StringList();\n" +
				"        java.util.List<String> b = (StringList) a;      // warned but safe.\n" +
				"    }\n" +
				"   Zork z;\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 1)\n" +
			"	class StringList extends java.util.LinkedList<String> {\n" +
			"	      ^^^^^^^^^^\n" +
			"The serializable class StringList does not declare a static final serialVersionUID field of type long\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 9)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}
	public void test0547() {
		runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"import java.util.*;\n" +
			"public class X {\n" +
			"	public <K> TreeMap<K,K> essai(K type) {\n" +
			"		TreeMap<K,K> treeMap = new TreeMap<K,K>();\n" +
			"		return treeMap;\n" +
			"	}\n" +
			"	public static void main(String args[]) {\n" +
			"		X x = new X();\n" +
			"		TreeMap<?,?> treeMap = x.essai(null);\n" +
			"	}\n" +
			"}\n",
		},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
	}
	public void test0548() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"interface DA<T> {\n" +
				"}\n" +
				"interface DB<T> extends DA<T> {\n" +
				"}\n" +
				"interface DC<T> extends DA<Integer> {\n" +
				"}\n" +
				"\n" +
				"public class X {\n" +
				"	Object o = (DC<?>) (DA<?>) null;\n" +
				"  Zork z;\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 9)\n" +
			"	Object o = (DC<?>) (DA<?>) null;\n" +
			"	           ^^^^^^^^^^^^^^^^^^^^\n" +
			"Unnecessary cast from DA<capture#1-of ?> to DC<?>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 9)\n" +
			"	Object o = (DC<?>) (DA<?>) null;\n" +
			"	                   ^^^^^^^^^^^^\n" +
			"Unnecessary cast from null to DA<?>\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 10)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}
	// **
	public void test0549() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X<T> {\n" +
				"	boolean DEBUG = this instanceof Special;\n" +
				"\n" +
				"	public static class Special extends X<String> {\n" +
				"	}\n" +
				"}\n",
			},
			"");
	}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=148046
	public void test0550() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"class A {}\n" +
				"class B extends A {}\n" +
				"\n" +
				"public class X<T> {\n" +
				"    public <U extends B> void foo(X<? super A> param) {\n" +
				"        X<U> foo = (X<U>)param;\n" +
				"    }\n" +
				"   Zork z;\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	X<U> foo = (X<U>)param;\n" +
			"	           ^^^^^^^^^^^\n" +
			"Cannot cast from X<capture#1-of ? super A> to X<U>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 8)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}
	// ensure no unchecked warning
	public void test0551() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    <T, U extends T, V extends T> T cond1(boolean z, U x1, V x2) {\n" +
				"        return (z? (T) x1: x2);\n" +
				"    }\n" +
				"    Zork z;\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 2)\n" +
			"	<T, U extends T, V extends T> T cond1(boolean z, U x1, V x2) {\n" +
			"	                                              ^\n" +
			"The parameter z is hiding a field from type X\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 5)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}
	public void test0552() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"\n" +
				"	Comparable<?> x;\n" +
				"\n" +
				"	void put(Comparable<?> c) {\n" +
				"		this.x = c;\n" +
				"	}\n" +
				"\n" +
				"	Comparable<?> get() {\n" +
				"		return x;\n" +
				"	}\n" +
				"\n" +
				"	void test() {\n" +
				"		X ci = new X();\n" +
				"		ci.put(new Integer(3));\n" +
				"		Integer i = (Integer) ci.get();\n" +
				"	}\n" +
				"\n" +
				"}\n",
			},
			"");
	}
	public void test0553() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"   public static void main(String args[]) throws Exception {\n" +
				"      doIt();\n" +
				"      System.out.println(\"SUCCESS\");\n" +
				"   }\n" +
				"   public static void doIt() {\n" +
				"      Holder<Integer> association = new Holder<Integer>(new Integer(0));\n" +
				"      Integer sizeHolder = (Integer)(association.getValue()); //Cast to Integer is redundant!!!\n" +
				"      System.out.print(sizeHolder.intValue());\n" +
				"   }\n" +
				"   static class Holder<V> {\n" +
				"      V value;\n" +
				"      Holder(V value) {\n" +
				"         this.value = value;\n" +
				"      }\n" +
				"      V getValue() {\n" +
				"         return value;\n" +
				"      }\n" +
				"   }\n" +
				"}\n"	,
			},
			"0SUCCESS");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=86898 - variation
	public void test0554() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				" import java.util.*;\n" +
				" public class X<T> {\n" +
				" public static void main(String[] args) {\n" +
				"		X<? extends Object> xo = null;\n" +
				"		X<String> xs = null;\n" +
				"		X2 x2 = null;\n" +
				"		\n" +
				"		Object o1 = (X<String>) xo;\n" +
				"		Object o2 = (X<? extends Object>) xs;\n" +
				"		Object o3 = (X2) xo;\n" +
				"		Object o4 = (X<? extends Object>) x2;\n" +
				"		Object o5 = (X3<String>) xo;\n" +
				"	}\n" +
				"}\n" +
				"class X2 extends X<String> {\n" +
				"}\n" +
				"class X3<U> extends X<U> {\n" +
				"   Zork z;\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 8)\n" +
			"	Object o1 = (X<String>) xo;\n" +
			"	            ^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from X<capture#1-of ? extends Object> to X<String>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 8)\n" +
			"	Object o1 = (X<String>) xo;\n" +
			"	            ^^^^^^^^^^^^^^\n" +
			"Unnecessary cast from X<capture#1-of ? extends Object> to X<String>\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 9)\n" +
			"	Object o2 = (X<? extends Object>) xs;\n" +
			"	            ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Unnecessary cast from X<String> to X<? extends Object>\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 10)\n" +
			"	Object o3 = (X2) xo;\n" +
			"	            ^^^^^^^\n" +
			"Unnecessary cast from X<capture#3-of ? extends Object> to X2\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 11)\n" +
			"	Object o4 = (X<? extends Object>) x2;\n" +
			"	            ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Unnecessary cast from X2 to X<? extends Object>\n" +
			"----------\n" +
			"6. WARNING in X.java (at line 12)\n" +
			"	Object o5 = (X3<String>) xo;\n" +
			"	            ^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from X<capture#5-of ? extends Object> to X3<String>\n" +
			"----------\n" +
			"7. WARNING in X.java (at line 12)\n" +
			"	Object o5 = (X3<String>) xo;\n" +
			"	            ^^^^^^^^^^^^^^^\n" +
			"Unnecessary cast from X<capture#5-of ? extends Object> to X3<String>\n" +
			"----------\n" +
			"8. ERROR in X.java (at line 18)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}
	public void test0555() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				" import java.util.List;\n" +
				" public class X<U extends Number> {\n" +
				" U u;\n" +
				" void foo(X<? extends Number> xn, X<? extends U> xu) {\n" +
				"		xn = xu;\n" +
				"		xu = xn;\n" +
				"		xu.u = xn.u; // ko\n" +
				"		xn.u = xu.u; // ko\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	xu = xn;\n" +
			"	     ^^\n" +
			"Type mismatch: cannot convert from X<capture#4-of ? extends Number> to X<? extends U>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 7)\n" +
			"	xu.u = xn.u; // ko\n" +
			"	       ^^^^\n" +
			"Type mismatch: cannot convert from capture#6-of ? extends Number to capture#5-of ? extends U\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 8)\n" +
			"	xn.u = xu.u; // ko\n" +
			"	       ^^^^\n" +
			"Type mismatch: cannot convert from capture#8-of ? extends U to capture#7-of ? extends Number\n" +
			"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=87273
	public void test0556() {
		this.runConformTest(
			new String[] {
				"X.java",
				"interface Foo {\n" +
				"	Object get();\n" +
				"}\n" +
				"\n" +
				"interface MyList<F> extends Foo {\n" +
				"	public F get();\n" +
				"}\n" +
				"\n" +
				"class MyListImpl<G> implements MyList<G> {\n" +
				"	public G get() {\n" +
				"		System.out.println(\"SUCCESS\");\n" +
				"		return null;\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"interface StringList extends MyList<String> {\n" +
				"}\n" +
				"\n" +
				"class StringListImpl extends MyListImpl<String> implements StringList {\n" +
				"}\n" +
				"\n" +
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		Foo f = new StringListImpl();\n" +
				"		f.get();\n" +
				"	}\n" +
				"}\n",
			},
			"SUCCESS");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=83002
	public void test0557() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	static <T extends Exception> void foo(T t) throws T {\n" + // ensure exception is properly encoded (...^ex)
				"	}\n" +
				"}\n",
			},
			"");
		this.runConformTest(
			new String[] {
				"Y.java",
				"import java.io.*;\n" +
				"public class Y {\n" +
				"	void foo() {\n" +
				"		try {\n" +
				"			X.foo(new IOException());\n" +
				"		} catch(IOException e){\n" +
				"		}\n" +
				"	}\n" +
				"}\n",
			},
			"",
			null,
			false,
			null);
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=83002
	public void test0558() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	static <T extends Exception, U extends Exception> void foo(T t, U u) throws T, U {\n" + // ensure exception is properly encoded (...^ex)
				"	}\n" +
				"}\n",
			},
			"");
		this.runConformTest(
			new String[] {
				"Y.java",
				"import java.io.*;\n" +
				"public class Y {\n" +
				"	void foo() {\n" +
				"		try {\n" +
				"			X.foo(new IOException(), new ClassNotFoundException());\n" +
				"		} catch(IOException e){\n" +
				"		} catch(ClassNotFoundException e){\n" +
				"		}\n" +
				"	}\n" +
				"}\n",
			},
			"",
			null,
			false,
			null);
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=86902
	// **
	public void test0559() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"class Cell<T> {\n" +
				"	T t;\n" +
				"	public void setT(T t) {\n" +
				"		this.t= t;\n" +
				"	}\n" +
				"	public T getT() {\n" +
				"		return t;\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"public class X {\n" +
				"  Zork z;\n" +
				"	public static void main(String[] args) {\n" +
				"		Cell c= new Cell();\n" +
				"		c.setT(Boolean.FALSE); // other: warning: [unchecked] unchecked\n" +
				"			// call to setT(T) as a member of the raw type p.Cell\n" +
				"		c.t= Boolean.TRUE; // other: warning: [unchecked] unchecked call\n" +
				"			// to setT(T) as a member of the raw type p.Cell\n" +
				"		boolean b1= (Boolean) c.getT();\n" +
				"		boolean b2= (Boolean) c.t;\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 12)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 14)\n" +
			"	Cell c= new Cell();\n" +
			"	^^^^\n" +
			"Cell is a raw type. References to generic type Cell<T> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 14)\n" +
			"	Cell c= new Cell();\n" +
			"	            ^^^^\n" +
			"Cell is a raw type. References to generic type Cell<T> should be parameterized\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 15)\n" +
			"	c.setT(Boolean.FALSE); // other: warning: [unchecked] unchecked\n" +
			"	^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The method setT(Object) belongs to the raw type Cell. References to generic type Cell<T> should be parameterized\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 17)\n" +
			"	c.t= Boolean.TRUE; // other: warning: [unchecked] unchecked call\n" +
			"	  ^\n" +
			"Type safety: The field t from the raw type Cell is assigned a value of type Boolean. References to generic type Cell<T> should be parameterized\n" +
			"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=85924
	public void test0560() {
		this.runConformTest(
			new String[] {
				"X.java",
				"interface IController<U extends IView<?>>  {\n" +
				"    public U getView() ;\n" +
				"}\n" +
				"interface IView<U>  {\n" +
				"}\n" +
				"class MatGroup   {\n" +
				"	public abstract static class View implements IView<String> {\n" +
				"		public void setTempAppearance() {\n" +
				"			System.out.println(\"SUCCESS\");\n" +
				"		}\n" +
				"	}\n" +
				"	\n" +
				"	public abstract static class Ctrl<U extends View> implements IController<U>  {\n" +
				"	}\n" +
				"}\n" +
				"public class X {\n" +
				"	public static void main(String []args) {\n" +
				"		MatGroup.Ctrl<?>children[] = { \n" +
				"				new MatGroup.Ctrl<MatGroup.View>(){\n" +
				"					public MatGroup.View getView() { return new MatGroup.View(){}; }	\n" +
				"				}} ;\n" +
				"	    for(MatGroup.Ctrl<?> glmat: children) {\n" +
				"			glmat.getView().setTempAppearance() ;\n" +
				"	    }\n" +
				"	}\n" +
				"}\n",
			},
			"SUCCESS");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=87956
	public void test0561() {
		// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6182950
		String expectedCompilerLog = (this.complianceLevel == ClassFileConstants.JDK1_6)?
				"----------\n" + 
				"1. WARNING in X.java (at line 2)\n" + 
				"	void foo(A<String> a) {}\n" + 
				"	     ^^^^^^^^^^^^^^^^\n" + 
				"Erasure of method foo(A<String>) is the same as another method in type X\n" +
				"----------\n" + 
				"2. WARNING in X.java (at line 3)\n" + 
				"	Object foo(A<Integer> a) { return null; }\n" + 
				"	       ^^^^^^^^^^^^^^^^^\n" + 
				"Erasure of method foo(A<Integer>) is the same as another method in type X\n" +
				"----------\n":
					"----------\n" + 
					"1. ERROR in X.java (at line 2)\n" + 
					"	void foo(A<String> a) {}\n" + 
					"	     ^^^^^^^^^^^^^^^^\n" + 
					"Erasure of method foo(A<String>) is the same as another method in type X\n" +
					"----------\n" + 
					"2. ERROR in X.java (at line 3)\n" + 
					"	Object foo(A<Integer> a) { return null; }\n" + 
					"	       ^^^^^^^^^^^^^^^^^\n" + 
					"Erasure of method foo(A<Integer>) is the same as another method in type X\n" +
					"----------\n" + 
					"3. ERROR in X.java (at line 4)\n" + 
					"	void test(A<Integer> a) { foo(a); }\n" + 
					"	                          ^^^\n" + 
					"The method foo(A<String>) in the type X is not applicable for the arguments (A<Integer>)\n" + 
					"----------\n";
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	void foo(A<String> a) {}\n" +
				"	Object foo(A<Integer> a) { return null; }\n" +
				"	 void test(A<Integer> a) { foo(a); }\n" +
				"}\n" +
				"class A<T> {}\n",
			},
			expectedCompilerLog
		);
/* javac 7
X.java:3: name clash: foo(A<Integer>) and foo(A<String>) have the same erasure
        Object foo(A<Integer> a) { return null; }
               ^
X.java:4: method foo in class X cannot be applied to given types
        void test(A<Integer> a) { foo(a); }
                                  ^
  required: A<String>
  found: A<Integer>
2 errors
 */
		String expectedCompilerLog2 = (this.complianceLevel == ClassFileConstants.JDK1_6)?
				"----------\n" + 
				"1. WARNING in X.java (at line 2)\n" + 
				"	Number foo(A<String> a) { return null; }\n" + 
				"	       ^^^^^^^^^^^^^^^^\n" + 
				"Erasure of method foo(A<String>) is the same as another method in type X\n" +
				"----------\n" + 
				"2. WARNING in X.java (at line 3)\n" + 
				"	Integer foo(A<Integer> a) { return null; }\n" + 
				"	        ^^^^^^^^^^^^^^^^^\n" + 
				"Erasure of method foo(A<Integer>) is the same as another method in type X\n" +
				"----------\n":
					"----------\n" + 
					"1. ERROR in X.java (at line 2)\n" + 
					"	Number foo(A<String> a) { return null; }\n" + 
					"	       ^^^^^^^^^^^^^^^^\n" + 
					"Erasure of method foo(A<String>) is the same as another method in type X\n" +
					"----------\n" + 
					"2. ERROR in X.java (at line 3)\n" + 
					"	Integer foo(A<Integer> a) { return null; }\n" + 
					"	        ^^^^^^^^^^^^^^^^^\n" + 
					"Erasure of method foo(A<Integer>) is the same as another method in type X\n" +
					"----------\n" + 
					"3. ERROR in X.java (at line 4)\n" + 
					"	void test(A<Integer> a) { foo(a); }\n" + 
					"	                          ^^^\n" + 
					"The method foo(A<String>) in the type X is not applicable for the arguments (A<Integer>)\n" + 
					"----------\n";
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	Number foo(A<String> a) { return null; }\n" +
				"	Integer foo(A<Integer> a) { return null; }\n" +
				"	void test(A<Integer> a) { foo(a); }\n" +
				"}\n" +
				"class A<T> {}\n",
			},
			expectedCompilerLog2
/* javac 7
X.java:3: name clash: foo(A<Integer>) and foo(A<String>) have the same erasure
        Integer foo(A<Integer> a) { return null; }
                ^
X.java:4: method foo in class X cannot be applied to given types
        void test(A<Integer> a) { foo(a); }
                                  ^
  required: A<String>
  found: A<Integer>
2 errors
 */
		);
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=87550
	public void test0562() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"interface Inter<A, B> {}\n" +
				"public class X<T, U, V extends X<T, U, V>> extends ArrayList<V> implements Inter<T, U> {\n" +
				"	public final void foo(U u) {\n" +
				"		X.bar(this, u);\n" +
				"	}\n" +
				"	public static final <P, Q> void bar(Collection<? extends Inter<P, Q>> c, Q q) {}\n" +
				"}\n",
			},
			"");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=87550 - variation
	public void test0563() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"interface Inter<A, B> {}\n" +
				"public class X<T, U, V extends X<T, U, V>> extends ArrayList<V> implements Inter<T, U> {\n" +
				"	public final void foo(U u) {\n" +
				"		X.bar(this, u);\n" +
				"	}\n" +
				"	public static final <P, Q, R> void bar(Collection<R> c, Q q) {}\n" +
				"}\n",
			},
			"");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=87550 - variation
	// Awaiting clarification on http://mail.openjdk.java.net/pipermail/lambda-spec-experts/2013-November/000428.html
	public void test0564() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"interface Inter<A, B> {}\n" +
				"public class X<T, U, V extends X<T, U, V>> extends ArrayList<V> implements Inter<T, U> {\n" +
				"	public final void foo(U u) {\n" +
				"		X.bar(this, u);\n" +
				"	}\n" +
				"	public static final <P, Q> void bar(Collection<? extends Inter<P, Q>> c, Q q) {}\n" +
				"}\n",
			},
			"");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=87995	- check no warning
	public void test0565() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"interface IFoo<T> {\n" +
				"    public T get(Class<T> clazz);\n" +
				"   Zork z;\n" +
				"}\n" +
				"\n" +
				"class Bar implements IFoo<Integer> {\n" +
				"    public Integer get(Class<Integer> arg0) {\n" +
				"        return Integer.valueOf(3);\n" +
				"    }\n" +
				"}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}
	public void test0566() {
		String xSource =
				"import java.util.*;\n" +
				"\n" +
				"public class X {\n" +
				"\n" +
				"	void bar2() {\n" +
				"		List<X1> le = new ArrayList<X1>(5);\n" +
				"		le = fill(le, new X2());\n" +
				"	}\n" +
				"	<T> List<T> fill(List<? super T> lt, T t) { return null; }\n" +
				"}\n" +
				"class X1 {}\n" +
				"class X2 extends X1 {\n" +
				"	void foo(){}\n" +
				"}\n";
		if (this.complianceLevel < ClassFileConstants.JDK1_8) {
			this.runNegativeTest(
				new String[] {
					"X.java",
					xSource,
				},
				"----------\n" +
				"1. ERROR in X.java (at line 7)\n" +
				"	le = fill(le, new X2());\n" +
				"	     ^^^^^^^^^^^^^^^^^^\n" +
				"Type mismatch: cannot convert from List<X2> to List<X1>\n" +
				"----------\n");
		} else {
			runConformTest(new String[]{ "X.java", xSource });
		}
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=89454
	public void test0567() {
		this.runConformTest(
			new String[] {
				"Thrower.java",
				"public interface Thrower<E extends Exception> {\n" +
				"    public void throwIt() throws E;\n" +
				"}\n",
			},
			"");
		this.runConformTest(
			new String[] {
				"GenericsTest.java",
				"public class GenericsTest {\n" +
				"    public static void main(String[] args) throws MyException {\n" +
				"        Thrower<MyException> thrower = new Thrower<MyException>() {\n" +
				"            public void throwIt() throws MyException {\n" +
				"                throw new MyException();\n" +
				"            }\n" +
				"        };\n" +
				"        try {\n" +
				"           thrower.throwIt();\n" +
				"        } catch(Exception e) {\n" +
				"          System.out.println(\"SUCCESS\");\n" +
				"        }\n" +
				"    }\n" +
				"}\n" +
				"class MyException extends Exception {\n" +
				"}\n",
			},
			"SUCCESS",
			null,
			false,
			null);
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=89448
	public void test0568() {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.ArrayList;\n" +
				"import java.util.List;\n" +
				"\n" +
				"public class X {\n" +
				"\n" +
				"    public static void main(String[] args) {\n" +
				"\n" +
				"        ArrayList<ArrayList<Long>> n = new ArrayList<ArrayList<Long>>();\n" +
				"        ArrayList<Long> arr = new ArrayList<Long>();\n" +
				"        arr.add(new Long(5));\n" +
				"        n.add(arr);\n" +
				"        \n" +
				"        List<? extends List<Long>> m = n; // Whoa!\n" +
				"        \n" +
				"        for(Long l : m.get(0)) {\n" +
				"            System.out.println(l);\n" +
				"        }\n" +
				"    }\n" +
				"\n" +
				"}\n",
			},
			"5");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=89778
	public void test0569() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X\n" +
				"{\n" +
				"    protected static <T extends Exception> void foo() throws T, Exce {\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	protected static <T extends Exception> void foo() throws T, Exce {\n" +
			"	                                                            ^^^^\n" +
			"Exce cannot be resolved to a type\n" +
			"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=90147
	public void test0570() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<T extends Object> {\n" +
				"  public class InnerClass implements Comparable<T> {\n" +
				"    public int compareTo(T other) {\n" +
				"      return -1;\n" +
				"    }\n" +
				"  }\n" +
				"  \n" +
				"  public void foo() {\n" +
				"    InnerClass a = new InnerClass();\n" +
				"    InnerClass b = new InnerClass();\n" +
				"    // The following line does not compile (anymore):\n" +
				"    a.compareTo(b);\n" +
				"  }\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 12)\n" +
			"	a.compareTo(b);\n" +
			"	  ^^^^^^^^^\n" +
			"The method compareTo(T) in the type X<T>.InnerClass is not applicable for the arguments (X<T>.InnerClass)\n" +
			"----------\n");
	}
	public void test0571() {
		runConformTest(
			// test directory preparation
			true /* flush output directory */,
			new String[] { /* test files */
				"X.java",
				"interface IFoo {\n" +
				"	void foo();\n" +
				"}\n" +
				"class Box<T extends IFoo> {\n" +
				"	T value() {\n" +
				"		return null;\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"interface IBar {\n" +
				"	void bar();\n" +
				"}\n" +
				"\n" +
				"public class X {\n" +
				"	void test01(Box<?> box) {\n" +
				"		box.value().foo();\n" +
				"	}\n" +
				"	void test02(Box<? extends IBar> box) {\n" +
				"		box.value().foo();\n" +
				"		box.value().bar();\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		System.out.println(\"SUCCESS\");\n" +
				"	}\n" +
				"}\n",
			},
			// compiler options
			null /* no class libraries */,
			null /* no custom options */,
			// compiler results
			null /* do not check compiler log */,
			// runtime results
			"SUCCESS" /* expected output string */,
			null /* do not check error string */,
			// javac options
			JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=90430
	// SHOULD FAIL AT 1.8 (18.2.3): The method doWithEnumClass(Class<T>) in the type X is not applicable for the arguments (Class<Enum>)
	public void test0572() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public <T extends Enum<T>> void doWithEnumClass(Class<T> enumClass) {\n" +
				"	}\n" +
				"\n" +
				"	public void f() {\n" +
				"		Class<?> cl = null; // Returned by Class.forName(\"xyz\");\n" +
				"		doWithEnumClass((Class<Enum>) cl);\n" +
				"	}\n" +
			"}\n",
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=90430 - check unchecked warnings
	// SHOULD FAIL AT 1.8 (18.2.3): The method doWithEnumClass(Class<T>) in the type X is not applicable for the arguments (Class<Enum>)
	public void test0573() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public <T extends Enum<T>> void doWithEnumClass(Class<T> enumClass) {\n" +
				"		Zork z;\n" +
				"	}\n" +
				"\n" +
				"	public void f() {\n" +
				"		Class<?> cl = null; // Returned by Class.forName(\"xyz\");\n" +
				"		doWithEnumClass((Class<Enum>) cl);\n" +
				"	}\n" +
			"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 8)\n" +
			"	doWithEnumClass((Class<Enum>) cl);\n" +
			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked invocation doWithEnumClass(Class<Enum>) of the generic method doWithEnumClass(Class<T>) of type X\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 8)\n" +
			"	doWithEnumClass((Class<Enum>) cl);\n" +
			"	                ^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from Class<capture#1-of ?> to Class<Enum>\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 8)\n" +
			"	doWithEnumClass((Class<Enum>) cl);\n" +
			"	                       ^^^^\n" +
			"Enum is a raw type. References to generic type Enum<E> should be parameterized\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=90423 - variation
	public void test0574() {
		// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6182950
		String expectedCompilerLog = (this.complianceLevel == ClassFileConstants.JDK1_6)?
				"----------\n" + 
				"1. WARNING in X.java (at line 6)\n" + 
				"	<T extends Integer> T foo(Object o) {  return null; } // ok\n" + 
				"	           ^^^^^^^\n" + 
				"The type parameter T should not be bounded by the final type Integer. Final types cannot be further extended\n" + 
				"----------\n" + 
				"2. WARNING in X.java (at line 6)\n" + 
				"	<T extends Integer> T foo(Object o) {  return null; } // ok\n" + 
				"	                      ^^^^^^^^^^^^^\n" + 
				"Duplicate method foo(Object) in type X.C2\n" + 
				"----------\n" + 
				"3. WARNING in X.java (at line 7)\n" + 
				"	<T extends String> T foo(Object o) {  return null; } // ok\n" + 
				"	           ^^^^^^\n" + 
				"The type parameter T should not be bounded by the final type String. Final types cannot be further extended\n" + 
				"----------\n" + 
				"4. WARNING in X.java (at line 7)\n" + 
				"	<T extends String> T foo(Object o) {  return null; } // ok\n" + 
				"	                     ^^^^^^^^^^^^^\n" + 
				"Duplicate method foo(Object) in type X.C2\n" + 
				"----------\n" + 
				"5. ERROR in X.java (at line 10)\n" + 
				"	new X().new C2().foo((List<String>) null);\n" + 
				"	                 ^^^\n" + 
				"The method foo(Object) is ambiguous for the type X.C2\n" + 
				"----------\n":
					"----------\n" + 
					"1. WARNING in X.java (at line 6)\n" + 
					"	<T extends Integer> T foo(Object o) {  return null; } // ok\n" + 
					"	           ^^^^^^^\n" + 
					"The type parameter T should not be bounded by the final type Integer. Final types cannot be further extended\n" + 
					"----------\n" + 
					"2. ERROR in X.java (at line 6)\n" + 
					"	<T extends Integer> T foo(Object o) {  return null; } // ok\n" + 
					"	                      ^^^^^^^^^^^^^\n" + 
					"Duplicate method foo(Object) in type X.C2\n" + 
					"----------\n" + 
					"3. WARNING in X.java (at line 7)\n" + 
					"	<T extends String> T foo(Object o) {  return null; } // ok\n" + 
					"	           ^^^^^^\n" + 
					"The type parameter T should not be bounded by the final type String. Final types cannot be further extended\n" + 
					"----------\n" + 
					"4. ERROR in X.java (at line 7)\n" + 
					"	<T extends String> T foo(Object o) {  return null; } // ok\n" + 
					"	                     ^^^^^^^^^^^^^\n" + 
					"Duplicate method foo(Object) in type X.C2\n" + 
					"----------\n";
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.List;\n" +
				"\n" +
				"public class X {\n" +
				"\n" +
				"	class C2 {\n" +
				"		<T extends Integer> T foo(Object o) {  return null; } // ok\n" +
				"		<T extends String> T foo(Object o) {  return null; } // ok\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		new X().new C2().foo((List<String>) null);\n" +
				"	}\n" +
				"}\n"
			},
			expectedCompilerLog
		);
/*
X.java:6: name clash: <T#1>foo(Object) and <T#2>foo(Object) have the same erasure
                <T extends String> T foo(Object o) {  return null; } // ok
                                     ^
  where T#1,T#2 are type-variables:
    T#1 extends String declared in method <T#1>foo(Object)
    T#2 extends Integer declared in method <T#2>foo(Object)
1 error
 */
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=84496 - variation with field ref
	public void test0575() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public static void main(String[] args) {\n" +
				"        Foo<?> f1 = new Foo<Integer>();\n" +
				"        (f1).bar = (f1).bar;\n" +
				"    }\n" +
				"    static class Foo<T> {\n" +
				"       Bar<T> bar = new Bar<T>();\n" +
				"    }\n" +
				"    static class Bar<T> {\n" +
				"        T t;\n" +
				"    }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	(f1).bar = (f1).bar;\n" +
			"	           ^^^^^^^^\n" +
			"Type mismatch: cannot convert from X.Bar<capture#2-of ?> to X.Bar<capture#1-of ?>\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=84496 - variation with single ref
	public void test0576() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public static void main(String[] args) {\n" +
				"        Foo<?> f1 = new Foo<Integer>();\n" +
				"        Foo<?> f2 = new Foo<String>();\n" +
				"		f1 = f1;\n" +
				"		f1 = f2;\n" +
				"    }\n" +
				"    static class Foo<T> {\n" +
				"    }\n" +
				"}\n"
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=84496 - variation with qualified name ref
	public void test0577() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public static void main(String[] args) {\n" +
				"        Foo<?> f1 = new Foo<Integer>();\n" +
				"        (f1).bar = f1.bar;\n" +
				"    }\n" +
				"    static class Foo<T> {\n" +
				"       Bar<T> bar = new Bar<T>();\n" +
				"    }\n" +
				"    static class Bar<T> {\n" +
				"        T t;\n" +
				"    }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	(f1).bar = f1.bar;\n" +
			"	           ^^^^^^\n" +
			"Type mismatch: cannot convert from X.Bar<capture#2-of ?> to X.Bar<capture#1-of ?>\n" +
			"----------\n");
	}
	// check array bound for wildcard
	public void test0578() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	void foo(Box<? extends int[]> box) {\n" +
				"		int[] ints = box.get();\n" +
				"	}\n" +
				"}\n" +
				"class Box<T> {\n" +
				"	T get() { return null; }\n" +
				"}\n"
			},
			"");
	}
	// check array bound for wildcard
	public void test0579() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	void foo(Box<? super int[]> box) {\n" +
				"		int[] ints = box.get();\n" +
				"	}\n" +
				"}\n" +
				"class Box<T> {\n" +
				"	T get() { return null; }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	int[] ints = box.get();\n" +
			"	             ^^^^^^^^^\n" +
			"Type mismatch: cannot convert from capture#1-of ? super int[] to int[]\n" +
			"----------\n");
	}
	// check array bound for wildcard
	public void test0580() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	void foo(Box<?> box) {\n" +
				"		int[] ints = box.get();\n" +
				"	}\n" +
				"}\n" +
				"class Box<T> {\n" +
				"	T get() { return null; }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	int[] ints = box.get();\n" +
			"	             ^^^^^^^^^\n" +
			"Type mismatch: cannot convert from capture#1-of ? to int[]\n" +
			"----------\n");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=84496 - variation
	public void test0581() {
	    this.runNegativeTest(
			new String[] {
	            "X.java",
	            "class X {" +
	            "  public static void main(String[] args) {\n" +
	            "    Foo<?> f1 = new Foo<Integer>();\n" +
	            "    f1.bar = f1.bar;\n" +
	            "   }\n" +
	            " }\n" +
	            "class Foo<T> {\n" +
	            "  Bar<T> bar = new Bar<T>();\n" +
	            "}\n" +
	            "class Bar<T> {\n" +
	            "  T t;\n" +
	            "}\n"
	   		},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	f1.bar = f1.bar;\n" +
			"	         ^^^^^^\n" +
			"Type mismatch: cannot convert from Bar<capture#2-of ?> to Bar<capture#1-of ?>\n" +
			"----------\n");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=84496
	public void test0582() {
	    this.runConformTest(
            new String[] {
                "X.java",
                "import java.util.List;\n" +
                "class X {\n" +
                "  void foo(List<? extends I1> l1) {\n" +
                "    C1 c1 = (C1)l1.get(0);\n" +
                "  }\n" +
                "}\n" +
                "interface I1{}\n" +
                "class C1{}\n"
            },
            "");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=91021
	public void test0583() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"class D<U> {\n" +
				"		 public D (D<U> anotherD) {\n" +
				"		 }\n" +
				"}\n" +
				"\n" +
				"public class X<S> {\n" +
				"		 public static class C<T> {\n" +
				"		 		 public C(C<T> anotherC) {\n" +
				"		 		 }\n" +
				"		 }\n" +
				"\n" +
				"		 public void mD(D<S> d) {\n" +
				"		 		 //the following line is OK (no warning reported)\n" +
				"		 		 new D<S>(d);\n" +
				"		 }\n" +
				"		 \n" +
				"		 public void mC(C<S> c) {\n" +
				"		 		 /* type safety warning\n" +
				"		 		  * (The expression of type X.C<S>\n" +
				"		 		  * needs unchecked conversion to conform to\n" +
				"		 		  * XSB<S>.C<S>)\n" +
				"		 		  */\n" +
				"		 		 new C<S>(c);\n" +
				"		 }\n" +
				"		Zork z;\n" +
				"}\n"
            },
			"----------\n" +
			"1. ERROR in X.java (at line 25)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=91017
	public void test0584() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"import java.util.ArrayList;\n" +
				"import java.util.List;\n" +
				"\n" +
				"public class X {\n" +
				"		 public static void main(String[] args) {\n" +
				"		 		 List<String> stringList = new ArrayList<String>();\n" +
				"		 		 stringList.add(\"foo\");\n" +
				"		 		 List<Integer> intList = new ArrayList<Integer>();\n" +
				"		 		 intList.add(1);\n" +
				"\n" +
				"		 		 List<?> untypedList = stringList;\n" +
				"		 		 List<?> untypedList2 = intList;\n" +
				"\n" +
				"		 		 //correctly flagged as error: untypedList.add(new Object());\n" +
				"		 		 //ditto: untypedList.add(untypedList2.get(0));\n" +
				"\n" +
				"		 		 //but this is not flagged at all by eclipse:\n" +
				"		 		 untypedList.addAll(untypedList2);\n" +
				"\n" +
				"		 		 for(String s : stringList){\n" +
				"		 		 		 //next line generates runtime ClassCastException\n" +
				"		 		 		 Logger.log(\"Test_Lists.main: s: \" + s);\n" +
				"		 		 }\n" +
				"		 }\n" +
				"}\n"
            },
    		"----------\n" +
    		"1. ERROR in X.java (at line 18)\n" +
    		"	untypedList.addAll(untypedList2);\n" +
    		"	            ^^^^^^\n" +
    		"The method addAll(Collection<? extends capture#1-of ?>) in the type List<capture#1-of ?> is not applicable for the arguments (List<capture#2-of ?>)\n" +
    		"----------\n" +
    		"2. ERROR in X.java (at line 22)\n" +
    		"	Logger.log(\"Test_Lists.main: s: \" + s);\n" +
    		"	^^^^^^\n" +
    		"Logger cannot be resolved\n" +
    		"----------\n");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=90881
	public void test0585() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"import java.util.*;\n" +
				"\n" +
				"public class X {\n" +
				"        public static void main(String[] args) {\n" +
				"                Outer.Comparator<String> i = new Outer.Comparator<String>() {\n" +
				"\n" +
				"                        public boolean equals(String a, String b) {\n" +
				"                                return false;\n" +
				"                        }\n" +
				"\n" +
				"                        public int hashCode(String a) {\n" +
				"                                return 0;\n" +
				"                        }\n" +
				"                };\n" +
				"\n" +
				"        }\n" +
				"}\n" +
				"\n" +
				"class Outer {}\n",
            },
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	Outer.Comparator<String> i = new Outer.Comparator<String>() {\n" +
			"	^^^^^^^^^^^^^^^^\n" +
			"Outer.Comparator cannot be resolved to a type\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 5)\n" +
			"	Outer.Comparator<String> i = new Outer.Comparator<String>() {\n" +
			"	                                 ^^^^^^^^^^^^^^^^\n" +
			"Outer.Comparator cannot be resolved to a type\n" +
			"----------\n");
	}

	// **
	// note: the test does not show the needed unchecked warning, since it is
	//       a conform test
	public void test0586() {
	    this.runConformTest(
            new String[] {
                "X.java",
				"public class X {\n" +
				"    static class BB<T, S> { }\n" +
				"    static class BD<T> extends BB<T, T> { }\n" +
				"    void f() {\n" +
				"        BB<? extends Number, ? super Integer> bb = null;\n" +
				"        Object o = (BD<Number>) bb;\n" +
				"    }\n" +
				"}\n",
            },
			"");
	}

	public void test0587() {
	    this.runConformTest(
            new String[] {
                "X.java",
				"interface DA<T> {\n" +
				"}\n" +
				"interface DB<T> extends DA<T> {\n" +
				"}\n" +
				"interface DC<T> extends DA<Integer> {\n" +
				"}\n" +
				"\n" +
				"public class X {\n" +
				"	Object o = (DC<?>) (DA<?>) null;\n" +
				"}\n",
            },
			"");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=90433
	// **
	public void test0588() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
    			"public class X<S extends Comparable<S>> {\n" +
    			"	public void f() {\n" +
    			"		Class<? extends Comparable<?>> cc = Long.class;\n" +
    			"		Class<S> currentClass = null;\n" +
    			"		boolean b = currentClass == Long.class;\n" +
    			"		boolean c = X.class == Long.class;\n" +
    			"    }\n" +
    			"}\n",
            },
    		"----------\n" +
    		"1. ERROR in X.java (at line 6)\n" +
    		"	boolean c = X.class == Long.class;\n" +
    		"	            ^^^^^^^^^^^^^^^^^^^^^\n" +
    		"Incompatible operand types Class<X> and Class<Long>\n" +
    		"----------\n");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=85281
	public void test0589() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"import java.util.ArrayList;\n" +
				"import java.util.List;\n" +
				"\n" +
				"public class X {\n" +
				"\n" +
				"	void addAll(List<? extends Number> target, List<? extends Number> source) {\n" +
				"		target.addAll(source);\n" +
				"	}\n" +
				"\n" +
				"	public static void main(String... args) {\n" +
				"		List<Integer> ints = new ArrayList<Integer>();\n" +
				"		ints.add(3);\n" +
				"\n" +
				"		List<Float> floats = new ArrayList<Float>();\n" +
				"		floats.add(3f);\n" +
				"\n" +
				"		new X().addAll(ints, floats);\n" +
				"\n" +
				"		for (Integer integer : ints) {\n" +
				"			System.out.println(integer.intValue());\n" +
				"		}\n" +
				"	}\n" +
				"}\n",
            },
    		"----------\n" +
    		"1. ERROR in X.java (at line 7)\n" +
    		"	target.addAll(source);\n" +
    		"	       ^^^^^^\n" +
    		"The method addAll(Collection<? extends capture#1-of ? extends Number>) in the type List<capture#1-of ? extends Number> is not applicable for the arguments (List<capture#2-of ? extends Number>)\n" +
    		"----------\n");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=85281 - variation
	public void test0590() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"import java.util.ArrayList;\n" +
				"import java.util.List;\n" +
				"\n" +
				"public class X {\n" +
				"\n" +
				"	void assignAll(Class<? super Number> sup, Class<? extends Number> ext) {\n" +
				"		Class<? super Number> superSup = sup.getSuperclass();\n" +
				"		Class<?> superExt = ext.getSuperclass();\n" +
				"		Class<? super Number> superSup2 = ext.getSuperclass();\n" +
				"	}	\n" +
				"}\n",
            },
    		"----------\n" +
    		"1. ERROR in X.java (at line 9)\n" +
    		"	Class<? super Number> superSup2 = ext.getSuperclass();\n" +
    		"	                                  ^^^^^^^^^^^^^^^^^^^\n" +
    		"Type mismatch: cannot convert from Class<capture#6-of ? super capture#5-of ? extends Number> to Class<? super Number>\n" +
    		"----------\n");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=85281 - variation
	public void test0591() {
	    this.runConformTest(
            new String[] {
                "X.java",
				"public class X<U> {\n" +
				"\n" +
				"	public Values<U> foo(Box<? extends U> box) {\n" +
				"		return selectedValues(box.getValues());\n" +
				"	}\n" +
				"	public static <G> Values<G> selectedValues(Values<? extends G> v) {\n" +
				"		return null;\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"abstract class Box<V> {\n" +
				"	  abstract Values<V> getValues();\n" +
				"}\n" +
				"abstract class Values<T> {\n" +
				"}\n",
            },
			"");
	}
	public void test0592() {
	    this.runConformTest(
            new String[] {
                "X.java",
				"import java.util.*;\n" +
				"public class X {\n" +
				"    List<?> l;\n" +
				"    void m() {\n" +
				"	m2(l);\n" +
				"    }\n" +
				"    <T> void m2(List<T> l2) {\n" +
				"	l2.add(l2.remove(0));\n" +
				"    }\n" +
				"}\n",
            },
			"");
	}
	public void test0593() {
		Map options = getCompilerOptions();
		options.put(JavaCore.COMPILER_PB_UNCHECKED_TYPE_OPERATION, JavaCore.IGNORE);
	    String xSource =
				"import java.util.*;\n" +
				"public class X {\n" +
				"	    List<Class<?>> classes1 = Arrays.asList(String.class, Boolean.class);\n" +
				"	    List<? extends Class<?>> classes2 = Arrays.asList(String.class, Boolean.class);\n" +
				"}\n";
	    if (this.complianceLevel < ClassFileConstants.JDK1_8) {
	    	this.runNegativeTest(
    			new String[] {
    				"X.java",
    				xSource,
    			},
    			"----------\n" +
				"1. ERROR in X.java (at line 3)\n" +
				"	List<Class<?>> classes1 = Arrays.asList(String.class, Boolean.class);\n" +
				"	                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
				"Type mismatch: cannot convert from List<Class<? extends Object&Serializable&Comparable<?>>> to List<Class<?>>\n" +
				"----------\n",
				null,
				true,
				options);
	    } else {
	    	runConformTest(new String[] { "X.java", xSource }, options);
	    }
	}
	public void test0594() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				" import java.util.*;\n" +
				"import static java.util.Map.*;\n" +
				"\n" +
				"abstract class MyIterator<E> implements Iterator<E> {\n" +
				"	Set<E> iteratedSet;\n" +
				"}\n" +
				"public class X {\n" +
				"	\n" +
				"	void foo() {\n" +
				"		Map<String, ?> map;\n" +
				"		Iterator<Entry<String, ?>> it = map.entrySet().iterator();\n" +
				"\n" +
				"		Entry<String, Number> unrelatedEntry;\n" +
				"		MyIterator<Entry<String, ?>> mit = (MyIterator<Entry<String, ?>>) it;\n" +
				"		mit.iteratedSet.add(unrelatedEntry);\n" +
				"	}\n" +
				"}\n",
            },
    		"----------\n" +
    		"1. ERROR in X.java (at line 11)\n" +
    		"	Iterator<Entry<String, ?>> it = map.entrySet().iterator();\n" +
    		"	                                ^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
    		"Type mismatch: cannot convert from Iterator<Map.Entry<String,capture#1-of ?>> to Iterator<Map.Entry<String,?>>\n" +
    		"----------\n");
	}
	public void test0595() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				" import java.util.*;\n" +
				"import static java.util.Map.*;\n" +
				"\n" +
				"abstract class MyIterator<E> implements Iterator<E> {\n" +
				"	Set<E> iteratedSet;\n" +
				"}\n" +
				"public class X {\n" +
				"	\n" +
				"	void bar() {\n" +
				"		Map<? extends String, ?> map;\n" +
				"		Iterator<Entry<? extends String, ?>> it = map.entrySet().iterator();\n" +
				"\n" +
				"		Entry<String, Number> unrelatedEntry;\n" +
				"		MyIterator<Entry<? extends String, ?>> mit = (MyIterator<Entry<? extends String, ?>>) it;\n" +
				"		mit.iteratedSet.add(unrelatedEntry);\n" +
				"	}\n" +
				"}\n",
            },
    		"----------\n" +
    		"1. ERROR in X.java (at line 11)\n" +
    		"	Iterator<Entry<? extends String, ?>> it = map.entrySet().iterator();\n" +
    		"	                                          ^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
    		"Type mismatch: cannot convert from Iterator<Map.Entry<capture#1-of ? extends String,capture#2-of ?>> to Iterator<Map.Entry<? extends String,?>>\n" +
    		"----------\n");
	}
	public void test0596() {
	    this.runConformTest(
            new String[] {
                "X.java",
				"import java.util.*;\n" +
				"\n" +
				"public class X {\n" +
				"	<T> Set<T> unmodifiableSet(Set<T> set) {\n" +
				"		return set;\n" +
				"	}\n" +
				"	public void foo(Set<?> s) {\n" +
				"		Set<?> s2 = unmodifiableSet(s);\n" +
				"	}\n" +
				"}\n",
            },
			"");
	}
	public void test0597() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"public class X<U> {\n" +
				"	Pair<U,U> m() { \n" +
				"		return null; \n" +
				"	}\n" +
				"	void foo(X<?> x) {\n" +
				"		x.m().first = x.m().second;\n" +
				"	}\n" +
				"}\n" +
				"	\n" +
				"class Pair<E, F> {\n" +
				"	E first;\n" +
				"	F second;\n" +
				"}\n",
            },
    		"----------\n" +
    		"1. ERROR in X.java (at line 6)\n" +
    		"	x.m().first = x.m().second;\n" +
    		"	              ^^^^^^^^^^^^\n" +
    		"Type mismatch: cannot convert from capture#2-of ? to capture#1-of ?\n" +
    		"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=90879
	// SHOULD FAIL AT 1.8 (18.2.3): The method sort(List<T>) in the type Collections is not applicable for the arguments (List<X>)
	public void test0598() {
	    this.runConformTest(
            new String[] {
                "X.java",
				"import java.util.*;\n" +
				"\n" +
				"class X implements Comparable {\n" +
				"\n" +
				"	public int compareTo(Object o) {\n" +
				"		return 0;\n" +
				"	}\n" +
				"\n" +
				"}\n" +
				"\n" +
				"class Y {\n" +
				"	public static void main(String[] args) {\n" +
				"		List<X> lx = null;\n" +
				"		Collections.sort(lx);\n" +
				"	}\n" +
				"}\n",
			},
			"");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=90879 - variation
	// SHOULD FAIL AT 1.8 (18.2.3): The method sort1(List<T>) in the type X is not applicable for the arguments (List<X>)
	public void test0599() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"import java.util.*;\n" +
				"\n" +
				"public class X implements Comparable {\n" +
				"	public static void main(String[] args) {\n" +
				"		Zork z;\n" +
				"		\n" +
				"		List<X> lx = null;\n" +
				"		sort1(lx);\n" +
				"		sort2(lx);\n" +
				"		sort3(lx);\n" +
				"		sort4(lx);\n" +
				"		sort5(lx);\n" +
				"	}\n" +
				"	public int compareTo(Object o) {\n" +
				"		return 0;\n" +
				"	}\n" +
				"	static <T extends Comparable<? super T>> void sort1(List<T> list) {}\n" +
				"	static <T extends Comparable<? extends T>> void sort2(List<T> list) {}\n" +
				"	static <T extends Comparable<?>> void sort3(List<T> list) {}\n" +
				"	static <T extends Comparable<T>> void sort4(List<T> list) {}\n" +
				"	static <T extends Comparable> void sort5(List<T> list) {}\n" +
				"}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	public class X implements Comparable {\n" +
			"	                          ^^^^^^^^^^\n" +
			"Comparable is a raw type. References to generic type Comparable<T> should be parameterized\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 5)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 8)\n" +
			"	sort1(lx);\n" +
			"	^^^^^^^^^\n" +
			"Type safety: Unchecked invocation sort1(List<X>) of the generic method sort1(List<T>) of type X\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 9)\n" +
			"	sort2(lx);\n" +
			"	^^^^^^^^^\n" +
			"Type safety: Unchecked invocation sort2(List<X>) of the generic method sort2(List<T>) of type X\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 11)\n" +
			"	sort4(lx);\n" +
			"	^^^^^^^^^\n" +
			"Type safety: Unchecked invocation sort4(List<X>) of the generic method sort4(List<T>) of type X\n" +
			"----------\n" +
			"6. WARNING in X.java (at line 21)\n" +
			"	static <T extends Comparable> void sort5(List<T> list) {}\n" +
			"	                  ^^^^^^^^^^\n" +
			"Comparable is a raw type. References to generic type Comparable<T> should be parameterized\n" +
			"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=90879 - variation
	// SHOULD FAIL AT 1.8 (18.2.3): The method sort6(List<T>) in the type X is not applicable for the arguments (List<MyEnum>)
	public void test0600() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"import java.util.*;\n" +
				"\n" +
				"public class X implements Comparable {\n" +
				"	public static void main(String[] args) {\n" +
				"		Zork z;\n" +
				"		\n" +
				"		List<MyEnum> le = null;\n" +
				"		sort6(le);\n" +
				"		sort7(le);\n" +
				"		sort8(le);\n" +
				"		sort9(le);\n" +
				"		sort10(le);\n" +
				"	}\n" +
				"	public int compareTo(Object o) {\n" +
				"		return 0;\n" +
				"	}\n" +
				"	static <T extends MyEnum<? super T>> void sort6(List<T> list) {}\n" +
				"	static <T extends MyEnum<? extends T>> void sort7(List<T> list) {}\n" +
				"	static <T extends MyEnum<?>> void sort8(List<T> list) {}\n" +
				"	static <T extends MyEnum<T>> void sort9(List<T> list) {}\n" +
				"	static <T extends MyEnum> void sort10(List<T> list) {}\n" +
				"}\n" +
				"class MyEnum<E extends MyEnum<E>> {}\n",
            },
            "----------\n" +
    		"1. WARNING in X.java (at line 3)\n" +
    		"	public class X implements Comparable {\n" +
    		"	                          ^^^^^^^^^^\n" +
    		"Comparable is a raw type. References to generic type Comparable<T> should be parameterized\n" +
    		"----------\n" +
    		"2. ERROR in X.java (at line 5)\n" +
    		"	Zork z;\n" +
    		"	^^^^\n" +
    		"Zork cannot be resolved to a type\n" +
    		"----------\n" +
    		"3. WARNING in X.java (at line 7)\n" +
    		"	List<MyEnum> le = null;\n" +
    		"	     ^^^^^^\n" +
    		"MyEnum is a raw type. References to generic type MyEnum<E> should be parameterized\n" +
    		"----------\n" +
    		"4. WARNING in X.java (at line 8)\n" +
    		"	sort6(le);\n" +
    		"	^^^^^^^^^\n" +
    		"Type safety: Unchecked invocation sort6(List<MyEnum>) of the generic method sort6(List<T>) of type X\n" +
    		"----------\n" +
    		"5. WARNING in X.java (at line 9)\n" +
    		"	sort7(le);\n" +
    		"	^^^^^^^^^\n" +
    		"Type safety: Unchecked invocation sort7(List<MyEnum>) of the generic method sort7(List<T>) of type X\n" +
    		"----------\n" +
    		"6. WARNING in X.java (at line 11)\n" +
    		"	sort9(le);\n" +
    		"	^^^^^^^^^\n" +
    		"Type safety: Unchecked invocation sort9(List<MyEnum>) of the generic method sort9(List<T>) of type X\n" +
    		"----------\n" +
    		"7. WARNING in X.java (at line 21)\n" +
    		"	static <T extends MyEnum> void sort10(List<T> list) {}\n" +
    		"	                  ^^^^^^\n" +
    		"MyEnum is a raw type. References to generic type MyEnum<E> should be parameterized\n" +
    		"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=85281 - variation
	public void test0601() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"public class X<U> {\n" +
				"\n" +
				"	public Values<U> foo(Box<? extends U> box) {\n" +
				"		return selectedValues(box.getValues());\n" +
				"	}\n" +
				"	public static <G> Values<G> selectedValues(Values<G> v) {\n" +
				"		return null;\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"abstract class Box<V> {\n" +
				"	  abstract Values<V> getValues();\n" +
				"}\n" +
				"abstract class Values<T> {\n" +
				"}\n",
            },
    		"----------\n" +
    		"1. ERROR in X.java (at line 4)\n" +
			"	return selectedValues(box.getValues());\n" +
			"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
    		"Type mismatch: cannot convert from Values<capture#1-of ? extends U> to Values<U>\n" +
    		"----------\n");
	}
	public void test0602() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"public class X<U> {\n" +
				"\n" +
				"	public void foo(Box<? extends U> box) {\n" +
				"		box.getValues()[0] = box.getValues()[1];\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"abstract class Box<V> {\n" +
				"	  abstract Values<V>[] getValues();\n" +
				"}\n" +
				"abstract class Values<T> {\n" +
				"}\n",
            },
    		"----------\n" +
    		"1. ERROR in X.java (at line 4)\n" +
    		"	box.getValues()[0] = box.getValues()[1];\n" +
    		"	                     ^^^^^^^^^^^^^^^^^^\n" +
    		"Type mismatch: cannot convert from Values<capture#2-of ? extends U> to Values<capture#1-of ? extends U>\n" +
    		"----------\n");
	}
	public void test0603() {
	    this.runConformTest(
            new String[] {
                "X.java",
				"public class X<U> {\n" +
				"\n" +
				"	public void foo(Box<? extends U>[] boxes) {\n" +
				"		boxes[0] = boxes[1];\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"abstract class Box<V> {\n" +
				"	  abstract Values<V>[] getValues();\n" +
				"}\n" +
				"abstract class Values<T> {\n" +
				"}\n",
            },
			"");
	}
	// capture on array ref
	public void test0604() {
	    this.runConformTest(
            new String[] {
                "X.java",
				"public class X<U> {\n" +
				"\n" +
				"	public void foo(Box<? extends U>[] boxes) {\n" +
				"		bar(boxes[0], boxes[1]);\n" +
				"	}\n" +
				"	<V> void bar(V v1, V v2) {}\n" +
				"}\n" +
				"\n" +
				"abstract class Box<V> {\n" +
				"	  abstract Values<V>[] getValues();\n" +
				"}\n" +
				"abstract class Values<T> {\n" +
				"}\n",
            },
			"");
	}
	// capture on array ref
	public void test0605() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"public class X<U> {\n" +
				"\n" +
				"	public void foo(Box<? extends U> box) {\n" +
				"		box.getValues()[1] = box.getValues()[2];\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"abstract class Box<V> {\n" +
				"	  abstract Values<V>[] getValues();\n" +
				"}\n" +
				"abstract class Values<T> {\n" +
				"}\n",
            },
    		"----------\n" +
    		"1. ERROR in X.java (at line 4)\n" +
    		"	box.getValues()[1] = box.getValues()[2];\n" +
    		"	                     ^^^^^^^^^^^^^^^^^^\n" +
    		"Type mismatch: cannot convert from Values<capture#2-of ? extends U> to Values<capture#1-of ? extends U>\n" +
    		"----------\n");
	}
	public void test0606() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"public class X<U> {\n" +
				"\n" +
				"	public void foo(Box<? extends U> box) {\n" +
				"		box.getValues()[1] = (Values<? extends U>) box.getValues()[2];\n" +
				"	}\n" +
				"	<V> void bar(V v1, V v2) {}\n" +
				"}\n" +
				"\n" +
				"abstract class Box<V> {\n" +
				"	  abstract Values<V>[] getValues();\n" +
				"}\n" +
				"abstract class Values<T> {\n" +
				"}\n",
            },
    		"----------\n" +
    		"1. ERROR in X.java (at line 4)\n" +
    		"	box.getValues()[1] = (Values<? extends U>) box.getValues()[2];\n" +
    		"	                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
    		"Type mismatch: cannot convert from Values<capture#3-of ? extends U> to Values<capture#1-of ? extends U>\n" +
    		"----------\n");
	}
	public void test0607() {
		this.runNegativeTest(
            new String[] {
                "X.java",
				"import java.util.*;\n" +
				"\n" +
				"public class X {\n" +
				"\n" +
				"	void test01() {\n" +
				"		List<Comparable<Object>> lObj = new ArrayList<Comparable<Object>> ();\n" +
				"		Collections.sort (lObj);	\n" +
				"	}\n" +
				"	void test02() {\n" +
				"		List<Comparable> lComp = new ArrayList<Comparable> ();\n" +
				"		Collections.sort (lComp);		\n" +
				"	}\n" +
				"	void test03() {\n" +
				"		List<Comparable<String>> lStr = new ArrayList<Comparable<String>> ();\n" +
				"		Collections.sort (lStr);\n" +
				"	}\n" +
				" }\n",
            },
            "----------\n" +
    		"1. WARNING in X.java (at line 10)\n" +
    		"	List<Comparable> lComp = new ArrayList<Comparable> ();\n" +
    		"	     ^^^^^^^^^^\n" +
    		"Comparable is a raw type. References to generic type Comparable<T> should be parameterized\n" +
    		"----------\n" +
    		"2. WARNING in X.java (at line 10)\n" +
    		"	List<Comparable> lComp = new ArrayList<Comparable> ();\n" +
    		"	                                       ^^^^^^^^^^\n" +
    		"Comparable is a raw type. References to generic type Comparable<T> should be parameterized\n" +
    		"----------\n" +
    		"3. WARNING in X.java (at line 11)\n" +
    		"	Collections.sort (lComp);		\n" +
    		"	^^^^^^^^^^^^^^^^^^^^^^^^\n" +
    		"Type safety: Unchecked invocation sort(List<Comparable>) of the generic method sort(List<T>) of type Collections\n" +
    		(this.complianceLevel < ClassFileConstants.JDK1_8 ? 
    		"----------\n" +
    		"4. ERROR in X.java (at line 15)\n" +
    		"	Collections.sort (lStr);\n" +
    		"	            ^^^^\n" +
    		"Bound mismatch: The generic method sort(List<T>) of type Collections is not applicable for the arguments (List<Comparable<String>>). The inferred type Comparable<String> is not a valid substitute for the bounded parameter <T extends Comparable<? super T>>\n" +
    		"----------\n" : 
    			"----------\n" + 
    			"4. ERROR in X.java (at line 15)\n" + 
    			"	Collections.sort (lStr);\n" + 
    			"	            ^^^^\n" + 
    			"The method sort(List<T>) in the type Collections is not applicable for the arguments (List<Comparable<String>>)\n" + 
    			"----------\n"));
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=84284 - check warnings
	// SHOULD FAIL AT 1.8 (18.2.3): The method sort(List<T>) in the type Collections is not applicable for the arguments (LinkedList<Ball>)
	public void test0608() {
	    this.runNegativeTest(
            new String[] {
                "Ball.java",
				"import java.util.*;\n" +
				"class Ball implements Comparable {\n" +
				"\n" +
				"    public int compareTo(Object o) {\n" +
				"    	return 0;\n" +
				"    }\n" +
				"    \n" +
				"    public static void main(String[] args) {\n" +
				"    	LinkedList<Ball> foo = new LinkedList<Ball>();\n" +
				"    	Collections.sort(foo);\n" +
				"    }\n" +
				"	Zork z;\n" +
				"}\n",
            },
    		"----------\n" + 
    		"1. WARNING in Ball.java (at line 2)\n" + 
    		"	class Ball implements Comparable {\n" + 
    		"	                      ^^^^^^^^^^\n" + 
    		"Comparable is a raw type. References to generic type Comparable<T> should be parameterized\n" + 
    		"----------\n" + 
    		"2. WARNING in Ball.java (at line 10)\n" + 
    		"	Collections.sort(foo);\n" + 
    		"	^^^^^^^^^^^^^^^^^^^^^\n" + 
    		"Type safety: Unchecked invocation sort(LinkedList<Ball>) of the generic method sort(List<T>) of type Collections\n" + 
    		"----------\n" + 
    		"3. ERROR in Ball.java (at line 12)\n" + 
    		"	Zork z;\n" + 
    		"	^^^^\n" + 
    		"Zork cannot be resolved to a type\n" + 
    		"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=81831
	public void test0609() {
	    this.runConformTest(
            new String[] {
                "I.java",
				"interface I<T extends I<? super T>> {}\n",
            },
			"");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=89940
	public void test0610() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				" import java.util.List;\n" +
				"\n" +
				"public class X {\n" +
				"	void foo(List<Object> objects, List raw) {\n" +
				"\n" +
				"	    List<Number> numbers;\n" +
				"	    List<? extends Number> ext;\n" +
				"	    \n" +
				"	    numbers= (List<Number>) objects; // correct - cast error\n" +
				"	    ext= (List<? extends Number>) objects; // wrong, should fail\n" +
				"\n" +
				"	    ext= raw; // correct - raw conversion warning issued\n" +
				"	    numbers= raw; // correct - raw conversion warning issued\n" +
				"	}\n" +
				"}\n",
            },
    		"----------\n" +
    		"1. WARNING in X.java (at line 4)\n" +
    		"	void foo(List<Object> objects, List raw) {\n" +
    		"	                               ^^^^\n" +
    		"List is a raw type. References to generic type List<E> should be parameterized\n" +
    		"----------\n" +
    		"2. ERROR in X.java (at line 9)\n" +
    		"	numbers= (List<Number>) objects; // correct - cast error\n" +
    		"	         ^^^^^^^^^^^^^^^^^^^^^^\n" +
    		"Cannot cast from List<Object> to List<Number>\n" +
    		"----------\n" +
    		"3. ERROR in X.java (at line 10)\n" +
    		"	ext= (List<? extends Number>) objects; // wrong, should fail\n" +
    		"	     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
    		"Cannot cast from List<Object> to List<? extends Number>\n" +
    		"----------\n" +
    		"4. WARNING in X.java (at line 12)\n" +
    		"	ext= raw; // correct - raw conversion warning issued\n" +
    		"	     ^^^\n" +
    		"Type safety: The expression of type List needs unchecked conversion to conform to List<? extends Number>\n" +
    		"----------\n" +
    		"5. WARNING in X.java (at line 13)\n" +
    		"	numbers= raw; // correct - raw conversion warning issued\n" +
    		"	         ^^^\n" +
    		"Type safety: The expression of type List needs unchecked conversion to conform to List<Number>\n" +
    		"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=91696
	public void test0611() {
	    this.runConformTest(
            new String[] {
                "C.java",
				"import java.io.Serializable;\n" +
				"\n" +
				"interface A<K extends A.BK<S>, S extends A.BS> {\n" +
				"	public interface BS extends Serializable {\n" +
				"	}\n" +
				"	public interface BK<SS> extends Serializable {\n" +
				"		public void put(SS a);\n" +
				"	}\n" +
				"\n" +
				"	public P<K, S> getP();\n" +
				"}\n" +
				"\n" +
				"class P<K extends A.BK<S>, S extends A.BS> {\n" +
				"	K k;\n" +
				"	S s;\n" +
				"\n" +
				"	public void put() {\n" +
				"		k.put(s);\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"public class C<T> implements A<C.K, C.S> {\n" +
				"	public static class K implements A.BK<C.S> {\n" +
				"		public void put(S a) {\n" +
				"		}\n" +
				"	}\n" +
				"	protected static class S implements A.BS {\n" +
				"	}\n" +
				"\n" +
				"	public P<K, S> getP() {\n" +
				"		return null;\n" +
				"	}\n" +
				"}\n",
            },
			"");
	}
	public void test0612() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"import java.util.*;\n" +
				"\n" +
				"class MPair<A,B> {}\n" +
				"\n" +
				"public class X<K,V> {\n" +
				"    private static class Bucket extends LinkedList<MPair<K,V>> {}\n" +
				"    private Bucket[] buckets = new X.Bucket[100];\n" +
				"}\n",
            },
    		"----------\n" +
    		"1. ERROR in X.java (at line 6)\n" +
    		"	private static class Bucket extends LinkedList<MPair<K,V>> {}\n" +
    		"	                                                     ^\n" +
    		"Cannot make a static reference to the non-static type K\n" +
    		"----------\n" +
    		"2. ERROR in X.java (at line 6)\n" +
    		"	private static class Bucket extends LinkedList<MPair<K,V>> {}\n" +
    		"	                                                       ^\n" +
    		"Cannot make a static reference to the non-static type V\n" +
	    	"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=84973
	public void test0613() {
	    this.runNegativeTest(
            new String[] {
                "Map.java",
				"package xy;\n" +
				"import xy.Map.Entry;\n" +
				"\n" +
				"class Map<M> {\n" +
				"    class Entry<E> { }\n" +
				"}\n" +
				"class User {\n" +
				"    void a(Entry<String> e) { } // Entry<String> is illegal (eclipse accepts)\n" +
				"    void c(Map.Entry<String> e) { } // illegal (correctly flagged)\n" +
				"    void b(Entry e) { } // OK\n" +
				"    void d(Map<Integer>.Entry<String> e) { } // OK\n" +
				"}\n",
            },
            "----------\n" +
    		"1. ERROR in Map.java (at line 8)\n" +
    		"	void a(Entry<String> e) { } // Entry<String> is illegal (eclipse accepts)\n" +
    		"	       ^^^^^\n" +
    		"The member type Map.Entry<String> must be qualified with a parameterized type, since it is not static\n" +
    		"----------\n" +
    		"2. ERROR in Map.java (at line 9)\n" +
    		"	void c(Map.Entry<String> e) { } // illegal (correctly flagged)\n" +
    		"	       ^^^^^^^^^\n" +
    		"The member type Map.Entry<String> must be qualified with a parameterized type, since it is not static\n" +
    		"----------\n" +
    		"3. WARNING in Map.java (at line 10)\n" +
    		"	void b(Entry e) { } // OK\n" +
    		"	       ^^^^^\n" +
    		"Map.Entry is a raw type. References to generic type Map<M>.Entry<E> should be parameterized\n" +
    		"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=84973 - variation
	public void test0614() {
	    this.runNegativeTest(
            new String[] {
                "X1.java",
				"class X1 {\n" +
				"	static class X2<T> {\n" +
				"		class X3<U> {\n" +
				"		}\n" +
				"	}\n" +
				"}\n" +
				"class Y1 {\n" +
				"	class Y2 extends X1.X2<Exception> {\n" +
				"		void foo() {\n" +
				"			X3<String> x;\n" +
				"		}\n" +
				"	}\n" +
				"	Zork z;\n" +
				"}\n",
            },
			"----------\n" +
			"1. ERROR in X1.java (at line 13)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=84973 - variation
	public void test0615() {
	    this.runNegativeTest(
            new String[] {
                "X1.java",
				"class X1 {\n" +
				"	static class X2<T> {\n" +
				"		class X3<U> {\n" +
				"		}\n" +
				"	}\n" +
				"}\n" +
				"class Y1 {\n" +
				"	class Y2 extends X1.X2 {\n" +
				"		void foo() {\n" +
				"			X3<String> x;\n" +
				"		}\n" +
				"	}\n" +
				"}\n",
            },
            "----------\n" +
    		"1. WARNING in X1.java (at line 8)\n" +
    		"	class Y2 extends X1.X2 {\n" +
    		"	                 ^^^^^\n" +
    		"X1.X2 is a raw type. References to generic type X1.X2<T> should be parameterized\n" +
    		"----------\n" +
    		"2. ERROR in X1.java (at line 10)\n" +
    		"	X3<String> x;\n" +
    		"	^^\n" +
    		"The member type X1.X2.X3<String> must be qualified with a parameterized type, since it is not static\n" +
    		"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=84973 - variation
	public void test0616() {
	    this.runNegativeTest(
            new String[] {
                "Map.java",
				"package xy;\n" +
				"import xy.Map.Entry;\n" +
				"\n" +
				"class Map<M> {\n" +
				"    class Entry<E> { }\n" +
				"}\n" +
				"class User extends Map<String> {\n" +
				"    void a(Entry<String> e) { } // Entry<String> is illegal (eclipse accepts)\n" +
				"    void c(Map.Entry<String> e) { } // illegal (correctly flagged)\n" +
				"    void b(Entry e) { } // OK\n" +
				"    void d(Map<Integer>.Entry<String> e) { } // OK\n" +
				"}\n",
            },
            "----------\n" +
    		"1. ERROR in Map.java (at line 9)\n" +
    		"	void c(Map.Entry<String> e) { } // illegal (correctly flagged)\n" +
    		"	       ^^^^^^^^^\n" +
    		"The member type Map.Entry<String> must be qualified with a parameterized type, since it is not static\n" +
    		"----------\n" +
    		"2. WARNING in Map.java (at line 10)\n" +
    		"	void b(Entry e) { } // OK\n" +
    		"	       ^^^^^\n" +
    		"Map.Entry is a raw type. References to generic type Map<M>.Entry<E> should be parameterized\n" +
    		"----------\n");
	}
public void test0617() {
        this.runNegativeTest(
            new String[] {
                "X.java",
                "public class X {\n" +
                "\n" +
                "   public void foo() {\n" +
                "       String s = null;\n" +
                "       ZZZ1<?>.ZZZ2<?>.ZZZ3<?> var = null;\n" +
                "       s = var;\n" +
                "   }\n" +
                "}\n" +
                "\n" +
                "class ZZZ1<T1> {\n" +
                "  class ZZZ2<T2> {\n" +
                "    class ZZZ3<T3> {}\n" +
                "  }\n" +
                "}\n",
            },
    		"----------\n" +
    		"1. ERROR in X.java (at line 6)\n" +
    		"	s = var;\n" +
    		"	    ^^^\n" +
    		"Type mismatch: cannot convert from ZZZ1<?>.ZZZ2<?>.ZZZ3<capture#1-of ?> to String\n" +
    		"----------\n");
    }
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=84973 - variation
	public void test0618() {
	    this.runNegativeTest(
            new String[] {
                "Map.java",
				"class Map<M> {\n" +
				"    class Entry<E> { }\n" +
				"    class Foo {\n" +
				"    	Entry<String> entry;\n" +
				"    	static void foo(Entry<String> e) { } // invalid static ref\n" +
				"    }\n" +
				"    static class Bar {\n" +
				"    	Entry<String> entry; // invalid static ref\n" +
				"    }\n" +
				"    void a(Entry<String> e) { } // OK\n" +
				"    void c(Map.Entry<String> e) { } // illegal \n" +
				"    void b(Entry e) { } // OK\n" +
				"    void d(Map<Integer>.Entry<String> e) { } // OK\n" +
				"}\n",
            },
            "----------\n" +
    		"1. ERROR in Map.java (at line 5)\n" +
    		"	static void foo(Entry<String> e) { } // invalid static ref\n" +
    		"	            ^^^^^^^^^^^^^^^^^^^^\n" +
    		"The method foo cannot be declared static; static methods can only be declared in a static or top level type\n" +
    		"----------\n" +
    		"2. ERROR in Map.java (at line 5)\n" +
    		"	static void foo(Entry<String> e) { } // invalid static ref\n" +
    		"	                ^^^^^\n" +
    		"Cannot make a static reference to the non-static type Entry\n" +
    		"----------\n" +
    		"3. ERROR in Map.java (at line 8)\n" +
    		"	Entry<String> entry; // invalid static ref\n" +
    		"	^^^^^\n" +
    		"Cannot make a static reference to the non-static type Entry\n" +
    		"----------\n" +
    		"4. ERROR in Map.java (at line 11)\n" +
    		"	void c(Map.Entry<String> e) { } // illegal \n" +
    		"	       ^^^^^^^^^\n" +
    		"The member type Map.Entry<String> must be qualified with a parameterized type, since it is not static\n" +
    		"----------\n" +
    		"5. WARNING in Map.java (at line 12)\n" +
    		"	void b(Entry e) { } // OK\n" +
    		"	       ^^^^^\n" +
    		"Map.Entry is a raw type. References to generic type Map<M>.Entry<E> should be parameterized\n" +
    		"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=89440
	public void test0619() {
	    this.runConformTest(
            new String[] {
                "X.java",
				"interface ISample<V> {\n" +
				"	public static enum Stuff {\n" +
				"		FIRST, SECOND, THIRD\n" +
				"	};\n" +
				"}\n" +
				"\n" +
				"class SampleClass {\n" +
				"	public void doSomething(ISample.Stuff thing) {\n" +
				"\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"public class X {\n" +
				"	public void doSomething() {\n" +
				"		SampleClass sample = new SampleClass();\n" +
				"		sample.doSomething(ISample.Stuff.FIRST);\n" +
				"	}\n" +
				"}\n",
            },
			"");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=84551
	public void test0620() {
	    this.runNegativeTest(
            new String[] {
                "Outer.java",
				"public class Outer<O> {\n" +
				"	class Inner { }\n" +
				"	\n" +
				"	static void test(Inner i) { }\n" +
				"}\n",
            },
			"----------\n" +
			"1. ERROR in Outer.java (at line 4)\n" +
			"	static void test(Inner i) { }\n" +
			"	                 ^^^^^\n" +
			"Cannot make a static reference to the non-static type Inner\n" +
			"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=84551- variation
	public void test0621() {
	    this.runConformTest(
            new String[] {
                "Outer.java",
				"public class Outer {\n" +
				"	class Inner { }\n" +
				"	\n" +
				"	static void test(Inner i) { }\n" +
				"}\n",
            },
			"");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=84551 - variation
	public void test0622() {
	    this.runConformTest(
            new String[] {
                "Outer.java",
				"public class Outer<O> {\n" +
				"	static class Inner { }\n" +
				"	\n" +
				"	static void test(Inner i) { }\n" +
				"}\n",
            },
			"");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=84551 - variation
	public void test0623() {
	    this.runConformTest(
            new String[] {
                "X.java",
				"public class X<T> {\n" +
				"	static class Outer {\n" +
				"		class Inner { }\n" +
				"		static void test(Inner i) { }\n" +
				"	}\n" +
				"}\n",
            },
			"");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=83034
	public void test0624() {
	    this.runConformTest(
            new String[] {
                "X.java",
				" interface IFoo<U, V extends X<U, V>> {\n" +
				"	V bar(int i);\n" +
				"}\n" +
				"\n" +
				"public class X<E, F extends X<E, F>> {\n" +
				"	\n" +
				"	public boolean foo(X<E, ?> x) {\n" +
				"		return false;\n" +
				"	}\n" +
				"	public boolean baz(IFoo<E, ?> f) {\n" +
				"		return foo(f.bar(0));\n" +
				"	}\n" +
				"}\n",
            },
			"");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=83034 - variation
	public void test0625() {
	    this.runConformTest(
            new String[] {
                "Foo.java",
				"public class Foo<K> {\n" +
				"	public enum Mode {\n" +
				"		A\n" +
				"	};\n" +
				"	public void test(Mode mode) {\n" +
				"	}\n" +
				"} \n",
            },
			"");
	    this.runConformTest(
            new String[] {
                "X.java",
				"public class X {\n" +
				"	enum Keys {\n" +
				"		B\n" +
				"	};\n" +
				"	public void test() {\n" +
				"		Foo<Keys> foo = new Foo<Keys>();\n" +
				"		foo.test(Foo.Mode.A); // error\n" +
				"	}\n" +
				"} \n",
            },
			"",
			null,
			false,
			null);
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=92037
	public void test0626() {
		String errMessage = isMinimumCompliant(ClassFileConstants.JDK11) ?
				"----------\n" +
	    		"1. WARNING in X.java (at line 7)\n" +
	    		"	private static class B<A> {\n" +
	    		"	                       ^\n" +
	    		"The type parameter A is hiding the type X.A\n" +
	    		"----------\n" +
	    		"2. ERROR in X.java (at line 21)\n" +
	    		"	System.out.println(b instanceof C);\n" +
	    		"	                   ^^^^^^^^^^^^^^\n" +
	    		"Incompatible conditional operand types X.B<X.A> and X.C\n" +
	    		"----------\n"
	    		:
	    		"----------\n" +
	    		"1. WARNING in X.java (at line 7)\n" +
	    		"	private static class B<A> {\n" +
	    		"	                       ^\n" +
	    		"The type parameter A is hiding the type X.A\n" +
	    		"----------\n" +
	    		"2. WARNING in X.java (at line 11)\n" +
	    		"	private static class AA extends A {\n" +
	    		"	                     ^^\n" +
	    		"Access to enclosing constructor X.A() is emulated by a synthetic accessor method\n" +
	    		"----------\n" +
	    		"3. WARNING in X.java (at line 15)\n" +
	    		"	private static class C extends B<AA> {\n" +
	    		"	                     ^\n" +
	    		"Access to enclosing constructor X.B<A>() is emulated by a synthetic accessor method\n" +
	    		"----------\n" +
	    		"4. ERROR in X.java (at line 21)\n" +
	    		"	System.out.println(b instanceof C);\n" +
	    		"	                   ^^^^^^^^^^^^^^\n" +
	    		"Incompatible conditional operand types X.B<X.A> and X.C\n" +
	    		"----------\n";
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"public class X {\n" +
				"\n" +
				"	private static class A {\n" +
				"\n" +
				"	}\n" +
				"\n" +
				"	private static class B<A> {\n" +
				"\n" +
				"	}\n" +
				"\n" +
				"	private static class AA extends A {\n" +
				"\n" +
				"	}\n" +
				"\n" +
				"	private static class C extends B<AA> {\n" +
				"\n" +
				"	}\n" +
				"\n" +
				"	public static void main(String[] args) {\n" +
				"		B<A> b = new B<A>();\n" +
				"		System.out.println(b instanceof C);\n" +
				"	}\n" +
				"}\n",
            }, errMessage);
	}

	public void test0627() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"import java.util.List;\n" +
				"\n" +
				"public class X {\n" +
				"\n" +
				"	<T> List<? extends T> foo(List<? extends T> l1, List<? extends T> l2) {\n" +
				"		return l1;\n" +
				"	}\n" +
				"	void bar(List<String> l1, List<Integer> l2) {\n" +
				"		String s = foo(l1, l2);\n" +
				"	}\n" +
				"}\n",
            },
    		"----------\n" +
    		"1. ERROR in X.java (at line 9)\n" +
    		"	String s = foo(l1, l2);\n" +
    		"	           ^^^^^^^^^^^\n" +
    		"Type mismatch: cannot convert from List<capture#2-of ? extends "+intersection("Object","Serializable","Comparable<?>")+"> to String\n" +
    		"----------\n");
	}
	// check capture for conditional operator
	public void test0628() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"import java.util.List;\n" +
				"\n" +
				"public class X {\n" +
				"\n" +
				"	<T> List<? extends T> foo(List<? extends T> l1, List<? extends T> l2) {\n" +
				"		return l1;\n" +
				"	}\n" +
				"	void bar(List<Float> l1, List<Integer> l2) {\n" +
				"		List<?> l3 = null;\n" +
				"		String s = l1 != null ? foo(l1, l2) : l3;\n" +
				"	}\n" +
				"}\n",
            },
            this.complianceLevel < ClassFileConstants.JDK1_8 ? 
	    		"----------\n" +
	    		"1. ERROR in X.java (at line 10)\n" +
	    		"	String s = l1 != null ? foo(l1, l2) : l3;\n" +
	    		"	           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
	    		"Type mismatch: cannot convert from List<capture#4-of ? extends Object> to String\n" +
	    		"----------\n" : 
	    			"----------\n" + 
	    			"1. ERROR in X.java (at line 10)\n" + 
	    			"	String s = l1 != null ? foo(l1, l2) : l3;\n" + 
		    		"	                        ^^^^^^^^^^^\n" +
		    		"Type mismatch: cannot convert from List<capture#2-of ? extends Number & "+intersection("Comparable<?>")+"> to String\n" +
	    			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=92556
	public void test0629() {
	    this.runConformTest(
            new String[] {
                "X.java",
				"public class X {\n" +
				"	public abstract class Context<N extends Number> {\n" +
				"		private Strategy<N, ? super Context<N>> strategy;\n" +
				"		public void setStrategy(Strategy<N, ? super Context<N>> strategy) {\n" +
				"			this.strategy = strategy;\n" +
				"		}\n" +
				"		// m?thode qui utilise la strat?gie\n" +
				"		public N call() throws Exception {\n" +
				"			return this.strategy.call(this);\n" +
				"		}\n" +
				"	}\n" +
				"	public interface Strategy<N extends Number, C extends Context<N>> {\n" +
				"		public abstract N call(C context);\n" +
				"	}\n" +
				"\n" +
				"} \n",
            },
			"");
	}
	public void test0630() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"import java.util.ArrayList;\n" +
				"import java.util.List;\n" +
				"\n" +
				"@SuppressWarnings(\"null\")\n" +
				"public class X {\n" +
				"\n" +
				"	void test0() {\n" +
				"		List<? super Number[]> arrays= new ArrayList<Number[]>();\n" +
				"		Number[] a= null;\n" +
				"		arrays.add(null);\n" +
				"		arrays.add(a); // Error: The method add(capture-of ? super Number[]) in the type List<capture-of ? super Number[]> is not applicable for the arguments (Number[])\n" +
				"	}\n" +
				"\n" +
				"	void test01() {\n" +
				"		List<? extends Number[]> arrays= new ArrayList<Number[]>();\n" +
				"		Number[] a= null;\n" +
				"		arrays.add(null);\n" +
				"		arrays.add(a); // Error: The method add(capture-of ? extends Number[]) in the type List<capture-of ? super Number[]> is not applicable for the arguments (Number[])\n" +
				"	}\n" +
				"	\n" +
				"	void test02() {\n" +
				"		List<? super Number> nums= null;\n" +
				"		Number n= null;\n" +
				"		nums.add(null);\n" +
				"		nums.add(n);\n" +
				"	}\n" +
				"\n" +
				"	void test3() {\n" +
				"		List<? super List<Number>> nums= null;\n" +
				"		List<Number> n= null;\n" +
				"		nums.add(null);\n" +
				"		nums.add(n);\n" +
				"	}\n" +
				"}\n",
	        },
			"----------\n" +
			"1. ERROR in X.java (at line 18)\n" +
			"	arrays.add(a); // Error: The method add(capture-of ? extends Number[]) in the type List<capture-of ? super Number[]> is not applicable for the arguments (Number[])\n" +
			"	       ^^^\n" +
			"The method add(capture#4-of ? extends Number[]) in the type List<capture#4-of ? extends Number[]> is not applicable for the arguments (Number[])\n" +
			"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=93044
	public void test0631() {
		this.runNegativeTest(
            new String[] {
                "X.java",
				"import java.lang.annotation.RetentionPolicy;\n" +
				"\n" +
				"public class X\n" +
				"{\n" +
				"		 public static void main(String[] args)\n" +
				"		 {\n" +
				"		 		 Class<? extends Enum<?>> c = RetentionPolicy.class;\n" +
				"		 		 System.out.println(Enum.valueOf(c, \"CLASS\"));\n" +
				"		 }\n" +
				"}\n",
	        },
	        this.complianceLevel < ClassFileConstants.JDK1_8 ? 
	        "----------\n" +
			"1. ERROR in X.java (at line 8)\n" +
			"	System.out.println(Enum.valueOf(c, \"CLASS\"));\n" +
			"	                        ^^^^^^^\n" +
			"Bound mismatch: The generic method valueOf(Class<T>, String) of type Enum<E> is not applicable for the arguments (Class<capture#1-of ? extends Enum<?>>, String). The inferred type capture#1-of ? extends Enum<?> is not a valid substitute for the bounded parameter <T extends Enum<T>>\n" +
			"----------\n" :
				"----------\n" + 
				"1. ERROR in X.java (at line 8)\n" + 
				"	System.out.println(Enum.valueOf(c, \"CLASS\"));\n" + 
				"	                        ^^^^^^^\n" + 
				"The method valueOf(Class<T>, String) in the type Enum is not applicable for the arguments (Class<capture#1-of ? extends Enum<?>>, String)\n" + 
				"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=92982
	public void test0632() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"import java.util.Vector;\n" +
				"\n" +
				"@SuppressWarnings(\"null\")\n" +
				"public class X {\n" +
				"	void test01() {\n" +
				"		Vector<? super java.lang.Object[]> lhs = null;\n" +
				"		Vector<? extends java.lang.Object[]> rhs = null;\n" +
				"		lhs.add(rhs.get(0));\n" +
				"	}\n" +
				"	void test02() {\n" +
				"		Vector<? extends java.lang.Object[]> lhs = null;\n" +
				"		Vector<? extends java.lang.Object[]> rhs = null;\n" +
				"		lhs.add(rhs.get(0));\n" +
				"	}\n" +
				"	void test3() {\n" +
				"		Vector<? super java.lang.Object[]> lhs = null;\n" +
				"		Vector<? super java.lang.Object[]> rhs = null;\n" +
				"		lhs.add(rhs.get(0));\n" +
				"	}\n" +
				"	void test4() {\n" +
				"		Vector<?  extends java.lang.Object[]> lhs = null;\n" +
				"		Vector<? super java.lang.Object[]> rhs = null;\n" +
				"		lhs.add(rhs.get(0));\n" +
				"	}\n" +
				"}\n",
	        },
			"----------\n" +
			"1. ERROR in X.java (at line 13)\n" +
			"	lhs.add(rhs.get(0));\n" +
			"	    ^^^\n" +
			"The method add(capture#3-of ? extends Object[]) in the type Vector<capture#3-of ? extends Object[]> is not applicable for the arguments (capture#4-of ? extends Object[])\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 18)\n" +
			"	lhs.add(rhs.get(0));\n" +
			"	    ^^^\n" +
			"The method add(capture#5-of ? super Object[]) in the type Vector<capture#5-of ? super Object[]> is not applicable for the arguments (capture#6-of ? super Object[])\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 23)\n" +
			"	lhs.add(rhs.get(0));\n" +
			"	    ^^^\n" +
			"The method add(capture#7-of ? extends Object[]) in the type Vector<capture#7-of ? extends Object[]> is not applicable for the arguments (capture#8-of ? super Object[])\n" +
			"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=92982 - variation
	public void test0633() {
	    runConformTest(
    		// test directory preparation
    		true /* flush output directory */,
    		new String[] { /* test files */
                "X.java",
				"import java.util.Vector;\n" +
				"\n" +
				"public class X {\n" +
				"	void test1() {\n" +
				"		Vector<? super Object[]> lhs = null;\n" +
				"		Vector<Object[]> rhs = null;\n" +
				"		lhs.add(rhs.get(0)); \n" +
				"		foo(rhs.get(0)); // ok #foo(Object[])\n" +
				"	}\n" +
				"	void foo(Object[] objs) {\n" +
				"	}\n" +
				"}\n",
	        },
			// compiler results
			null /* do not check compiler log */,
			// runtime results
			"" /* expected output string */,
			null /* do not check error string */,
			// javac options
			JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=90775
	public void test0634() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"import java.lang.reflect.Array;\n" +
				"\n" +
				"public class X<T> {\n" +
				"\n" +
				"	T[] theArray;\n" +
				"\n" +
				"	public X(Class<T> clazz) {\n" +
				"		theArray = (T[]) Array.newInstance(clazz, 10); // Compiler warning\n" +
				"	}\n" +
				"\n" +
				"	public T get(int i) {\n" +
				"		return theArray[i];\n" +
				"	}\n" +
				"\n" +
				"	public static void main(String[] args) {\n" +
				"		X<Integer> t = new X<Integer>(Integer.class);\n" +
				"		// GenericsArray1<Integer> t = new GenericsArray1<Integer>( int.class );\n" +
				"		Object[] o = t.theArray;\n" +
				"	}\n" +
				"  Zork z;\n" +
				"}\n",
	        },
	        "----------\n" +
			"1. WARNING in X.java (at line 8)\n" +
			"	theArray = (T[]) Array.newInstance(clazz, 10); // Compiler warning\n" +
			"	           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from Object to T[]\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 20)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=93298
	public void test0635() {
	    this.runConformTest(
            new String[] {
                "X.java",
				"import java.util.Iterator;\n" +
				"public class X {\n" +
				"	public static class Indexed <U>  {\n" +
				"		public Iterator<U> foo() {\n" +
				"			return new IndexedIter();\n" +
				"		}\n" +
				"		class IndexedIter implements Iterator<U> {\n" +
				"			public boolean hasNext() {\n" +
				"				return false;\n" +
				"			}\n" +
				"			public U next() {\n" +
				"				return null;\n" +
				"			}\n" +
				"			public void remove() {\n" +
				"			}\n" +
				"		}\n" +
				"	}\n" +
				"}\n",
	        },
			"");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=78084
	public void test0636() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
			"public abstract class X<T> {\n" +
			"  public final T element() {\n" +
			"    T result = (T) customElement(); // reports unnecessary cast\n" +
			"    return result;\n" +
			"  }\n" +
			"  protected abstract Object customElement();\n" +
			"  Zork z;\n" +
			"}\n",
	        },
	        "----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	T result = (T) customElement(); // reports unnecessary cast\n" +
			"	           ^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from Object to T\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 7)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=84968
	public void test0637() {
	    this.runConformTest(
            new String[] {
                "X.java",
				"public class X<E> {\n" +
				"	public static final class Ex1 extends Exception {\n" +
				"		private static final long serialVersionUID = 1;\n" +
				"	}\n" +
				"\n" +
				"	private void a1() {\n" +
				"		try {\n" +
				"			a1_1();\n" +
				"		} catch (Ex1 si) {\n" +
				"			assert si != null;\n" +
				"		}\n" +
				"	}\n" +
				"\n" +
				"	protected Object a1_1() throws Ex1 {\n" +
				"		return null;\n" +
				"	}\n" +
				"\n" +
				"	private void a2() {\n" +
				"		try {\n" +
				"			a2_1();\n" +
				"		} catch (Ex2 si) {\n" +
				"			assert si != null;\n" +
				"		}\n" +
				"	}\n" +
				"\n" +
				"	protected Object a2_1() throws Ex2 {\n" +
				"		return null;\n" +
				"	}\n" +
				"\n" +
				"	public final static class Ex3 extends Exception {\n" +
				"		private static final long serialVersionUID = 1;\n" +
				"	}\n" +
				"\n" +
				"	private void a3() {\n" +
				"		try {\n" +
				"			a3_1();\n" +
				"		} catch (Ex3 si) {\n" +
				"			assert si != null;\n" +
				"		}\n" +
				"	}\n" +
				"\n" +
				"	protected Object a3_1() throws Ex3 {\n" +
				"		return null;\n" +
				"	}\n" +
				"\n" +
				"}\n" +
				"\n" +
				"final class Ex2 extends Exception {\n" +
				"	private static final long serialVersionUID = 1;\n" +
				"}\n",
	        },
			"");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=93478
	public void test0638() {
	    this.runConformTest(
            new String[] {
                "X.java",
				"import java.util.concurrent.BlockingQueue;\n" +
				"\n" +
				"public class X {\n" +
				"	static interface IMX<S, L> {\n" +
				"		void call(L a, S b);\n" +
				"	}\n" +
				"	static interface Y<S, L> {\n" +
				"		void addX(final IMX<S, L> a);\n" +
				"		void removeX(final IMX<S, L> a);\n" +
				"	}\n" +
				"	static final class Pair<T, V> {\n" +
				"		T first;\n" +
				"\n" +
				"		V second;\n" +
				"	}\n" +
				"	static class Bar<P> {\n" +
				"		Bar(final BlockingQueue<P> a) {\n" +
				"\n" +
				"		}\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"final class Foo<S, L> extends X.Bar<X.Pair<L[], S>> implements X.IMX<S, L> {\n" +
				"	Foo(final BlockingQueue<X.Pair<L[], S>> in) {\n" +
				"		super(in);\n" +
				"	}\n" +
				"	public void call(L a, S b) {\n" +
				"	}\n" +
				"}\n",
	        },
			"");
	}
	public void test0639() {
	    this.runConformTest(
            new String[] {
                "X.java",
				"import java.lang.annotation.Annotation;\n" +
				"import java.lang.reflect.*;\n" +
				"\n" +
				"@interface MyAnnotation {\n" +
				"}\n" +
				"public class X {\n" +
				"	void test() throws Exception {\n" +
				"		Class type = X.class;\n" +
				"		Method method = type.getMethod(\"test\");\n" +
				"		Constructor constructor = type.getConstructor();\n" +
				"		Field field = type.getField(\"field\");\n" +
				"		Package packge = type.getPackage();\n" +
				"		MyAnnotation typeAnnot = getAnnotation(MyAnnotation.class);\n" +
				"		MyAnnotation methodAnnot = getAnnotation(MyAnnotation.class);\n" +
				"		MyAnnotation constrAnnot = getAnnotation(MyAnnotation.class);\n" +
				"		MyAnnotation fieldAnnot = getAnnotation(MyAnnotation.class);\n" +
				"		MyAnnotation packgeAnnot = getAnnotation(MyAnnotation.class);\n" +
				"	}\n" +
				"\n" +
				"	int field;\n" +
				"	\n" +
				"	<U extends Annotation> U getAnnotation(Class<U> annotatedType) {\n" +
				"		return null;\n" +
				"	}\n" +
				"}\n",
	        },
			"");
	}
	public void test0640() {
	    this.runConformTest(
            new String[] {
                "X.java",
				"import java.lang.annotation.Annotation;\n" +
				"import java.lang.reflect.*;\n" +
				"\n" +
				"@interface MyAnnotation {\n" +
				"}\n" +
				"public class X {\n" +
				"	void test() throws Exception {\n" +
				"		Class<?> type = X.class;\n" +
				"		Method method = type.getMethod(\"test\");\n" +
				"		Constructor constructor = type.getConstructor();\n" +
				"		Field field = type.getField(\"field\");\n" +
				"		Package packge = type.getPackage();\n" +
				"		MyAnnotation typeAnnot = getAnnotation(MyAnnotation.class);\n" +
				"		MyAnnotation methodAnnot = getAnnotation(MyAnnotation.class);\n" +
				"		MyAnnotation constrAnnot = getAnnotation(MyAnnotation.class);\n" +
				"		MyAnnotation fieldAnnot = getAnnotation(MyAnnotation.class);\n" +
				"		MyAnnotation packgeAnnot = getAnnotation(MyAnnotation.class);\n" +
				"	}\n" +
				"\n" +
				"	int field;\n" +
				"	\n" +
				"	<U extends Annotation> U getAnnotation(Class<U> annotatedType) {\n" +
				"		return null;\n" +
				"	}\n" +
				"}\n",
	        },
			"");
	}
	public void test0641() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"import java.lang.reflect.*;\n" +
				"\n" +
				"@interface MyAnnotation {\n" +
				"}\n" +
				"@SuppressWarnings(\"all\")\n" +
				"public class X {\n" +
				"	void test() throws Exception {\n" +
				"		Class type = X.class;\n" +
				"		Method method = type.getMethod(\"test\");\n" +
				"		Constructor constructor = type.getConstructor();\n" +
				"		Field field = type.getField(\"field\");\n" +
				"		Package packge = type.getPackage();\n" +
				"		MyAnnotation typeAnnot = type.getAnnotation(MyAnnotation.class);\n" +
				"		MyAnnotation methodAnnot = method.getAnnotation(MyAnnotation.class);\n" +
				"		MyAnnotation constrAnnot = constructor.getAnnotation(MyAnnotation.class);\n" +
				"		MyAnnotation fieldAnnot = field.getAnnotation(MyAnnotation.class);\n" +
				"		MyAnnotation packgeAnnot = packge.getAnnotation(MyAnnotation.class);\n" +
				"	}\n" +
				"\n" +
				"	int field;\n" +
				"}\n",
	        },
	        "----------\n" +
			"1. ERROR in X.java (at line 13)\n" +
			"	MyAnnotation typeAnnot = type.getAnnotation(MyAnnotation.class);\n" +
			"	                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Annotation to MyAnnotation\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 15)\n" +
			"	MyAnnotation constrAnnot = constructor.getAnnotation(MyAnnotation.class);\n" +
			"	                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Annotation to MyAnnotation\n" +
			"----------\n");
	}
	public void test0642() {
	    this.runConformTest(
            new String[] {
                "X.java",
				"import java.lang.reflect.*;\n" +
				"\n" +
				"@interface MyAnnotation {\n" +
				"}\n" +
				"@SuppressWarnings(\"all\")\n" +
				"public class X {\n" +
				"	void test() throws Exception {\n" +
				"		Class<?> type = X.class;\n" +
				"		Method method = type.getMethod(\"test\");\n" +
				"		Constructor<?> constructor = type.getConstructor();\n" +
				"		Field field = type.getField(\"field\");\n" +
				"		Package packge = type.getPackage();\n" +
				"		MyAnnotation typeAnnot = type.getAnnotation(MyAnnotation.class);\n" +
				"		MyAnnotation methodAnnot = method.getAnnotation(MyAnnotation.class);\n" +
				"		MyAnnotation constrAnnot = constructor.getAnnotation(MyAnnotation.class);\n" +
				"		MyAnnotation fieldAnnot = field.getAnnotation(MyAnnotation.class);\n" +
				"		MyAnnotation packgeAnnot = packge.getAnnotation(MyAnnotation.class);\n" +
				"	}\n" +
				"\n" +
				"	int field;\n" +
				"}\n",
	        },
			"");
	}
	public void test0643() {
	    this.runConformTest(
            new String[] {
                "X.java",
				"public class X<T> {\n" +
				"	\n" +
				"	static <U> U foo(U u) {\n" +
				"		return u;\n" +
				"	}\n" +
				"	\n" +
				"	void bar(X x) {\n" +
				"		String str = x.foo(\"hello\");\n" +
				"	}\n" +
				"}\n",
	        },
			"");
	}
	public void test0644() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"public class X<T> {\n" +
				"	\n" +
				"	<U> U foo(U u) {\n" +
				"		return u;\n" +
				"	}\n" +
				"	\n" +
				"	void bar(X x) {\n" +
				"		String str = x.foo(\"hello\");\n" +
				"	}\n" +
				"}\n",
	        },
	        "----------\n" +
			"1. WARNING in X.java (at line 7)\n" +
			"	void bar(X x) {\n" +
			"	         ^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 8)\n" +
			"	String str = x.foo(\"hello\");\n" +
			"	             ^^^^^^^^^^^^^^\n" +
			"Type safety: The method foo(Object) belongs to the raw type X. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 8)\n" +
			"	String str = x.foo(\"hello\");\n" +
			"	             ^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Object to String\n" +
			"----------\n");
	}
	public void test0645() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"import java.lang.annotation.Annotation;\n" +
				"\n" +
				"@interface MyAnnotation {\n" +
				"}\n" +
				"\n" +
				"class X {\n" +
				"	void bar(XClass<String> arg) {\n" +
				"		XClass xc = new XClass();\n" +
				"		String str = xc.getConstructor().getAnnotation(arg);\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class XClass<U> {\n" +
				"	XConstructor<U> getConstructor() {\n" +
				"		return null;\n" +
				"	}\n" +
				"}\n" +
				"class XConstructor<V> {\n" +
				"	<W extends Annotation> W getAnnotation(XClass<W> cl) {\n" +
				"		return null;\n" +
				"	}\n" +
				"}\n",
	        },
			"----------\n" +
			"1. WARNING in X.java (at line 8)\n" +
			"	XClass xc = new XClass();\n" +
			"	^^^^^^\n" +
			"XClass is a raw type. References to generic type XClass<U> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 8)\n" +
			"	XClass xc = new XClass();\n" +
			"	                ^^^^^^\n" +
			"XClass is a raw type. References to generic type XClass<U> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 9)\n" +
			"	String str = xc.getConstructor().getAnnotation(arg);\n" +
			"	             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The method getAnnotation(XClass) belongs to the raw type XConstructor. References to generic type XConstructor<V> should be parameterized\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 9)\n" +
			"	String str = xc.getConstructor().getAnnotation(arg);\n" +
			"	             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Annotation to String\n" +
			"----------\n");
	}
	public void test0646() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		Outer.Inner inner = new Outer().new Inner();\n" +
				"		X x = inner.setOuterT(new X());\n" +
				"		\n" +
				"		Outer<String>.Inner innerS = inner;\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class Outer<T> {\n" +
				"	T t;\n" +
				"	class Inner {\n" +
				"		T setOuterT(T t1) {\n" +
				"			t = t1;\n" +
				"			return t;\n" +
				"		}\n" +
				"	}\n" +
				"}\n",
	        },
	        "----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	Outer.Inner inner = new Outer().new Inner();\n" +
			"	^^^^^^^^^^^\n" +
			"Outer.Inner is a raw type. References to generic type Outer<T>.Inner should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 3)\n" +
			"	Outer.Inner inner = new Outer().new Inner();\n" +
			"	                        ^^^^^\n" +
			"Outer is a raw type. References to generic type Outer<T> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 3)\n" +
			"	Outer.Inner inner = new Outer().new Inner();\n" +
			"	                                    ^^^^^\n" +
			"Outer.Inner is a raw type. References to generic type Outer<T>.Inner should be parameterized\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 4)\n" +
			"	X x = inner.setOuterT(new X());\n" +
			"	      ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The method setOuterT(Object) belongs to the raw type Outer.Inner. References to generic type Outer<T>.Inner should be parameterized\n" +
			"----------\n" +
			"5. ERROR in X.java (at line 4)\n" +
			"	X x = inner.setOuterT(new X());\n" +
			"	      ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Object to X\n" +
			"----------\n" +
			"6. WARNING in X.java (at line 6)\n" +
			"	Outer<String>.Inner innerS = inner;\n" +
			"	                             ^^^^^\n" +
			"Type safety: The expression of type Outer.Inner needs unchecked conversion to conform to Outer<String>.Inner\n" +
			"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=94644
	public void test0647() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		Outer.Inner inner = new Outer().new Inner();\n" +
				"		X x = inner.set(new X());\n" +
				"		\n" +
				"		Outer<String>.Inner innerS = inner;\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"class Outer<T> {\n" +
				"	T t;\n" +
				"	static class Inner<U> {\n" +
				"		U set(U u) {\n" +
				"			return u;\n" +
				"		}\n" +
				"	}\n" +
				"}\n",
	        },
	        "----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	Outer.Inner inner = new Outer().new Inner();\n" +
			"	^^^^^^^^^^^\n" +
			"Outer.Inner is a raw type. References to generic type Outer.Inner<U> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 3)\n" +
			"	Outer.Inner inner = new Outer().new Inner();\n" +
			"	                        ^^^^^\n" +
			"Outer is a raw type. References to generic type Outer<T> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 3)\n" +
			"	Outer.Inner inner = new Outer().new Inner();\n" +
			"	                                    ^^^^^\n" +
			"Outer.Inner is a raw type. References to generic type Outer.Inner<U> should be parameterized\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 4)\n" +
			"	X x = inner.set(new X());\n" +
			"	      ^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The method set(Object) belongs to the raw type Outer.Inner. References to generic type Outer.Inner<U> should be parameterized\n" +
			"----------\n" +
			"5. ERROR in X.java (at line 4)\n" +
			"	X x = inner.set(new X());\n" +
			"	      ^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Object to X\n" +
			"----------\n" +
			"6. ERROR in X.java (at line 6)\n" +
			"	Outer<String>.Inner innerS = inner;\n" +
			"	^^^^^^^^^^^^^^^^^^^\n" +
			"The member type Outer.Inner<U> cannot be qualified with a parameterized type, since it is static. Remove arguments from qualifying type Outer<String>\n" +
			"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=94644 - variation
	public void test0648() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"public class X {\n" +
				"	void foo() {\n" +
				"		Outer.Inner inner = new Sub().get();\n" +
				"	}\n" +
				"	Zork z;\n" +
				"}\n" +
				"class Outer<T> {\n" +
				"	class Inner<U> {\n" +
				"	}\n" +
				"}\n" +
				"class Sub extends Outer {\n" +
				"	Inner get() { return null; }\n" +
				"}\n",
	        },
	        "----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	Outer.Inner inner = new Sub().get();\n" +
			"	^^^^^^^^^^^\n" +
			"Outer.Inner is a raw type. References to generic type Outer<T>.Inner<U> should be parameterized\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 5)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 11)\n" +
			"	class Sub extends Outer {\n" +
			"	                  ^^^^^\n" +
			"Outer is a raw type. References to generic type Outer<T> should be parameterized\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 12)\n" +
			"	Inner get() { return null; }\n" +
			"	^^^^^\n" +
			"Outer.Inner is a raw type. References to generic type Outer<T>.Inner<U> should be parameterized\n" +
			"----------\n");
	}
	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=94644 - variation
	public void test0649() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"public class X {\n" +
				"	void foo() {\n" +
				"		Outer<String>.Inner inner = new Sub().get();\n" +
				"	}\n" +
				"	Zork z;\n" +
				"}\n" +
				"class Outer<T> {\n" +
				"	class Inner {\n" +
				"	}\n" +
				"}\n" +
				"class Sub extends Outer {\n" +
				"	Inner get() { return null; }\n" +
				"}\n",
	        },
	        "----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	Outer<String>.Inner inner = new Sub().get();\n" +
			"	                            ^^^^^^^^^^^^^^^\n" +
			"Type safety: The expression of type Outer.Inner needs unchecked conversion to conform to Outer<String>.Inner\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 5)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 11)\n" +
			"	class Sub extends Outer {\n" +
			"	                  ^^^^^\n" +
			"Outer is a raw type. References to generic type Outer<T> should be parameterized\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 12)\n" +
			"	Inner get() { return null; }\n" +
			"	^^^^^\n" +
			"Outer.Inner is a raw type. References to generic type Outer<T>.Inner should be parameterized\n" +
			"----------\n");
	}

	//https://bugs.eclipse.org/bugs/show_bug.cgi?id=89440
	public void test0650() {
	    this.runConformTest(
            new String[] {
				"p/A.java",
				"package p;\n" +
				"\n" +
				"public interface A<V> {\n" +
				"	public static enum Stuff {\n" +
				"		FIRST, SECOND, THIRD\n" +
				"	};\n" +
				"}",
            },
            "");
	    this.runConformTest(
	    	new String[] {
				"q/SampleClass2.java",
				"package q;\n" +
				"\n" +
				"import p.A.Stuff;\n" +
				"\n" +
				"public class SampleClass2 {\n" +
				"  public void doSomething(Stuff thing) {\n" +
				"    \n" +
				"  }\n" +
				"}"
            },
			"",
			null,
			false,
			null);
		this.runConformTest(
			new String[] {
				"q/SampleClass3.java",
				"package q;\n" +
				"\n" +
				"import p.A;\n" +
				"\n" +
				"public class SampleClass3 {\n" +
				"	public void doSomething() {\n" +
				"		SampleClass2 sample = new SampleClass2();\n" +
				"		sample.doSomething(A.Stuff.FIRST);\n" +
				"	}\n" +
				"}",
			},
			"",
			null,
			false,
			null);
	}
	public void test0651() {
	    runConformTest(
            new String[] {
                "X.java",
				"public class X<U> {\n" +
				"\n" +
				"	int field;\n" +
				"	static int FIELD;\n" +
				"\n" +
				"	{\n" +
				"		field = 1;\n" +
				"	}\n" +
				"	static {\n" +
				"		FIELD = 1;\n" +
				"	}\n" +
				"\n" +
				"	public Values<U> foo(Box<? extends U> box) {\n" +
				"		return selectedValues(box.getValues()); // 1\n" +
				"	}\n" +
				"	public static <G> Values<G> selectedValues(Values<? extends G> v) {\n" +
				"		return null;\n" +
				"	}\n" +
				"}\n" +
				"abstract class Box<V extends java.io.Serializable> { // Added bound for V\n" +
				"	abstract Values<V> getValues();\n" +
				"}\n" +
				"abstract class Values<T> {\n" +
				"}\n",
	        },
			JavacTestOptions.EclipseHasABug.EclipseBug236217);
	}
	public void test0652() {
	    this.runConformTest(
            new String[] {
                "X.java",
				"import java.util.*;\n" +
				"\n" +
				"public class X {\n" +
				"    public static void main(String[] args) {\n" +
				"        Collection<?> c = new HashSet<String>();\n" +
				"        Set<?> s = (Set<?>)c;\n" +
				"    }\n" +
				"}\n",
	        },
			"");
	}
	public void test0653() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"import java.util.*;\n" +
				"\n" +
				"public class X {\n" +
				"	static public <T extends Collection> void workaround(T a, T b) {\n" +
				"		a.addAll(b);\n" +
				"	}\n" +
				"	Zork z;\n" +
				"}\n",
	        },
	        "----------\n" +
			"1. WARNING in X.java (at line 4)\n" +
			"	static public <T extends Collection> void workaround(T a, T b) {\n" +
			"	                         ^^^^^^^^^^\n" +
			"Collection is a raw type. References to generic type Collection<E> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 5)\n" +
			"	a.addAll(b);\n" +
			"	^^^^^^^^^^^\n" +
			"Type safety: The method addAll(Collection) belongs to the raw type Collection. References to generic type Collection<E> should be parameterized\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 7)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}
	public void test0654() {
	    this.runNegativeTest(
            new String[] {
                "X.java",
				"import java.util.*;\n" +
				"\n" +
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		Map myMap = new HashMap();\n" +
				"		myMap.put(\"key1\", \"1\");\n" +
				"\n" +
				"		for (Map.Entry e : myMap.entrySet())\n" +
				"			System.out.println(\"Key = \" + e.getKey() + \" Value = \" + e.getValue());\n" +
				"		Set<Map.Entry> set = myMap.entrySet();\n" +
				"		for (Map.Entry e : set)\n" +
				"			System.out.println(\"Key = \" + e.getKey() + \" Value = \" + e.getValue());\n" +
				"	}\n" +
				"}\n",
	        },
	        "----------\n" +
			"1. WARNING in X.java (at line 5)\n" +
			"	Map myMap = new HashMap();\n" +
			"	^^^\n" +
			"Map is a raw type. References to generic type Map<K,V> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 5)\n" +
			"	Map myMap = new HashMap();\n" +
			"	                ^^^^^^^\n" +
			"HashMap is a raw type. References to generic type HashMap<K,V> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 6)\n" +
			"	myMap.put(\"key1\", \"1\");\n" +
			"	^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The method put(Object, Object) belongs to the raw type Map. References to generic type Map<K,V> should be parameterized\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 8)\n" +
			"	for (Map.Entry e : myMap.entrySet())\n" +
			"	     ^^^^^^^^^\n" +
			"Map.Entry is a raw type. References to generic type Map.Entry<K,V> should be parameterized\n" +
			"----------\n" +
			"5. ERROR in X.java (at line 8)\n" +
			"	for (Map.Entry e : myMap.entrySet())\n" +
			"	                   ^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from element type Object to Map.Entry\n" +
			"----------\n" +
			"6. WARNING in X.java (at line 10)\n" +
			"	Set<Map.Entry> set = myMap.entrySet();\n" +
			"	    ^^^^^^^^^\n" +
			"Map.Entry is a raw type. References to generic type Map.Entry<K,V> should be parameterized\n" +
			"----------\n" +
			"7. WARNING in X.java (at line 10)\n" +
			"	Set<Map.Entry> set = myMap.entrySet();\n" +
			"	                     ^^^^^^^^^^^^^^^^\n" +
			"Type safety: The expression of type Set needs unchecked conversion to conform to Set<Map.Entry>\n" +
			"----------\n" +
			"8. WARNING in X.java (at line 11)\n" +
			"	for (Map.Entry e : set)\n" +
			"	     ^^^^^^^^^\n" +
			"Map.Entry is a raw type. References to generic type Map.Entry<K,V> should be parameterized\n" +
			"----------\n");
	}
// **
public void test0655() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"    static class BB<T, S> { }\n" +
			"    static class BD<T> extends BB<T, T> { }\n" +
			"    void f() {\n" +
			"        BB<? extends Number, ? super Integer> bb = null;\n" +
			"        Object o = (BD<Number>) bb;\n" +
			"    }\n" +
			"    Zork z;\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 6)\n" +
		"	Object o = (BD<Number>) bb;\n" +
		"	           ^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from X.BB<capture#1-of ? extends Number,capture#2-of ? super Integer> to X.BD<Number>\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 6)\n" +
		"	Object o = (BD<Number>) bb;\n" +
		"	           ^^^^^^^^^^^^^^^\n" +
		"Unnecessary cast from X.BB<capture#1-of ? extends Number,capture#2-of ? super Integer> to X.BD<Number>\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 8)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
public void test0656() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			"public class X {\n" +
			"	protected Vector<String> v = null;\n" +
			"\n" +
			"	public void f() {\n" +
			"		((String) (v.elementAt(0))).charAt(0);\n" +
			"	}\n" +
			"\n" +
			"	public static void main(String[] args) {\n" +
			"		System.out.println(\"SUCCESS\");\n" +
			"	}\n" +
			"}\n",
		},
		"SUCCESS");
}
public void test0657() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X{\n" +
			"	\n" +
			"	private static class GenericWrapper<Elem>  {\n" +
			"		private Elem theObject;\n" +
			"		public GenericWrapper(Elem arg) {\n" +
			"			theObject = arg;\n" +
			"		}\n" +
			"		public <T extends Elem> GenericWrapper (GenericWrapper<T> other) {\n" +
			"			this.theObject = other.theObject;\n" +
			"		}\n" +
			"		public String toString() {\n" +
			"			return theObject.toString();\n" +
			"		}\n" +
			"	}\n" +
			"	private static GenericWrapper<String> method (Object wrappedString) {\n" +
			"		return (GenericWrapper<String>) wrappedString;\n" +
			"	}\n" +
			"\n" +
			"	public static void main(String[] args) {\n" +
			"		System.out.print(method(new GenericWrapper<String>(\"abc\")));\n" +
			"		System.out.println(method(new GenericWrapper<Exception>(new Exception())));\n" +
			"	}\n" +
			"}\n",
		},
		"abcjava.lang.Exception");
}
public void test0658() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X{\n" +
			"	\n" +
			"	private static class GenericWrapper<Elem>  {\n" +
			"		Zork z;\n" +
			"		private Elem theObject;\n" +
			"		public GenericWrapper(Elem arg) {\n" +
			"			theObject = arg;\n" +
			"		}\n" +
			"		public <T extends Elem> GenericWrapper (GenericWrapper<T> other) {\n" +
			"			this.theObject = other.theObject;\n" +
			"		}\n" +
			"		public String toString() {\n" +
			"			return theObject.toString();\n" +
			"		}\n" +
			"	}\n" +
			"	private static GenericWrapper<String> method (Object wrappedString) {\n" +
			"		return (GenericWrapper<String>) wrappedString;\n" +
			"	}\n" +
			"\n" +
			"	public static void main(String[] args) {\n" +
			"		System.out.print(method(new GenericWrapper<String>(\"abc\")));\n" +
			"		System.out.println(method(new GenericWrapper<Exception>(new Exception())));\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 12)\n" +
		"	public String toString() {\n" +
		"	              ^^^^^^^^^^\n" +
		"The method toString() of type X.GenericWrapper<Elem> should be tagged with @Override since it actually overrides a superclass method\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 17)\n" +
		"	return (GenericWrapper<String>) wrappedString;\n" +
		"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from Object to X.GenericWrapper<String>\n" +
		"----------\n");
}
public void test0659() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.lang.ref.*;\n" +
			"\n" +
			"@SuppressWarnings(\"unused\")\n" +
			"public class X<K, V> extends WeakReference<V> {\n" +
			"	Zork z;\n" +
			"	static ReferenceQueue<Integer> queue = new ReferenceQueue<Integer>();\n" +
			"\n" +
			"	private K key;\n" +
			"\n" +
			"	public X(K key, V value, ReferenceQueue<V> queue) {\n" +
			"		super(value, queue);\n" +
			"	}\n" +
			"\n" +
			"	public K getKey() {\n" +
			"		return key;\n" +
			"	}\n" +
			"	@Override\n" +
			"	public String toString() {\n" +
			"		return \"key:\" + key;\n" +
			"	}\n" +
			"\n" +
			"	public static void main(String[] arg) throws Exception {\n" +
			"		X<String, Integer> ref = new X<String, Integer>(\"Dummy Key\", Integer.valueOf(5), queue);\n" +
			"		new Thread() {\n" +
			"			@Override\n" +
			"			public void run() {\n" +
			"				for (;;) {\n" +
			"					// force ref to be cleared\n" +
			"					System.gc();\n" +
			"				}\n" +
			"			}\n" +
			"		}.start();\n" +
			"\n" +
			"		X<String, Integer> fromQueue = (X<String, Integer>) queue.remove();\n" +
			"		System.out.println(fromQueue);\n" +
			"		System.exit(0);\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 34)\n" +
		"	X<String, Integer> fromQueue = (X<String, Integer>) queue.remove();\n" +
		"	                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from Reference<capture#1-of ? extends Integer> to X<String,Integer>\n" +
		"----------\n");
}
public void test0660() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"\n" +
			"	boolean run(X x) {\n" +
			"		return false;\n" +
			"	}\n" +
			"	<T> void run(Class<T> ct) {\n" +
			"	}\n" +
			"\n" +
			"	public static void main(String[] args) {\n" +
			"		boolean b = new X().run(new X(){});\n" +
			"		System.out.println(\"SUCCESS\");\n" +
			"	}\n" +
			"}\n",
		},
		"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=95066
public void test0661() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<S extends Comparable<S>> {\n" +
			"   public X() {\n" +
			"       S a = (S)(Integer)3;\n" +
			"   }\n" +
			"	Zork z;\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 3)\n" +
		"	S a = (S)(Integer)3;\n" +
		"	      ^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from Integer to S\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 5)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=95066 - variation
public void test0662() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<S extends Comparable<String>> {\n" +
			"   public X() {\n" +
			"       S a = (S)(Integer)3; // this should fail\n" +
			"   }\n" +
			"	Zork z;\n" +
			"}",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	S a = (S)(Integer)3; // this should fail\n" +
		"	      ^^^^^^^^^^^^^\n" +
		"Cannot cast from Integer to S\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 5)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=95066 - variation
public void test0663() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.List;\n" +
			"\n" +
			"public class X {\n" +
			"   Object foo(Comparable<Integer> c) {\n" +
			"	   return (Comparable<S>) c;\n" +
			"   }\n" +
			"   <U extends Throwable, V extends Runnable> void foo(List<V> lv) {\n" +
			"	   List l = (List<U>) lv;\n" +
			"   }\n" +
			"   <U extends Throwable, V extends Runnable> void foo2(List<List<V>> lv) {\n" +
			"	   List l = (List<List<U>>) lv;\n" +
			"   }\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	return (Comparable<S>) c;\n" +
		"	                   ^\n" +
		"S cannot be resolved to a type\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 8)\n" +
		"	List l = (List<U>) lv;\n" +
		"	^^^^\n" +
		"List is a raw type. References to generic type List<E> should be parameterized\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 8)\n" +
		"	List l = (List<U>) lv;\n" +
		"	         ^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from List<V> to List<U>\n" +
		"----------\n" +
		"4. WARNING in X.java (at line 8)\n" +
		"	List l = (List<U>) lv;\n" +
		"	         ^^^^^^^^^^^^\n" +
		"Unnecessary cast from List<V> to List<U>\n" +
		"----------\n" +
		"5. WARNING in X.java (at line 11)\n" +
		"	List l = (List<List<U>>) lv;\n" +
		"	^^^^\n" +
		"List is a raw type. References to generic type List<E> should be parameterized\n" +
		"----------\n" +
		"6. ERROR in X.java (at line 11)\n" +
		"	List l = (List<List<U>>) lv;\n" +
		"	         ^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from List<List<V>> to List<List<U>>\n" +
		"----------\n" +
		"7. WARNING in X.java (at line 11)\n" +
		"	List l = (List<List<U>>) lv;\n" +
		"	         ^^^^^^^^^^^^^^^^^^\n" +
		"Unnecessary cast from List<List<V>> to List<List<U>>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=95066 - variation
public void test0664() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<S extends Comparable<String>> {\n" +
			"   public X(X2 x2) {\n" +
			"       S a = (S)x2;\n" +
			"   }\n" +
			"}\n" +
			"abstract class X2 implements Comparable<X2> {\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	S a = (S)x2;\n" +
		"	      ^^^^^\n" +
		"Cannot cast from X2 to S\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=95066 - variation
public void test0665() {
	this.runNegativeTest(
		new String[] {
			"Test.java",
			"public class Test<S> {\n" +
			"	void foo() {\n" +
			"		A a = new A();\n" +
			"		Comparable<Object> c = (Comparable<Object>) a; // Fails as expected\n" +
			"		Comparable<S> c2 = (Comparable<S>) a; // Should fail?\n" +
			"	}\n" +
			"\n" +
			"}\n" +
			"\n" +
			"final class A implements Comparable<A> {\n" +
			"	public int compareTo(A o) {\n" +
			"		return 0;\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in Test.java (at line 4)\n" +
		"	Comparable<Object> c = (Comparable<Object>) a; // Fails as expected\n" +
		"	                       ^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from A to Comparable<Object>\n" +
		"----------\n" +
		"2. WARNING in Test.java (at line 5)\n" +
		"	Comparable<S> c2 = (Comparable<S>) a; // Should fail?\n" +
		"	                   ^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from A to Comparable<S>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=89940
public void test0666() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.List;\n" +
			"\n" +
			"public class X {\n" +
			"	void foo(List<Object> objects, List raw) {\n" +
			"\n" +
			"	    List<Number> numbers;\n" +
			"	    List<? extends Number> ext;\n" +
			"	    \n" +
			"	    numbers= (List<Number>) objects; // correct - cast error\n" +
			"	    ext= (List<? extends Number>) objects; // wrong, should fail\n" +
			"\n" +
			"	    ext= raw; // correct - raw conversion warning issued\n" +
			"	    numbers= raw; // correct - raw conversion warning issued\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 4)\n" +
		"	void foo(List<Object> objects, List raw) {\n" +
		"	                               ^^^^\n" +
		"List is a raw type. References to generic type List<E> should be parameterized\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 9)\n" +
		"	numbers= (List<Number>) objects; // correct - cast error\n" +
		"	         ^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from List<Object> to List<Number>\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 10)\n" +
		"	ext= (List<? extends Number>) objects; // wrong, should fail\n" +
		"	     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from List<Object> to List<? extends Number>\n" +
		"----------\n" +
		"4. WARNING in X.java (at line 12)\n" +
		"	ext= raw; // correct - raw conversion warning issued\n" +
		"	     ^^^\n" +
		"Type safety: The expression of type List needs unchecked conversion to conform to List<? extends Number>\n" +
		"----------\n" +
		"5. WARNING in X.java (at line 13)\n" +
		"	numbers= raw; // correct - raw conversion warning issued\n" +
		"	         ^^^\n" +
		"Type safety: The expression of type List needs unchecked conversion to conform to List<Number>\n" +
		"----------\n");
}
public void _test0667() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			"public class X {\n" +
			"    public static void foo(List<? super Object[]> l) {    }\n" +
			" \n" +
			"    public static void foo2(List<Object[]> l) {    }\n" +
			" \n" +
			"    public static void foo3(List<? extends Object[]> l) {    }\n" +
			" \n" +
			"    public static void bar(List<? super Object> l) {    }\n" +
			" \n" +
			"    public static void bar2(List<Object> l) {    }\n" +
			" \n" +
			"    public static void bar3(List<? extends Object> l) {    }\n" +
			" \n" +
			"    public static void bar4(List<?> l) {    }\n" +
			" \n" +
			"    public static void main(String[] args) {\n" +
			"        {   // can be { Object, Object[] }\n" +
			"            List<? super Object[]> l = new ArrayList<Object[]>();\n" +
			"            l.add(l.get(0));  // illegal [01]\n" +
			"            l.add((Object) null);  // illegal [02]\n" +
			"            l.add((Integer) null);  // illegal [03]\n" +
			"            l.add((Object []) null); // illegal [04]\n" +
			"            l.add((Integer []) null); // illegal [05]\n" +
			"            l.add((Integer [][]) null); // illegal [06]\n" +
			" \n" +
			"            foo(l); // List<? super Object[]> - legal [07]\n" +
			"            foo2(l); // List<Object[]> - illegal [08]\n" +
			"            foo3(l); // List<? extends Object[]> - illegal [09]\n" +
			"            bar(l); // List<? super Object> - illegal [10]\n" +
			"            bar2(l); // List<Object> - illegal [11]\n" +
			"            bar3(l); // List<? extends Object> - legal [12]\n" +
			"            bar4(l); // List<?> - legal [13]\n" +
			"        }\n" +
			"        {   // can be Object[] or (? extends Object)[]\n" +
			"            List<Object[]> l = new ArrayList<Object[]>();\n" +
			"            l.add(l.get(0));  // legal [14]\n" +
			"            l.add((Object) null);  // illegal [15]\n" +
			"            l.add((Integer) null);  // illegal [16]\n" +
			"            l.add((Object []) null); // legal [17]\n" +
			"            l.add((Integer []) null); // legal [18]\n" +
			"            l.add((Integer [][]) null); // legal [19]\n" +
			" \n" +
			"            foo(l); // List<? super Object[]> - legal [20]\n" +
			"            foo2(l); // List<Object[]> - legal [21]\n" +
			"            foo3(l); // List<? extends Object[]> - legal [22]\n" +
			"            bar(l); // List<? super Object> - illegal [23]\n" +
			"            bar2(l); // List<Object> - illegal [24]\n" +
			"            bar3(l); // List<? extends Object> - legal [25]\n" +
			"            bar4(l); // List<?> - legal [26]\n" +
			"        }\n" +
			"        {   // Only allows wildcards, Object is illegal.\n" +
			"            List<? extends Object[]> l = new ArrayList<Object[]>();\n" +
			"            l.add(l.get(0));  // illegal [27]\n" +
			"            l.add((Object) null);  // illegal [28]\n" +
			"            l.add((Integer) null);  // illegal [29]\n" +
			"            l.add((Object []) null); // illegal [30]\n" +
			"            l.add((Integer []) null); // illegal [31]\n" +
			"            l.add((Integer [][]) null); // illegal [32]\n" +
			" \n" +
			"            foo(l); // List<? super Object[]> - illegal [33]\n" +
			"            foo2(l); // List<Object[]> - illegal [34]\n" +
			"            foo3(l); // List<? extends Object[]> - legal [35]\n" +
			"            bar(l); // List<? super Object> - illegal [36]\n" +
			"            bar2(l); // List<Object> - illegal [37]\n" +
			"            bar3(l); // List<? extends Object> - legal [38]\n" +
			"            bar4(l); // List<?> - legal [39]\n" +
			"        }\n" +
			"        {   // can add non-arrays but can only match ? super Object, ? super Object[], or ? extends Object, but not Object  \n" +
			"            List<? super Object> l = new ArrayList<Object>();\n" +
			"            l.add(l.get(0));  // legal [40]\n" +
			"            l.add((Object) null);  // legal [41]\n" +
			"            l.add((Integer) null);  // legal [42]\n" +
			"            l.add((Object []) null); // illegal [43]\n" +
			"            l.add((Integer []) null); // illegal [44]\n" +
			"            l.add((Integer [][]) null); // illegal [45]\n" +
			" \n" +
			"            foo(l); // legal [46]\n" +
			"            foo2(l); // illegal [47]\n" +
			"            foo3(l); // illegal [48]\n" +
			"            bar(l); // legal [49]\n" +
			"            bar2(l); // illegal [50]\n" +
			"            bar3(l); // legal [51]\n" +
			"            bar4(l); // legal [52]\n" +
			"        }\n" +
			"        {   // can add array but cannot call a method which expects an array. 100% !\n" +
			"            List<Object> l = new ArrayList<Object>();\n" +
			"            l.get(0).toString();\n" +
			"            l.add(l.get(0));  // legal [53]\n" +
			"            l.add((Object) null);  // legal [54]\n" +
			"            l.add((Integer) null);  // legal [55]\n" +
			"            l.add((Object []) null); // legal [56]\n" +
			"            l.add((Integer []) null); // legal [57]\n" +
			"            l.add((Integer [][]) null); // legal [58]\n" +
			" \n" +
			"            foo(l); // legal [59]\n" +
			"            foo2(l); // illegal [60]\n" +
			"            foo3(l); // illegal [61]\n" +
			"            bar(l); // legal [62]\n" +
			"            bar2(l); // legal [63]\n" +
			"            bar3(l); // legal [64]\n" +
			"            bar4(l); // legal [65]\n" +
			"        }\n" +
			"        {   // cannot add any type but can match ? or ? extends Object.\n" +
			"            List<? extends Object> l = new ArrayList<Object>();\n" +
			"            l.add(l.get(0));  // illegal [66]\n" +
			"            l.add((Object) null);  // illegal [67]\n" +
			"            l.add((Integer) null);  // illegal [68]\n" +
			"            l.add((Object []) null); // illegal [69]\n" +
			"            l.add((Integer []) null); // illegal [70]\n" +
			"            l.add((Integer [][]) null); // illegal [71]\n" +
			" \n" +
			"            foo(l); // List<? super Object[]> - illegal [72]\n" +
			"            foo2(l); // List<Object[]> - illegal [73]\n" +
			"            foo3(l); // List<? extends Object[]> - illegal [74]\n" +
			"            bar(l); // List<? super Object> - illegal [75]\n" +
			"            bar2(l); // List<Object> - illegal [76]\n" +
			"            bar3(l); // List<? extends Object> - legal [77]\n" +
			"            bar4(l); // List<?> - legal [78]\n" +
			"        }\n" +
			"        {   // same as ? extends Object.\n" +
			"            List<?> l = new ArrayList<Object>();\n" +
			"            l.add(l.get(0));  // illegal [79]\n" +
			"            l.add((Object) null);  // illegal [80]\n" +
			"            l.add((Integer) null);  // illegal [81]\n" +
			"            l.add((Object []) null); // illegal [82]\n" +
			"            l.add((Integer []) null); // illegal [83]\n" +
			"            l.add((Integer [][]) null); // illegal [84]\n" +
			" \n" +
			"            foo(l); // List<? super Object[]> - illegal [85]\n" +
			"            foo2(l); // List<Object[]> - illegal [86]\n" +
			"            foo3(l); // List<? extends Object[]> - illegal [87]\n" +
			"            bar(l); // List<? super Object> - illegal [88]\n" +
			"            bar2(l); // List<Object> - illegal [89]\n" +
			"            bar3(l); // List<? extends Object> - legal [90]\n" +
			"            bar4(l); // List<?> - legal [91]\n" +
			"        }\n" +
			"    }\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 21)\n" +
		"	l.add(l.get(0));  // illegal [01]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ? super Object[]) in the type List<capture-of ? super Object[]> is not applicable for the arguments (capture-of ? super Object[])\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 22)\n" +
		"	l.add((Object) null);  // illegal [02]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ? super Object[]) in the type List<capture-of ? super Object[]> is not applicable for the arguments (Object)\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 23)\n" +
		"	l.add((Integer) null);  // illegal [03]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ? super Object[]) in the type List<capture-of ? super Object[]> is not applicable for the arguments (Integer)\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 24)\n" +
		"	l.add((Object []) null); // illegal [04]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ? super Object[]) in the type List<capture-of ? super Object[]> is not applicable for the arguments (Object[])\n" +
		"----------\n" +
		"5. ERROR in X.java (at line 25)\n" +
		"	l.add((Integer []) null); // illegal [05]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ? super Object[]) in the type List<capture-of ? super Object[]> is not applicable for the arguments (Integer[])\n" +
		"----------\n" +
		"6. ERROR in X.java (at line 26)\n" +
		"	l.add((Integer [][]) null); // illegal [06]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ? super Object[]) in the type List<capture-of ? super Object[]> is not applicable for the arguments (Integer[][])\n" +
		"----------\n" +
		"7. ERROR in X.java (at line 28)\n" +
		"	foo(l); // List<? super Object[]> - legal [07]\n" +
		"	^^^\n" +
		"The method foo(List<? super Object[]>) in the type X is not applicable for the arguments (List<capture-of ? super Object[]>)\n" +
		"----------\n" +
		"8. ERROR in X.java (at line 29)\n" +
		"	foo2(l); // List<Object[]> - illegal [08]\n" +
		"	^^^^\n" +
		"The method foo2(List<Object[]>) in the type X is not applicable for the arguments (List<capture-of ? super Object[]>)\n" +
		"----------\n" +
		"9. ERROR in X.java (at line 30)\n" +
		"	foo3(l); // List<? extends Object[]> - illegal [09]\n" +
		"	^^^^\n" +
		"The method foo3(List<? extends Object[]>) in the type X is not applicable for the arguments (List<capture-of ? super Object[]>)\n" +
		"----------\n" +
		"10. ERROR in X.java (at line 31)\n" +
		"	bar(l); // List<? super Object> - illegal [10]\n" +
		"	^^^\n" +
		"The method bar(List<? super Object>) in the type X is not applicable for the arguments (List<capture-of ? super Object[]>)\n" +
		"----------\n" +
		"11. ERROR in X.java (at line 32)\n" +
		"	bar2(l); // List<Object> - illegal [11]\n" +
		"	^^^^\n" +
		"The method bar2(List<Object>) in the type X is not applicable for the arguments (List<capture-of ? super Object[]>)\n" +
		"----------\n" +
		"12. ERROR in X.java (at line 39)\n" +
		"	l.add((Object) null);  // illegal [15]\n" +
		"	  ^^^\n" +
		"The method add(Object[]) in the type List<Object[]> is not applicable for the arguments (Object)\n" +
		"----------\n" +
		"13. ERROR in X.java (at line 40)\n" +
		"	l.add((Integer) null);  // illegal [16]\n" +
		"	  ^^^\n" +
		"The method add(Object[]) in the type List<Object[]> is not applicable for the arguments (Integer)\n" +
		"----------\n" +
		"14. ERROR in X.java (at line 48)\n" +
		"	bar(l); // List<? super Object> - illegal [23]\n" +
		"	^^^\n" +
		"The method bar(List<? super Object>) in the type X is not applicable for the arguments (List<Object[]>)\n" +
		"----------\n" +
		"15. ERROR in X.java (at line 49)\n" +
		"	bar2(l); // List<Object> - illegal [24]\n" +
		"	^^^^\n" +
		"The method bar2(List<Object>) in the type X is not applicable for the arguments (List<Object[]>)\n" +
		"----------\n" +
		"16. ERROR in X.java (at line 55)\n" +
		"	l.add(l.get(0));  // illegal [27]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ? extends Object[]) in the type List<capture-of ? extends Object[]> is not applicable for the arguments (capture-of ? extends Object[])\n" +
		"----------\n" +
		"17. ERROR in X.java (at line 56)\n" +
		"	l.add((Object) null);  // illegal [28]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ? extends Object[]) in the type List<capture-of ? extends Object[]> is not applicable for the arguments (Object)\n" +
		"----------\n" +
		"18. ERROR in X.java (at line 57)\n" +
		"	l.add((Integer) null);  // illegal [29]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ? extends Object[]) in the type List<capture-of ? extends Object[]> is not applicable for the arguments (Integer)\n" +
		"----------\n" +
		"19. ERROR in X.java (at line 58)\n" +
		"	l.add((Object []) null); // illegal [30]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ? extends Object[]) in the type List<capture-of ? extends Object[]> is not applicable for the arguments (Object[])\n" +
		"----------\n" +
		"20. ERROR in X.java (at line 59)\n" +
		"	l.add((Integer []) null); // illegal [31]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ? extends Object[]) in the type List<capture-of ? extends Object[]> is not applicable for the arguments (Integer[])\n" +
		"----------\n" +
		"21. ERROR in X.java (at line 60)\n" +
		"	l.add((Integer [][]) null); // illegal [32]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ? extends Object[]) in the type List<capture-of ? extends Object[]> is not applicable for the arguments (Integer[][])\n" +
		"----------\n" +
		"22. ERROR in X.java (at line 62)\n" +
		"	foo(l); // List<? super Object[]> - illegal [33]\n" +
		"	^^^\n" +
		"The method foo(List<? super Object[]>) in the type X is not applicable for the arguments (List<capture-of ? extends Object[]>)\n" +
		"----------\n" +
		"23. ERROR in X.java (at line 63)\n" +
		"	foo2(l); // List<Object[]> - illegal [34]\n" +
		"	^^^^\n" +
		"The method foo2(List<Object[]>) in the type X is not applicable for the arguments (List<capture-of ? extends Object[]>)\n" +
		"----------\n" +
		"24. ERROR in X.java (at line 65)\n" +
		"	bar(l); // List<? super Object> - illegal [36]\n" +
		"	^^^\n" +
		"The method bar(List<? super Object>) in the type X is not applicable for the arguments (List<capture-of ? extends Object[]>)\n" +
		"----------\n" +
		"25. ERROR in X.java (at line 66)\n" +
		"	bar2(l); // List<Object> - illegal [37]\n" +
		"	^^^^\n" +
		"The method bar2(List<Object>) in the type X is not applicable for the arguments (List<capture-of ? extends Object[]>)\n" +
		"----------\n" +
		"26. ERROR in X.java (at line 75)\n" +
		"	l.add((Object []) null); // illegal [43]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ? super Object) in the type List<capture-of ? super Object> is not applicable for the arguments (Object[])\n" +
		"----------\n" +
		"27. ERROR in X.java (at line 76)\n" +
		"	l.add((Integer []) null); // illegal [44]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ? super Object) in the type List<capture-of ? super Object> is not applicable for the arguments (Integer[])\n" +
		"----------\n" +
		"28. ERROR in X.java (at line 77)\n" +
		"	l.add((Integer [][]) null); // illegal [45]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ? super Object) in the type List<capture-of ? super Object> is not applicable for the arguments (Integer[][])\n" +
		"----------\n" +
		"29. ERROR in X.java (at line 79)\n" +
		"	foo(l); // legal [46]\n" +
		"	^^^\n" +
		"The method foo(List<? super Object[]>) in the type X is not applicable for the arguments (List<capture-of ? super Object>)\n" +
		"----------\n" +
		"30. ERROR in X.java (at line 80)\n" +
		"	foo2(l); // illegal [47]\n" +
		"	^^^^\n" +
		"The method foo2(List<Object[]>) in the type X is not applicable for the arguments (List<capture-of ? super Object>)\n" +
		"----------\n" +
		"31. ERROR in X.java (at line 81)\n" +
		"	foo3(l); // illegal [48]\n" +
		"	^^^^\n" +
		"The method foo3(List<? extends Object[]>) in the type X is not applicable for the arguments (List<capture-of ? super Object>)\n" +
		"----------\n" +
		"32. ERROR in X.java (at line 83)\n" +
		"	bar2(l); // illegal [50]\n" +
		"	^^^^\n" +
		"The method bar2(List<Object>) in the type X is not applicable for the arguments (List<capture-of ? super Object>)\n" +
		"----------\n" +
		"33. ERROR in X.java (at line 98)\n" +
		"	foo2(l); // illegal [60]\n" +
		"	^^^^\n" +
		"The method foo2(List<Object[]>) in the type X is not applicable for the arguments (List<Object>)\n" +
		"----------\n" +
		"34. ERROR in X.java (at line 99)\n" +
		"	foo3(l); // illegal [61]\n" +
		"	^^^^\n" +
		"The method foo3(List<? extends Object[]>) in the type X is not applicable for the arguments (List<Object>)\n" +
		"----------\n" +
		"35. ERROR in X.java (at line 107)\n" +
		"	l.add(l.get(0));  // illegal [66]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ? extends Object) in the type List<capture-of ? extends Object> is not applicable for the arguments (capture-of ? extends Object)\n" +
		"----------\n" +
		"36. ERROR in X.java (at line 108)\n" +
		"	l.add((Object) null);  // illegal [67]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ? extends Object) in the type List<capture-of ? extends Object> is not applicable for the arguments (Object)\n" +
		"----------\n" +
		"37. ERROR in X.java (at line 109)\n" +
		"	l.add((Integer) null);  // illegal [68]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ? extends Object) in the type List<capture-of ? extends Object> is not applicable for the arguments (Integer)\n" +
		"----------\n" +
		"38. ERROR in X.java (at line 110)\n" +
		"	l.add((Object []) null); // illegal [69]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ? extends Object) in the type List<capture-of ? extends Object> is not applicable for the arguments (Object[])\n" +
		"----------\n" +
		"39. ERROR in X.java (at line 111)\n" +
		"	l.add((Integer []) null); // illegal [70]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ? extends Object) in the type List<capture-of ? extends Object> is not applicable for the arguments (Integer[])\n" +
		"----------\n" +
		"40. ERROR in X.java (at line 112)\n" +
		"	l.add((Integer [][]) null); // illegal [71]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ? extends Object) in the type List<capture-of ? extends Object> is not applicable for the arguments (Integer[][])\n" +
		"----------\n" +
		"41. ERROR in X.java (at line 114)\n" +
		"	foo(l); // List<? super Object[]> - illegal [72]\n" +
		"	^^^\n" +
		"The method foo(List<? super Object[]>) in the type X is not applicable for the arguments (List<capture-of ? extends Object>)\n" +
		"----------\n" +
		"42. ERROR in X.java (at line 115)\n" +
		"	foo2(l); // List<Object[]> - illegal [73]\n" +
		"	^^^^\n" +
		"The method foo2(List<Object[]>) in the type X is not applicable for the arguments (List<capture-of ? extends Object>)\n" +
		"----------\n" +
		"43. ERROR in X.java (at line 116)\n" +
		"	foo3(l); // List<? extends Object[]> - illegal [74]\n" +
		"	^^^^\n" +
		"The method foo3(List<? extends Object[]>) in the type X is not applicable for the arguments (List<capture-of ? extends Object>)\n" +
		"----------\n" +
		"44. ERROR in X.java (at line 117)\n" +
		"	bar(l); // List<? super Object> - illegal [75]\n" +
		"	^^^\n" +
		"The method bar(List<? super Object>) in the type X is not applicable for the arguments (List<capture-of ? extends Object>)\n" +
		"----------\n" +
		"45. ERROR in X.java (at line 118)\n" +
		"	bar2(l); // List<Object> - illegal [76]\n" +
		"	^^^^\n" +
		"The method bar2(List<Object>) in the type X is not applicable for the arguments (List<capture-of ? extends Object>)\n" +
		"----------\n" +
		"46. ERROR in X.java (at line 124)\n" +
		"	l.add(l.get(0));  // illegal [79]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ?) in the type List<capture-of ?> is not applicable for the arguments (capture-of ?)\n" +
		"----------\n" +
		"47. ERROR in X.java (at line 125)\n" +
		"	l.add((Object) null);  // illegal [80]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ?) in the type List<capture-of ?> is not applicable for the arguments (Object)\n" +
		"----------\n" +
		"48. ERROR in X.java (at line 126)\n" +
		"	l.add((Integer) null);  // illegal [81]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ?) in the type List<capture-of ?> is not applicable for the arguments (Integer)\n" +
		"----------\n" +
		"49. ERROR in X.java (at line 127)\n" +
		"	l.add((Object []) null); // illegal [82]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ?) in the type List<capture-of ?> is not applicable for the arguments (Object[])\n" +
		"----------\n" +
		"50. ERROR in X.java (at line 128)\n" +
		"	l.add((Integer []) null); // illegal [83]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ?) in the type List<capture-of ?> is not applicable for the arguments (Integer[])\n" +
		"----------\n" +
		"51. ERROR in X.java (at line 129)\n" +
		"	l.add((Integer [][]) null); // illegal [84]\n" +
		"	  ^^^\n" +
		"The method add(capture-of ?) in the type List<capture-of ?> is not applicable for the arguments (Integer[][])\n" +
		"----------\n" +
		"52. ERROR in X.java (at line 131)\n" +
		"	foo(l); // List<? super Object[]> - illegal [85]\n" +
		"	^^^\n" +
		"The method foo(List<? super Object[]>) in the type X is not applicable for the arguments (List<capture-of ?>)\n" +
		"----------\n" +
		"53. ERROR in X.java (at line 132)\n" +
		"	foo2(l); // List<Object[]> - illegal [86]\n" +
		"	^^^^\n" +
		"The method foo2(List<Object[]>) in the type X is not applicable for the arguments (List<capture-of ?>)\n" +
		"----------\n" +
		"54. ERROR in X.java (at line 133)\n" +
		"	foo3(l); // List<? extends Object[]> - illegal [87]\n" +
		"	^^^^\n" +
		"The method foo3(List<? extends Object[]>) in the type X is not applicable for the arguments (List<capture-of ?>)\n" +
		"----------\n" +
		"55. ERROR in X.java (at line 134)\n" +
		"	bar(l); // List<? super Object> - illegal [88]\n" +
		"	^^^\n" +
		"The method bar(List<? super Object>) in the type X is not applicable for the arguments (List<capture-of ?>)\n" +
		"----------\n" +
		"56. ERROR in X.java (at line 135)\n" +
		"	bar2(l); // List<Object> - illegal [89]\n" +
		"	^^^^\n" +
		"The method bar2(List<Object>) in the type X is not applicable for the arguments (List<capture-of ?>)\n" +
		"----------\n");
}
public void test0668() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"import java.util.List;\n" +
			" \n" +
			"public class X {\n" +
			"    void foo(List<? super Object[]> l) {\n" +
			"        l.add(new Object[0]);\n" +
			"    }\n" +
			"}\n",
		},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=95289
public void test0669() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			"public class X {\n" +
			"private static<T> int indexOf(final T[] array,final T elem) {\n" +
			"	return 0;\n" +
			"}\n" +
			"public static void meth(AContainer ac, AInfo[] aiArray) {\n" +
			"  for(AInfo ai: aiArray) {\n" +
			"	int index1 = indexOf(ac.getAs(),ai.a);\n" +
			"	int index2 = indexOf(ac.getAs(),ai); // ai.class!=ai.a.class!!!\n" +
			"  }\n" +
			"}\n" +
			"}\n" +
			"\n" +
			"class AContainer {\n" +
			"   public A[] getAs(){ return null; }\n" +
			"}\n" +
			"\n" +
			"class AInfo {\n" +
			"   public A a;\n" +
			"}\n" +
			"\n" +
			"class A {\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=95021 (ensure not even a warning)
public void test0670() {
	runConformTest(
		true,
		new String[] {
			"X.java",
			"import java.util.Map;\n" +
			"\n" +
			"interface MethodProperty<ActualType extends MethodProperty<ActualType>> {\n" +
			"	public void copyFrom(ActualType other);\n" +
			"}\n" +
			"\n" +
			"class MethodPropertyDatabase<Property extends MethodProperty<Property>> {\n" +
			"	Map<String, Property> propertyMap;\n" +
			"	\n" +
			"	void read(String fileName) {\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"class FooProperty implements MethodProperty<FooProperty> {\n" +
			"	String value;\n" +
			"\n" +
			"	public void copyFrom(FooProperty other) {\n" +
			"		this.value = other.value;\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"class FooPropertyDatabase extends MethodPropertyDatabase<FooProperty> {\n" +
			"}\n" +
			"\n" +
			"public class X {\n" +
			"	FooPropertyDatabase fooDatabase;\n" +
			"	\n" +
			"	public void readDatabase() {\n" +
			"		FooPropertyDatabase database = new FooPropertyDatabase();\n" +
			"		\n" +
			"		fooDatabase = readDatabase(database, \"foodatabase.db\"); // Bug reported on this line\n" +
			"	}\n" +
			"	\n" +
			"	private<\n" +
			"		Property extends MethodProperty<Property>,\n" +
			"		DatabaseType extends MethodPropertyDatabase<Property>\n" +
			"		> DatabaseType readDatabase(DatabaseType database, String fileName) {\n" +
			"			database.read(fileName);\n" +
			"			return database;\n" +
			"		}\n" +
			"	\n" +
			"}\n",
		},
		"",
		null,
		null,
		JavacTestOptions.EclipseJustification.EclipseBug95021);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=95021 - variation: ensure not even a warning
public void test0671() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.Map;\n" +
			"\n" +
			"interface MethodProperty<ActualType extends MethodProperty<ActualType>> {\n" +
			"	public void copyFrom(ActualType other);\n" +
			"}\n" +
			"\n" +
			"class MethodPropertyDatabase<Property extends MethodProperty<Property>> {\n" +
			"	Map<String, Property> propertyMap;\n" +
			"	\n" +
			"	void read(String fileName) {\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"class FooProperty implements MethodProperty<FooProperty> {\n" +
			"	String value;\n" +
			"\n" +
			"	public void copyFrom(FooProperty other) {\n" +
			"		this.value = other.value;\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"class FooPropertyDatabase extends MethodPropertyDatabase<FooProperty> {\n" +
			"}\n" +
			"\n" +
			"public class X {\n" +
			"  Zork z;\n" +
			"	FooPropertyDatabase fooDatabase;\n" +
			"	\n" +
			"	public void readDatabase() {\n" +
			"		FooPropertyDatabase database = new FooPropertyDatabase();\n" +
			"		\n" +
			"		fooDatabase = readDatabase(database, \"foodatabase.db\"); // Bug reported on this line\n" +
			"	}\n" +
			"	\n" +
			"	private<\n" +
			"		Property extends MethodProperty<Property>,\n" +
			"		DatabaseType extends MethodPropertyDatabase<Property>\n" +
			"		> DatabaseType readDatabase(DatabaseType database, String fileName) {\n" +
			"			database.read(fileName);\n" +
			"			return database;\n" +
			"		}\n" +
			"	\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 26)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=95021 - variation: ensure not even a warning
// SHOULD FAIL AT 1.8 (18.2.3): The method read(D, String) in the type X is not applicable for the arguments (Bar<Foo>, String)
public void test0672() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface Foo<T extends Foo<T>> {\n" +
			"}\n" +
			"\n" +
			"class Bar<Q> {\n" +
			"}\n" +
			"\n" +
			"\n" +
			"public class X {\n" +
			"	Zork z;\n" +
			"	void readDatabase() {\n" +
			"		Bar<Foo> bar = new Bar<Foo>();\n" +
			"		read(bar, \"sadasd\");\n" +
			"	}\n" +
			"	\n" +
			"	<P extends Foo<P>, D extends Bar<P>> \n" +
			"	D read(D d, String s) {\n" +
			"			return d;\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 9)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 11)\n" +
		"	Bar<Foo> bar = new Bar<Foo>();\n" +
		"	    ^^^\n" +
		"Foo is a raw type. References to generic type Foo<T> should be parameterized\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 11)\n" +
		"	Bar<Foo> bar = new Bar<Foo>();\n" +
		"	                       ^^^\n" +
		"Foo is a raw type. References to generic type Foo<T> should be parameterized\n" +
		"----------\n" +
		"4. WARNING in X.java (at line 12)\n" +
		"	read(bar, \"sadasd\");\n" +
		"	^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked invocation read(Bar<Foo>, String) of the generic method read(D, String) of type X\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=95638
public void test0673() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.List;\n" +
			"\n" +
			"class Key<E, F extends Type<E, F>> {\n" +
			"}\n" +
			"\n" +
			"class State<S extends State> {\n" +
			"}\n" +
			"\n" +
			"class Type<T, U extends Type<T, U>> {\n" +
			"}\n" +
			"\n" +
			"class Store<A, B extends Type<A, B>, C extends Key<A, B>, D extends State<D>> {\n" +
			"}\n" +
			"\n" +
			"public class X<K> {\n" +
			"	List<Store<K, ?, ? extends Key<K, ?>, ? extends State<?>>> stores;\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=95638 - variation
public void test0674() {
	this.runConformTest(
		new String[] {
			"X.java",
			"class Key<E extends Key<E>> {}\n" +
			"class Store<F extends Key<F>> {}\n" +
			"\n" +
			"public class X<T extends Key<T>> {\n" +
			"	Store<? extends Key<T>> store;\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=95638 - variation
public void test0675() {
	runNegativeTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"class Key<E extends Key<E>> {}\n" +
			"class Store<F extends Key<F>> {}\n" +
			"\n" +
			"public class X<T> {\n" +
			"	Store<? extends Key<T>> store1;\n" +
			"	Store<? extends Key<? extends T>> store2;\n" +
			"}\n",
		},
		// compiler results
		"----------\n" + /* expected compiler log */
		"1. ERROR in X.java (at line 5)\n" +
		"	Store<? extends Key<T>> store1;\n" +
		"	                    ^\n" +
		"Bound mismatch: The type T is not a valid substitute for the bounded parameter <E extends Key<E>> of the type Key<E>\n" +
		"----------\n" + 
		"2. ERROR in X.java (at line 6)\n" + 
		"	Store<? extends Key<? extends T>> store2;\n" + 
		"	                    ^^^^^^^^^^^\n" + 
		"Bound mismatch: The type ? extends T is not a valid substitute for the bounded parameter <E extends Key<E>> of the type Key<E>\n" + 
		"----------\n",
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}
//check fault tolerance, in spite of bound mismatch, still pass param type for further resolving message send
public void test0676() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T extends Throwable> {\n" +
			"	T get() { return null; }\n" +
			"	\n" +
			"	void foo(X<String> xs) {\n" +
			"		xs.get().printStackTrace();\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	void foo(X<String> xs) {\n" +
		"	           ^^^^^^\n" +
		"Bound mismatch: The type String is not a valid substitute for the bounded parameter <T extends Throwable> of the type X<T>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 5)\n" +
		"	xs.get().printStackTrace();\n" +
		"	         ^^^^^^^^^^^^^^^\n" +
		"The method printStackTrace() is undefined for the type String\n" +
		"----------\n");
}
public void test0677() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		{\n" +
			"			ArrayList<Number> arrayList = new ArrayList<Integer>(); // compile error\n" +
			"			Number number = arrayList.get(0);\n" +
			"		}\n" +
			"		{\n" +
			"			ArrayList<? extends Number> arrayList = new ArrayList<Integer>(); //correct\n" +
			"			Number number = arrayList.get(0);\n" +
			"		}\n" +
			"		{\n" +
			"			ArrayList<? super Integer> arrayList = new ArrayList<Number>();\n" +
			"			Object number = arrayList.get(0); //returns java.lang.Object\n" +
			"		}\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	ArrayList<Number> arrayList = new ArrayList<Integer>(); // compile error\n" +
		"	                              ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from ArrayList<Integer> to ArrayList<Number>\n" +
		"----------\n");
}
public void test0678() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.io.Serializable;\n" +
			"\n" +
			"public class X<T, T2 extends T & Serializable > {\n" +
			"	\n" +
			"	X<Object, Serializable> right1;\n" +
			"	X<String, Serializable> wrong1;\n" +
			"	X<Y, Y> right2;\n" +
			"	\n" +
			"	static class Y implements Serializable {\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	public class X<T, T2 extends T & Serializable > {\n" +
		"	                                 ^^^^^^^^^^^^\n" +
		"Cannot specify any additional bound Serializable when first bound is a type parameter\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 6)\n" +
		"	X<String, Serializable> wrong1;\n" +
		"	          ^^^^^^^^^^^^\n" +
		"Bound mismatch: The type Serializable is not a valid substitute for the bounded parameter <T2 extends T & Serializable> of the type X<T,T2>\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 9)\n" +
		"	static class Y implements Serializable {\n" +
		"	             ^\n" +
		"The serializable class Y does not declare a static final serialVersionUID field of type long\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=95638 - variation
public void test0679() {
	this.runConformTest(
		new String[] {
			"X.java",
			"class Key<E, F extends Key<E, F>> {}\n" +
			"class Store<A, B extends Key<A, B>> {}\n" +
			"\n" +
			"public class X<K extends Key<?, K>> {\n" +
			"	Store<K, ? extends Key<K, ?>> store;\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=95638 - variation
public void test0680() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.List;\n" +
			"\n" +
			"class Key<E, F extends Type<E, F, G, H>, G extends Key<E, F, G, H>, H extends State<H>> {}\n" +
			"class State<S extends State> {}\n" +
			"class Type<T, U extends Type<T, U, V, W>, V extends Key<T, U, V, W>, W extends State<W>> {}\n" +
			"class Store<A, B extends Type<A, B, C, D>, C extends Key<A, B, C, D>, D extends State<D>> {}\n" +
			"\n" +
			"public class X<K extends Key<K, ?,?,?>> {\n" +
			"	List<Store<K, ?, ? extends Key<K, ?, ?, ?>, ? extends State<?>>> stores;\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=95638 - variation
public void test0681() {
	this.runConformTest(
		new String[] {
			"X.java",
			"class Key<E, K extends Key<E, K>> {\n" +
			"}\n" +
			"class Store<E, K extends Key<E, K>> {\n" +
			"}\n" +
			"class X<E> {\n" +
			"	Store<E, ?> store1;\n" +
			"	Store<E, ? extends Key<E, ?>> store2;\n" +
			"\n" +
			"	class StoreHolder <F extends Key<E, F>> {\n" +
			"		Store<E, F> store;\n" +
			"	}\n" +
			"}\n" +
			"class Y<T, U extends Y<T, U>> {\n" +
			"	Y<?, ?> y;\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=95963
public void test0682() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"class X extends A<X.M> {}\n" +
			"class A<T> {}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 1)\n" +
		"	class X extends A<X.M> {}\n" +
		"	                  ^^^\n" +
		"X.M cannot be resolved to a type\n" +
		"----------\n"
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=96085
public void test0683() {
	this.runConformTest(
		new String[] {
			"P.java",
			"public interface P<V> {\n" +
			"    interface A {}\n" +
			"}\n",
			"P2.java",
			"public class P2 implements P.A {\n" +
			"    P2(P.A problem) {}\n" +
			"}\n",
			"P3.java",
			"public class P3 {\n" +
			"    void test() {P.A o = new P2((P.A) null);}\n" +
			"}\n",
		},
		"");
	this.runConformTest(
		new String[] {
			"P3.java",
			"class P3 {\n" +
			"    void test() {P.A o = new P2((P.A) null);}\n" +
			"}\n",
		},
		"",
		null,
		false,
		null);
}
public void test0684() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" +
			"	<U> U foo(U u1, U u2) {\n" +
			"		return u1;\n" +
			"	}\n" +
			"	void bar(X<? extends Throwable> x1, X<? extends Runnable> x2) {\n" +
			"		X<String> x = foo(x1, x2);\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 6)\n" +
		"	X<String> x = foo(x1, x2);\n" +
		"	              ^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from X<capture#3-of ? extends Object> to X<String>\n" +
		"----------\n");
}
public void test0685() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" +
			"	<U> U foo(U u1, U u2) {\n" +
			"		return u1;\n" +
			"	}\n" +
			"	void bar(X<? extends Throwable> x1, X<? extends Runnable> x2) {\n" +
			"		X<String> x = foo(x1, x2);\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 6)\n" +
		"	X<String> x = foo(x1, x2);\n" +
		"	              ^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from X<capture#3-of ? extends Object> to X<String>\n" +
		"----------\n");
}
// check wildcard bounds wrt variable boundCheck
public void test0686() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.List;\n" +
			"class Other<T extends List<? extends Runnable>> {\n" +
			"}\n" +
			"\n" +
			"public class X {\n" +
			"	Other<? extends List<? extends Throwable>> other1;\n" +
			"	Other<? extends List<? super String>> other2;	\n" +
			"	Other<? extends List<? extends String>> other3;		\n" +
			"	Other<? extends List<? extends Runnable>> other7 = other1;\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 7)\n" +
		"	Other<? extends List<? super String>> other2;	\n" +
		"	      ^^^^^^^^^^^^^^\n" +
		"Bound mismatch: The type ? extends List<? super String> is not a valid substitute for the bounded parameter <T extends List<? extends Runnable>> of the type Other<T>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 8)\n" +
		"	Other<? extends List<? extends String>> other3;		\n" +
		"	      ^^^^^^^^^^^^^^\n" +
		"Bound mismatch: The type ? extends List<? extends String> is not a valid substitute for the bounded parameter <T extends List<? extends Runnable>> of the type Other<T>\n" +
		"----------\n");
}
// check wildcard bounds wrt variable boundCheck
public void test0687() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.List;\n" +
			"class Other<T extends List<? extends Runnable>> {\n" +
			"}\n" +
			"\n" +
			"public class X {\n" +
			"	Other<? extends List<?>> other2;\n" +
			"	Other<? extends List<? super Throwable>> other3;\n" +
			"	Other<? super List<? extends Throwable>> other4;\n" +
			"	Other<? super List<?>> other5;\n" +
			"	Other<? super List<? super Throwable>> other6;\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 7)\n" +
		"	Other<? extends List<? super Throwable>> other3;\n" +
		"	      ^^^^^^^^^^^^^^\n" +
		"Bound mismatch: The type ? extends List<? super Throwable> is not a valid substitute for the bounded parameter <T extends List<? extends Runnable>> of the type Other<T>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 8)\n" +
		"	Other<? super List<? extends Throwable>> other4;\n" +
		"	      ^^^^^^^^^^^^\n" +
		"Bound mismatch: The type ? super List<? extends Throwable> is not a valid substitute for the bounded parameter <T extends List<? extends Runnable>> of the type Other<T>\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 9)\n" +
		"	Other<? super List<?>> other5;\n" +
		"	      ^^^^^^^^^^^^\n" +
		"Bound mismatch: The type ? super List<?> is not a valid substitute for the bounded parameter <T extends List<? extends Runnable>> of the type Other<T>\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 10)\n" +
		"	Other<? super List<? super Throwable>> other6;\n" +
		"	      ^^^^^^^^^^^^\n" +
		"Bound mismatch: The type ? super List<? super Throwable> is not a valid substitute for the bounded parameter <T extends List<? extends Runnable>> of the type Other<T>\n" +
		"----------\n");
}
// check wildcard bounds wrt variable boundCheck
public void test0688() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.List;\n" +
			"class Other<T extends List<? extends Runnable>> {\n" +
			"}\n" +
			"\n" +
			"public class X {\n" +
			"	Other<? super List<? extends Runnable>> other5;\n" +
			"}\n",
		},
		"");
}
// check wildcard bounds wrt variable boundCheck
public void test0689() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.List;\n" +
			"class Other<T extends List<? extends Runnable>> {\n" +
			"}\n" +
			"\n" +
			"public class X {\n" +
			"	Other<? super List<? super Runnable>> other5;\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 6)\n" +
		"	Other<? super List<? super Runnable>> other5;\n" +
		"	      ^^^^^^^^^^^^\n" +
		"Bound mismatch: The type ? super List<? super Runnable> is not a valid substitute for the bounded parameter <T extends List<? extends Runnable>> of the type Other<T>\n" +
		"----------\n");
}
// check assignment rules across param types with wildcards
public void test0690() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.List;\n" +
			"public class X {\n" +
			"	void foo(List<? extends Runnable> lr, List<?> la) {\n" +
			"		lr = la;\n" +
			"		la = lr;\n" +
			"	}\n" +
			"}         \n" +
			"\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	lr = la;\n" +
		"	     ^^\n" +
		"Type mismatch: cannot convert from List<capture#2-of ?> to List<? extends Runnable>\n" +
		"----------\n");
}
// check that final class bound is more restrictive
public void test0691() {
	this.runNegativeTest(
		new String[] {
			"XX.java",
			"public class XX<T extends Runnable> {\n" +
			"	void foo(XX<?> lhs, XX<? extends String> rhs) {\n" +
			"		lhs = rhs;\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in XX.java (at line 2)\n" +
		"	void foo(XX<?> lhs, XX<? extends String> rhs) {\n" +
		"	                       ^^^^^^^^^^^^^^^^\n" +
		"Bound mismatch: The type ? extends String is not a valid substitute for the bounded parameter <T extends Runnable> of the type XX<T>\n" +
		"----------\n");
}
// check wildcard bounds wrt variable boundCheck
public void test0692() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.List;\n" +
			"\n" +
			"public class X<T extends List<Object>> {\n" +
			"	\n" +
			"	void foo(X<? extends List<String>> x) {\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	void foo(X<? extends List<String>> x) {\n" +
		"	           ^^^^^^^^^^^^^^\n" +
		"Bound mismatch: The type ? extends List<String> is not a valid substitute for the bounded parameter <T extends List<Object>> of the type X<T>\n" +
		"----------\n");
}
// bound checks
public void test0693() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T extends Runnable> {\n" +
			"	X<X<String>> x1;\n" +
			"	X<? extends String> x2;\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 2)\n" +
		"	X<X<String>> x1;\n" +
		"	  ^\n" +
		"Bound mismatch: The type X<String> is not a valid substitute for the bounded parameter <T extends Runnable> of the type X<T>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 2)\n" +
		"	X<X<String>> x1;\n" +
		"	    ^^^^^^\n" +
		"Bound mismatch: The type String is not a valid substitute for the bounded parameter <T extends Runnable> of the type X<T>\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 3)\n" +
		"	X<? extends String> x2;\n" +
		"	  ^^^^^^^^^^^^^^^^\n" +
		"Bound mismatch: The type ? extends String is not a valid substitute for the bounded parameter <T extends Runnable> of the type X<T>\n" +
		"----------\n");
}
// bound checks
public void test0694() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T extends X<T>> {\n" +
			"	X<X<X<String>>> x1;\n" +
			"	X<? extends X<? extends X<String>>> x2;\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 2)\n" +
		"	X<X<X<String>>> x1;\n" +
		"	  ^\n" +
		"Bound mismatch: The type X<X<String>> is not a valid substitute for the bounded parameter <T extends X<T>> of the type X<T>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 2)\n" +
		"	X<X<X<String>>> x1;\n" +
		"	    ^\n" +
		"Bound mismatch: The type X<String> is not a valid substitute for the bounded parameter <T extends X<T>> of the type X<T>\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 2)\n" +
		"	X<X<X<String>>> x1;\n" +
		"	      ^^^^^^\n" +
		"Bound mismatch: The type String is not a valid substitute for the bounded parameter <T extends X<T>> of the type X<T>\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 3)\n" +
		"	X<? extends X<? extends X<String>>> x2;\n" +
		"	  ^^^^^^^^^^^\n" +
		"Bound mismatch: The type ? extends X<? extends X<String>> is not a valid substitute for the bounded parameter <T extends X<T>> of the type X<T>\n" +
		"----------\n" +
		"5. ERROR in X.java (at line 3)\n" +
		"	X<? extends X<? extends X<String>>> x2;\n" +
		"	              ^^^^^^^^^^^\n" +
		"Bound mismatch: The type ? extends X<String> is not a valid substitute for the bounded parameter <T extends X<T>> of the type X<T>\n" +
		"----------\n" +
		"6. ERROR in X.java (at line 3)\n" +
		"	X<? extends X<? extends X<String>>> x2;\n" +
		"	                          ^^^^^^\n" +
		"Bound mismatch: The type String is not a valid substitute for the bounded parameter <T extends X<T>> of the type X<T>\n" +
		"----------\n");
}
// bound checks
public void test0695() {
	this.runConformTest(
		new String[] {
			"I.java",
			"interface I<T extends I<? extends T>> {\n" +
			"}\n",
		},
		"");
}
public void test0696() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"class Key<E extends Key<E>> {}\n" +
			"class Store<F extends Key<F>> {}\n" +
			"\n" +
			"public class X<T> {\n" +
			"	Store<? extends Key<T>> store = new Store<Key<T>>();\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	Store<? extends Key<T>> store = new Store<Key<T>>();\n" +
		"	                    ^\n" +
		"Bound mismatch: The type T is not a valid substitute for the bounded parameter <E extends Key<E>> of the type Key<E>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 5)\n" +
		"	Store<? extends Key<T>> store = new Store<Key<T>>();\n" +
		"	                                          ^^^\n" +
		"Bound mismatch: The type Key<T> is not a valid substitute for the bounded parameter <F extends Key<F>> of the type Store<F>\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 5)\n" +
		"	Store<? extends Key<T>> store = new Store<Key<T>>();\n" +
		"	                                              ^\n" +
		"Bound mismatch: The type T is not a valid substitute for the bounded parameter <E extends Key<E>> of the type Key<E>\n" +
		"----------\n");
}
public void test0697() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.List;\n" +
			"public class X<U, V extends List<U>> {\n" +
			"	V v;\n" +
			"	\n" +
			"	void foo(X<String, ?> x1, X<Object, ?> x2) {\n" +
			"		String s =x1.v.get(0);\n" +
			"		Object o = x2.v.get(0);\n" +
			"		\n" +
			"	}\n" +
			"}\n",
		},
		"");
}
public void test0698() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.List;\n" +
			"\n" +
			"public class X<U extends List<Object>, V extends List<String>> {\n" +
			"	\n" +
			"	X<? super Exception, ? super Exception> x;\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	X<? super Exception, ? super Exception> x;\n" +
		"	  ^^^^^^^^^^^^^^^^^\n" +
		"Bound mismatch: The type ? super Exception is not a valid substitute for the bounded parameter <U extends List<Object>> of the type X<U,V>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 5)\n" +
		"	X<? super Exception, ? super Exception> x;\n" +
		"	                     ^^^^^^^^^^^^^^^^^\n" +
		"Bound mismatch: The type ? super Exception is not a valid substitute for the bounded parameter <V extends List<String>> of the type X<U,V>\n" +
		"----------\n");
}
public void test0699() {
	this.runNegativeTest(
		new String[] {
			"X2.java",
			"import java.util.List;\n" +
			"class Other2<T extends List< Runnable>> {\n" +
			"}\n" +
			"\n" +
			"class X2 {\n" +
			"	Other2<? extends List<Throwable>> other1;\n" +
			"	Other2<? extends List<? super String>> other2;	\n" +
			"	Other2<? extends List<? extends String>> other3;		\n" +
			"	Other2<? extends List<? extends Runnable>> other7 = other1;\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X2.java (at line 6)\n" +
		"	Other2<? extends List<Throwable>> other1;\n" +
		"	       ^^^^^^^^^^^^^^\n" +
		"Bound mismatch: The type ? extends List<Throwable> is not a valid substitute for the bounded parameter <T extends List<Runnable>> of the type Other2<T>\n" +
		"----------\n" +
		"2. ERROR in X2.java (at line 7)\n" +
		"	Other2<? extends List<? super String>> other2;	\n" +
		"	       ^^^^^^^^^^^^^^\n" +
		"Bound mismatch: The type ? extends List<? super String> is not a valid substitute for the bounded parameter <T extends List<Runnable>> of the type Other2<T>\n" +
		"----------\n" +
		"3. ERROR in X2.java (at line 8)\n" +
		"	Other2<? extends List<? extends String>> other3;		\n" +
		"	       ^^^^^^^^^^^^^^\n" +
		"Bound mismatch: The type ? extends List<? extends String> is not a valid substitute for the bounded parameter <T extends List<Runnable>> of the type Other2<T>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=96646
public void test0700() {
	this.runConformTest(
		new String[] {
			"X.java",
			"abstract class BaseFactory<T> {\n" +
			"	public T create() throws Exception {\n" +
			"		return getType().newInstance();\n" +
			"	}\n" +
			"	public abstract Class<T> getType();\n" +
			"}\n" +
			"interface StringFactory {\n" +
			"	public String create() throws Exception;\n" +
			"}\n" +
			"public class X extends BaseFactory<String> implements StringFactory {\n" +
			"	@Override\n" +
			"	public Class<String> getType() {\n" +
			"		return String.class;\n" +
			"	}\n" +
			"	public static void main(String[] args) throws Exception {\n" +
			"		String emptyString = new X().create();\n" +
			"		System.out.printf(\"SUCCESS\");\n" +
			"	}\n" +
			"}\n",
		},
		"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=97303
public void test0701() {
	Map options = getCompilerOptions();
	options.put(JavaCore.COMPILER_PB_UNCHECKED_TYPE_OPERATION, JavaCore.IGNORE);
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.Arrays;\n" +
			"import java.util.List;\n" +
			"\n" +
			"class Deejay {\n" +
			"	class Counter<T> {}\n" +
			"\n" +
			"	Counter<Song> songCounter = new Counter<Song>();\n" +
			"	Counter<Genre> genreCounter = new Counter<Genre>();\n" +
			"\n" +
			"	List<Counter<?>> list1 = Arrays.asList(songCounter, genreCounter);\n" +
			"	List<Counter<? extends Object>> list2 = Arrays.asList(songCounter, genreCounter);\n" +
			"	List<Counter<?>> list3 = Arrays.<Counter<?>>asList(songCounter, genreCounter);\n" +
			"	List<Counter<?>> list4 = Arrays.asList(new Counter<?>[] {songCounter, genreCounter});\n" +
			"	List<Counter<? extends String>> list5 = Arrays.asList(songCounter, genreCounter);\n" +
			"}\n" +
			"class Genre {}\n" +
			"class Song {}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 14)\n" +
		"	List<Counter<? extends String>> list5 = Arrays.asList(songCounter, genreCounter);\n" +
		"	                                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from List<Deejay.Counter<? extends Object>> to List<Deejay.Counter<? extends String>>\n" +
		"----------\n",
		null,
		true,
		options);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=97303 - variation
public void test0702() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T extends Runnable> implements Runnable {\n" +
			"	\n" +
			"	void foo0(X<X<?>> lhs, X<X<? extends Runnable>> rhs) {\n" +
			"		lhs = rhs; // 0\n" +
			"	}\n" +
			"	void foo1(X<X<?>> lhs, X<X<? extends Object>> rhs) {\n" +
			"		lhs = rhs; // 1\n" + // TODO (philippe) should be ok using capture rules for equivalence
			"	}\n" +
			"	void foo2(X<X<? extends Cloneable>> lhs, X<X<? extends Object>> rhs) {\n" +
			"		lhs = rhs; // 2\n" +
			"	}\n" +
			"	void foo3(X<X<? extends Runnable>> lhs, X<X<? extends Object>> rhs) {\n" +
			"		lhs = rhs; // 3\n" +
			"	}\n" +
			"	void foo4(X<X<? extends Runnable>> lhs, X<X<?>> rhs) {\n" +
			"		lhs = rhs; // 4\n" +
			"	}\n" +
			"	void foo5(X<X<?>> lhs, X<X<? extends Cloneable>> rhs) {\n" +
			"		lhs = rhs; // 5\n" +
			"	}\n" +
			"	void foo6(X<X<X<X<X<?>>>>> lhs, X<X<X<X<X<? extends Runnable>>>>> rhs) {\n" +
			"		lhs = rhs; // 6\n" +
			"	}	\n" +
			"	public void run() {\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 7)\n" +
		"	lhs = rhs; // 1\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from X<X<? extends Object>> to X<X<?>>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 10)\n" +
		"	lhs = rhs; // 2\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from X<X<? extends Object>> to X<X<? extends Cloneable>>\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 13)\n" +
		"	lhs = rhs; // 3\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from X<X<? extends Object>> to X<X<? extends Runnable>>\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 19)\n" +
		"	lhs = rhs; // 5\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from X<X<? extends Cloneable>> to X<X<?>>\n" +
		"----------\n");
}
public void test0703() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<T extends X<T>> {}\n" +
			"class Y extends X<Y> {\n" +
			"    X<?> p = (Y)null;\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=97800
public void test0704() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"public class X {\n" +
			"		 public static void main(String[] args) {\n" +
			"		 		 List<String> l = (List<String>)Collections.emptyList();\n" +
			"		 }	 \n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	List<String> l = (List<String>)Collections.emptyList();\n" +
		"	                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from List<Object> to List<String>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=97480
public void test0705() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			"public class X {\n" +
			"  void f(Object o){\n" +
			"		 ((Map.Entry)o).setValue(\"bug\");\n" +
			"		 		 \n" +
			"		 Map.Entry me= (Map.Entry)o; \n" +
			"		 me.setValue(\"ok\");\n" +
			"		 		 \n" +
			"		 ((Vector)o).add(\"ok\");\n" +
			"  }\n" +
			" Zork z;\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 5)\n" +
		"	((Map.Entry)o).setValue(\"bug\");\n" +
		"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: The method setValue(Object) belongs to the raw type Map.Entry. References to generic type Map.Entry<K,V> should be parameterized\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 5)\n" +
		"	((Map.Entry)o).setValue(\"bug\");\n" +
		"	  ^^^^^^^^^\n" +
		"Map.Entry is a raw type. References to generic type Map.Entry<K,V> should be parameterized\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 7)\n" +
		"	Map.Entry me= (Map.Entry)o; \n" +
		"	^^^^^^^^^\n" +
		"Map.Entry is a raw type. References to generic type Map.Entry<K,V> should be parameterized\n" +
		"----------\n" +
		"4. WARNING in X.java (at line 7)\n" +
		"	Map.Entry me= (Map.Entry)o; \n" +
		"	               ^^^^^^^^^\n" +
		"Map.Entry is a raw type. References to generic type Map.Entry<K,V> should be parameterized\n" +
		"----------\n" +
		"5. WARNING in X.java (at line 8)\n" +
		"	me.setValue(\"ok\");\n" +
		"	^^^^^^^^^^^^^^^^^\n" +
		"Type safety: The method setValue(Object) belongs to the raw type Map.Entry. References to generic type Map.Entry<K,V> should be parameterized\n" +
		"----------\n" +
		"6. WARNING in X.java (at line 10)\n" +
		"	((Vector)o).add(\"ok\");\n" +
		"	^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: The method add(Object) belongs to the raw type Vector. References to generic type Vector<E> should be parameterized\n" +
		"----------\n" +
		"7. WARNING in X.java (at line 10)\n" +
		"	((Vector)o).add(\"ok\");\n" +
		"	  ^^^^^^\n" +
		"Vector is a raw type. References to generic type Vector<E> should be parameterized\n" +
		"----------\n" +
		"8. ERROR in X.java (at line 12)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=97219
public void test0706() {
	String outputExpectedBelow17 = (this.complianceLevel == ClassFileConstants.JDK1_6)?
			"----------\n" + 
			"1. WARNING in X.java (at line 9)\n" + 
			"	class BB extends AA<CC> { <U> BB test() {return null;} }\n" + 
			"	                                 ^^^^^^\n" + 
			"Name clash: The method test() of type BB has the same erasure as test() of type AA<T> but does not override it\n" + 
			"----------\n":
				"----------\n" + 
				"1. ERROR in X.java (at line 9)\n" + 
				"	class BB extends AA<CC> { <U> BB test() {return null;} }\n" + 
				"	                                 ^^^^^^\n" + 
				"Name clash: The method test() of type BB has the same erasure as test() of type AA<T> but does not override it\n" + 
				"----------\n";
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	void foo() {\n" +
			"		BB bb = new BB();\n" +
			"		bb.<Object>test();\n" +
			"		((AA<CC>) bb).test();\n" +
			"	}\n" +
			"}\n" +
			"class AA<T> { AA<Object> test() {return null;} }\n" +
			"class BB extends AA<CC> { <U> BB test() {return null;} }\n" +
			"class CC {}\n",
		},
		(this.complianceLevel < ClassFileConstants.JDK1_7)
		? outputExpectedBelow17
		: "----------\n" + 
		"1. ERROR in X.java (at line 4)\n" + 
		"	bb.<Object>test();\n" + 
		"	           ^^^^\n" + 
		"The method test() is ambiguous for the type BB\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 9)\n" + 
		"	class BB extends AA<CC> { <U> BB test() {return null;} }\n" + 
		"	                                 ^^^^^^\n" + 
		"Name clash: The method test() of type BB has the same erasure as test() of type AA<T> but does not override it\n" + 
		"----------\n"
	);
/*
X.java:4: reference to test is ambiguous, both method test() in AA and method <U>test() in BB match
                bb.<Object>test();
                  ^
  where U is a type-variable:
    U extends Object declared in method <U>test()
X.java:9: name clash: <U>test() in BB and test() in AA have the same erasure, yet neither overrides the other
class BB extends AA<CC> { <U> BB test() {return null;} }
                                 ^
  where U is a type-variable:
    U extends Object declared in method <U>test()
2 errors
 */
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=97219
public void test0706a() {
	// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6182950
	String expectedCompilerLog = (this.complianceLevel == ClassFileConstants.JDK1_6)?
			"----------\n" + 
			"1. ERROR in X.java (at line 4)\n" + 
			"	AA<Object> res1 = bb.test();\n" + 
			"	                     ^^^^\n" + 
			"The method test() is ambiguous for the type BB\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 5)\n" + 
			"	AA res3 = bb.test();\n" + 
			"	^^\n" + 
			"AA is a raw type. References to generic type AA<T> should be parameterized\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 5)\n" + 
			"	AA res3 = bb.test();\n" + 
			"	             ^^^^\n" + 
			"The method test() is ambiguous for the type BB\n" + 
			"----------\n" + 
			"4. WARNING in X.java (at line 9)\n" + 
			"	class BB extends AA<CC> { <U> BB test() {return null;} }\n" + 
			"	                                 ^^^^^^\n" + 
			"Name clash: The method test() of type BB has the same erasure as test() of type AA<T> but does not override it\n" + 
			"----------\n":
				"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	AA<Object> res1 = bb.test();\n" + 
				"	                     ^^^^\n" + 
				"The method test() is ambiguous for the type BB\n" + 
				"----------\n" + 
				"2. WARNING in X.java (at line 5)\n" + 
				"	AA res3 = bb.test();\n" + 
				"	^^\n" + 
				"AA is a raw type. References to generic type AA<T> should be parameterized\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 5)\n" + 
				"	AA res3 = bb.test();\n" + 
				"	             ^^^^\n" + 
				"The method test() is ambiguous for the type BB\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 9)\n" + 
				"	class BB extends AA<CC> { <U> BB test() {return null;} }\n" + 
				"	                                 ^^^^^^\n" + 
				"Name clash: The method test() of type BB has the same erasure as test() of type AA<T> but does not override it\n" + 
				"----------\n";
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	void foo() {\n" +
			"		BB bb = new BB();\n" +
			"		AA<Object> res1 = bb.test();\n" +
			"		AA res3 = bb.test();\n" +
			"	}\n" +
			"}\n" +
			"class AA<T> { AA<Object> test() {return null;} }\n" +
			"class BB extends AA<CC> { <U> BB test() {return null;} }\n" +
			"class CC {}\n",
		},
		expectedCompilerLog
	);
/*
X.java:4: reference to test is ambiguous, both method test() in AA and method <U>test() in BB match
                AA<Object> res1 = bb.test();
                                    ^
  where U is a type-variable:
    U extends Object declared in method <U>test()
X.java:5: reference to test is ambiguous, both method test() in AA and method <U>test() in BB match
                AA res3 = bb.test();
                            ^
  where U is a type-variable:
    U extends Object declared in method <U>test()
X.java:9: name clash: <U>test() in BB and test() in AA have the same erasure, yet neither overrides the other
class BB extends AA<CC> { <U> BB test() {return null;} }
                                 ^
  where U is a type-variable:
    U extends Object declared in method <U>test()
3 errors
 */
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=97219
public void test0706b() {
	// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6182950
	String expectedCompilerLog = (this.complianceLevel == ClassFileConstants.JDK1_6)?
			"----------\n" + 
			"1. ERROR in X.java (at line 4)\n" + 
			"	AA<CC> res = bb.test();\n" + 
			"	                ^^^^\n" + 
			"The method test() is ambiguous for the type BB\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 5)\n" + 
			"	BB res2 = bb.test();\n" + 
			"	             ^^^^\n" + 
			"The method test() is ambiguous for the type BB\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 9)\n" + 
			"	class BB extends AA<CC> { <U> BB test() {return null;} }\n" + 
			"	                                 ^^^^^^\n" + 
			"Name clash: The method test() of type BB has the same erasure as test() of type AA<T> but does not override it\n" + 
			"----------\n":
				"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	AA<CC> res = bb.test();\n" + 
				"	                ^^^^\n" + 
				"The method test() is ambiguous for the type BB\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 5)\n" + 
				"	BB res2 = bb.test();\n" + 
				"	             ^^^^\n" + 
				"The method test() is ambiguous for the type BB\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 9)\n" + 
				"	class BB extends AA<CC> { <U> BB test() {return null;} }\n" + 
				"	                                 ^^^^^^\n" + 
				"Name clash: The method test() of type BB has the same erasure as test() of type AA<T> but does not override it\n" + 
				"----------\n";
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	void foo() {\n" +
			"		BB bb = new BB();\n" +
			"		AA<CC> res = bb.test();\n" +
			"		BB res2 = bb.test();\n" +
			"	}\n" +
			"}\n" +
			"class AA<T> { AA<Object> test() {return null;} }\n" +
			"class BB extends AA<CC> { <U> BB test() {return null;} }\n" +
			"class CC {}\n",
		},
		expectedCompilerLog
	);
/*
X.java:4: reference to test is ambiguous, both method test() in AA and method <U>test() in BB match
                AA<CC> res = bb.test();
                               ^
  where U is a type-variable:
    U extends Object declared in method <U>test()
X.java:4: incompatible types
                AA<CC> res = bb.test();
                                    ^
  required: AA<CC>
  found:    AA<Object>
X.java:5: reference to test is ambiguous, both method test() in AA and method <U>test() in BB match
                BB res2 = bb.test();
                            ^
  where U is a type-variable:
    U extends Object declared in method <U>test()
X.java:5: incompatible types
                BB res2 = bb.test();
                                 ^
  required: BB
  found:    AA<Object>
X.java:9: name clash: <U>test() in BB and test() in AA have the same erasure, yet neither overrides the other
class BB extends AA<CC> { <U> BB test() {return null;} }
                                 ^
  where U is a type-variable:
    U extends Object declared in method <U>test()
5 errors
 */
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	void foo() {\n" +
			"		BB bb = new BB();\n" +
			"		AA<CC> res = bb.test();\n" +
			"		BB res2 = bb.test();\n" +
			"	}\n" +
			"}\n" +
			"class AA<T> { AA<Object> test() {return null;} }\n" +
			"class BB extends AA<CC> { }\n" +
			"class CC {}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	AA<CC> res = bb.test();\n" +
		"	             ^^^^^^^^^\n" +
		"Type mismatch: cannot convert from AA<Object> to AA<CC>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 5)\n" +
		"	BB res2 = bb.test();\n" +
		"	          ^^^^^^^^^\n" +
		"Type mismatch: cannot convert from AA<Object> to BB\n" +
		"----------\n"
	);
/*
X.java:4: incompatible types
                AA<CC> res = bb.test();
                                    ^
  required: AA<CC>
  found:    AA<Object>
X.java:5: incompatible types
                BB res2 = bb.test();
                                 ^
  required: BB
  found:    AA<Object>
2 errors
 */
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98079
public void test0707() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" +
			"\n" +
			"    B<? extends T> b() {\n" +
			"        return a();\n" +
			"    }\n" +
			"    \n" +
			"    <U extends T> B<U> a() {\n" +
			"        return null;\n" +
			"    }\n" +
			"    \n" +
			"    static class B<V> { }\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=95684
public void test0708() {
	this.runConformTest(
		new String[] {
			"UserClass.java",
			"public class UserClass<K> {\n" +
			"    protected class DataHolder {}\n" +
			"    protected void loadHook(DataHolder data) {}\n" +
			"}\n",
		},
		"");
	this.runConformTest(
		new String[] {
			"ChildClass.java",
			"public class ChildClass extends UserClass<Object> {\n" +
			"    @Override protected void loadHook(DataHolder data) {}\n" +
			"}\n",
		},
		"",
		null,
		false,
		null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=95684 - variation
public void test0709() {
	this.runConformTest(
		new String[] {
			"UserClass.java",
			"public class UserClass<K> {\n" +
			"    protected class DataHolder {}\n" +
			"    protected void loadHook(DataHolder[] data) {}\n" +
			"}\n",
		},
		"");
	this.runConformTest(
		new String[] {
			"ChildClass.java",
			"public class ChildClass extends UserClass<Object> {\n" +
			"    @Override protected void loadHook(DataHolder[] data) {}\n" +
			"}\n",
		},
		"",
		null,
		false,
		null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=96713
public void test0710() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static <V, P extends Persistent<V>> P createDataObject(V value) {\n" +
			"		return null;\n" +
			"	}\n" +
			"	public static void testCreateDataObject(Object v) {\n" +
			"		Persistent d = createDataObject(v);\n" +
			"	}\n" +
			"\n" +
			"	private interface Persistent<V> {\n" +
			"		public V getValueObject();\n" +
			"	}\n" +
			"}\n",
		},
		"");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=97108
public void test0711(){
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.ArrayList;\n" +
			"import java.util.HashMap;\n" +
			"import java.util.List;\n" +
			"import java.util.Map;\n" +
			"\n" +
			"public class X<T> {\n" +
			"	static private Map<String, XX> m1 = new HashMap<String, XX>();\n" +
			"	private List<XX> m2 = new ArrayList<XX>();\n" +
			"	static protected XX foo()\n" +
			"	{\n" +
			"		return null;\n" +
			"	}\n" +
			"	static public abstract class XX<TT>\n" +
			"	{\n" +
			"	}\n" +
			"}\n",
		},
	    "");

	this.runConformTest(
		new String[] {
			"Y.java",
			"public class Y extends X<Object>  \n" +
			"{        \n" +
			"}\n"
		},
	    "",
	    null,
	    false,
	    null);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=97108
// The case that works
public void test0712(){
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.ArrayList;\n" +
			"import java.util.HashMap;\n" +
			"import java.util.List;\n" +
			"import java.util.Map;\n" +
			"\n" +
			"public class X<T> {\n" +
			"	static private Map<String, XX> m1 = new HashMap<String, XX>();\n" +
			"	private List<XX<T>> m2 = new ArrayList<XX<T>>();\n" +
			"	static protected XX foo()\n" +
			"	{\n" +
			"		return null;\n" +
			"	}\n" +
			"	static public abstract class XX<TT>\n" +
			"	{\n" +
			"	}\n" +
			"}\n",
		},
        "");
	this.runConformTest(
		new String[] {
			"Y.java",
			"public class Y extends X<Object>  \n" +
			"{        \n" +
			"}\n"
		},
        "",
        null,
        false,
        null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=96713
public void test0713() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" +
			"	int i = 0;\n" +
			"	interface Y {\n" +
			"		java.util.List<T> lt = null;\n" +
			"		int j = i;\n" +
			"		void m1(T t);		\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	java.util.List<T> lt = null;\n" +
		"	               ^\n" +
		"Cannot make a static reference to the non-static type T\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 5)\n" +
		"	int j = i;\n" +
		"	        ^\n" +
		"Cannot make a static reference to the non-static field i\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 6)\n" +
		"	void m1(T t);		\n" +
		"	        ^\n" +
		"Cannot make a static reference to the non-static type T\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98232
public void test0714() {
	this.runConformTest(
		new String[] {
			"B.java",
			"import java.util.Map;\n" +
			"import java.util.Set;\n" +
			"import java.util.SortedSet;\n" +
			"\n" +
			"public class B  {\n" +
			"	static Set<Map.Entry> foo(SortedSet<Map.Entry> set) {\n" +
			"		return null;\n" +
			"	}\n" +
			"}\n" +
			"\n",
		},
        "");
	this.runConformTest(
		new String[] {
			"A.java",
			"public class A {\n" +
			"	A() {\n" +
			"		B.foo(null);\n" +
			"	}\n" +
			"}\n"
		},
        "",
        null,
        false,
        null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98393
public void test0715() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"    void foo() {\n" +
			"    	Comparable<String> c = (java.util.List)bar(5, 5.0);\n" +
			"    }\n" +
			"    \n" +
			"    <T> T bar(T t1, T t2) { return t1; }\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	Comparable<String> c = (java.util.List)bar(5, 5.0);\n" +
		"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from List to Comparable<String>\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 3)\n" +
		"	Comparable<String> c = (java.util.List)bar(5, 5.0);\n" +
		"	                        ^^^^^^^^^^^^^^\n" +
		"List is a raw type. References to generic type List<E> should be parameterized\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98396
// **
public void test0716() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T extends Number & Comparable<String>> {\n" +
			"    void foo(T t) {\n" +
			"    		 Comparable<Integer> ci = (Comparable<Integer>) t;  \n" +
			"    }\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	Comparable<Integer> ci = (Comparable<Integer>) t;  \n" +
		"	                         ^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from T to Comparable<Integer>\n" +
		"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=98396 - variation
public void test0717() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.List;\n" +
			"public class X<T extends Comparable<String> & List<Integer>> {\n" +
			"    void foo(T t) {\n" +
			"    		 Comparable<Integer> ci = (Comparable<Integer>) t;  \n" +
			"    }\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	Comparable<Integer> ci = (Comparable<Integer>) t;  \n" +
		"	                         ^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from T to Comparable<Integer>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98478
// SHOULD FAIL AT 1.8 (18.2.3): The method max(Collection<? extends T>) in the type Collections is not applicable for the arguments (Set<X.ActionImpl>)
public void test0718() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.Collections;\n" +
			"import java.util.Set;\n" +
			"import java.util.TreeSet;\n" +
			"\n" +
			"public class X {\n" +
			"    \n" +
			"    public interface Base {\n" +
			"    }\n" +
			"    \n" +
			"    abstract class Action<T extends Base> {\n" +
			"    }\n" +
			"\n" +
			"    public class ActionImpl<T extends Base> extends Action<T> implements Comparable<ActionImpl> {\n" +
			"        public int compareTo(ActionImpl o) {\n" +
			"            return 0;\n" +
			"        }\n" +
			"    }\n" +
			"\n" +
			"    public void test() {\n" +
			"        Set<ActionImpl> set = new TreeSet<ActionImpl>();\n" +
			"        Collections.max(set);\n" +
			"    }\n" +
			"   Zork z;\n" +
			"}\n",
		},
		"----------\n" + 
		"1. WARNING in X.java (at line 13)\n" + 
		"	public class ActionImpl<T extends Base> extends Action<T> implements Comparable<ActionImpl> {\n" + 
		"	                                                                                ^^^^^^^^^^\n" + 
		"X.ActionImpl is a raw type. References to generic type X.ActionImpl<T> should be parameterized\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 14)\n" + 
		"	public int compareTo(ActionImpl o) {\n" + 
		"	                     ^^^^^^^^^^\n" + 
		"X.ActionImpl is a raw type. References to generic type X.ActionImpl<T> should be parameterized\n" + 
		"----------\n" + 
		"3. WARNING in X.java (at line 20)\n" + 
		"	Set<ActionImpl> set = new TreeSet<ActionImpl>();\n" + 
		"	    ^^^^^^^^^^\n" + 
		"X.ActionImpl is a raw type. References to generic type X.ActionImpl<T> should be parameterized\n" + 
		"----------\n" + 
		"4. WARNING in X.java (at line 20)\n" + 
		"	Set<ActionImpl> set = new TreeSet<ActionImpl>();\n" + 
		"	                                  ^^^^^^^^^^\n" + 
		"X.ActionImpl is a raw type. References to generic type X.ActionImpl<T> should be parameterized\n" + 
		"----------\n" + 
		"5. WARNING in X.java (at line 21)\n" + 
		"	Collections.max(set);\n" + 
		"	^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: Unchecked invocation max(Set<X.ActionImpl>) of the generic method max(Collection<? extends T>) of type Collections\n" + 
		"----------\n" + 
		"6. ERROR in X.java (at line 23)\n" + 
		"	Zork z;\n" + 
		"	^^^^\n" + 
		"Zork cannot be resolved to a type\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98364
public void test0719() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.Iterator;\n" +
			"import java.util.ListIterator;\n" +
			"\n" +
			"interface IntegerIterator extends Iterator {}\n" +
			"interface IntegerListIterator extends ListIterator<Integer>, IntegerIterator {}\n" +
			"\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 4)\n" +
		"	interface IntegerIterator extends Iterator {}\n" +
		"	                                  ^^^^^^^^\n" +
		"Iterator is a raw type. References to generic type Iterator<E> should be parameterized\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 5)\n" +
		"	interface IntegerListIterator extends ListIterator<Integer>, IntegerIterator {}\n" +
		"	          ^^^^^^^^^^^^^^^^^^^\n" +
		"The interface Iterator cannot be implemented more than once with different arguments: Iterator and Iterator<Integer>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98364 - variation
public void test0720() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface Foo<T> {}\n" +
			"interface Bar extends Foo<Integer> {}\n" +
			"interface Baz extends Bar, Foo {}\n" +
			"\n" +
			"class XSuper implements Foo {}\n" +
			"class XSub extends XSuper implements Foo<Integer> {}\n" +
			"\n" +
			"public class X implements Bar, Foo {}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	interface Baz extends Bar, Foo {}\n" +
		"	          ^^^\n" +
		"The interface Foo cannot be implemented more than once with different arguments: Foo and Foo<Integer>\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 3)\n" +
		"	interface Baz extends Bar, Foo {}\n" +
		"	                           ^^^\n" +
		"Foo is a raw type. References to generic type Foo<T> should be parameterized\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 5)\n" +
		"	class XSuper implements Foo {}\n" +
		"	                        ^^^\n" +
		"Foo is a raw type. References to generic type Foo<T> should be parameterized\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 6)\n" +
		"	class XSub extends XSuper implements Foo<Integer> {}\n" +
		"	      ^^^^\n" +
		"The interface Foo cannot be implemented more than once with different arguments: Foo and Foo<Integer>\n" +
		"----------\n" +
		"5. ERROR in X.java (at line 8)\n" +
		"	public class X implements Bar, Foo {}\n" +
		"	             ^\n" +
		"The interface Foo cannot be implemented more than once with different arguments: Foo and Foo<Integer>\n" +
		"----------\n" +
		"6. WARNING in X.java (at line 8)\n" +
		"	public class X implements Bar, Foo {}\n" +
		"	                               ^^^\n" +
		"Foo is a raw type. References to generic type Foo<T> should be parameterized\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98561
public void test0721() {
	this.runConformTest(
			new String[] {
				"Foo.java",
				"public class Foo<T>\n" +
				"{\n" +
				"	protected abstract class InnerFoo\n" +
				"	{\n" +
				"		protected abstract void doSomething();\n" +
				"	}\n" +
				"	\n" +
				"	protected void run( InnerFoo innerFoo )\n" +
				"	{\n" +
				"		innerFoo.doSomething();\n" +
				"	}\n" +
				"}",
			},
	        "");
		this.runConformTest(
			new String[] {
				"Bar.java",
				"public class Bar extends Foo<Integer>\n" +
				"{\n" +
				"	public void go()\n" +
				"	{\n" +
				"		InnerFoo inner = new InnerFoo()\n" +
				"		{\n" +
				"			protected void doSomething()\n" +
				"			{\n" +
				"				System.out.println( \"hello\" );\n" +
				"			}\n" +
				"		};\n" +
				"		run( inner );\n" +
				"	}\n" +
				"}"
			},
	        "",
	        null,
	        false,
	        null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98364 - variation
public void test0722() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I1<T1> {\n" +
			"}\n" +
			"\n" +
			"interface I2<T2> extends I1<T2> {\n" +
			"}\n" +
			"\n" +
			"public class X<U1> implements I1<U1>, I2<U1> {\n" +
			"}\n",
		},
		"");
}
public void test0723() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface IA<E> {}\n" +
			"interface IB<E> extends IA<E> {}\n" +
			"class A<E> implements IA<E> {}\n" +
			"class B<E> implements IB<E> {}\n" +
			"\n" +
			"public class X {\n" +
			"\n" +
			"	public static void main(String[] args) {\n" +
			"		A<Integer> x = new A<Integer>();\n" +
			"		B<Integer> y = new B<Integer>();\n" +
			"		print(x);\n" +
			"		print(y);\n" +
			"	}\n" +
			"	public static <T extends IA<?>> void print(T a) {\n" +
			"		System.out.print(\"A\");\n" +
			"	}\n" +
			"	public static <T extends IB<?>> void print(T a) {\n" +
			"		System.out.println(\"B\");\n" +
			"	}\n" +
			"}\n",
		},
		"AB");
}
public void test0724() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.HashMap;\n" +
			"\n" +
			"public class X {\n" +
			"\n" +
			"	public static void main(String[] args) {\n" +
			"		HashMap<Byte, Byte> subst = new HashMap<Byte, Byte>();\n" +
			"		subst.put((byte)1, (byte)1);\n" +
			"		if (1 + subst.get((byte)1) > 0.f) {\n" +
			"			System.out.println(\"SUCCESS\");\n" +
			"		}		\n" +
			"	}\n" +
			"}\n",
		},
		"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98500
public void test0725() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"class AbsC {\n" +
			"	public <T> T[] resize(T[] src, T[] dest) {\n" +
			"		return dest;\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"class ConrC<T> extends AbsC {\n" +
			"	T[][] data;\n" +
			"	protected void allocateChunkSlots(int maxChunkNo) {\n" +
			"		data = resize(data, new Object[maxChunkNo][]);\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 10)\n" +
		"	data = resize(data, new Object[maxChunkNo][]);\n" +
		"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from Object[][] to T[][]\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98500
public void test0726() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	\n" +
			"	void foo() {\n" +
			"		\n" +
			"		Controller<?> ctrl = null;\n" +
			"		foobar(ctrl.getView().getContent()); \n" +
			"	} \n" +
			"	\n" +
			"	static void foobar(X x) {\n" +
			"	}\n" +
			"}\n" +
			"interface Controller<T extends View<?>> {\n" +
			"    public T getView() ;\n" +
			"}\n" +
			"interface View<U extends X> {\n" +
			"	public U getContent();\n" +
			"}\n"
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98500 - variation
public void test0727() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<E> {\n" +
			"	\n" +
			"	void foo() {\n" +
			"		\n" +
			"		Controller<?> ctrl = null;\n" +
			"		foobar(ctrl.getView().getContent()); \n" +
			"	} \n" +
			"	\n" +
			"	static void foobar(X<String> x) {\n" +
			"	}\n" +
			"}\n" +
			"interface Controller<T extends View<?>> {\n" +
			"    public T getView() ;\n" +
			"}\n" +
			"interface View<U extends X<String>> {\n" +
			"	public U getContent();\n" +
			"}\n"
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98500 - variation
public void test0728() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<E> {\n" +
			"	\n" +
			"	public static void main(String[] args) {\n" +
			"		\n" +
			"		Controller<?> ctrl = null;\n" +
			"		foobar(ctrl.getView().getContent()); \n" +
			"	} \n" +
			"	\n" +
			"	static void foobar(X<String> x) {\n" +
			"	}\n" +
			"}\n" +
			"interface Controller<T extends View<?>> {\n" +
			"    public T getView() ;\n" +
			"}\n" +
			"interface View<U extends X<U>> {\n" +
			"	public U getContent();\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 6)\n" + 
		"	foobar(ctrl.getView().getContent()); \n" + 
		"	^^^^^^\n" + 
		"The method foobar(X<String>) in the type X<E> is not applicable for the arguments (capture#2-of ?)\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=96586
public void test0729() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X implements I<Y> {}\n" +
			"interface I<T> {}\n" +
			"class Y extends X implements I<Y> {}\n"
		},
		"");
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X implements I<Y> {}\n" +
			"interface I<T extends I<? super T>> {}\n" +
			"class Y extends X implements I<X> {}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	class Y extends X implements I<X> {}\n" +
		"	      ^\n" +
		"The interface I cannot be implemented more than once with different arguments: I<Y> and I<X>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 3)\n" +
		"	class Y extends X implements I<X> {}\n" +
		"	                               ^\n" +
		"Bound mismatch: The type X is not a valid substitute for the bounded parameter <T extends I<? super T>> of the type I<T>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=90437
public void test0730() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"\n" +
			"    Zork z;\n" +
			"    public interface SuperInterface<A> {\n" +
			"    }\n" +
			"\n" +
			"    public interface SubInterface extends SuperInterface<String> {\n" +
			"        public String getString();\n" +
			"    }\n" +
			"\n" +
			"    private SuperInterface< ? extends SuperInterface> x = null;\n" +
			"\n" +
			"    public void f() {\n" +
			"        ((SubInterface) this.x).getString();\n" +
			"    }\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 11)\n" +
		"	private SuperInterface< ? extends SuperInterface> x = null;\n" +
		"	                                  ^^^^^^^^^^^^^^\n" +
		"X.SuperInterface is a raw type. References to generic type X.SuperInterface<A> should be parameterized\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 14)\n" +
		"	((SubInterface) this.x).getString();\n" +
		"	^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from X.SuperInterface<capture#1-of ? extends X.SuperInterface> to X.SubInterface\n" +
		"----------\n"	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=97440
public void test0731() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<E> {\n" +
			"	X<? super E> parent;\n" +
			"	X<? super E> current;\n" +
			"\n" +
			"	X<? extends E> parent2;\n" +
			"	X<? extends E> current2;\n" +
			"\n" +
			"	void foo() {\n" +
			"		current = current.parent;\n" +
			"	}\n" +
			"\n" +
			"	void bar() {\n" +
			"		current2 = current2.parent2;\n" +
			"	}\n" +
			"}\n"
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98331
public void test0732() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface B<T> {}\n" +
			"interface C extends B<String>{}\n" +
			"interface D extends B<Integer>{}\n" +
			"\n" +
			"public class X {\n" +
			"             public static void main(String[] args) {\n" +
			"                         D d = null;\n" +
			"                         C c = (C)d; // illegal\n" +
			"             }\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 8)\n" +
		"	C c = (C)d; // illegal\n" +
		"	      ^^^^\n" +
		"Cannot cast from D to C\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98331 - variation
public void test0733() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface B<T> {}\n" +
			"interface C extends B<String>{}\n" +
			"interface D<E> extends B<E>{}\n" +
			"\n" +
			"\n" +
			"public class X {\n" +
			"			Object foo(C c) {\n" +
			"					return (D<? extends String>) c;\n" +
			"             }\n" +
			"}\n"
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98331 - variation
public void test0734() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface B<T> {}\n" +
			"interface C extends B<String>{}\n" +
			"interface D<E> extends B<E>{}\n" +
			"\n" +
			"\n" +
			"public class X {\n" +
			"			Object foo(C c, D<? extends String> d) {\n" +
			"					return c != null ? c : d; \n" +
			"             }\n" +
			"}\n"
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98331 - variation
public void test0735() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface B<T> {}\n" +
			"interface C extends B<String>{}\n" +
			"interface D<E> extends B<E>{}\n" +
			"\n" +
			"\n" +
			"public class X {\n" +
			"			Object foo(C c, D<? extends Exception> d) {\n" +
			"					return c != null ? c : d; \n" +
			"             }\n" +
			"}\n"
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98331 - variation
public void test0736() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface B<T> {}\n" +
			"interface C extends B<String>{}\n" +
			"interface D<E> extends B<E>{}\n" +
			"\n" +
			"\n" +
			"public class X {\n" +
			"			void bar(C c) {\n" +
			"					D<? extends Exception> d = (D<? extends Exception>) c;\n" +
			"					foo(d, c);\n" +
			"             }\n" +
			"			<U> void foo(U u1, U u2) {\n" +
			"			}\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 8)\n" +
		"	D<? extends Exception> d = (D<? extends Exception>) c;\n" +
		"	                           ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from C to D<? extends Exception>\n" +
		"----------\n");
}
public void test0737() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"class Sup {\n" +
			"}\n" +
			"\n" +
			"class Sub1 extends Sup {\n" +
			"}\n" +
			"\n" +
			"class Sub2 extends Sup {\n" +
			"\n" +
			"}\n" +
			"abstract class X {\n" +
			"	abstract <S, A extends S, B extends S> S method(A la, B lb);\n" +
			"\n" +
			"	void m2() {\n" +
			"		Sup Sup = method(new Sub1(), new Sub2());// <-- compiles?? ( A=Sub1, B=Sub2, S=Sup)\n" +
			"		Object obj = method(1, \"32\");// <--doesn\'t compile?? ( A=Integer, B=String, S=Object)\n" +
			"	}\n" +
			"}\n",
		},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_7 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98331 - variation
public void test0738() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface B<T> {}\n" +
			"class C implements B<String>{}\n" +
			"interface D extends B<Integer>{}\n" +
			"\n" +
			"public class X {\n" +
			"             public static void main(String[] args) {\n" +
			"                         D d = null;\n" +
			"                         C c = (C)d; // illegal\n" +
			"             }\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 8)\n" +
		"	C c = (C)d; // illegal\n" +
		"	      ^^^^\n" +
		"Cannot cast from D to C\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98331 - variation
public void test0739() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface B<T> {}\n" +
			"interface C extends B<String>{}\n" +
			"class D implements B<Integer>{}\n" +
			"\n" +
			"public class X {\n" +
			"             public static void main(String[] args) {\n" +
			"                         D d = null;\n" +
			"                         C c = (C)d; // illegal\n" +
			"             }\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 8)\n" +
		"	C c = (C)d; // illegal\n" +
		"	      ^^^^\n" +
		"Cannot cast from D to C\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98331 - variation
public void test0740() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface B<T> {}\n" +
			"final class C implements B<String>{}\n" +
			"\n" +
			"public class X {\n" +
			"             public static void main(String[] args) {\n" +
			"                         B<Integer> d = null;\n" +
			"                         C c = (C)d; // illegal\n" +
			"             }\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 7)\n" +
		"	C c = (C)d; // illegal\n" +
		"	      ^^^^\n" +
		"Cannot cast from B<Integer> to C\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98331 - variation
public void test0741() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface B<T> {}\n" +
			"final class D implements B<Integer>{}\n" +
			"\n" +
			"public class X {\n" +
			"             public static void main(String[] args) {\n" +
			"                         D d = null;\n" +
			"                         B<String> c = (B<String>)d; // illegal\n" +
			"             }\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 7)\n" +
		"	B<String> c = (B<String>)d; // illegal\n" +
		"	              ^^^^^^^^^^^^\n" +
		"Cannot cast from D to B<String>\n" +
		"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=98538
// **
// FAIL ERRMSG
public void test0742() {
	if (this.complianceLevel >= ClassFileConstants.JDK1_8)
		return;
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			" public class X {\n" +
			" \n" +
			"	static abstract class SelfType<T extends SelfType<T>>{\n" +
			"	}\n" +
			" \n" +
			"	static class SuperType extends SelfType<SuperType>{\n" +
			"	}\n" +
			" \n" +
			"	static class SubType extends SuperType{}\n" +
			" \n" +
			"	static <T extends SelfType<T>> List<T> makeSingletonList(T t){\n" +
			"		return Collections.singletonList(t);\n" +
			"	}\n" +
			" \n" +
			"	static <T extends SelfType<T>,S extends T> List<T> makeSingletonList2(S s){\n" +
			"		return Collections.singletonList((T)s); // #0\n" +
			"	}\n" +
			" \n" +
			"	public static void main(String[] args){\n" +
			"		makeSingletonList(new SuperType()); // #1 - OK\n" +
			"		List<SuperType> lsup = makeSingletonList(new SuperType()); // #2 - OK\n" +
			"		List<SubType> lsub = makeSingletonList(new SubType()); // #3 - ERROR\n" +
			"		makeSingletonList(new SubType()); // #4 - ERROR\n" +
			" 		makeSingletonList2(new SubType()); // #5 - ERROR\n" +
			"		lsup = makeSingletonList2(new SubType()); // #6 - OK\n" +
			"		lsub = makeSingletonList2(new SubType()); // #7 - ERROR\n" +
			"		makeSingletonList2(new SuperType()); // #8 - OK\n" +
			"		lsup = makeSingletonList2(new SuperType()); // #9 - OK\n" +
			"	}\n" +
			"}\n"
		},
		(this.complianceLevel < ClassFileConstants.JDK1_8 ?
		"----------\n" +
		"1. ERROR in X.java (at line 24)\n" +
		"	List<SubType> lsub = makeSingletonList(new SubType()); // #3 - ERROR\n" +
		"	                     ^^^^^^^^^^^^^^^^^\n" +
		"Bound mismatch: The generic method makeSingletonList(T) of type X is not applicable for the arguments (X.SubType). The inferred type X.SubType is not a valid substitute for the bounded parameter <T extends X.SelfType<T>>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 25)\n" +
		"	makeSingletonList(new SubType()); // #4 - ERROR\n" +
		"	^^^^^^^^^^^^^^^^^\n" +
		"Bound mismatch: The generic method makeSingletonList(T) of type X is not applicable for the arguments (X.SubType). The inferred type X.SubType is not a valid substitute for the bounded parameter <T extends X.SelfType<T>>\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 26)\n" +
		"	makeSingletonList2(new SubType()); // #5 - ERROR\n" +
		"	^^^^^^^^^^^^^^^^^^\n" +
		"Bound mismatch: The generic method makeSingletonList2(S) of type X is not applicable for the arguments (X.SubType). The inferred type X.SubType is not a valid substitute for the bounded parameter <T extends X.SelfType<T>>\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 28)\n" +
		"	lsub = makeSingletonList2(new SubType()); // #7 - ERROR\n" +
		"	       ^^^^^^^^^^^^^^^^^^\n" +
		"Bound mismatch: The generic method makeSingletonList2(S) of type X is not applicable for the arguments (X.SubType). The inferred type X.SubType is not a valid substitute for the bounded parameter <T extends X.SelfType<T>>\n" +
		"----------\n"
		: // ----- JDK1_8 + -----: #4 & #5 infer as argument type: SuperType.
		"----------\n" +
		"1. ERROR in X.java (at line 24)\n" +
		"	List<SubType> lsub = makeSingletonList(new SubType()); // #3 - ERROR\n" +
		"	                     ^^^^^^^^^^^^^^^^^\n" +
		"Bound mismatch: The generic method makeSingletonList(T) of type X is not applicable for the arguments (X.SubType). The inferred type X.SubType is not a valid substitute for the bounded parameter <T extends X.SelfType<T>>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 28)\n" +
		"	lsub = makeSingletonList2(new SubType()); // #7 - ERROR\n" +
		"	       ^^^^^^^^^^^^^^^^^^\n" +
		"Bound mismatch: The generic method makeSingletonList2(S) of type X is not applicable for the arguments (X.SubType). The inferred type X.SubType is not a valid substitute for the bounded parameter <T extends X.SelfType<T>>\n" +
		"----------\n"));
}

//https://bugs.eclipse.org/bugs/show_bug.cgi?id=99553
public void test0743() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface TestGeneric2<A> {\n" +
			"	Nested<A> getNested2(); // super\n" +
			"\n" +
			"	class Nested<B> implements TestGeneric2<B> {\n" +
			"		public Nested<B> getNested2() { // sub\n" +
			"			return this;//2\n" +
			"		}\n" +
			"	}\n" +
			"}\n" +
			" \n" +
			"class TestGeneric3<A> {\n" +
			"	Nested<A> getNested3() { return null; } // super\n" +
			"\n" +
			"	class Nested<B> extends TestGeneric3<B> {\n" +
			"		@Override public Nested<B> getNested3() { // sub\n" +
			"			return this;//3\n" +
			"		}\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 16)\n" +
		"	return this;//3\n" +
		"	       ^^^^\n" +
		"Type mismatch: cannot convert from TestGeneric3<A>.Nested<B> to TestGeneric3<B>.Nested<B>\n" +
		"----------\n");
}
public void test0744() {
	this.runNegativeTest(
		new String[] {
			"java/util/X.java",
			"package java.util;\n" +
			"\n" +
			"import java.io.*;\n" +
			"\n" +
			"class Super<U, V> {\n" +
			"	static class Entry<U,V> {\n" +
			"		Entry(int i, U u, V v, Entry<U,V> entry) {}\n" +
			"		void recordAccess(Super<U,V> s) {\n" +
			"		}\n" +
			"	}\n" +
			"}\n"+
			"public abstract class X<K1, V1> extends Super<K1, V1> {\n" +
			"\n" +
			"	Entry<K1, V1> h;\n" +
			"\n" +
			"	private static class Entry<K2, V2> extends Super.Entry<K2, V2> {\n" +
			"\n" +
			"		Entry() {\n" +
			"			super(0, null, null, null);\n" +
			"		}\n" +
			"\n" +
			"		void ab(Entry<K2, V2> e) {\n" +
			"		}\n" +
			"\n" +
			"		@Override void recordAccess(Super<K2, V2> m) {\n" +
			"			X<K2, V2> x = (X<K2, V2>) m;\n" +
			"			ab(x.h);\n" +
			"		}\n" +
			"	}\n" +
			"  Zork z;\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in java\\util\\X.java (at line 30)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=99922
public void test0745() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	void test() {\n" +
			"		java.util.Arrays.asList(3, 3.1);\n" +
			"	}\n" +
			"}\n"
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=99922 - variation
public void test0746() {
	Map options = getCompilerOptions();
	options.put(JavaCore.COMPILER_PB_UNCHECKED_TYPE_OPERATION, JavaCore.IGNORE);
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	void test() {\n" +
			"		String s = java.util.Arrays.asList(3, 3.1);\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	String s = java.util.Arrays.asList(3, 3.1);\n" +
		"	           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from List<"+intersection("Number","Comparable<?>")+"> to String\n" +
		"----------\n",
		null,
		true,
		options);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=99983
public void test0747() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" +
			"  interface I {}\n" +
			"  class Y<U extends T & I> {\n" +
			"  }\n" +
			"}",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	class Y<U extends T & I> {\n" +
		"	                      ^\n" +
		"Cannot specify any additional bound X.I when first bound is a type parameter\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=100007
public void test0748() {
	// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6182950
	String expectedCompilerLog = (this.complianceLevel == ClassFileConstants.JDK1_6)?
			"----------\n" + 
			"1. WARNING in X.java (at line 5)\n" + 
			"	public byte[] create(Class<byte[]> cl) { return null; }\n" + 
			"	              ^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Name clash: The method create(Class<byte[]>) of type X has the same erasure as create(Class<U>) of type Factory<T> but does not override it\n" + 
			"----------\n":
				"----------\n" + 
				"1. ERROR in X.java (at line 5)\n" + 
				"	public byte[] create(Class<byte[]> cl) { return null; }\n" + 
				"	              ^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Name clash: The method create(Class<byte[]>) of type X has the same erasure as create(Class<U>) of type Factory<T> but does not override it\n" + 
				"----------\n";
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface Factory<T> {\n" +
			"	<U extends T> U create(Class<U> cl);\n" +
			"}\n" +
			"abstract class X implements Factory<byte[]> {\n" +
			"	public byte[] create(Class<byte[]> cl) { return null; }\n" +
			"}\n",
		},
		expectedCompilerLog
	);
// javac 7 reports the name clash when X subclasses another class or is a concrete type
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=100149
public void test0749() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.List;\n" +
			"\n" +
			"public class X<T extends X<?>> {\n" +
			"	T get() { return null; }\n" +
			"	void foo(X x) {\n" +
			"		String s = x.get();\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 5)\n" +
		"	void foo(X x) {\n" +
		"	         ^\n" +
		"X is a raw type. References to generic type X<T> should be parameterized\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 6)\n" +
		"	String s = x.get();\n" +
		"	           ^^^^^^^\n" +
		"Type mismatch: cannot convert from X to String\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=100149 - variation
public void test0750() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.List;\n" +
			"\n" +
			"public class X<T extends List<String>> {\n" +
			"	T get() { return null; }\n" +
			"	void foo(X x) {\n" +
			"		List<Object> l = x.get();\n" +
			"	}\n" +
			"  Zork z ;\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 5)\n" +
		"	void foo(X x) {\n" +
		"	         ^\n" +
		"X is a raw type. References to generic type X<T> should be parameterized\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 6)\n" +
		"	List<Object> l = x.get();\n" +
		"	                 ^^^^^^^\n" +
		"Type safety: The expression of type List needs unchecked conversion to conform to List<Object>\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 8)\n" +
		"	Zork z ;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=100153
public void test0751() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T extends X<T>> {\n" +
			"	\n" +
			"	void foo(X<? extends T> x) {\n" +
			"		X<T> x2 = x;\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	X<T> x2 = x;\n" +
		"	          ^\n" +
		"Type mismatch: cannot convert from X<capture#1-of ? extends T> to X<T>\n" +
		"----------\n");
}
public void test0752() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.io.Serializable;\n" +
			"\n" +
			"public class X<E extends Serializable> {\n" +
			"	X<? extends I<E>> parent;\n" +
			"	X<? extends I<E>> current;\n" +
			"	void foo() {\n" +
			"		current = current.parent;\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"interface I<T> {\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 7)\n" +
		"	current = current.parent;\n" +
		"	          ^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from X<capture#3-of ? extends I<capture#2-of ? extends I<E>>> to X<? extends I<E>>\n" +
		"----------\n");
}
public void test0753() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.io.Serializable;\n" +
			"\n" +
			"public class X<E extends Serializable> {\n" +
			"	X<? super I<E>> parent;\n" +
			"	X<? super I<E>> current;\n" +
			"	void foo() {\n" +
			"		current = current.parent;\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"interface I<T> {\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	X<? super I<E>> parent;\n" +
		"	  ^^^^^^^^^\n" +
		"Bound mismatch: The type ? super I<E> is not a valid substitute for the bounded parameter <E extends Serializable> of the type X<E>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 5)\n" +
		"	X<? super I<E>> current;\n" +
		"	  ^^^^^^^^^\n" +
		"Bound mismatch: The type ? super I<E> is not a valid substitute for the bounded parameter <E extends Serializable> of the type X<E>\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 7)\n" +
		"	current = current.parent;\n" +
		"	          ^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from X<capture#3-of ? super I<capture#2-of ? super I<E>>> to X<? super I<E>>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=99578
public void test0754() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"class bugSuper<T extends Object> {\n" +
			"	public T getData(){\n" +
			"		return null;\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"class bugElement {\n" +
			"}\n" +
			"\n" +
			"class bugClass<T extends bugElement> extends bugSuper<T>{\n" +
			"}\n" +
			"\n" +
			"public class X{\n" +
			"	public void method(bugClass bc){\n" +
			"		bugElement be = bc.getData();   //<< here\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 14)\n" +
		"	public void method(bugClass bc){\n" +
		"	                   ^^^^^^^^\n" +
		"bugClass is a raw type. References to generic type bugClass<T> should be parameterized\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 15)\n" +
		"	bugElement be = bc.getData();   //<< here\n" +
		"	                ^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from Object to bugElement\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=99999
public void test0755() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" +
			"  public static class B {}\n" +
			"  public static void main (String... args) {\n" +
			"    X<?>.B[] b = new X<?>.B[1];\n" +
			"  }\n" +
			"}",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	X<?>.B[] b = new X<?>.B[1];\n" +
		"	^^^^^^\n" +
		"The member type X.B cannot be qualified with a parameterized type, since it is static. Remove arguments from qualifying type X<?>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 4)\n" +
		"	X<?>.B[] b = new X<?>.B[1];\n" +
		"	                 ^^^^^^\n" +
		"The member type X.B cannot be qualified with a parameterized type, since it is static. Remove arguments from qualifying type X<?>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=99999 - variation
public void test0756() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"public class X<T> {\n" +
			"  public class B {}\n" +
			"  public static void main (String... args) {\n" +
			"    X<?>.B[] b = new X<?>.B[1];\n" +
			"  }\n" +
			"}",
		},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_7 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=100147
public void test0757() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<K, V> {\n" +
			"	static class EntryMap<K, V> {\n" +
			"		class Entry {\n" +
			"		}\n" +
			"	}\n" +
			"\n" +
			"	EntryMap.Entry internalGet(Object key) {\n" +
			"		return null;\n" +
			"	}\n" +
			"	\n" +
			"	void foo(Object key) {\n" +
			"		EntryMap<K,V>.Entry entry = internalGet(key);\n" +
			"	}\n" +
			"  Zork z;\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 7)\n" +
		"	EntryMap.Entry internalGet(Object key) {\n" +
		"	^^^^^^^^^^^^^^\n" +
		"X.EntryMap.Entry is a raw type. References to generic type X.EntryMap<K,V>.Entry should be parameterized\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 12)\n" +
		"	EntryMap<K,V>.Entry entry = internalGet(key);\n" +
		"	                            ^^^^^^^^^^^^^^^^\n" +
		"Type safety: The expression of type X.EntryMap.Entry needs unchecked conversion to conform to X.EntryMap<K,V>.Entry\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 14)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=100147 - variation
public void test0758() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<K, V> {\n" +
			"	static class EntryMap<K, V> {\n" +
			"		class Entry {\n" +
			"		}\n" +
			"	}\n" +
			"\n" +
			"	EntryMap.Entry internalGet(Object key) {\n" +
			"		return null;\n" +
			"	}\n" +
			"	\n" +
			"	void foo(Object key) {\n" +
			"		EntryMap<K,V>.Entry entry = (EntryMap.Entry) internalGet(key);\n" +
			"	}\n" +
			"  Zork z;\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 7)\n" +
		"	EntryMap.Entry internalGet(Object key) {\n" +
		"	^^^^^^^^^^^^^^\n" +
		"X.EntryMap.Entry is a raw type. References to generic type X.EntryMap<K,V>.Entry should be parameterized\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 12)\n" +
		"	EntryMap<K,V>.Entry entry = (EntryMap.Entry) internalGet(key);\n" +
		"	                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Unnecessary cast from X.EntryMap.Entry to X.EntryMap.Entry\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 12)\n" +
		"	EntryMap<K,V>.Entry entry = (EntryMap.Entry) internalGet(key);\n" +
		"	                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: The expression of type X.EntryMap.Entry needs unchecked conversion to conform to X.EntryMap<K,V>.Entry\n" +
		"----------\n" +
		"4. WARNING in X.java (at line 12)\n" +
		"	EntryMap<K,V>.Entry entry = (EntryMap.Entry) internalGet(key);\n" +
		"	                             ^^^^^^^^^^^^^^\n" +
		"X.EntryMap.Entry is a raw type. References to generic type X.EntryMap<K,V>.Entry should be parameterized\n" +
		"----------\n" +
		"5. ERROR in X.java (at line 14)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=100128
public void test0759() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<E>\n" +
			"{\n" +
			"  E[] m;\n" +
			"  public X()\n" +
			"  {\n" +
			"	X<? extends E> x = null;\n" +
			"	System.out.println(x.m.length);\n" +
			"  }\n" +
			"}\n",
		},
		"");
}
public void test0760() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			"public class X<U> {\n" +
			"	public static <T> X<T> make() {\n" +
			"		return null;\n" +
			"	}\n" +
			"	public static <T> T itself(T t) {\n" +
			"		return t;\n" +
			"	}\n" +
			"\n" +
			"	void foo() {\n" +
			"		X<Integer> x1 = make();\n" +
			"		X<Integer> x2 = itself(x1);\n" +
			"	}\n" +
			"	void bar() {\n" +
			"		X<Integer> x2 = itself(make());\n" +
			"	}\n" +
			"	void baz() {\n" +
			"		X<Integer> x2 = itself((X<Integer>)make());\n" +
			"	}	\n" +
			"} \n",
		},
		(this.complianceLevel < ClassFileConstants.JDK1_8 ?
		"----------\n" +
		"1. ERROR in X.java (at line 16)\n" +
		"	X<Integer> x2 = itself(make());\n" +
		"	                ^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from X<Object> to X<Integer>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 19)\n" +
		"	X<Integer> x2 = itself((X<Integer>)make());\n" +
		"	                       ^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from X<Object> to X<Integer>\n" +
		"----------\n"
		:
		"----------\n" +
		"1. ERROR in X.java (at line 19)\n" +
		"	X<Integer> x2 = itself((X<Integer>)make());\n" +
		"	                       ^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from X<Object> to X<Integer>\n" +
		"----------\n"			
		));
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=100421
public void test0761() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"\n" +
			"  public abstract class ClassA<A, B> {\n" +
			"    public abstract B method(A param);\n" +
			"  }\n" +
			"\n" +
			"  public class ClassB<C, D extends C> {\n" +
			"    // the following field declaration causes an error\n" +
			"    ClassA<? super C, ? extends D> classA;\n" +
			"\n" +
			"    public D method(D d) {\n" +
			"      return classA.method(d);\n" +
			"    }\n" +
			"  }\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=100421 - variation
public void test0762() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"\n" +
			"  public abstract class ClassA<A, B extends Number> {\n" +
			"    public abstract B method(A param);\n" +
			"  }\n" +
			"\n" +
			"  public class ClassB<C extends Number, D extends C> {\n" +
			"    // the following field declaration causes an error\n" +
			"    ClassA<? super C, ? extends D> classA;\n" +
			"\n" +
			"    public D method(D d) {\n" +
			"      return classA.method(d);\n" +
			"    }\n" +
			"  }\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=100519
public void test0763() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<E> {\n" +
			"	public static class InnerClass {\n" +
			"		public InnerClass() {\n" +
			"			System.out.println(\"class : \" + InnerClass.this);\n" +
			"		}\n" +
			"	}\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=100527
public void test0764() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			" \n" +
			"interface IIfClosure {}\n" +
			" \n" +
			"public class X {\n" +
			"    public X(String label, HashMap<String,Object> bindings) {\n" +
			"        this(label, bindings, (List<IIfClosure>)Collections.emptyList());\n" +
			"    }\n" +
			"    \n" +
			"    public X(String label, HashMap<String,Object> bindings, Collection<IIfClosure> coll) {\n" +
			"    }\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 7)\n" +
		"	this(label, bindings, (List<IIfClosure>)Collections.emptyList());\n" +
		"	                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from List<Object> to List<IIfClosure>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=98379
public void test0765() {
	this.runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"public class X {\n" +
			"    static <T extends X> T f1() throws Exception{\n" +
			"    	return null;\n" +
			"    }\n" +
			"    static <U extends X> U f2() throws Exception {\n" +
			"        return f1();\n" +
			"    }\n" +
			"}\n",
		},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBug6302954 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=99453
public void test0766() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			"interface Cloneable<T extends Cloneable<T>> {\n" +
			"	public T clone();\n" +
			"}\n" +
			"\n" +
			"interface CloneableMap<K, V extends Cloneable<V>> extends Map<K, V>, Cloneable<CloneableMap<K, V>> {\n" +
			"}\n" +
			"\n" +
			"interface C<T extends C<T>> extends Cloneable<T> {\n" +
			"}\n" +
			"public class X {\n" +
			"	void foo() {\n" +
			"		CloneableMap<String, C<?>> map = null;\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 14)\n" +
		"	CloneableMap<String, C<?>> map = null;\n" +
		"	                     ^\n" +
		"Bound mismatch: The type C<?> is not a valid substitute for the bounded parameter <V extends Cloneable<V>> of the type CloneableMap<K,V>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=99453 - variation
public void test0767() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			"interface Cloneable<T extends Cloneable<T>> {\n" +
			"	public T clone();\n" +
			"}\n" +
			"\n" +
			"interface CloneableMap<K, V extends Cloneable<V>> extends Map<K, V>, Cloneable<CloneableMap<K, V>> {\n" +
			"}\n" +
			"\n" +
			"interface C extends Cloneable<C> {\n" +
			"}\n" +
			"public class X {\n" +
			"	void foo() {\n" +
			"		CloneableMap<String, C> map = null;\n" +
			"	}\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=100619
public void test0768() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	<T extends Runnable, U extends Runnable & T>  T foo1() { return null; }\n" +
			"	<T extends Y<Object>, U extends Z & T>  T foo2() { return null; }\n" +
			"	<T extends Y<Object>, U extends T & Z>  T foo3() { return null; }\n" +
			"	<T extends Y<Object>, U extends W & Z>  T foo4() { return null; }\n" +
			"}\n" +
			"\n" +
			"interface Y<T> {\n" +
			"}\n" +
			"\n" +
			"interface Z extends Y<String> {}\n" +
			"interface W extends Y<Object> {}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 2)\n" +
		"	<T extends Runnable, U extends Runnable & T>  T foo1() { return null; }\n" +
		"	                                          ^\n" +
		"The type T is not an interface; it cannot be specified as a bounded parameter\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 3)\n" +
		"	<T extends Y<Object>, U extends Z & T>  T foo2() { return null; }\n" +
		"	                                    ^\n" +
		"The type T is not an interface; it cannot be specified as a bounded parameter\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 4)\n" +
		"	<T extends Y<Object>, U extends T & Z>  T foo3() { return null; }\n" +
		"	                                    ^\n" +
		"Cannot specify any additional bound Z when first bound is a type parameter\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 4)\n" +
		"	<T extends Y<Object>, U extends T & Z>  T foo3() { return null; }\n" +
		"	                                    ^\n" +
		"The interface Y cannot be implemented more than once with different arguments: Y<String> and Y<Object>\n" +
		"----------\n" +
		"5. ERROR in X.java (at line 5)\n" +
		"	<T extends Y<Object>, U extends W & Z>  T foo4() { return null; }\n" +
		"	                                    ^\n" +
		"The interface Y cannot be implemented more than once with different arguments: Y<String> and Y<Object>\n" +
		"----------\n");
}
public void test0769() {
	this.runConformTest(
		new String[] {
			"X.java",
			"class XSuper<T> {\n" +
			"	T value;\n" +
			"}\n" +
			"public class X extends XSuper<String>{\n" +
			"	public void a() {\n" +
			"		value += 1;\n" +
			"		value = value + 1;\n" +
			"		System.out.println(value);\n" +
			"	}\n" +
			"\n" +
			"	public static void main(final String[] args) {\n" +
			"		X x = new X();\n" +
			"		x.value = \"[\";\n" +
			"		x.a();\n" +
			"	}\n" +
			"}\n",
		},
		"[11");
}
public void test0770() {
	this.runConformTest(
		new String[] {
			"X.java",
			"class XSuper<T> {\n" +
			"	T value;\n" +
			"}\n" +
			"public class X extends XSuper<String>{\n" +
			"	public void a() {\n" +
			"		this.value += 1;\n" +
			"		this.value = this.value + 1;\n" +
			"		System.out.println(this.value);\n" +
			"	}\n" +
			"\n" +
			"	public static void main(final String[] args) {\n" +
			"		X x = new X();\n" +
			"		x.value = \"[\";\n" +
			"		x.a();\n" +
			"	}\n" +
			"}\n",
		},
		"[11");
}
public void test0771() {
	this.runConformTest(
		new String[] {
			"X.java",
			"class XSuper<T> {\n" +
			"	T value;\n" +
			"}\n" +
			"public class X extends XSuper<String>{\n" +
			"	public static void a(X x) {\n" +
			"		x.value += 1;\n" +
			"		x.value = x.value + 1;\n" +
			"		System.out.println(x.value);\n" +
			"	}\n" +
			"\n" +
			"	public static void main(final String[] args) {\n" +
			"		X x = new X();\n" +
			"		x.value = \"[\";\n" +
			"		a(x);\n" +
			"	}\n" +
			"}\n",
		},
		"[11");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=101794
public void test0772() throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface Foo<T> {\n" +
			"  public T getIt();\n" +
			"}\n" +
			"\n" +
			"class FooImpl implements Foo {\n" +
			"  public String getIt() {\n" +
			"    return null;\n" +
			"  }\n" +
			"}\n" +
			"public class X {\n" +
			"  public void doIt() {\n" +
			"    Object s = new FooImpl().getIt();\n" +
			"  }\n" +
			"}\n",
		},
		"");
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"  public void doIt() {\n" +
			"    Object s = new FooImpl().getIt();\n" +
			"  }\n" +
			"}\n",
		},
		"",
		null,
		false,
		null);
		String expectedOutput =
			"  // Method descriptor #18 ()Ljava/lang/Object;\n" +
			"  // Stack: 1, Locals: 1\n" +
			"  public bridge synthetic java.lang.Object getIt();\n" +
			"    0  aload_0 [this]\n" +
			"    1  invokevirtual FooImpl.getIt() : java.lang.String [19]\n" +
			"    4  areturn\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 1]\n";

		File f = new File(OUTPUT_DIR + File.separator + "FooImpl.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=101794 - variation
public void test0773() throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface Foo<T extends Exception> {\n" +
			"  public T getIt() throws T;\n" +
			"}\n" +
			"\n" +
			"class FooImpl implements Foo {\n" +
			"  public NullPointerException getIt() {\n" +
			"    return null;\n" +
			"  }\n" +
			"}\n" +
			"public class X {\n" +
			"  public void doIt() {\n" +
			"    Object s = new FooImpl().getIt();\n" +
			"  }\n" +
			"}\n",
		},
		"");
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"  public void doIt() {\n" +
			"    Object s = new FooImpl().getIt();\n" +
			"  }\n" +
			"}\n",
		},
		"",
		null,
		false,
		null);
		String expectedOutput =
			"  // Method descriptor #18 ()Ljava/lang/Exception;\n" +
			"  // Stack: 1, Locals: 1\n" +
			"  public bridge synthetic java.lang.Exception getIt() throws java.lang.Exception;\n" +
			"    0  aload_0 [this]\n" +
			"    1  invokevirtual FooImpl.getIt() : java.lang.NullPointerException [22]\n" +
			"    4  areturn\n" +
			"      Line numbers:\n" +
			"        [pc: 0, line: 1]\n";

		File f = new File(OUTPUT_DIR + File.separator + "FooImpl.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=98532
public void test0774() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" +
			"	static class StaticInnerNoParam {\n" +
			"		T x;\n" +
			"	}\n" +
			"	class NonStaticInnerParam<T> {}	\n" +
			"	static class StaticInnerParam<T> {	}\n" +
			"	<T> void foo(T t) {}\n" +
			"	static <T> void bar(T t) {}\n" +
			"	<T> X(T t) {}\n" +
			"	\n" +
			"	class U {}\n" +
			"	<U> void foo2(U t) {}\n" +
			"	static <U> void bar2(U t) {}\n" +
			"	class NonStaticInnerParam2<U> {}	\n" +
			"	static class StaticInnerParam2<U> {}	\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	T x;\n" +
		"	^\n" +
		"Cannot make a static reference to the non-static type T\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 5)\n" +
		"	class NonStaticInnerParam<T> {}	\n" +
		"	                          ^\n" +
		"The type parameter T is hiding the type T\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 7)\n" +
		"	<T> void foo(T t) {}\n" +
		"	 ^\n" +
		"The type parameter T is hiding the type T\n" +
		"----------\n" +
		"4. WARNING in X.java (at line 9)\n" +
		"	<T> X(T t) {}\n" +
		"	 ^\n" +
		"The type parameter T is hiding the type T\n" +
		"----------\n" +
		"5. WARNING in X.java (at line 12)\n" +
		"	<U> void foo2(U t) {}\n" +
		"	 ^\n" +
		"The type parameter U is hiding the type X<T>.U\n" +
		"----------\n" +
		"6. WARNING in X.java (at line 13)\n" +
		"	static <U> void bar2(U t) {}\n" +
		"	        ^\n" +
		"The type parameter U is hiding the type X<T>.U\n" +
		"----------\n" +
		"7. WARNING in X.java (at line 14)\n" +
		"	class NonStaticInnerParam2<U> {}	\n" +
		"	                           ^\n" +
		"The type parameter U is hiding the type X<T>.U\n" +
		"----------\n" +
		"8. WARNING in X.java (at line 15)\n" +
		"	static class StaticInnerParam2<U> {}	\n" +
		"	                               ^\n" +
		"The type parameter U is hiding the type X<T>.U\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=100153
public void test0775() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<T extends X<T>> {\n" +
			"	void foo1(X<? extends T> x) {}\n" +
			"	void foo2(X<? super T> x) {}\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=103023
public void test0776() {
	runConformTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			"public class X<T extends Comparable<? super T>> {\n" +
			"\n" +
			"    abstract class Foo<E> implements I<Foo<? extends E>> {}\n" +
			"\n" +
			"    abstract class Bar<E> implements I<Bar<? extends E>> {}\n" +
			"\n" +
			"    public void bar(List<Foo<T>> f, List<Bar<T>> b) {\n" +
			"	foo(f, b);\n" +
			"    }\n" +
			"\n" +
			"    <C> void foo(List<? extends C> f, List<? extends C> b) {\n" +
			"	System.out.println(\"SUCCESS\");\n" +
			"    }\n" +
			"    public static void main(String... args) {\n" +
			"	new X().bar(null, null);\n" +
			"    }\n" +
			"}\n" +
			"interface I<U> {}\n",
		},
		// compiler results
		null /* do not check compiler log */,
		// runtime results
		"SUCCESS" /* expected output string */,
		null /* do not check error string */,
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=103472
public void test0777() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public interface B<T> {\n" +
			"		public T a();\n" +
			"	}\n" +
			"\n" +
			"	public interface C extends B {\n" +
			"	}\n" +
			"\n" +
			"	public class D implements B<Integer> {\n" +
			"		public Integer a() {\n" +
			"			return 0;\n" +
			"		}\n" +
			"	}\n" +
			"\n" +
			"	// Illegal\n" +
			"	public class E implements B<Integer>, C {\n" +
			"		public Integer a() {\n" +
			"			return 0;\n" +
			"		}\n" +
			"	}\n" +
			"\n" +
			"	// why is this allowed?\n" +
			"	public class F extends D implements C {\n" +
			"		public Integer a() {\n" +
			"			return 0;\n" +
			"		}\n" +
			"	}\n" +
			"\n" +
			"	public interface G<T> {\n" +
			"		public void a(T pArg);\n" +
			"	}\n" +
			"\n" +
			"	public interface H extends G {\n" +
			"		public Object b();\n" +
			"	}\n" +
			"\n" +
			"	public class I implements G<Integer> {\n" +
			"		public void a(Integer pInt) {\n" +
			"		}\n" +
			"	}\n" +
			"\n" +
			"	// Illegal. Huh?\n" +
			"	public class J extends I implements G {\n" +
			"		public Integer a() {\n" +
			"			return 0;\n" +
			"		}\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 6)\n" +
		"	public interface C extends B {\n" +
		"	                           ^\n" +
		"X.B is a raw type. References to generic type X.B<T> should be parameterized\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 16)\n" +
		"	public class E implements B<Integer>, C {\n" +
		"	             ^\n" +
		"The interface B cannot be implemented more than once with different arguments: X.B and X.B<Integer>\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 23)\n" +
		"	public class F extends D implements C {\n" +
		"	             ^\n" +
		"The interface B cannot be implemented more than once with different arguments: X.B<Integer> and X.B\n" +
		"----------\n" +
		"4. WARNING in X.java (at line 24)\n" +
		"	public Integer a() {\n" +
		"	               ^^^\n" +
		"The method a() of type X.F should be tagged with @Override since it actually overrides a superclass method\n" +
		"----------\n" +
		"5. WARNING in X.java (at line 33)\n" +
		"	public interface H extends G {\n" +
		"	                           ^\n" +
		"X.G is a raw type. References to generic type X.G<T> should be parameterized\n" +
		"----------\n" +
		"6. ERROR in X.java (at line 43)\n" +
		"	public class J extends I implements G {\n" +
		"	             ^\n" +
		"The interface G cannot be implemented more than once with different arguments: X.G<Integer> and X.G\n" +
		"----------\n" +
		"7. WARNING in X.java (at line 43)\n" +
		"	public class J extends I implements G {\n" +
		"	                                    ^\n" +
		"X.G is a raw type. References to generic type X.G<T> should be parameterized\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=103472 - variation
public void test0778() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	interface B<T> {}\n" +
			"\n" +
			"	interface C extends B {}\n" +
			"\n" +
			"	class D implements B<Integer> {}\n" +
			"\n" +
			"	class F extends D implements C {}\n" +
			"	\n" +
			"	class V<U extends D & C> {}\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 4)\n" +
		"	interface C extends B {}\n" +
		"	                    ^\n" +
		"X.B is a raw type. References to generic type X.B<T> should be parameterized\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 8)\n" +
		"	class F extends D implements C {}\n" +
		"	      ^\n" +
		"The interface B cannot be implemented more than once with different arguments: X.B<Integer> and X.B\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 10)\n" +
		"	class V<U extends D & C> {}\n" +
		"	                      ^\n" +
		"The interface B cannot be implemented more than once with different arguments: X.B and X.B<Integer>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=103227
public void test0779() throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.AbstractList;\n" +
			"import java.util.List;\n" +
			"\n" +
			"public class X {\n" +
			"	private static class Entry {\n" +
			"		public void doIt(final List<? extends String> args) {\n" +
			"			List<String> list = new AbstractList<String>() {\n" +
			"				@Override public int size() { return 0; }\n" +
			"				@Override public String get(int i) { return args.get(i); }\n" +
			"			};\n" +
			"		}\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		new Entry().doIt(null);\n" +
			"		System.out.println(\"SUCCESS\");\n" +
			"	}\n" +
			"}\n",
		},
		"SUCCESS");

	String expectedOutput =
		"  // Method descriptor #31 (I)Ljava/lang/Object;\n" +
		"  // Stack: 2, Locals: 2\n" +
		"  public bridge synthetic java.lang.Object get(int arg0);\n" +
		"    0  aload_0 [this]\n" +
		"    1  iload_1 [arg0]\n" +
		"    2  invokevirtual X$Entry$1.get(int) : java.lang.String [36]\n" +
		"    5  areturn\n" +
		"      Line numbers:\n" +
		"        [pc: 0, line: 1]\n";

	// check no unnecessary checkcast on bridge method for X$1
	File f = new File(OUTPUT_DIR + File.separator + "X$Entry$1.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=103227 - variation
public void test0780() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			"public class X {\n" +
			"	long foo(List<? extends Long> list) {\n" +
			"		return list.get(0);\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		List<Long> list = new ArrayList<Long>();\n" +
			"		list.add(123L);\n" +
			"		System.out.println(new X().foo(list));\n" +
			"	}\n" +
			"}\n",
		},
		"123");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=104109
public void test0781() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"\n" +
			"    public static <E, T extends E & Comparable<? super T>> Foo<E> doIt(T t) {\n" +
			"        return null;\n" +
			"    }\n" +
			"    \n" +
			"    interface Foo<E> {\n" +
			"        boolean ok(E e);\n" +
			"    }\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	public static <E, T extends E & Comparable<? super T>> Foo<E> doIt(T t) {\n" +
		"	                                ^^^^^^^^^^\n" +
		"Cannot specify any additional bound Comparable<? super T> when first bound is a type parameter\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=104082
public void test0782() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.lang.reflect.*;\n" +
			"import java.util.*;\n" +
			"\n" +
			"interface StoredObject {\n" +
			"	String getUid();\n" +
			"	String getName();\n" +
			"	String getDescription();\n" +
			"}\n" +
			"\n" +
			"interface GraphDiagramNode // extends Comparable\n" +
			"{\n" +
			"}\n" +
			"\n" +
			"public class X<ObjectType extends StoredObject, ParentType extends StoredObject> implements GraphDiagramNode {\n" +
			"	private final JccsGraphDiagramModel model;\n" +
			"	private final X<? extends ParentType, ?> parent;\n" +
			"	private final ObjectType object;\n" +
			"\n" +
			"	public class JccsGraphDiagramModel {\n" +
			"	}\n" +
			"\n" +
			"	public interface GraphDiagramModel {\n" +
			"	}\n" +
			"\n" +
			"	public class Dependency {\n" +
			"\n" +
			"	}\n" +
			"\n" +
			"	public X(JccsGraphDiagramModel argModel, X<? extends ParentType, ?> argParent, ObjectType argObject) {\n" +
			"		model = argModel;\n" +
			"		parent = argParent;\n" +
			"		object = argObject;\n" +
			"	}\n" +
			"\n" +
			"	protected <ChildType extends StoredObject> Collection<? extends X<ChildType, ? super ObjectType>> createChildren(\n" +
			"			Iterator<ChildType> argData, Class<? extends X<ChildType, ? super ObjectType>> argChildNodeClass,\n" +
			"			Class<? extends StoredObject> argInterface) {\n" +
			"		Collection<X<ChildType, ? super ObjectType>> output = new LinkedList<X<ChildType, ? super ObjectType>>();\n" +
			"\n" +
			"		try {\n" +
			"			while (argData.hasNext()) {\n" +
			"				ChildType next = argData.next();\n" +
			"				Constructor<? extends X<ChildType, ? super ObjectType>> constructor = argChildNodeClass.getConstructor(\n" +
			"						JccsGraphDiagramModel.class, getClass(), argInterface);\n" +
			"\n" +
			"				output.add(constructor.newInstance(model, this, next));\n" +
			"			}\n" +
			"		} catch (Exception x) {\n" +
			"			x.printStackTrace();\n" +
			"		}\n" +
			"\n" +
			"		return output;\n" +
			"	}\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=104167
public void test0783() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" +
			"  private static class B{\n" +
			"    private int foo; //incorrectly identified as unused\n" +
			"  }\n" +
			"  void bar(B b){\n" +
			"    if (b.foo == 0)\n" +
			"      return;\n" +
			"  }\n" +
			"  Zork z;\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 9)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=104082 - variation
public void test0784() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T, U> {\n" +
			"	X<? extends U, ?> parent;\n" +
			"\n" +
			"	public X(X<? extends U, ?> parent) {\n" +
			"		this.parent = parent;\n" +
			"	}\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=103528
public void test0785() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"public class X {\n" +
			"    <T extends Collection<? extends Number>> T getLonger(T t1, T t2) {\n" +
			"        return t1.size() > t2.size() ? t1 : t2;\n" +
			"    }\n" +
			"    \n" +
			"    void m(HashSet<?> list, ArrayList<?> set) {\n" +
			"        getLonger(list, set);\n" +
			"    }\n" +
			"}\n",
		},
		this.complianceLevel < ClassFileConstants.JDK1_8 ?
		"----------\n" + 
		"1. ERROR in X.java (at line 8)\n" + 
		"	getLonger(list, set);\n" + 
		"	^^^^^^^^^\n" + 
		"Bound mismatch: The generic method getLonger(T, T) of type X is not applicable for the arguments (HashSet<capture#3-of ?>, ArrayList<capture#4-of ?>). The inferred type AbstractCollection<? extends Object>&Cloneable&Serializable is not a valid substitute for the bounded parameter <T extends Collection<? extends Number>>\n" + 
		"----------\n" :
			"----------\n" + 
			"1. ERROR in X.java (at line 8)\n" + 
			"	getLonger(list, set);\n" + 
			"	^^^^^^^^^\n" + 
			"The method getLonger(T, T) in the type X is not applicable for the arguments (HashSet<capture#3-of ?>, ArrayList<capture#4-of ?>)\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=103528 - variation
public void test0786() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"public class X {\n" +
			"    <T extends Collection<? extends Object>> T getLonger(T t1, T t2) {\n" +
			"        return t1.size() > t2.size() ? t1 : t2;\n" +
			"    }\n" +
			"    \n" +
			"    void m(HashSet<?> list, ArrayList<?> set) {\n" +
			"        getLonger(list, set);\n" +
			"    }\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=103528 - variation
public void test0787() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"public class X<U> {\n" +
			"    <T extends Collection<? extends U>> T getLonger(T t1, T t2) {\n" +
			"        return t1.size() > t2.size() ? t1 : t2;\n" +
			"    }\n" +
			"    \n" +
			"    void m(HashSet<?> list, ArrayList<?> set) {\n" +
			"        getLonger(list, set);\n" +
			"    }\n" +
			"}\n",
		},
		this.complianceLevel < ClassFileConstants.JDK1_8 ?
		"----------\n" + 
		"1. ERROR in X.java (at line 8)\n" + 
		"	getLonger(list, set);\n" + 
		"	^^^^^^^^^\n" + 
		"Bound mismatch: The generic method getLonger(T, T) of type X<U> is not applicable for the arguments (HashSet<capture#3-of ?>, ArrayList<capture#4-of ?>). The inferred type AbstractCollection<? extends Object>&Cloneable&Serializable is not a valid substitute for the bounded parameter <T extends Collection<? extends U>>\n" + 
		"----------\n" :
			"----------\n" + 
			"1. ERROR in X.java (at line 8)\n" + 
			"	getLonger(list, set);\n" + 
			"	^^^^^^^^^\n" + 
			"The method getLonger(T, T) in the type X<U> is not applicable for the arguments (HashSet<capture#3-of ?>, ArrayList<capture#4-of ?>)\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=103994
public void test0788() {
	this.runConformTest(
		new String[] {
			"test/A.java",
			"package test;\n" +
			"\n" +
			"public class A<C extends java.nio.channels.Channel>\n" +
			"{\n" +
			"	class B\n" +
			"		extends A<java.nio.channels.SocketChannel>\n" +
			"	{\n" +
			"	}\n" +
			"}\n",
			"java/nio/channels/spi/AbstractSelectableChannel.java",
			"package java.nio.channels.spi;\n" +
			"\n" +
			"public abstract class AbstractSelectableChannel\n" +
			"	extends java.nio.channels.SelectableChannel\n" +
			"{\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=103994 - variation (change ordering of files should have no effect)
public void test0789() {
	this.runConformTest(
		new String[] {
			"java/nio/channels/spi/AbstractSelectableChannel.java",
			"package java.nio.channels.spi;\n" +
			"\n" +
			"public abstract class AbstractSelectableChannel\n" +
			"	extends java.nio.channels.SelectableChannel\n" +
			"{\n" +
			"}\n",
			"test/A.java",
			"package test;\n" +
			"\n" +
			"public class A<C extends java.nio.channels.Channel>\n" +
			"{\n" +
			"	class B\n" +
			"		extends A<java.nio.channels.SocketChannel>\n" +
			"	{\n" +
			"	}\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=103485
public void test0790() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	<T extends Comparable<T>> boolean isGreater(T t1, T t2) {\n" +
			"		return t1.compareTo(t2) > 0 ? true : false; \n" +
			"	}\n" +
			"\n" +
			"	void method1(Integer i, Double d) {\n" +
			"		if (isGreater(i, d)) \n" +
			"			System.out.println(\"GREATER\");\n" +
			"		else\n" +
			"			System.out.println(\"LOWER\");\n" +
			"	}\n" +
			"	void method2(Integer i, Double d) {\n" +
			"		Comparable<? extends Number> c1= i;\n" +
			"		Comparable<? extends Number> c2= d;\n" +
			"		isGreater(c1, c2);\n" +
			"	}	\n" +
			"	void method3(Integer i, Double d) {\n" +
			"		Comparable c1= i;\n" +
			"		Comparable c2= d;\n" +
			"		isGreater(c1, c2);\n" +
			"	}	\n" +
			"	public static void main(String[] args) {\n" +
			"		Integer i = 1;\n" +
			"		Double d = 2.0;\n" +
			"		new X().method1(i, d);\n" +
			"		new X().method2(i, d);\n" +
			"		new X().method3(i, d);\n" +
			"	}\n" +
			"}\n",
		},
		this.complianceLevel < ClassFileConstants.JDK1_8 ?
		"----------\n" +
		"1. ERROR in X.java (at line 7)\n" +
		"	if (isGreater(i, d)) \n" +
		"	    ^^^^^^^^^\n" +
		"Bound mismatch: The generic method isGreater(T, T) of type X is not applicable for the arguments (Integer, Double). The inferred type "+ intersection("Number", "Comparable<?>") +" is not a valid substitute for the bounded parameter <T extends Comparable<T>>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 15)\n" +
		"	isGreater(c1, c2);\n" +
		"	^^^^^^^^^\n" +
		"Bound mismatch: The generic method isGreater(T, T) of type X is not applicable for the arguments (Comparable<capture#1-of ? extends Number>, Comparable<capture#2-of ? extends Number>). The inferred type Comparable<? extends Number> is not a valid substitute for the bounded parameter <T extends Comparable<T>>\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 18)\n" +
		"	Comparable c1= i;\n" +
		"	^^^^^^^^^^\n" +
		"Comparable is a raw type. References to generic type Comparable<T> should be parameterized\n" +
		"----------\n" +
		"4. WARNING in X.java (at line 19)\n" +
		"	Comparable c2= d;\n" +
		"	^^^^^^^^^^\n" +
		"Comparable is a raw type. References to generic type Comparable<T> should be parameterized\n" +
		"----------\n" +
		"5. WARNING in X.java (at line 20)\n" +
		"	isGreater(c1, c2);\n" +
		"	^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked invocation isGreater(Comparable, Comparable) of the generic method isGreater(T, T) of type X\n" +
		"----------\n" :
			"----------\n" + 
			"1. ERROR in X.java (at line 7)\n" + 
			"	if (isGreater(i, d)) \n" + 
			"	    ^^^^^^^^^\n" + 
			"The method isGreater(T, T) in the type X is not applicable for the arguments (Integer, Double)\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 15)\n" + 
			"	isGreater(c1, c2);\n" + 
			"	^^^^^^^^^\n" + 
			"The method isGreater(T, T) in the type X is not applicable for the arguments (Comparable<capture#1-of ? extends Number>, Comparable<capture#2-of ? extends Number>)\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 18)\n" + 
			"	Comparable c1= i;\n" + 
			"	^^^^^^^^^^\n" + 
			"Comparable is a raw type. References to generic type Comparable<T> should be parameterized\n" + 
			"----------\n" + 
			"4. WARNING in X.java (at line 19)\n" + 
			"	Comparable c2= d;\n" + 
			"	^^^^^^^^^^\n" + 
			"Comparable is a raw type. References to generic type Comparable<T> should be parameterized\n" + 
			"----------\n" + 
			"5. WARNING in X.java (at line 20)\n" + 
			"	isGreater(c1, c2);\n" + 
			"	^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation isGreater(Comparable, Comparable) of the generic method isGreater(T, T) of type X\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=104655
public void test0791() {
	runConformTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"X.java",
			"public class X {\n" +
			"  <Sup, E1 extends Sup, E2 extends Sup> Sup method1(boolean b, E1 e1, E2 e2) {\n" +
			"    if (b)\n" +
			"      return e1;\n" +
			"    else\n" +
			"      return e2;\n" +
			"  }\n" +
			"\n" +
			"  <Sup, E1 extends Sup, E2 extends Sup> Sup method2(boolean b, E1 e1, E2 e2) {\n" +
			"    return b ? e1 : e2;\n" +
			"  }\n" +
			"}\n",
		},
		// compiler results
		null /* do not check compiler log */,
		// runtime results
		"" /* expected output string */,
		null /* do not check error string */,
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_7 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=104649
public void test0792() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"public class X<E> {\n" +
			"	void shouldcompile() {\n" +
			"		java.util.Collections.max(null);\n" +
			"	}\n" +
			"}\n",
		},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_7 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=105635
public void test0793() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"class X { \n" +
			"	public java.util.List<Integer> i,j[],k;\n" +
			"	void m() {\n" +
			"		  i[0] = null;\n" +
			"		  j[0] = null;\n" +
			"		  k[0] = null;\n" +
			"	}\n" +
			"}",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	i[0] = null;\n" +
		"	^^^^\n" +
		"The type of the expression must be an array type but it resolved to List<Integer>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 6)\n" +
		"	k[0] = null;\n" +
		"	^^^^\n" +
		"The type of the expression must be an array type but it resolved to List<Integer>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=105635
public void test0794() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.List;\n" +
			"class X { \n" +
			"	public List<Integer> i,j[],k;\n" +
			"	void m() {\n" +
			"		  i[0] = null;\n" +
			"		  j[0] = null;\n" +
			"		  k[0] = null;\n" +
			"	}\n" +
			"}",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	i[0] = null;\n" +
		"	^^^^\n" +
		"The type of the expression must be an array type but it resolved to List<Integer>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 7)\n" +
		"	k[0] = null;\n" +
		"	^^^^\n" +
		"The type of the expression must be an array type but it resolved to List<Integer>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=106297
public void test0795() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<T> { \n" +
			"		 class B {\n" +
			"			 B() {\n" +
			"				 System.out.println(\"SUCCESS\");\n" +
			"			 }\n" +
			"		 }\n" +
			"		 static { \n" +
			"		 		 new X<String>().new B() {};\n" +
			"		 }\n" +
			"		 public static void main(String[] args) {\n" +
			"			\n" +
			"		}\n" +
			"}\n",
		},
		"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=106297 - variation
public void test0796() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T> { \n" +
			"		 class B {\n" +
			"			 B(T t) {\n" +
			"				 System.out.println(\"SUCCESS\");\n" +
			"			 }\n" +
			"		 }\n" +
			"		 static { \n" +
			"		 		 new X<String>().new B(12) {};\n" +
			"		 }\n" +
			"		 public static void main(String[] args) {\n" +
			"			\n" +
			"		}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 8)\n" +
		"	new X<String>().new B(12) {};\n" +
		"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"The constructor X<String>.B(int) is undefined\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=106297 - variation
public void test0797() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<T> { \n" +
			"		 class B {\n" +
			"			 B() {\n" +
			"				 System.out.println(\"SUCCESS\");\n" +
			"			 }\n" +
			"		 }\n" +
			"		 static { \n" +
			"		 		 new X<String>().new B();\n" +
			"		 }\n" +
			"		 public static void main(String[] args) {\n" +
			"			\n" +
			"		}\n" +
			"}\n",
		},
		"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=106284
public void test0798() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.math.BigDecimal;\n" +
			"\n" +
			"public class X\n" +
			"{\n" +
			"    private static <T extends Comparable<? super T>> T max(T... elems)\n" +
			"    {\n" +
			"        T max=null;\n" +
			"        for (T elem : elems)\n" +
			"            if (max == null || max.compareTo(elem) < 0)\n" +
			"                max=elem;\n" +
			"        return max;\n" +
			"    }\n" +
			"\n" +
			"    public static void main(String[] args)\n" +
			"    {\n" +
			"        System.out.println(max(1, 2.0, new BigDecimal(Math.PI)));\n" +
			"    }\n" +
			"}\n",
		},
		this.complianceLevel < ClassFileConstants.JDK1_7 ?
		"----------\n" +
		"1. ERROR in X.java (at line 16)\n" +
		"	System.out.println(max(1, 2.0, new BigDecimal(Math.PI)));\n" +
		"	                   ^^^\n" +
		"Bound mismatch: The generic method max(T...) of type X is not applicable for the arguments (Integer, Double, BigDecimal). The inferred type Number&Comparable<?> is not a valid substitute for the bounded parameter <T extends Comparable<? super T>>\n" +
		"----------\n" : 
			this.complianceLevel < ClassFileConstants.JDK1_8 ? 
			"----------\n" + 
			"1. WARNING in X.java (at line 5)\n" + 
			"	private static <T extends Comparable<? super T>> T max(T... elems)\n" + 
			"	                                                            ^^^^^\n" + 
			"Type safety: Potential heap pollution via varargs parameter elems\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 16)\n" + 
			"	System.out.println(max(1, 2.0, new BigDecimal(Math.PI)));\n" + 
			"	                   ^^^\n" + 
			"Bound mismatch: The generic method max(T...) of type X is not applicable for the arguments (Integer, Double, BigDecimal). The inferred type Number&Comparable<?> is not a valid substitute for the bounded parameter <T extends Comparable<? super T>>\n" + 
			"----------\n" :
				"----------\n" + 
				"1. WARNING in X.java (at line 5)\n" + 
				"	private static <T extends Comparable<? super T>> T max(T... elems)\n" + 
				"	                                                            ^^^^^\n" + 
				"Type safety: Potential heap pollution via varargs parameter elems\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 16)\n" + 
				"	System.out.println(max(1, 2.0, new BigDecimal(Math.PI)));\n" + 
				"	                   ^^^\n" + 
				"The method max(T...) in the type X is not applicable for the arguments (int, double, BigDecimal)\n" + 
				"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=105531
public void test0799() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" +
			"	Y first;\n" +
			"	Y first2;\n" +
			"\n" +
			"	<U> U foo(U u1, U u2) {\n" +
			"		return u1;\n" +
			"	}\n" +
			"	void bar2(Y<? extends T> ref) {\n" +
			"		String s = foo(ref, first);\n" +
			"	}\n" +
			"	\n" +
			"	void foo(Y<? extends T> ref) {\n" +
			"		ref.next = first == null ? ref : first;\n" +
			"		String s = first == null ? ref : first;\n" +
			"		ref.next = first2 == null ? ref : first2;\n" +
			"	}\n" +
			"	Y<? extends T> bar(Y<? extends T> ref) {\n" +
			"		return first == null ? ref : first;\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"class Y<E> {\n" +
			"	Y<E> next;\n" +
			"}\n",
		},
		this.complianceLevel < ClassFileConstants.JDK1_8 ? 
			"----------\n" +
			"1. WARNING in X.java (at line 2)\n" +
			"	Y first;\n" +
			"	^\n" +
			"Y is a raw type. References to generic type Y<E> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 3)\n" +
			"	Y first2;\n" +
			"	^\n" +
			"Y is a raw type. References to generic type Y<E> should be parameterized\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 9)\n" +
			"	String s = foo(ref, first);\n" +
			"	           ^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Y to String\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 13)\n" +
			"	ref.next = first == null ? ref : first;\n" +
			"	           ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The expression of type Y needs unchecked conversion to conform to Y<capture#2-of ? extends T>\n" +
			"----------\n" +
			"5. ERROR in X.java (at line 14)\n" +
			"	String s = first == null ? ref : first;\n" +
			"	           ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Y to String\n" +
			"----------\n" +
			"6. WARNING in X.java (at line 15)\n" +
			"	ref.next = first2 == null ? ref : first2;\n" +
			"	           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The expression of type Y needs unchecked conversion to conform to Y<capture#5-of ? extends T>\n" +
			"----------\n" +
			"7. WARNING in X.java (at line 18)\n" +
			"	return first == null ? ref : first;\n" +
			"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The expression of type Y needs unchecked conversion to conform to Y<? extends T>\n" +
			"----------\n" : 
				"----------\n" + 
				"1. WARNING in X.java (at line 2)\n" + 
				"	Y first;\n" + 
				"	^\n" + 
				"Y is a raw type. References to generic type Y<E> should be parameterized\n" + 
				"----------\n" + 
				"2. WARNING in X.java (at line 3)\n" + 
				"	Y first2;\n" + 
				"	^\n" + 
				"Y is a raw type. References to generic type Y<E> should be parameterized\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 9)\n" + 
				"	String s = foo(ref, first);\n" + 
				"	           ^^^^^^^^^^^^^^^\n" + 
				"Type mismatch: cannot convert from Y to String\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 13)\n" + 
				"	ref.next = first == null ? ref : first;\n" + 
				"	                           ^^^\n" + 
				"Type mismatch: cannot convert from Y<capture#3-of ? extends T> to Y<capture#2-of ? extends T>\n" + 
				"----------\n" + 
				"5. WARNING in X.java (at line 13)\n" + 
				"	ref.next = first == null ? ref : first;\n" + 
				"	                                 ^^^^^\n" + 
				"Type safety: The expression of type Y needs unchecked conversion to conform to Y<capture#2-of ? extends T>\n" + 
				"----------\n" + 
				"6. ERROR in X.java (at line 14)\n" + 
				"	String s = first == null ? ref : first;\n" + 
				"	                           ^^^\n" + 
				"Type mismatch: cannot convert from Y<capture#4-of ? extends T> to String\n" + 
				"----------\n" + 
				"7. ERROR in X.java (at line 14)\n" + 
				"	String s = first == null ? ref : first;\n" + 
				"	                                 ^^^^^\n" + 
				"Type mismatch: cannot convert from Y to String\n" + 
				"----------\n" + 
				"8. ERROR in X.java (at line 15)\n" + 
				"	ref.next = first2 == null ? ref : first2;\n" + 
				"	                            ^^^\n" + 
				"Type mismatch: cannot convert from Y<capture#6-of ? extends T> to Y<capture#5-of ? extends T>\n" + 
				"----------\n" + 
				"9. WARNING in X.java (at line 15)\n" + 
				"	ref.next = first2 == null ? ref : first2;\n" + 
				"	                                  ^^^^^^\n" + 
				"Type safety: The expression of type Y needs unchecked conversion to conform to Y<capture#5-of ? extends T>\n" + 
				"----------\n" + 
				"10. WARNING in X.java (at line 18)\n" + 
				"	return first == null ? ref : first;\n" + 
				"	                             ^^^^^\n" + 
				"Type safety: The expression of type Y needs unchecked conversion to conform to Y<? extends T>\n" + 
				"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=106744
public void test0800() {
	runNegativeTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"import java.lang.reflect.Constructor;\n" +
			"\n" +
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"        final Class<Ann> AnnClass = Ann.class;\n" +
			"	    Constructor[] constrs = X.class.getConstructors();\n" +
			"        for (Constructor constructor  : constrs) {\n" +
			"            final String message = constructor.getAnnotation(AnnClass).message();\n" +
			"            System.out.println(message);\n" +
			"        }\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"@interface Ann {\n" +
			"	String message();\n" +
			"}\n",
		},
		// compiler results
		"----------\n" + /* expected compiler log */
		"1. WARNING in X.java (at line 6)\n" +
		"	Constructor[] constrs = X.class.getConstructors();\n" +
		"	^^^^^^^^^^^\n" +
		"Constructor is a raw type. References to generic type Constructor<T> should be parameterized\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 7)\n" +
		"	for (Constructor constructor  : constrs) {\n" +
		"	     ^^^^^^^^^^^\n" +
		"Constructor is a raw type. References to generic type Constructor<T> should be parameterized\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 8)\n" +
		"	final String message = constructor.getAnnotation(AnnClass).message();\n" +
		"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: The method getAnnotation(Class) belongs to the raw type Constructor. References to generic type Constructor<T> should be parameterized\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 8)\n" +
		"	final String message = constructor.getAnnotation(AnnClass).message();\n" +
		"	                                                           ^^^^^^^\n" +
		"The method message() is undefined for the type Annotation\n" +
		"----------\n",
		// javac options
		JavacTestOptions.JavacHasABug.JavacBug6400189 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=106744 - variation
public void test0801() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		try {\n" +
			"		    X.class.getConstructor(new Class[0]).getAnnotation(Ann.class).message();\n" +
			"		} catch(Exception e) {\n" +
			"		}\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"@interface Ann {\n" +
			"	String message();\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=106744 - variation
public void test0802() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<U> {\n" +
			"    void bar(Y y, X<ZZ> x) {\n" +
			"    	y.foo(x).zz();\n" +
			"    }\n" +
			"}\n" +
			"class Y<V> {\n" +
			"    <T extends Z> T foo(X<T> x) { return null; }\n" +
			"}\n" +
			"\n" +
			"class Z {\n" +
			"}\n" +
			"class ZZ extends Z {\n" +
			"	void zz() {}\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 2)\n" +
		"	void bar(Y y, X<ZZ> x) {\n" +
		"	         ^\n" +
		"Y is a raw type. References to generic type Y<V> should be parameterized\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 3)\n" +
		"	y.foo(x).zz();\n" +
		"	^^^^^^^^\n" +
		"Type safety: The method foo(X) belongs to the raw type Y. References to generic type Y<V> should be parameterized\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 3)\n" +
		"	y.foo(x).zz();\n" +
		"	         ^^\n" +
		"The method zz() is undefined for the type Z\n" +
		"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=101831
public void test0803() {
	this.runNegativeTest(
		false /* skipJavac */,
		this.complianceLevel < ClassFileConstants.JDK1_8 ? null : JavacTestOptions.Excuse.EclipseHasSomeMoreWarnings,
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			"public class X<A> {\n" +
			"  ArrayList<A> list = new ArrayList<A>();\n" +
			"  ArrayList<? super A> superList = new ArrayList<A>();\n" +
			"  ArrayList<? extends A> extendsList = new ArrayList<A>();\n" +
			"\n" +
			"  ArrayList<A> getList() {\n" +
			"    return true ? list : list;\n" +
			"  }\n" +
			"\n" +
			"  ArrayList<? super A> getSuperList() {\n" +
			"    return true ? superList : superList;\n" +
			"  }\n" +
			"\n" +
			"  ArrayList<? extends A> getExtendsList() {\n" +
			"    return true ? extendsList : extendsList;\n" +
			"  }\n" +
			"}\n",
		},
		this.complianceLevel < ClassFileConstants.JDK1_8 ? 
			"----------\n" + 
			"1. WARNING in X.java (at line 9)\n" + 
			"	return true ? list : list;\n" + 
			"	                     ^^^^\n" + 
			"Dead code\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 13)\n" + 
			"	return true ? superList : superList;\n" + 
			"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type mismatch: cannot convert from ArrayList<capture#3-of ? extends Object> to ArrayList<? super A>\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 17)\n" + 
			"	return true ? extendsList : extendsList;\n" + 
			"	                            ^^^^^^^^^^^\n" + 
			"Dead code\n" + 
			"----------\n" : 
				"----------\n" + 
				"1. WARNING in X.java (at line 9)\n" + 
				"	return true ? list : list;\n" + 
				"	                     ^^^^\n" + 
				"Dead code\n" + 
				"----------\n" + 
				"2. WARNING in X.java (at line 13)\n" + 
				"	return true ? superList : superList;\n" + 
				"	                          ^^^^^^^^^\n" + 
				"Dead code\n" + 
				"----------\n" + 
				"3. WARNING in X.java (at line 17)\n" + 
				"	return true ? extendsList : extendsList;\n" + 
				"	                            ^^^^^^^^^^^\n" + 
				"Dead code\n" + 
				"----------\n"
			);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=106865
public void test0804() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"class Y<E> {\n" +
			"	void foo(E e) {\n" +
			"	}\n" +
			"}\n" +
			"public class X {\n" +
			"    void method1(Y<? super Object[]> y, Object[] os) {\n" +
			"        y.foo(os);\n" +
			"    }\n" +
			"    void method2(Y<? super Cloneable> y, Cloneable c) {\n" +
			"        y.foo(c);\n" +
			"    }    \n" +
			"    void method3(Y<? extends Object[]> y, Object[] os) {\n" +
			"        y.foo(os);\n" +
			"    }\n" +
			"    void method4(Y<? extends Cloneable> y, Cloneable c) {\n" +
			"        y.foo(c);\n" +
			"    }    \n" +
			"    \n" +
			"    void bar(Y<Object> y) {\n" +
			"    	method2(y, null);\n" +
			"    }\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 13)\n" +
		"	y.foo(os);\n" +
		"	  ^^^\n" +
		"The method foo(capture#3-of ? extends Object[]) in the type Y<capture#3-of ? extends Object[]> is not applicable for the arguments (Object[])\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 16)\n" +
		"	y.foo(c);\n" +
		"	  ^^^\n" +
		"The method foo(capture#4-of ? extends Cloneable) in the type Y<capture#4-of ? extends Cloneable> is not applicable for the arguments (Cloneable)\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=106936
public void test0805() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			" 	static <T> T foo(T t1, T t2) { return t1; }\n" +
			" 	public static void main(String[] args) {\n" +
			"		Number[] numbers = {}, numbers2, numbers3;\n" +
			"		Float[] floats = {};\n" +
			"		Integer[] integers = {};\n" +
			"\n" +
			"		numbers2 = foo(numbers, floats);\n" +
			" 		numbers3 = numbers != null ? numbers : floats;\n" +
			" 		String s = foo(numbers, floats); 		\n" +
			"\n" +
			" 		numbers2 = foo(integers, floats);\n" +
			" 		numbers3 = integers != null ? integers : floats;\n" +
			" 		String s2 = foo(integers, floats);\n" +
			" 	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 10)\n" +
		"	String s = foo(numbers, floats); 		\n" +
		"	           ^^^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from Number[] to String\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 14)\n" +
		"	String s2 = foo(integers, floats);\n" +
		"	            ^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from "+intersection("Number",
				intersection("Comparable<? extends "+intersection("Number","Comparable<?>")+">")
				)+"[] to String\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=107079
public void test0806() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.ArrayList;\n" +
			"import java.util.List;\n" +
			"\n" +
			"/**\n" +
			" * This class demonstrates a generic program that Eclipse must not compile as it\n" +
			" * can lead to a ClassCastException despite having no explicit type casts.\n" +
			" */\n" +
			"public class X {\n" +
			"	private static class ValueHolder<T> {\n" +
			"		public T value;\n" +
			"	}\n" +
			"\n" +
			"	public static void main(final String[] args) {\n" +
			"		List<ValueHolder<?>> multiList = new ArrayList<ValueHolder<?>>();\n" +
			"\n" +
			"		ValueHolder<Integer> intHolder = new ValueHolder<Integer>();\n" +
			"		intHolder.value = 1;\n" +
			"\n" +
			"		ValueHolder<Double> doubleHolder = new ValueHolder<Double>();\n" +
			"		doubleHolder.value = 1.5;\n" +
			"\n" +
			"		multiList.add(intHolder);\n" +
			"		multiList.add(doubleHolder);\n" +
			"\n" +
			"		// I believe this line is being erroneously treated as a capture\n" +
			"        // conversion under 3.1 JDT.\n" +
			"		// I believe the problem is that ? cannot be captured except in a first\n" +
			"        // level wildcard.\n" +
			"		swapFirstTwoValues(multiList);\n" +
			"\n" +
			"		// this line causes a ClassCastException when checked.\n" +
			"		Integer value = intHolder.value;\n" +
			"		System.out.println(value);\n" +
			"	}\n" +
			"\n" +
			"	private static <T> void swapFirstTwoValues(List<ValueHolder<T>> multiList) {\n" +
			"		ValueHolder<T> intHolder = multiList.get(0);\n" +
			"		ValueHolder<T> doubleHolder = multiList.get(1);\n" +
			"\n" +
			"		intHolder.value = doubleHolder.value;\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 29)\n" +
		"	swapFirstTwoValues(multiList);\n" +
		"	^^^^^^^^^^^^^^^^^^\n" +
		"The method swapFirstTwoValues(List<X.ValueHolder<T>>) in the type X is not applicable for the arguments (List<X.ValueHolder<?>>)\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=107756
public void test0807() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface Prop<BeanT> {\n" +
			"	Unmarshaller.Handler createHandler();\n" +
			"}\n" +
			"\n" +
			"abstract class Unmarshaller {\n" +
			"	public static abstract class Handler {}\n" +
			"}\n" +
			"\n" +
			"public class X {\n" +
			"	void foo(Prop p) {\n" +
			"		Unmarshaller.Handler h = p.createHandler(); \n" +
			"	}\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=107756 - variation
public void test0808() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" +
			"    \n" +
			"    public static void main(String[] args) {\n" +
			"        X x = new X();\n" +
			"        x.ax = new AX<String>();\n" +
			"    }\n" +
			"    \n" +
			"    AX<T> ax;\n" +
			"}\n" +
			"\n" +
			"class AX <P> {\n" +
			"    AX<P> p;\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=106946
public void test0809() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.Iterator;\n" +
			"\n" +
			"class Node {}\n" +
			"interface Set1<N extends Node> extends Iterable<N> {}\n" +
			"interface Set2 extends Iterable<Node> {}\n" +
			"\n" +
			"class SetIterator<N extends Node> implements Iterator<N> {\n" +
			"	public N next() {\n" +
			"		return null;\n" +
			"	}\n" +
			"	public boolean hasNext() {\n" +
			"		return true;\n" +
			"	}\n" +
			"	public void remove() {\n" +
			"	}\n" +
			"}\n" +
			"interface Set3<N extends Node> extends Iterable<N> {\n" +
			"	SetIterator<N> iterator();\n" +
			"}\n" +
			"public class X {\n" +
			"	void f1(Set1 s) {\n" +
			"		Node n_ = s.iterator().next();\n" +
			"		// ^Type mismatch: cannot convert from Object to Node\n" +
			"		// this was unexpected (s can only contain types derivered from Node)\n" +
			"		for (Node n : s) {\n" +
			"			// ^Type mismatch: cannot convert from Object to Node\n" +
			"			// this was unexpected\n" +
			"		}\n" +
			"	}\n" +
			"	void f2(Set2 s) {\n" +
			"		Node n_ = s.iterator().next();\n" +
			"		for (Node n : s) {\n" +
			"		}\n" +
			"	}\n" +
			"	void f3(Set3 s) {\n" +
			"		Node n_ = s.iterator().next();\n" +
			"		// (^ no error here)\n" +
			"		for (Node n : s) {\n" +
			"			// ^Type mismatch: cannot convert from Object to Node\n" +
			"			// this is even stranger as we already know that s.iterator().next()\n" +
			"            // have the right type\n" +
			"		}\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 21)\n" +
		"	void f1(Set1 s) {\n" +
		"	        ^^^^\n" +
		"Set1 is a raw type. References to generic type Set1<N> should be parameterized\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 22)\n" +
		"	Node n_ = s.iterator().next();\n" +
		"	          ^^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from Object to Node\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 25)\n" +
		"	for (Node n : s) {\n" +
		"	              ^\n" +
		"Type mismatch: cannot convert from element type Object to Node\n" +
		"----------\n" +
		"4. WARNING in X.java (at line 35)\n" +
		"	void f3(Set3 s) {\n" +
		"	        ^^^^\n" +
		"Set3 is a raw type. References to generic type Set3<N> should be parameterized\n" +
		"----------\n" +
		"5. ERROR in X.java (at line 38)\n" +
		"	for (Node n : s) {\n" +
		"	              ^\n" +
		"Type mismatch: cannot convert from element type Object to Node\n" +
		"----------\n");
}
public void test0810() {
	runConformTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"X.java",
			"class A<T, U> {\n" +
			"	public String toString() {\n" +
			"		return \"SUCCESS\";\n" +
			"	}\n" +
			"}\n" +
			"public class X {\n" +
			"\n" +
			"	public <K> A<K,K> foo(K type) {\n" +
			"		return new A<K,K>();\n" +
			"	}\n" +
			"\n" +
			"	public static void main(String args[]) {\n" +
			"		X x = new X();\n" +
			"		A<?,?> a = x.foo(null);\n" +
			"		System.out.println(a);\n" +
			"	}\n" +
			"}",
		},
		// compiler results
		null /* do not check compiler log */,
		// runtime results
		"SUCCESS" /* expected output string */,
		"" /* expected error string */,
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=108372
public void test0811() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" +
			"    private T t;\n" +
			"    private X.Inner inner;\n" +
			"    private X.Inner[] inners;\n" +
			"    public X(T t,  X.Inner in, X.Inner[] ins) {\n" +
			"        this.t = t;\n" +
			"        this.inner = in;\n" +
			"        this.inner = new X(null, null, null).new Inner();\n" +
			"        this.inners = ins;\n" +
			"        this.inners = new X.Inner[10];\n" +
			"        //Type mismatch: cannot convert from X.Inner[] to X<T>.Inner[]\n" +
			"    }\n" +
			"    private class Inner {\n" +
			"    }\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=108372 - variation
public void test0812() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" +
			"    private T t;\n" +
			"    private X<?>.Inner inner;\n" +
			"    private X<?>.Inner[] inners;\n" +
			"    public X(T t) {\n" +
			"        this.t = t;\n" +
			"        this.inner = new X.Inner();\n" +
			"        this.inners = new X.Inner[10];\n" +
			"        Zork z;\n" +
			"    }\n" +
			"    private class Inner {\n" +
			"    }\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 7)\n" +
		"	this.inner = new X.Inner();\n" +
		"	                 ^^^^^^^\n" +
		"X.Inner is a raw type. References to generic type X<T>.Inner should be parameterized\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 9)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=108372 - variation
public void test0813() {
	runConformTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"X.java",
			"public class X<T> {\n" +
			"    private T t;\n" +
			"    private X<?>.Inner[] inners;\n" +
			"    public X(T t) {\n" +
			"        this.t = t;\n" +
			"        this.inners = new X<?>.Inner[10];\n" +
			"    }\n" +
			"    private class Inner {\n" +
			"    }\n" +
			"}\n",
		},
		// compiler results
		null /* do not check compiler log */,
		// runtime results
		"" /* expected output string */,
		"" /* expected error string */,
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_7 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=104695
public void test0814() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"public class X<E> {\n" +
			"    void method(Object o) {\n" +
			"        if (o instanceof E[]) { //incorrect: cannot test non-reifiable type\n" +
			"            E[] es = (E[]) o;\n" +
			"        }\n" +
			"        if (o instanceof List<E>[]) { //incorrect too\n" +
			"            List<E>[] es = (List<E>[]) o; \n" +
			"        }\n" +
			"        if (o instanceof List<?>[]) { // unbound is ok\n" +
			"            List<?>[] es = (List<?>[]) o;\n" +
			"        }\n" +
			"    }\n" +
			"    void method(ArrayList<E>[] al) {\n" +
			"        if (al instanceof List<E>[]) { //incorrect too\n" +
			"            List<E>[] es = (List<E>[]) al; \n" +
			"        }        \n" +
			"    }\n" +
			"}\n",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 4)\n" + 
		"	if (o instanceof E[]) { //incorrect: cannot test non-reifiable type\n" + 
		"	    ^^^^^^^^^^^^^^^^\n" + 
		"Cannot perform instanceof check against type parameter E[]. Use its erasure Object[] instead since further generic type information will be erased at runtime\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 5)\n" + 
		"	E[] es = (E[]) o;\n" + 
		"	         ^^^^^^^\n" + 
		"Type safety: Unchecked cast from Object to E[]\n" + 
		"----------\n" + 
		"3. ERROR in X.java (at line 7)\n" + 
		"	if (o instanceof List<E>[]) { //incorrect too\n" + 
		"	    ^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Cannot perform instanceof check against parameterized type List<E>[]. Use the form List<?>[] instead since further generic type information will be erased at runtime\n" + 
		"----------\n" + 
		"4. WARNING in X.java (at line 8)\n" + 
		"	List<E>[] es = (List<E>[]) o; \n" + 
		"	               ^^^^^^^^^^^^^\n" + 
		"Type safety: Unchecked cast from Object to List<E>[]\n" + 
		"----------\n" + 
		"5. ERROR in X.java (at line 15)\n" + 
		"	if (al instanceof List<E>[]) { //incorrect too\n" + 
		"	    ^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Cannot perform instanceof check against parameterized type List<E>[]. Use the form List<?>[] instead since further generic type information will be erased at runtime\n" + 
		"----------\n" + 
		"6. WARNING in X.java (at line 16)\n" + 
		"	List<E>[] es = (List<E>[]) al; \n" + 
		"	               ^^^^^^^^^^^^^^\n" + 
		"Unnecessary cast from ArrayList<E>[] to List<E>[]\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=104695 - variation
public void test0815() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<E> {\n" +
			"	void foo(Object[][] e) {\n" +
			"		E[] o = (E[]) e;\n" +
			"		Zork z;\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 3)\n" +
		"	E[] o = (E[]) e;\n" +
		"	        ^^^^^^^\n" +
		"Type safety: Unchecked cast from Object[][] to E[]\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 4)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=104695 - variation
public void test0816() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"public class X<E> {\n" +
			"    void method(Object[] o) {\n" +
			"        if (o instanceof List<E>[][]) { //incorrect too\n" +
			"            List<E>[][] es = (List<E>[][]) o; \n" +
			"        }\n" +
			"    }\n" +
			"}\n",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 4)\n" + 
		"	if (o instanceof List<E>[][]) { //incorrect too\n" + 
		"	    ^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Cannot perform instanceof check against parameterized type List<E>[][]. Use the form List<?>[][] instead since further generic type information will be erased at runtime\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 5)\n" + 
		"	List<E>[][] es = (List<E>[][]) o; \n" + 
		"	                 ^^^^^^^^^^^^^^^\n" + 
		"Type safety: Unchecked cast from Object[] to List<E>[][]\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=104695 - variation
public void test0817() {
	this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.List;\n" +
				"\n" +
				"public class X<T> {\n" +
				"    private T t;\n" +
				"    private X<?>.Inner inner;\n" +
				"    private X<?>.Inner[] inners;\n" +
				"    public X(T t) {\n" +
				"        this.t = t;\n" +
				"        if (this.inner instanceof X<?>.Inner) {}\n" +
				"        if (this.inners instanceof X<?>.Inner[]) {}\n" +
				"    }\n" +
				"    private class Inner {\n" +
				"    }\n" +
				"    void foo(List l) {\n" +
				"    	if (l instanceof List<?>) {}\n" +
				"    	if (l instanceof List<? extends String>) {}\n" +
				"    }\n" +
				"    void foo(List[] ls) {\n" +
				"    	if (ls instanceof List<?>[]) {}\n" +
				"    	if (ls instanceof List<? extends String>[]) {}\n" +
				"    }\n" +
				"}\n",
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 9)\n" + 
			"	if (this.inner instanceof X<?>.Inner) {}\n" + 
			"	    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"The expression of type X<?>.Inner is already an instance of type X<?>.Inner\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 10)\n" + 
			"	if (this.inners instanceof X<?>.Inner[]) {}\n" + 
			"	    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"The expression of type X<?>.Inner[] is already an instance of type X<?>.Inner[]\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 14)\n" + 
			"	void foo(List l) {\n" + 
			"	         ^^^^\n" + 
			"List is a raw type. References to generic type List<E> should be parameterized\n" + 
			"----------\n" + 
			"4. WARNING in X.java (at line 15)\n" + 
			"	if (l instanceof List<?>) {}\n" + 
			"	    ^^^^^^^^^^^^^^^^^\n" + 
			"The expression of type List is already an instance of type List<?>\n" + 
			"----------\n" + 
			"5. ERROR in X.java (at line 16)\n" + 
			"	if (l instanceof List<? extends String>) {}\n" + 
			"	    ^^^^^^^^^^^^^^^^^\n" + 
			"Cannot perform instanceof check against parameterized type List<? extends String>. Use the form List<?> instead since further generic type information will be erased at runtime\n" + 
			"----------\n" + 
			"6. WARNING in X.java (at line 18)\n" + 
			"	void foo(List[] ls) {\n" + 
			"	         ^^^^\n" + 
			"List is a raw type. References to generic type List<E> should be parameterized\n" + 
			"----------\n" + 
			"7. WARNING in X.java (at line 19)\n" + 
			"	if (ls instanceof List<?>[]) {}\n" + 
			"	    ^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"The expression of type List[] is already an instance of type List<?>\n" + 
			"----------\n" + 
			"8. ERROR in X.java (at line 20)\n" + 
			"	if (ls instanceof List<? extends String>[]) {}\n" + 
			"	    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Cannot perform instanceof check against parameterized type List<? extends String>[]. Use the form List<?>[] instead since further generic type information will be erased at runtime\n" + 
			"----------\n");
}
public void test0818() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" +
			"    boolean b = this instanceof Y;\n" +
			"    static class Y extends X<Object> {\n" +
			"    }\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=101380
public void test0819() {
	this.runConformTest(
			new String[] {
				"X.java",
				"public class X implements MyInterface {\n" +
				"	public void myMethod(myEnum value) {\n" +
				"		System.out.println(\"value is \"+value);\n" +
				"	}\n" +
				"	public static void main(String[] args){\n" +
				"		new X().myMethod(myEnum.one);		\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"interface MyInterface<T> {\n" +
				"	enum myEnum {one,two};\n" +
				"	public void myMethod(myEnum value); \n" +
				"}\n",
			},
			"value is one");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=101380 - variation
public void test0820() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X implements I {\n" +
			"  public void x(M value) {}\n" +
			"}\n" +
			"interface I<T> {\n" +
			"  class M {}\n" +
			"  void x(M value); \n" +
			"}\n",
		},
		"");
}
public void test0821() throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.io.Serializable;\n" +
			"\n" +
			"public class X<T extends Serializable & Runnable> {\n" +
			"	T t;\n" +
			"	X(T t) {\n" +
			"		this.t = t;\n" +
			"	}\n" +
			"	void foo() {\n" +
			"		t.run();\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		new X<A>(new A()).foo();\n" +
			"	}\n" +
			"}\n" +
			"class A implements Serializable, Runnable {\n" +
			"	public void run() {\n" +
			"		System.out.println(\"AA\");\n" +
			"	}\n" +
			"}\n",
		},
		"AA");
	// 	ensure proper declaring class for #run() invocation
	String expectedOutput =
		"  // Method descriptor #15 ()V\n" +
		"  // Stack: 1, Locals: 1\n" +
		"  void foo();\n" +
		"     0  aload_0 [this]\n" +
		"     1  getfield X.t : java.io.Serializable [16]\n" +
		"     4  checkcast java.lang.Runnable [25]\n" +
		"     7  invokeinterface java.lang.Runnable.run() : void [27] [nargs: 1]\n" +
		"    12  return\n" +
		"      Line numbers:\n" +
		"        [pc: 0, line: 9]\n" +
		"        [pc: 12, line: 10]\n" +
		"      Local variable table:\n" +
		"        [pc: 0, pc: 13] local: this index: 0 type: X\n" +
		"      Local variable type table:\n" +
		"        [pc: 0, pc: 13] local: this index: 0 type: X<T>\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 test0822() throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.io.Serializable;\n" +
			"\n" +
			"public class X<T extends Serializable & Runnable> {\n" +
			"	void foo(T t) {\n" +
			"		t.run();\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		new X<A>().foo(new A());\n" +
			"	}\n" +
			"}\n" +
			"class A implements Serializable, Runnable {\n" +
			"	public void run() {\n" +
			"		System.out.println(\"AA\");\n" +
			"	}\n" +
			"}\n",
		},
		"AA");
	// 	ensure proper declaring class for #run() invocation
	String expectedOutput =
		"  // Method descriptor #17 (Ljava/io/Serializable;)V\n" +
		"  // Signature: (TT;)V\n" +
		"  // Stack: 1, Locals: 2\n" +
		"  void foo(java.io.Serializable t);\n" +
		"     0  aload_1 [t]\n" +
		"     1  checkcast java.lang.Runnable [20]\n" +
		"     4  invokeinterface java.lang.Runnable.run() : void [22] [nargs: 1]\n" +
		"     9  return\n" +
		"      Line numbers:\n" +
		"        [pc: 0, line: 5]\n" +
		"        [pc: 9, line: 6]\n" +
		"      Local variable table:\n" +
		"        [pc: 0, pc: 10] local: this index: 0 type: X\n" +
		"        [pc: 0, pc: 10] local: t index: 1 type: java.io.Serializable\n" +
		"      Local variable type table:\n" +
		"        [pc: 0, pc: 10] local: this index: 0 type: X<T>\n" +
		"        [pc: 0, pc: 10] local: t index: 1 type: T\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 test0823() throws Exception {
	runConformTest(
		true,
		new String[] {
			"X.java",
			"import java.io.Serializable;\n" +
			"\n" +
			"public class X<T extends Serializable & Runnable, V extends T> {\n" +
			"	T t;\n" +
			"	X(T t) {\n" +
			"		this.t = t;\n" +
			"	}\n" +
			"	void foo() {\n" +
			"		(this == null ? t : t).run();\n" +
			"		((V) t).run();\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		new X<A, A>(new A()).foo();\n" +
			"	}\n" +
			"}\n" +
			"class A implements Serializable, Runnable {\n" +
			"	public void run() {\n" +
			"		System.out.print(\"AA\");\n" +
			"	}\n" +
			"}\n",
		},
		null,
		"AAAA",
		null,
		JavacTestOptions.JavacHasABug.JavacBug6531075);
	// 	ensure proper declaring class for #run() invocation
	String expectedOutput =
		"  // Method descriptor #15 ()V\n" +
		"  // Stack: 1, Locals: 1\n" +
		"  void foo();\n" +
		"     0  aload_0 [this]\n" +
		"     1  ifnonnull 11\n" +
		"     4  aload_0 [this]\n" +
		"     5  getfield X.t : java.io.Serializable [16]\n" +
		"     8  goto 15\n" +
		"    11  aload_0 [this]\n" +
		"    12  getfield X.t : java.io.Serializable [16]\n" +
		"    15  checkcast java.lang.Runnable [25]\n" +
		"    18  invokeinterface java.lang.Runnable.run() : void [27] [nargs: 1]\n" +
		"    23  aload_0 [this]\n" +
		"    24  getfield X.t : java.io.Serializable [16]\n" +
		"    27  checkcast java.lang.Runnable [25]\n" +
		"    30  invokeinterface java.lang.Runnable.run() : void [27] [nargs: 1]\n" +
		"    35  return\n" +
		"      Line numbers:\n" +
		"        [pc: 0, line: 9]\n" +
		"        [pc: 23, line: 10]\n" +
		"        [pc: 35, line: 11]\n" +
		"      Local variable table:\n" +
		"        [pc: 0, pc: 36] local: this index: 0 type: X\n" +
		"      Local variable type table:\n" +
		"        [pc: 0, pc: 36] local: this index: 0 type: X<T,V>\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 test0824() throws Exception {
	runConformTest(
		true,
		new String[] {
			"X.java",
			"import java.io.Serializable;\n" +
			"\n" +
			"public class X<T extends Serializable & Runnable, V extends T> {\n" +
			"	void foo(T t) {\n" +
			"		(this == null ? t : t).run();\n" +
			"		((V) t).run();\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		new X<A, A>().foo(new A());\n" +
			"	}\n" +
			"}\n" +
			"class A implements Serializable, Runnable {\n" +
			"	public void run() {\n" +
			"		System.out.print(\"AA\");\n" +
			"	}\n" +
			"}\n",
		},
		null,
		"AAAA",
		null,
		JavacTestOptions.JavacHasABug.JavacBug6531075);
	// 	ensure proper declaring class for #run() invocation
	String expectedOutput =
		"  // Method descriptor #17 (Ljava/io/Serializable;)V\n" +
		"  // Signature: (TT;)V\n" +
		"  // Stack: 1, Locals: 2\n" +
		"  void foo(java.io.Serializable t);\n" +
		"     0  aload_0 [this]\n" +
		"     1  ifnonnull 8\n" +
		"     4  aload_1 [t]\n" +
		"     5  goto 9\n" +
		"     8  aload_1 [t]\n" +
		"     9  checkcast java.lang.Runnable [20]\n" +
		"    12  invokeinterface java.lang.Runnable.run() : void [22] [nargs: 1]\n" +
		"    17  aload_1 [t]\n" +
		"    18  checkcast java.lang.Runnable [20]\n" +
		"    21  invokeinterface java.lang.Runnable.run() : void [22] [nargs: 1]\n" +
		"    26  return\n" +
		"      Line numbers:\n" +
		"        [pc: 0, line: 5]\n" +
		"        [pc: 17, line: 6]\n" +
		"        [pc: 26, line: 7]\n" +
		"      Local variable table:\n" +
		"        [pc: 0, pc: 27] local: this index: 0 type: X\n" +
		"        [pc: 0, pc: 27] local: t index: 1 type: java.io.Serializable\n" +
		"      Local variable type table:\n" +
		"        [pc: 0, pc: 27] local: this index: 0 type: X<T,V>\n" +
		"        [pc: 0, pc: 27] local: t index: 1 type: T\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 test0825() throws Exception {
	if (this.complianceLevel >= ClassFileConstants.JDK1_8)
		return;
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.io.Serializable;\n" +
			"\n" +
			"public class X<T extends Serializable & Runnable, V extends T> {\n" +
			"	void foo(T t) {\n" +
			"		Runnable r1 = t;\n" +
			"		Runnable r2 = (this == null ? t : t);\n" +
			"		Runnable r3 = ((V) t);\n" +
			"		\n" +
			"		bar(t);\n" +
			"		bar(this == null ? t : t);\n" +
			"		bar((V)t);\n" +
			"	}\n" +
			"	void bar(Runnable r) {}	\n" +
			"	public static void main(String[] args) {\n" +
			"		new X<A, A>().foo(new A());\n" +
			"	}\n" +
			"}\n" +
			"class A implements Serializable, Runnable {\n" +
			"	public void run() {\n" +
			"		System.out.println(\"AA\");\n" +
			"	}\n" +
			"}\n",
		},
		"");
	// 	ensure proper declaring class for #run() invocation
	String expectedOutput = this.complianceLevel < ClassFileConstants.JDK1_8 ? 
		"  // Method descriptor #17 (Ljava/io/Serializable;)V\n" + 
		"  // Signature: (TT;)V\n" + 
		"  // Stack: 2, Locals: 5\n" + 
		"  void foo(java.io.Serializable t);\n" + 
		"     0  aload_1 [t]\n" + 
		"     1  checkcast java.lang.Runnable [20]\n" + 
		"     4  astore_2 [r1]\n" + 
		"     5  aload_0 [this]\n" + 
		"     6  ifnonnull 13\n" + 
		"     9  aload_1 [t]\n" + 
		"    10  goto 14\n" + 
		"    13  aload_1 [t]\n" + 
		"    14  astore_3 [r2]\n" + 
		"    15  aload_1 [t]\n" + 
		"    16  astore 4 [r3]\n" + 
		"    18  aload_0 [this]\n" + 
		"    19  aload_1 [t]\n" + 
		"    20  checkcast java.lang.Runnable [20]\n" + 
		"    23  invokevirtual X.bar(java.lang.Runnable) : void [22]\n" + 
		"    26  aload_0 [this]\n" + 
		"    27  aload_0 [this]\n" + 
		"    28  ifnonnull 35\n" + 
		"    31  aload_1 [t]\n" + 
		"    32  goto 36\n" + 
		"    35  aload_1 [t]\n" + 
		"    36  invokevirtual X.bar(java.lang.Runnable) : void [22]\n" + 
		"    39  aload_0 [this]\n" + 
		"    40  aload_1 [t]\n" + 
		"    41  invokevirtual X.bar(java.lang.Runnable) : void [22]\n" + 
		"    44  return\n" + 
		"      Line numbers:\n" + 
		"        [pc: 0, line: 5]\n" + 
		"        [pc: 5, line: 6]\n" + 
		"        [pc: 15, line: 7]\n" + 
		"        [pc: 18, line: 9]\n" + 
		"        [pc: 26, line: 10]\n" + 
		"        [pc: 39, line: 11]\n" + 
		"        [pc: 44, line: 12]\n" + 
		"      Local variable table:\n" + 
		"        [pc: 0, pc: 45] local: this index: 0 type: X\n" + 
		"        [pc: 0, pc: 45] local: t index: 1 type: java.io.Serializable\n" + 
		"        [pc: 5, pc: 45] local: r1 index: 2 type: java.lang.Runnable\n" + 
		"        [pc: 15, pc: 45] local: r2 index: 3 type: java.lang.Runnable\n" + 
		"        [pc: 18, pc: 45] local: r3 index: 4 type: java.lang.Runnable\n" + 
		"      Local variable type table:\n" + 
		"        [pc: 0, pc: 45] local: this index: 0 type: X<T,V>\n" + 
		"        [pc: 0, pc: 45] local: t index: 1 type: T\n" :
			
			"  // Method descriptor #17 (Ljava/io/Serializable;)V\n" + 
			"  // Signature: (TT;)V\n" + 
			"  // Stack: 2, Locals: 5\n" + 
			"  void foo(java.io.Serializable t);\n" + 
			"     0  aload_1 [t]\n" + 
			"     1  checkcast java.lang.Runnable [20]\n" + 
			"     4  astore_2 [r1]\n" + 
			"     5  aload_0 [this]\n" + 
			"     6  ifnonnull 16\n" + 
			"     9  aload_1 [t]\n" + 
			"    10  checkcast java.lang.Runnable [20]\n" + 
			"    13  goto 20\n" + 
			"    16  aload_1 [t]\n" + 
			"    17  checkcast java.lang.Runnable [20]\n" + 
			"    20  astore_3 [r2]\n" + 
			"    21  aload_1 [t]\n" + 
			"    22  astore 4 [r3]\n" + 
			"    24  aload_0 [this]\n" + 
			"    25  aload_1 [t]\n" + 
			"    26  checkcast java.lang.Runnable [20]\n" + 
			"    29  invokevirtual X.bar(java.lang.Runnable) : void [22]\n" + 
			"    32  aload_0 [this]\n" + 
			"    33  aload_0 [this]\n" + 
			"    34  ifnonnull 44\n" + 
			"    37  aload_1 [t]\n" + 
			"    38  checkcast java.lang.Runnable [20]\n" + 
			"    41  goto 48\n" + 
			"    44  aload_1 [t]\n" + 
			"    45  checkcast java.lang.Runnable [20]\n" + 
			"    48  invokevirtual X.bar(java.lang.Runnable) : void [22]\n" + 
			"    51  aload_0 [this]\n" + 
			"    52  aload_1 [t]\n" + 
			"    53  invokevirtual X.bar(java.lang.Runnable) : void [22]\n" + 
			"    56  return\n" + 
			"      Line numbers:\n" + 
			"        [pc: 0, line: 5]\n" + 
			"        [pc: 5, line: 6]\n" + 
			"        [pc: 21, line: 7]\n" + 
			"        [pc: 24, line: 9]\n" + 
			"        [pc: 32, line: 10]\n" + 
			"        [pc: 51, line: 11]\n" + 
			"        [pc: 56, line: 12]\n" + 
			"      Local variable table:\n" + 
			"        [pc: 0, pc: 57] local: this index: 0 type: X\n" + 
			"        [pc: 0, pc: 57] local: t index: 1 type: java.io.Serializable\n" + 
			"        [pc: 5, pc: 57] local: r1 index: 2 type: java.lang.Runnable\n" + 
			"        [pc: 21, pc: 57] local: r2 index: 3 type: java.lang.Runnable\n" + 
			"        [pc: 24, pc: 57] local: r3 index: 4 type: java.lang.Runnable\n" + 
			"      Local variable type table:\n" + 
			"        [pc: 0, pc: 57] local: this index: 0 type: X<T,V>\n" + 
			"        [pc: 0, pc: 57] local: t index: 1 type: T\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=110570
public void test0826() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" +
			"\n" +
			"  public <V1, V2 extends V1> void test(V1 p1, V2 p2) {}\n" +
			"	\n" +
			"  public static void main(String[] args) {\n" +
			"    XA a = new XA(){};\n" +
			"    XB b = new XB(){};\n" +
			"\n" +
			"    X t1 = new X();\n" +
			"    t1.test(a, b); //this gives an error but should be OK\n" +
			"    \n" +
			"    X<Object> t2 = new X<Object>();\n" +
			"    t2.test(a, b); //this compiles OK\n" +
			"    Zork z;\n" +
			"  }\n" +
			"}\n" +
			"\n" +
			"interface XA {}\n" +
			"interface XB extends XA {}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 9)\n" +
		"	X t1 = new X();\n" +
		"	^\n" +
		"X is a raw type. References to generic type X<T> should be parameterized\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 9)\n" +
		"	X t1 = new X();\n" +
		"	           ^\n" +
		"X is a raw type. References to generic type X<T> should be parameterized\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 10)\n" +
		"	t1.test(a, b); //this gives an error but should be OK\n" +
		"	^^^^^^^^^^^^^\n" +
		"Type safety: The method test(Object, Object) belongs to the raw type X. References to generic type X<T> should be parameterized\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 14)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=110570 - variation
// ensure variable V2 is substituted with upper bound erasure (List) and not just upperbound List<String>
// for raw generic method invocation
public void test0827() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.List;\n" +
			"public class X<T> {\n" +
			"  public <V1, V2 extends List<String>> void test(V1 p1, V2 p2) {}\n" +
			"  public static void main(String[] args) {\n" +
			"    XA a = new XA(){};\n" +
			"    List<Object> b = null;\n" +
			"    X t1 = new X();\n" +
			"    t1.test(a, b); //this gives an error but should be OK\n" +
			"    X<Object> t2 = new X<Object>();\n" +
			"    t2.test(a, b); //this compiles OK\n" +
			"  }\n" +
			"}\n" +
			"interface XA {}\n" +
			"\n",
		},
		this.complianceLevel < ClassFileConstants.JDK1_8 ? 
		"----------\n" +
		"1. WARNING in X.java (at line 7)\n" +
		"	X t1 = new X();\n" +
		"	^\n" +
		"X is a raw type. References to generic type X<T> should be parameterized\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 7)\n" +
		"	X t1 = new X();\n" +
		"	           ^\n" +
		"X is a raw type. References to generic type X<T> should be parameterized\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 8)\n" +
		"	t1.test(a, b); //this gives an error but should be OK\n" +
		"	^^^^^^^^^^^^^\n" +
		"Type safety: The method test(Object, List) belongs to the raw type X. References to generic type X<T> should be parameterized\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 10)\n" +
		"	t2.test(a, b); //this compiles OK\n" +
		"	   ^^^^\n" +
		"Bound mismatch: The generic method test(V1, V2) of type X<T> is not applicable for the arguments (XA, List<Object>). The inferred type List<Object> is not a valid substitute for the bounded parameter <V2 extends List<String>>\n" +
		"----------\n" :
			"----------\n" + 
			"1. WARNING in X.java (at line 7)\n" + 
			"	X t1 = new X();\n" + 
			"	^\n" + 
			"X is a raw type. References to generic type X<T> should be parameterized\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 7)\n" + 
			"	X t1 = new X();\n" + 
			"	           ^\n" + 
			"X is a raw type. References to generic type X<T> should be parameterized\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 8)\n" + 
			"	t1.test(a, b); //this gives an error but should be OK\n" + 
			"	^^^^^^^^^^^^^\n" + 
			"Type safety: The method test(Object, List) belongs to the raw type X. References to generic type X<T> should be parameterized\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 10)\n" + 
			"	t2.test(a, b); //this compiles OK\n" + 
			"	   ^^^^\n" + 
			"The method test(V1, V2) in the type X<Object> is not applicable for the arguments (XA, List<Object>)\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=109249
public void test0828() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface Transformable<T extends Transformable>\n" +
			"{\n" +
			"	public T transform();\n" +
			"}\n" +
			"interface Volume<V extends Volume> extends Transformable<V>\n" +
			"{\n" +
			"//	public V transform();\n" +
			"}\n" +
			"@SuppressWarnings(\"null\")\n" +
			"public class X {\n" +
			"	void foo(){\n" +
			"		Volume v1 = null;\n" +
			"		Volume v2 = v1.transform();\n" +
			"	}\n" +
			"	void bar(){\n" +
			"		Volume<Volume> v1 = null;\n" +
			"		Volume v2 = v1.transform();\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 1)\n" +
		"	interface Transformable<T extends Transformable>\n" +
		"	                                  ^^^^^^^^^^^^^\n" +
		"Transformable is a raw type. References to generic type Transformable<T> should be parameterized\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 5)\n" +
		"	interface Volume<V extends Volume> extends Transformable<V>\n" +
		"	                           ^^^^^^\n" +
		"Volume is a raw type. References to generic type Volume<V> should be parameterized\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 12)\n" +
		"	Volume v1 = null;\n" +
		"	^^^^^^\n" +
		"Volume is a raw type. References to generic type Volume<V> should be parameterized\n" +
		"----------\n" +
		"4. WARNING in X.java (at line 13)\n" +
		"	Volume v2 = v1.transform();\n" +
		"	^^^^^^\n" +
		"Volume is a raw type. References to generic type Volume<V> should be parameterized\n" +
		"----------\n" +
		"5. ERROR in X.java (at line 13)\n" +
		"	Volume v2 = v1.transform();\n" +
		"	            ^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from Transformable to Volume\n" +
		"----------\n" +
		"6. WARNING in X.java (at line 16)\n" +
		"	Volume<Volume> v1 = null;\n" +
		"	       ^^^^^^\n" +
		"Volume is a raw type. References to generic type Volume<V> should be parameterized\n" +
		"----------\n" +
		"7. WARNING in X.java (at line 17)\n" +
		"	Volume v2 = v1.transform();\n" +
		"	^^^^^^\n" +
		"Volume is a raw type. References to generic type Volume<V> should be parameterized\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=109249 - variation
public void test0829() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface Transformable<T extends Transformable>\n" +
			"{\n" +
			"	public T transform();\n" +
			"}\n" +
			"interface Volume<V extends Volume> extends Transformable<V>\n" +
			"{\n" +
			"	public V transform();\n" +
			"}\n" +
			"public class X {\n" +
			"	void foo(){\n" +
			"		Volume v1 = null;\n" +
			"		Volume v2 = v1.transform();\n" +
			"	}\n" +
			"	void bar(){\n" +
			"		Volume<Volume> v1 = null;\n" +
			"		Volume v2 = v1.transform();\n" +
			"	}\n" +
			"}\n",
		},
		"");
}

public void test0830() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"public class X<T> {\n" +
			"	void foo(Object o) {\n" +
			"		boolean b = o instanceof X;\n" +
			"		X x = (X) o;\n" +
			"		X<String> xs = (X<String>)o;\n" +
			"		Zork z;\n" +
			"	}\n" +
			"	void bar(ArrayList<String> al) {\n" +
			"		List l = (List) al;\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" + 
		"1. WARNING in X.java (at line 5)\n" + 
		"	X x = (X) o;\n" + 
		"	^\n" + 
		"X is a raw type. References to generic type X<T> should be parameterized\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 5)\n" + 
		"	X x = (X) o;\n" + 
		"	       ^\n" + 
		"X is a raw type. References to generic type X<T> should be parameterized\n" + 
		"----------\n" + 
		"3. WARNING in X.java (at line 6)\n" + 
		"	X<String> xs = (X<String>)o;\n" + 
		"	               ^^^^^^^^^^^^\n" + 
		"Type safety: Unchecked cast from Object to X<String>\n" + 
		"----------\n" + 
		"4. ERROR in X.java (at line 7)\n" + 
		"	Zork z;\n" + 
		"	^^^^\n" + 
		"Zork cannot be resolved to a type\n" + 
		"----------\n" + 
		"5. WARNING in X.java (at line 10)\n" + 
		"	List l = (List) al;\n" + 
		"	^^^^\n" + 
		"List is a raw type. References to generic type List<E> should be parameterized\n" + 
		"----------\n" + 
		"6. WARNING in X.java (at line 10)\n" + 
		"	List l = (List) al;\n" + 
		"	         ^^^^^^^^^\n" + 
		"Unnecessary cast from ArrayList<String> to List\n" + 
		"----------\n" + 
		"7. WARNING in X.java (at line 10)\n" + 
		"	List l = (List) al;\n" + 
		"	          ^^^^\n" + 
		"List is a raw type. References to generic type List<E> should be parameterized\n" + 
		"----------\n");
}
//unnecessary cast may be combined with unchecked cast warning
public void test0831() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"public class X {\n" +
			"	void foo(Object o1) {\n" +
			"		Object o2 = (List<String>) o1;\n" +
			"		\n" +
			"		foo((List<String>)o2);\n" +
			"	}\n" +
			"	Zork z;\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 4)\n" +
		"	Object o2 = (List<String>) o1;\n" +
		"	            ^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from Object to List<String>\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 4)\n" +
		"	Object o2 = (List<String>) o1;\n" +
		"	            ^^^^^^^^^^^^^^^^^\n" +
		"Unnecessary cast from Object to List<String>\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 6)\n" +
		"	foo((List<String>)o2);\n" +
		"	    ^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from Object to List<String>\n" +
		"----------\n" +
		"4. WARNING in X.java (at line 6)\n" +
		"	foo((List<String>)o2);\n" +
		"	    ^^^^^^^^^^^^^^^^\n" +
		"Unnecessary cast from Object to List<String>\n" +
		"----------\n" +
		"5. ERROR in X.java (at line 8)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=106010
public void test0832() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"class C1<T> {\n" +
			"	class C11 {	}\n" +
			"	class C12 {\n" +
			"		T t;\n" +
			"		C1<T>.C11[] m() {\n" +
			"			C1<T>.C11[] ts = (C1<T>.C11[]) new C1<?>.C11[5];\n" +
			"			return ts;\n" +
			"		}\n" +
			"	}\n" +
			"	Zork z;\n" +
			"}\n",
		},
		"----------\n" + 
		"1. WARNING in X.java (at line 6)\n" + 
		"	C1<T>.C11[] ts = (C1<T>.C11[]) new C1<?>.C11[5];\n" + 
		"	                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: Unchecked cast from C1<?>.C11[] to C1<T>.C11[]\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 10)\n" + 
		"	Zork z;\n" + 
		"	^^^^\n" + 
		"Zork cannot be resolved to a type\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=111014
public void test0833() {
	this.runConformTest(
		new String[] {
			"A.java",
			"class A<T1> {}\n",
			"B.java",
			"class B<T2> extends A<B<T2>.Inner> { class Inner {} }\n",
			"C.java",
			"class C { B<Integer> b; }\n",
		},
		"");
	this.runConformTest(
		new String[] {
			"C.java",
			"class C { B<Integer> b; }\n",
		},
		"",
		null,
		false,
		null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=100809
public void test0834() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"public class X {\n" +
			"    public static void main(String[] args) {\n" +
			"        Set<Integer> set = new HashSet<Integer>();\n" +
			"        set.add(42);\n" +
			"        Collection<Number> collection;\n" +
			"        collection = (Collection) set;\n" +
			"        System.out.println(collection.iterator().next());\n" +
			"        Zork z;\n" +
			"    }\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 7)\n" +
		"	collection = (Collection) set;\n" +
		"	             ^^^^^^^^^^^^^^^^\n" +
		"Type safety: The expression of type Collection needs unchecked conversion to conform to Collection<Number>\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 7)\n" +
		"	collection = (Collection) set;\n" +
		"	              ^^^^^^^^^^\n" +
		"Collection is a raw type. References to generic type Collection<E> should be parameterized\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 9)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=100809 - variation
public void test0835() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"public class X {\n" +
			"	void foo(List<String> ls) {\n" +
			"		ArrayList<?> als = (ArrayList) ls;\n" +
			"	}\n" +
			"	Zork z;\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 4)\n" +
		"	ArrayList<?> als = (ArrayList) ls;\n" +
		"	                    ^^^^^^^^^\n" +
		"ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 6)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=111208
public void test0836() {
	this.runConformTest(
		new String[] {
			"X.java",
			" import java.util.Iterator;\n" +
			" import java.util.List;\n" +
			"\n" +
			" public class X<A> {\n" +
			"\n" +
			" interface Factory<T> {\n" +
			" T invoke();\n" +
			"	}\n" +
			"\n" +
			"	public static <E> Iterator<E> iterate(Iterable<E> iterable) {\n" +
			"		return iterable.iterator();\n" +
			"	}\n" +
			"\n" +
			"	public Factory<Iterator<? extends A>> factory(final Factory<? extends List<? extends A>> factory) {\n" +
			"		return new Factory<Iterator<? extends A>>() {\n" +
			"			public Iterator<? extends A> invoke() {\n" +
			"				//String s = iterate(factory.invoke());\n" +
			"				return iterate(factory.invoke());\n" +
			"			}\n" +
			"		};\n" +
			"	}\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=111208 - variation
public void test0837() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			"public class X {\n" +
			"	public void foo(List<? extends List<? extends Number>> l) {\n" +
			"		bar(l.get(0));\n" +
			"		swap(l.get(0));\n" +
			"	}\n" +
			"	void bar(String s) {}\n" +
			"	private static <T> void swap(List<T> l) {\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	bar(l.get(0));\n" +
		"	^^^\n" +
		"The method bar(String) in the type X is not applicable for the arguments (capture#1-of ? extends List<? extends Number>)\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=111689
public void test0838() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public class CClass<T extends AClass.BClass<T>> {\n" +
			"	}\n" +
			"}\n",
			"AClass.java",
			"public interface AClass<X extends AClass> {\n" +
			"	public interface BClass<T extends BClass> extends AClass<T> {\n" +
			"	}\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=109118
public void test0839() {
	this.runConformTest(
		new String[] {
			"com/test/Tester.java",
			"package com.test;\n" +
			"\n" +
			"import com.test.TestClass.MyException;\n" +
			"\n" +
			"public class Tester {\n" +
			"\n" +
			"	public static void main(String[] args) {\n" +
			"		try {\n" +
			"			TestClass<String> test = new TestClass<String>();\n" +
			"		} catch (MyException e) {\n" +
			"			System.out.println(\"SUCCESS\");\n" +
			"		}\n" +
			"	}\n" +
			"}",
			"com/test/TestClass.java",
			"package com.test;\n" +
			"\n" +
			"public class TestClass<T> {\n" +
			"	\n" +
			"	public TestClass() throws MyException {\n" +
			"		throw new MyException();\n" +
			"	}\n" +
			"\n" +
			"	public static class MyException extends Exception {\n" +
			"		\n" +
			"		public MyException() {\n" +
			"			super();\n" +
			"		}\n" +
			"	}\n" +
			"}"
		},
		"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=109118
public void test0840() {
	this.runNegativeTest(
		new String[] {
			"generics/NodeList.java",
			"package generics;\n" +
			"public class NodeList<E> {\n" +
			"    public class Cursor { }\n" +
			"}",
			"generics/user/User.java",
			"package generics.user;\n" +
			"import generics.NodeList;\n" +
			"import generics.NodeList.Cursor;\n" +
			"public class User {\n" +
			"    Cursor raw;\n" +
			"    NodeList.Cursor rawQualified;\n" +
			"    NodeList<String>.Cursor parameterized;\n" +
			"\n" +
			"    void foo() {\n" +
			"        parameterized= rawQualified; //unchecked warning (OK)\n" +
			"        rawQualified= parameterized;\n" +
			"\n" +
			"        parameterized= raw; //should just give unchecked warning, but errors\n" +
			"        raw= parameterized; //should not error\n" +
			"\n" +
			"        raw= rawQualified; //should not error\n" +
			"        rawQualified= raw;\n" +
			"    }\n" +
			"    Zork z;\n" +
			"}",
		},
		"----------\n" +
		"1. WARNING in generics\\user\\User.java (at line 5)\n" +
		"	Cursor raw;\n" +
		"	^^^^^^\n" +
		"NodeList.Cursor is a raw type. References to generic type NodeList<E>.Cursor should be parameterized\n" +
		"----------\n" +
		"2. WARNING in generics\\user\\User.java (at line 6)\n" +
		"	NodeList.Cursor rawQualified;\n" +
		"	^^^^^^^^^^^^^^^\n" +
		"NodeList.Cursor is a raw type. References to generic type NodeList<E>.Cursor should be parameterized\n" +
		"----------\n" +
		"3. WARNING in generics\\user\\User.java (at line 10)\n" +
		"	parameterized= rawQualified; //unchecked warning (OK)\n" +
		"	               ^^^^^^^^^^^^\n" +
		"Type safety: The expression of type NodeList.Cursor needs unchecked conversion to conform to NodeList<String>.Cursor\n" +
		"----------\n" +
		"4. WARNING in generics\\user\\User.java (at line 13)\n" +
		"	parameterized= raw; //should just give unchecked warning, but errors\n" +
		"	               ^^^\n" +
		"Type safety: The expression of type NodeList.Cursor needs unchecked conversion to conform to NodeList<String>.Cursor\n" +
		"----------\n" +
		"5. ERROR in generics\\user\\User.java (at line 19)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=112268
public void test0841() {
	this.runConformTest(
		new String[] {
			"X.java", // =================
			"import java.util.*;\n" +
			"\n" +
			"public class X {\n" +
			"  List<? extends Comparator> bar() {\n" +
			"	  List<? extends Comparator> l = foo();\n" +
			"	  return foo();\n" +
			"  }\n" +
			"  <T> List<T> foo() {\n" +
			"	  return null;\n" +
			"  }\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=112500
public void test0842() {
	String expectedError = isJRE11Plus ? intersection("Object","Serializable","Comparable<?>", "CharSequence") :
		intersection("Object","Serializable","CharSequence");
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"import java.util.List;\n" +
			"\n" +
			"public class X {\n" +
			"	static <T> List<T> merge(List<? extends T> a, List<? extends T> b) {\n" +
			"		return null;\n" +
			"	}\n" +
			"\n" +
			"	public static void main(String[] args) {\n" +
			"		List<String> list1 = null;\n" +
			"		List<StringBuilder> list2 = null;\n" +
			"		List<? extends CharSequence> result = merge(list1, list2);\n" +
			"		List<? extends String> result2 = merge(list1, list2);\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 12)\n" +
		"	List<? extends String> result2 = merge(list1, list2);\n" +
		"	                                 ^^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from List<" + expectedError + "> to List<? extends String>\n" +
		"----------\n");
}
public void test0843() {
	String expectedError = isJRE11Plus ? intersection("Object","Serializable","Comparable<?>", "CharSequence") :
		intersection("Object","Serializable","CharSequence");
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"import java.util.List;\n" +
			"\n" +
			"public class X {\n" +
			"	static <T> List<T> merge(List<? extends T> a, List<? extends T> b) {\n" +
			"		return null;\n" +
			"	}\n" +
			"\n" +
			"	public static void main(String[] args) {\n" +
			"		List<String> list1 = null;\n" +
			"		List<StringBuilder> list2 = null;\n" +
			"		Object result3 = (List<? extends CharSequence>)merge(list1, list2);\n" +
			"		Object result4 = (List<? extends String>)merge(list1, list2);\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 11)\n" +
		"	Object result3 = (List<? extends CharSequence>)merge(list1, list2);\n" +
		"	                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Unnecessary cast from List<" + expectedError + "> to List<? extends CharSequence>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 12)\n" +
		"	Object result4 = (List<? extends String>)merge(list1, list2);\n" +
		"	                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from List<" + expectedError + "> to List<? extends String>\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 12)\n" +
		"	Object result4 = (List<? extends String>)merge(list1, list2);\n" +
		"	                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Unnecessary cast from List<" + expectedError + "> to List<? extends String>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=112595
public void test0844() {
	this.runConformTest(
		new String[] {
			"X.java", // =================
			"import java.util.*;\n" +
			"public class X {\n" +
			"    public Set< ? extends X> getModifiers()\n" +
			"    {\n" +
			"        return Collections.emptySet();\n" +
			"    }\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=112595
public void test0845() {
	this.runConformTest(
		new String[] {
			"Generic.java", // =================
			"public class Generic<T> {\n" +
			"	public int size() {\n" +
			"		return 0;\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		System.out.println(\"SUCCESS\");\n" +
			"	}\n" +
			"}", // =================
		},
		"SUCCESS");
	this.runNegativeTest(
			new String[] {
				"X.java", // =================
				"import java.util.ArrayList;\n" +
				"\n" +
				"public class X {\n" +
				"	public void testList(ArrayList aList) {\n" +
				"		aList.size();\n" +
				"	}\n" +
				"	public void testGeneric(Generic aGeneric) {\n" +
				"		aGeneric.size();\n" +
				"	}\n" +
				"	Zork z;\n" +
				"}\n", // =================
			},
			"----------\n" +
			"1. WARNING in X.java (at line 4)\n" +
			"	public void testList(ArrayList aList) {\n" +
			"	                     ^^^^^^^^^\n" +
			"ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 7)\n" +
			"	public void testGeneric(Generic aGeneric) {\n" +
			"	                        ^^^^^^^\n" +
			"Generic cannot be resolved to a type\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 10)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
	}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=112666
public void test0846() {
	this.runConformTest(
		new String[] {
			"X.java", // =================
			"import java.util.Collection;\n" +
			"public class X {\n" +
			"	void m() {\n" +
			"		Collection<? super Collection<? super Number>> col = null;\n" +
			"		java.util.List<java.lang.Number> n = null;\n" +
			"		col.add(n);\n" +
			"	}\n" +
			"}\n", // =================
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=112666
public void test0847() {
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"import java.util.Collection;\n" +
			"\n" +
			"public class X {\n" +
			"	void m() {\n" +
			"		Collection<? extends Collection<? super Number>> col = null;\n" +
			"		java.util.List<java.lang.Number> n = null;\n" +
			"		col.add(n);\n" +
			"	}\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 7)\n" +
		"	col.add(n);\n" +
		"	    ^^^\n" +
		"The method add(capture#1-of ? extends Collection<? super Number>) in the type Collection<capture#1-of ? extends Collection<? super Number>> is not applicable for the arguments (List<Number>)\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=106451
public void test0848() throws Exception {
	this.runNegativeTest(
			new String[] {
				"X.java", // =================
				"import java.util.*;\n" + 
				"\n" + 
				"public class X<E> {\n" + 
				"	public static <T> List<T> asList(T a) { return null; }\n" +
				"	Collection<? extends Number> asList= asList(1);\n" + 
				"	List<Number> nums= (List<Number>) asList; // correct warning\n" + 
				"	List<Number> numz= (LinkedList<Number>) asList; // type safety warning missing\n" + 
				"	Zork z;\n" + 
				"}\n", // =================
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 6)\n" + 
			"	List<Number> nums= (List<Number>) asList; // correct warning\n" + 
			"	                   ^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked cast from Collection<capture#1-of ? extends Number> to List<Number>\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 7)\n" + 
			"	List<Number> numz= (LinkedList<Number>) asList; // type safety warning missing\n" + 
			"	                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked cast from Collection<capture#2-of ? extends Number> to LinkedList<Number>\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 8)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
		
		this.runConformTest(
				new String[] {
					"X.java", // =================
					"import java.util.*;\n" + 
					"\n" + 
					"public class X<E> {\n" + 
					"	Collection<? extends Number> asList= Arrays.asList(1, 2.2);\n" + 
					"	List<Number> nums= (List<Number>) asList; // correct warning\n" + 
					"	List<Number> numz= (LinkedList<Number>) asList; // type safety warning missing\n" + 
					"}\n", // =================
				},
				"");
		// 	ensure presence of: "checkcast java.util.LinkedList" before putfield X.numz
		String expectedOutput =
		"  // Method descriptor #14 ()V\n" + 
		"  // Stack: 6, Locals: 1\n" + 
		"  public X();\n" + 
		"     0  aload_0 [this]\n" + 
		"     1  invokespecial java.lang.Object() [16]\n" + 
		"     4  aload_0 [this]\n" + 
		"     5  iconst_2\n" + 
		"     6  anewarray java.lang.Number [18]\n" + 
		"     9  dup\n" + 
		"    10  iconst_0\n" + 
		"    11  iconst_1\n" + 
		"    12  invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [20]\n" + 
		"    15  aastore\n" + 
		"    16  dup\n" + 
		"    17  iconst_1\n" + 
		"    18  ldc2_w <Double 2.2> [26]\n" + 
		"    21  invokestatic java.lang.Double.valueOf(double) : java.lang.Double [28]\n" + 
		"    24  aastore\n" + 
		"    25  invokestatic java.util.Arrays.asList(java.lang.Object[]) : java.util.List [33]\n" + 
		"    28  putfield X.asList : java.util.Collection [38]\n" + 
		"    31  aload_0 [this]\n" + 
		"    32  aload_0 [this]\n" + 
		"    33  getfield X.asList : java.util.Collection [38]\n" + 
		"    36  checkcast java.util.List [40]\n" + 
		"    39  putfield X.nums : java.util.List [42]\n" + 
		"    42  aload_0 [this]\n" + 
		"    43  aload_0 [this]\n" + 
		"    44  getfield X.asList : java.util.Collection [38]\n" + 
		"    47  checkcast java.util.LinkedList [44]\n" + 
		"    50  putfield X.numz : java.util.List [46]\n" + 
		"    53  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);
		}
}
//ensure no unsafe cast is diagnosed
public void test0849() {
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"public class X {\n" +
			"    static <T, U extends T> T[] cast(U[] a) { return (T[]) a; }\n" +
			"    Zork z;\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. WARNING in X.java (at line 2)\n" +
		"	static <T, U extends T> T[] cast(U[] a) { return (T[]) a; }\n" +
		"	                                                 ^^^^^^^\n" +
		"Unnecessary cast from U[] to T[]\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 3)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
public void test0850() {
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"public class X {\n" +
			"    <T> T f(Object o) {\n" +
			"	return (T) o; // OK\n" +
			"    }\n" +
			"\n" +
			"    <U, T extends U> T g(Object o) {\n" +
			"	return (T) o; // bug???\n" +
			"    }\n" +
			"\n" +
			"    <U, T extends U> T h(Object o) {\n" +
			"	return X.<T>castTo(o); // workaround\n" +
			"    }\n" +
			"\n" +
			"    private static <T> T castTo(Object o) {\n" +
			"	return (T) o;\n" +
			"    }\n" +
			"    Zork z;\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. WARNING in X.java (at line 3)\n" +
		"	return (T) o; // OK\n" +
		"	       ^^^^^\n" +
		"Type safety: Unchecked cast from Object to T\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 7)\n" +
		"	return (T) o; // bug???\n" +
		"	       ^^^^^\n" +
		"Type safety: Unchecked cast from Object to T\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 15)\n" +
		"	return (T) o;\n" +
		"	       ^^^^^\n" +
		"Type safety: Unchecked cast from Object to T\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 17)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
public void test0851() {
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"interface Foo {}\n" +
			"interface Bar<T> {}\n" +
			"public class X {\n" +
			"    Object m(Foo f) {\n" +
			"        return (Bar<Object>)f;\n" +
			"    }\n" +
			"    Zork z;\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. WARNING in X.java (at line 5)\n" +
		"	return (Bar<Object>)f;\n" +
		"	       ^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from Foo to Bar<Object>\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 5)\n" +
		"	return (Bar<Object>)f;\n" +
		"	       ^^^^^^^^^^^^^^\n" +
		"Unnecessary cast from Foo to Bar<Object>\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 7)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=106466
public void test0852() {
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"public class X {\n" +
			"	<T extends Runnable, U extends T & Runnable>  T foo() { return null; }\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 2)\n" +
		"	<T extends Runnable, U extends T & Runnable>  T foo() { return null; }\n" +
		"	                                   ^^^^^^^^\n" +
		"Cannot specify any additional bound Runnable when first bound is a type parameter\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=112109
public void test0853() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<C extends I> {\n" +
			"	void test(java.util.List<C> list) { list.get(0).notify(null); }\n" +
			"}\n" +
			"interface I { Object notify(Object o); }",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=113236
public void test0854() {
	runConformTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"X.java",
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		Field field = new Field();\n" +
			"		Form form = new Form(field);\n" +
			"		String result = form.getField().toString();\n" +
			"		System.out.print(result);\n" +
			"	}\n" +
			"}",
			"Form.java",
			"public class Form {\n" +
			"	private final Field field;\n" +
			"	public Form(Field field) {\n" +
			"		this.field = field;\n" +
			"	}\n" +
			"	public <T extends Field> T getField() {\n" +
			"		return (T) field;\n" +
			"	}\n" +
			"}",
			"Field.java",
			"public class Field {\n" +
			"	@Override\n" +
			"	public String toString() {\n" +
			"		return \"SUCCESS\";\n" +
			"	}\n" +
			"}",
		},
		// compiler results
		null /* do not check compiler log */,
		// runtime results
		"SUCCESS" /* expected output string */,
		"" /* expected error string */,
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=113218
public void test0855() {
	runConformTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"X.java",
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		FieldManager manager = new FieldManagerImpl();\n" +
			"		FieldMeta<FieldImpl> meta = new FieldMeta<FieldImpl>(manager);\n" +
			"		Field<? extends Field> field = new FieldImpl(meta);\n" +
			"		FieldMeta<? extends Field> meta2 = field.getFieldMeta();\n" +
			"		System.out.print(meta2.getFieldManager() instanceof ExtFieldManager);\n" +
			"	}\n" +
			"}",
			"FieldMeta.java",
			"public class FieldMeta<F extends Field> {\n" +
			"	private final FieldManager<F> fieldManager;\n" +
			"	public FieldMeta(FieldManager<F> fieldManager) {\n" +
			"		this.fieldManager = fieldManager;\n" +
			"	}\n" +
			"	public <FB extends FieldManager<F>> FB getFieldManager() {\n" +
			"		return (FB) fieldManager;\n" +
			"	}\n" +
			"}",
			"FieldManagerImpl.java",
			"public class FieldManagerImpl extends FieldManager<FieldImpl> implements\n" +
			"	ExtFieldManager<FieldImpl> {\n" +
			"}",
			"FieldManager.java",
			"public abstract class FieldManager<F extends Field> {}",
			"FieldImpl.java",
			"public class FieldImpl extends Field<FieldImpl> {\n" +
			"	public FieldImpl(FieldMeta<FieldImpl> fieldMeta) {\n" +
			"		super(fieldMeta);\n" +
			"	}\n" +
			"}",
			"Field.java",
			"public class Field<F extends Field> {\n" +
			"	private final FieldManager<F> fieldManager;\n" +
			"	private final FieldMeta<F> fieldMeta;\n" +
			"	public FieldMeta<F> getFieldMeta() {\n" +
			"		return fieldMeta;\n" +
			"	}\n" +
			"	public Field(FieldMeta<F> fieldMeta) {\n" +
			"		this.fieldMeta = fieldMeta;\n" +
			"		this.fieldManager = fieldMeta.getFieldManager();\n" +
			"	}\n" +
			"	public FieldManager<F> getFieldManager() {\n" +
			"		return fieldManager;\n" +
			"	}\n" +
			"}",
			"ExtFieldManager.java",
			"public interface ExtFieldManager<F extends Field> {}"
		},
		// compiler results
		null /* do not check compiler log */,
		// runtime results
		"true" /* expected output string */,
		"" /* expected error string */,
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}
public void test0856() {
	runConformTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"X.java",
			"public class X {\n" +
			"	static class MX<T> {\n" +
			"		T t = null;\n" +
			"	}\n" +
			"	static <T> T getT() {\n" +
			"		return (new MX<T>()).t;\n" +
			"	}\n" +
			"	public static void test() {\n" +
			"		getT().getClass(); // error: java.lang.Object cannot be dereferenced\n" +
			"	}\n" +
			"\n" +
			"	public static void main(String[] args) {\n" +
			"		System.out.println(\"SUCCESS\");\n" +
			"	}\n" +
			"}\n",
		},
		// compiler results
		"" /* expected compiler log */,
		// runtime results
		"SUCCESS" /* expected output string */,
		"" /* expected error string */,
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=113070
public void test0857() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public <U, T extends U & Cloneable & Runnable> void m(T t) {\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 2)\n" +
		"	public <U, T extends U & Cloneable & Runnable> void m(T t) {\n" +
		"	                         ^^^^^^^^^\n" +
		"Cannot specify any additional bound Cloneable when first bound is a type parameter\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=113560
public void test0858() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface ExtCloneable extends Cloneable {\n" +
			"	public ExtCloneable clone( String arg) throws CloneNotSupportedException;\n" +
			"}\n" +
			"public class X {\n" +
			"	public static <V extends ExtCloneable> ExtCloneable cloneItem1( V value) throws CloneNotSupportedException {\n" +
			"		return value.clone( \"\");\n" +
			"	}\n" +
			"	public static <V extends ExtCloneable> ExtCloneable cloneItem2( ExtCloneable value) throws CloneNotSupportedException {\n" +
			"		return value.clone( \"\");\n" +
			"	}\n" +
			"	public static <V extends ExtCloneable> ExtCloneable cloneItem3( V value) throws CloneNotSupportedException {\n" +
			"		return ((ExtCloneable)value).clone( \"\");\n" +
			"	}\n" +
			"}",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=113710
public void test0859() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.awt.Graphics2D;\n" +
			"import java.awt.Shape;\n" +
			"public class X<V extends DrawObject> {\n" +
			"   /** Base object for wrapping */\n" +
			"   protected V draw;\n" +
			"   /**\n" +
			"    * Draw the object with its attached text\n" +
			"    * \n" +
			"    * @param graphics the graphics object to draw into\n" +
			"    */\n" +
			"   public void draw( Graphics2D graphics ) {\n" +
			"      draw.draw(graphics);\n" +
			"   }\n" +
			"}\n" +
			"abstract class DrawObject implements Drawable {\n" +
			"   protected void draw( Graphics2D graphics, Shape shape ) {\n" +
			"   }\n" +
			"}\n" +
			"interface Drawable {\n" +
			"   void draw( Graphics2D graphics );\n" +
			"}",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=114304
public void test0860() {
	this.runConformTest(
		new String[] {
			"A.java",
			"interface A {\n" +
			"    A.I foo();\n" +
			"    interface I { }\n" +
			"}\n" +
			"\n" +
			"interface B<T> extends A { }\n" +
			"\n" +
			"interface C extends B<Object> {\n" +
			"    C.J foo();\n" +
			"    interface J extends B.I { }\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=114304 - variation
public void test0861() {
	this.runConformTest(
		new String[] {
			"A.java",
			"interface A {\n" +
			"    A.I foo();\n" +
			"    interface I { }\n" +
			"}\n" +
			"\n" +
			"interface B<T> extends A { }\n" +
			"\n" +
			"interface C extends B<Object> {\n" +
			"    C.J foo();\n" +
			"    interface J extends A.I { }\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=114304 - variation
public void test0862() {
	this.runConformTest(
		new String[] {
			"A.java",
			"interface A {\n" +
			"    interface I { }\n" +
			"\n" +
			"    A.I foo();\n" +
			"}\n" +
			"\n" +
			"interface B<T> extends A { \n" +
			"    interface J extends B.I { }\n" +
			"}\n" +
			"\n" +
			"interface C extends B<Object> {\n" +
			"    C.J foo();\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=114304 - variation
public void test0863() {
	this.runConformTest(
		new String[] {
			"A.java",
			"interface A {\n" +
			"    interface I { }\n" +
			"\n" +
			"    A.I foo();\n" +
			"}\n" +
			"\n" +
			"interface B<T> extends A { \n" +
			"    interface J extends B.I { }\n" +
			"}\n" +
			"\n" +
			"interface C extends B<Object> {\n" +
			"    B.J foo();\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=114304 - variation
public void test0864() {
	this.runNegativeTest(
		new String[] {
			"A.java",
			"interface A {\n" +
			"    interface I<T> { }\n" +
			"\n" +
			"    A.I<Object> foo();\n" +
			"}\n" +
			"\n" +
			"interface B<T> extends A { \n" +
			"    interface J<E> extends B.I<E> { }\n" +
			"}\n" +
			"\n" +
			"interface C extends B<Object> {\n" +
			"    C.J<Object> foo();\n" +
			"    B<Object>.J<Object> bar();\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in A.java (at line 13)\n" +
		"	B<Object>.J<Object> bar();\n" +
		"	^^^^^^^^^^^\n" +
		"The member type B.J<E> cannot be qualified with a parameterized type, since it is static. Remove arguments from qualifying type B<Object>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=114304 - variation
public void test0865() {
	this.runConformTest(
		new String[] {
			"A.java",
			"class A {\n" +
			"    interface I { }\n" +
			"\n" +
			"    A.I foo() { return null; }\n" +
			"}\n" +
			"\n" +
			"class B<T> extends A { \n" +
			"    interface J extends B.I { }\n" +
			"}\n" +
			"\n" +
			"class C extends B<Object> {\n" +
			"	@Override\n" +
			"    C.J foo() { return (B.J)super.foo(); }\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=114997
public void test0866() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.Collections;\n" +
			"import java.util.List;\n" +
			"\n" +
			"public class X {\n" +
			"  public interface Interface {\n" +
			"	  // nothing\n" +
			"  }\n" +
			"  public List<? extends Interface> field = Collections.emptyList();\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=114087
// SHOULD FAIL AT 1.8 (RET): Type mismatch: cannot convert from List<Runnable> to List
public void test0867() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.List;\n" +
			"\n" +
			"class Foo {\n" +
			"\n" +
			"	static <T extends Runnable> List<List<T>> foo1() {\n" +
			"		return null;\n" +
			"	}\n" +
			"	static <T extends Runnable> void bar1(List<List<T>> l) {\n" +
			"	}\n" +
			"	static <T extends Runnable> List<T> foo2() {\n" +
			"		return null;\n" +
			"	}\n" +
			"	static <T extends Runnable> void bar2(List<T> l) {\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"public class X {\n" +
			"\n" +
			"	{\n" +
			"		List<List> o = Foo.foo1();\n" +
			"		Foo.bar1(o);\n" +
			"	}\n" +
			"	{\n" +
			"		List o = Foo.foo2();\n" +
			"		Foo.bar2(o);\n" +
			"	}\n" +
			"\n" +
			"}\n",
		},
		"----------\n" + 
		"1. WARNING in X.java (at line 20)\n" + 
		"	List<List> o = Foo.foo1();\n" + 
		"	     ^^^^\n" + 
		"List is a raw type. References to generic type List<E> should be parameterized\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 20)\n" + 
		(this.complianceLevel < ClassFileConstants.JDK1_8 ?
		"	List<List> o = Foo.foo1();\n" +
		"	                   ^^^^\n" + 
		"The method foo1() in the type Foo is not applicable for the arguments ()\n"
		:
		"	List<List> o = Foo.foo1();\n" +
		"	               ^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from List<List<Runnable>> to List<List>\n" // TODO(stephan) more specific error message
		)+ 
		"----------\n" + 
		"3. ERROR in X.java (at line 21)\n" + 
		"	Foo.bar1(o);\n" + 
		"	    ^^^^\n" + 
		"The method bar1(List<List<T>>) in the type Foo is not applicable for the arguments (List<List>)\n" + 
		"----------\n" + 
		"4. WARNING in X.java (at line 24)\n" + 
		"	List o = Foo.foo2();\n" + 
		"	^^^^\n" + 
		"List is a raw type. References to generic type List<E> should be parameterized\n" + 
		"----------\n" + 
		"5. WARNING in X.java (at line 25)\n" + 
		"	Foo.bar2(o);\n" + 
		"	^^^^^^^^^^^\n" + 
		"Type safety: Unchecked invocation bar2(List) of the generic method bar2(List<T>) of type Foo\n" + 
		"----------\n" + 
		"6. WARNING in X.java (at line 25)\n" + 
		"	Foo.bar2(o);\n" + 
		"	         ^\n" + 
		"Type safety: The expression of type List needs unchecked conversion to conform to List<Runnable>\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=114365
public void test0868() {
	Map options = getCompilerOptions();
	options.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.IGNORE);
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.Collection;\n" +
			"import java.util.Iterator;\n" +
			"import java.io.Serializable;\n" +
			"import java.lang.Cloneable;\n" +
			"public class X<A extends Collection & Serializable > implements Collection {\n" +
			"	public int size() {\n" +
			"		// TODO Auto-generated method stub\n" +
			"		return 0;\n" +
			"	}\n" +
			"	public boolean isEmpty() {\n" +
			"		// TODO Auto-generated method stub\n" +
			"		return false;\n" +
			"	}\n" +
			"	public boolean contains(Object arg0) {\n" +
			"		// TODO Auto-generated method stub\n" +
			"		return false;\n" +
			"	}\n" +
			"	public Iterator iterator() {\n" +
			"		// TODO Auto-generated method stub\n" +
			"		return null;\n" +
			"	}\n" +
			"	public Object[] toArray() {\n" +
			"		// TODO Auto-generated method stub\n" +
			"		return null;\n" +
			"	}\n" +
			"	public Object[] toArray(Object[] arg0) {\n" +
			"		// TODO Auto-generated method stub\n" +
			"		return null;\n" +
			"	}\n" +
			"	public boolean add(Object arg0) {\n" +
			"		// TODO Auto-generated method stub\n" +
			"		return false;\n" +
			"	}\n" +
			"	public boolean remove(Object arg0) {\n" +
			"		// TODO Auto-generated method stub\n" +
			"		return false;\n" +
			"	}\n" +
			"	public boolean containsAll(Collection arg0) {\n" +
			"		// TODO Auto-generated method stub\n" +
			"		return false;\n" +
			"	}\n" +
			"	public boolean addAll(Collection arg0) {\n" +
			"		// TODO Auto-generated method stub\n" +
			"		return false;\n" +
			"	}\n" +
			"	public boolean removeAll(Collection arg0) {\n" +
			"		// TODO Auto-generated method stub\n" +
			"		return false;\n" +
			"	}\n" +
			"	public boolean retainAll(Collection arg0) {\n" +
			"		// TODO Auto-generated method stub\n" +
			"		return false;\n" +
			"	}\n" +
			"	public void clear() {\n" +
			"		// TODO Auto-generated method stub\n" +
			"		\n" +
			"	}" +
			"}",
		},
		"",
		null,
		true,
		null,
		options,
		null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=115181
public void test0869() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.Comparator;\n" +
			"\n" +
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		Class<?> c = Comparator.class;\n" +
			"		Zork z;\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 6)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=113950
public void test0870() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.List;\n" +
			"\n" +
			"public class X {\n" +
			"	public interface I<T> {\n" +
			"	        public <S extends T> void foo(List<S> ls);\n" +
			"	}\n" +
			"\n" +
			"	public abstract class A<T> implements I<T> {\n" +
			"	        public <S extends T> void foo(List<S> ls) { }\n" +
			"	}\n" +
			"\n" +
			"	public class C<T> extends A<List<T>> { }\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=107788
public void test0871() {
	this.runConformTest(
		new String[] {
			"Lister.java",
			"interface Lister<BeanT, PropT, PackT> {\n" +
			"	void endPacking(PackT p, BeanT b, Accessor<BeanT, PropT> acc);\n" +
			"\n" +
			"	static class IDRefs<BeanT, PropT> implements\n" +
			"			Lister<BeanT, PropT, IDRefs<BeanT, PropT>.Pack> {\n" +
			"		public void endPacking(Pack p, BeanT b, Accessor<BeanT, PropT> acc) {\n" +
			"		}\n" +
			"\n" +
			"		private class Pack {\n" +
			"		}\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"class Accessor<BeanT, PropT> {\n" +
			"}\n",
		},
		"");
}
public void test0872() {
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"import java.io.PrintStream;\n" +
			"\n" +
			"public class X {\n" +
			"	public void foo1(){\n" +
			"		M1<X> m = new M1<X>();\n" +
			"		M1<X>.N1<X> n = m.new N1<X>();\n" +
			"	}\n" +
			"	static class M1<T> {\n" +
			"		class N1<U> {\n" +
			"		}\n" +
			"	}\n" +
			"	public void foo2(){\n" +
			"		M2<X> m = new M2<X>();\n" +
			"		M2<X>.N2<X> n = m.new N2<X>();\n" +
			"	}\n" +
			"	class M2<T> {\n" +
			"		class N2<U> {\n" +
			"		}\n" +
			"	}\n" +
			"	public void foo3(){\n" +
			"		M3<X> m = new M3<X>();\n" +
			"		M3<X>.N3<X> n = m.new N3<X>();\n" +
			"	}\n" +
			"	class M3<T> {\n" +
			"		static class N3<U> {\n" +
			"		}\n" +
			"	}\n" +
			"	public void foo4(){\n" +
			"		M4<X> m = new M4<X>();\n" +
			"		M4<X>.N4<X> n = m.new N4<X>();\n" +
			"	}\n" +
			"	static class M4<T> {\n" +
			"		static class N4<U> {\n" +
			"		}\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 22)\n" +
		"	M3<X>.N3<X> n = m.new N3<X>();\n" +
		"	^^^^^^^^\n" +
		"The member type X.M3.N3<U> cannot be qualified with a parameterized type, since it is static. Remove arguments from qualifying type X.M3<X>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 25)\n" +
		"	static class N3<U> {\n" +
		"	             ^^\n" +
		"The member type N3 cannot be declared static; static types can only be declared in static or top level types\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 30)\n" +
		"	M4<X>.N4<X> n = m.new N4<X>();\n" +
		"	^^^^^^^^\n" +
		"The member type X.M4.N4<U> cannot be qualified with a parameterized type, since it is static. Remove arguments from qualifying type X.M4<X>\n" +
		"----------\n");
}
public void test0873() {
	this.runConformTest(
		new String[] {
			"X.java", // =================
			"public class X<T> {\n" +
			"    static class XMap {\n" +
			"        XEntry[] table;\n" +
			"        static class XEntry {}    \n" +
			"        void foo() {\n" +
			"            XEntry e = table[0];\n" +
			"        }	\n" +
			"    }        \n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=115693
public void test0874() throws Exception {
	this.runConformTest(
		new String[] {
			"X.java", // =================
			"class A {}\n" +
			"abstract class B<T> {\n" +
			"    public B<T> label(String s) { return this; }\n" +
			"}\n" +
			"final class C extends B<A> {\n" +
			"    public static C instance(String s) { return new C(); }\n" +
			"    @Override public String toString() {\n" +
			"    	return \"SUCCESS\";\n" +
			"    }\n" +
			"}\n" +
			"public class X {\n" +
			"    public static void main(String[] args) {\n" +
			"        C c = (C)C.instance(\"X\").label(\"Y\");\n" +
			"        System.out.println(c.toString());\n" +
			"    }\n" +
			"}\n",
		},
		"SUCCESS");
	// 	ensure only one checkcast C
	String expectedOutput =
		"  // Method descriptor #15 ([Ljava/lang/String;)V\n" +
		"  // Stack: 2, Locals: 2\n" +
		"  public static void main(java.lang.String[] args);\n" +
		"     0  ldc <String \"X\"> [16]\n" +
		"     2  invokestatic C.instance(java.lang.String) : C [17]\n" +
		"     5  ldc <String \"Y\"> [23]\n" +
		"     7  invokevirtual C.label(java.lang.String) : B [25]\n" +
		"    10  checkcast C [18]\n" +
		"    13  astore_1 [c]\n" +
		"    14  getstatic java.lang.System.out : java.io.PrintStream [29]\n" +
		"    17  aload_1 [c]\n" +
		"    18  invokevirtual C.toString() : java.lang.String [35]\n" +
		"    21  invokevirtual java.io.PrintStream.println(java.lang.String) : void [39]\n" +
		"    24  return\n" +
		"      Line numbers:\n" +
		"        [pc: 0, line: 13]\n" +
		"        [pc: 14, line: 14]\n" +
		"        [pc: 24, line: 15]\n" +
		"      Local variable table:\n" +
		"        [pc: 0, pc: 25] local: args index: 0 type: java.lang.String[]\n" +
		"        [pc: 14, pc: 25] local: c index: 1 type: C\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=119395
public void test0875() {
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"import java.util.*;\n" +
			"public class X {\n" +
			"\n" +
			"	public static class DatabaseObject {}\n" +
			"	public static class ObjectFormUI<T extends DatabaseObject> {}\n" +
			"	private static final Map<Class<? extends DatabaseObject>, Class<? extends ObjectFormUI>> uiMap = new HashMap<Class<? extends DatabaseObject>, Class<? extends ObjectFormUI>>();\n" +
			"\n" +
			"	public static <T extends DatabaseObject> Class<? extends ObjectFormUI<T>> getUI(\n" +
			"			Class<T> persistentClass) {\n" +
			"		return null != null \n" +
			"			? uiMap.get(persistentClass)\n" +
			"			: (Class<? extends ObjectFormUI<T>>) uiMap.get(persistentClass);\n" +
			"	}\n" +
			"}\n",
		},
		this.complianceLevel < ClassFileConstants.JDK1_8 ? 
			"----------\n" +
			"1. WARNING in X.java (at line 6)\n" +
			"	private static final Map<Class<? extends DatabaseObject>, Class<? extends ObjectFormUI>> uiMap = new HashMap<Class<? extends DatabaseObject>, Class<? extends ObjectFormUI>>();\n" +
			"	                                                                          ^^^^^^^^^^^^\n" +
			"X.ObjectFormUI is a raw type. References to generic type X.ObjectFormUI<T> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 6)\n" +
			"	private static final Map<Class<? extends DatabaseObject>, Class<? extends ObjectFormUI>> uiMap = new HashMap<Class<? extends DatabaseObject>, Class<? extends ObjectFormUI>>();\n" +
			"	                                                                                                                                                              ^^^^^^^^^^^^\n" +
			"X.ObjectFormUI is a raw type. References to generic type X.ObjectFormUI<T> should be parameterized\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 10)\n" +
			"	return null != null \n" +
			"			? uiMap.get(persistentClass)\n" +
			"			: (Class<? extends ObjectFormUI<T>>) uiMap.get(persistentClass);\n" +
			"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Class<capture#4-of ? extends X.ObjectFormUI> to Class<? extends X.ObjectFormUI<T>>\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 12)\n" +
			"	: (Class<? extends ObjectFormUI<T>>) uiMap.get(persistentClass);\n" +
			"	  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from Class<capture#2-of ? extends X.ObjectFormUI> to Class<? extends X.ObjectFormUI<T>>\n" +
			"----------\n" : 
				"----------\n" + 
				"1. WARNING in X.java (at line 6)\n" + 
				"	private static final Map<Class<? extends DatabaseObject>, Class<? extends ObjectFormUI>> uiMap = new HashMap<Class<? extends DatabaseObject>, Class<? extends ObjectFormUI>>();\n" + 
				"	                                                                          ^^^^^^^^^^^^\n" + 
				"X.ObjectFormUI is a raw type. References to generic type X.ObjectFormUI<T> should be parameterized\n" + 
				"----------\n" + 
				"2. WARNING in X.java (at line 6)\n" + 
				"	private static final Map<Class<? extends DatabaseObject>, Class<? extends ObjectFormUI>> uiMap = new HashMap<Class<? extends DatabaseObject>, Class<? extends ObjectFormUI>>();\n" + 
				"	                                                                                                                                                              ^^^^^^^^^^^^\n" + 
				"X.ObjectFormUI is a raw type. References to generic type X.ObjectFormUI<T> should be parameterized\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 11)\n" + 
				"	? uiMap.get(persistentClass)\n" + 
				"	  ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Type mismatch: cannot convert from Class<capture#1-of ? extends X.ObjectFormUI> to Class<? extends X.ObjectFormUI<T>>\n" + 
				"----------\n" + 
				"4. WARNING in X.java (at line 12)\n" + 
				"	: (Class<? extends ObjectFormUI<T>>) uiMap.get(persistentClass);\n" + 
				"	  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Type safety: Unchecked cast from Class<capture#2-of ? extends X.ObjectFormUI> to Class<? extends X.ObjectFormUI<T>>\n" + 
				"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=119395 - variation
public void test0876() {
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"import java.util.*;\n" +
			"public class X {\n" +
			"	void foo(){\n" +
			"		Class<Class<Object>> cco = null;\n" +
			"		Class<Class> cc = cco; // ko\n" +
			"		Class<Class<Object>> cco2 = cc; // ko\n" +
			"		\n" +
			"		Class<? extends Class<Object>> ceco = null;\n" +
			"		Class<? extends Class> cec = ceco; // ok\n" +
			"		Class<? extends Class<Object>> ceco2 = cec; // ko\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 5)\n" +
		"	Class<Class> cc = cco; // ko\n" +
		"	      ^^^^^\n" +
		"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 5)\n" +
		"	Class<Class> cc = cco; // ko\n" +
		"	                  ^^^\n" +
		"Type mismatch: cannot convert from Class<Class<Object>> to Class<Class>\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 6)\n" +
		"	Class<Class<Object>> cco2 = cc; // ko\n" +
		"	                            ^^\n" +
		"Type mismatch: cannot convert from Class<Class> to Class<Class<Object>>\n" +
		"----------\n" +
		"4. WARNING in X.java (at line 9)\n" +
		"	Class<? extends Class> cec = ceco; // ok\n" +
		"	                ^^^^^\n" +
		"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
		"----------\n" +
		"5. ERROR in X.java (at line 10)\n" +
		"	Class<? extends Class<Object>> ceco2 = cec; // ko\n" +
		"	                                       ^^^\n" +
		"Type mismatch: cannot convert from Class<capture#2-of ? extends Class> to Class<? extends Class<Object>>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=119395 - variation
public void test0877() {
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"import java.util.*;\n" +
			"public class X {\n" +
			"	<T extends Class> void bar(T t) {\n" +
			"		Class<Object> c = t; // ok - unchecked\n" +
			"	}\n" +
			"	<T extends Class> void bar2(List<? extends T> let) {\n" +
			"		Class<Object> c = let.get(0); // ok - unchecked\n" +
			"	}\n" +
			"	void bar3(List<? extends Class> lec) {\n" +
			"		Class<Object> c = lec.get(0); // ok - unchecked\n" +
			"	}\n" +
			"	Zork z;\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 3)\n" +
		"	<T extends Class> void bar(T t) {\n" +
		"	           ^^^^^\n" +
		"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 3)\n" +
		"	<T extends Class> void bar(T t) {\n" +
		"	           ^^^^^\n" +
		"The type parameter T should not be bounded by the final type Class. Final types cannot be further extended\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 4)\n" +
		"	Class<Object> c = t; // ok - unchecked\n" +
		"	                  ^\n" +
		"Type safety: The expression of type T needs unchecked conversion to conform to Class<Object>\n" +
		"----------\n" +
		"4. WARNING in X.java (at line 6)\n" +
		"	<T extends Class> void bar2(List<? extends T> let) {\n" +
		"	           ^^^^^\n" +
		"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
		"----------\n" +
		"5. WARNING in X.java (at line 6)\n" +
		"	<T extends Class> void bar2(List<? extends T> let) {\n" +
		"	           ^^^^^\n" +
		"The type parameter T should not be bounded by the final type Class. Final types cannot be further extended\n" +
		"----------\n" +
		"6. WARNING in X.java (at line 7)\n" +
		"	Class<Object> c = let.get(0); // ok - unchecked\n" +
		"	                  ^^^^^^^^^^\n" +
		"Type safety: The expression of type capture#1-of ? extends T needs unchecked conversion to conform to Class<Object>\n" +
		"----------\n" +
		"7. WARNING in X.java (at line 9)\n" +
		"	void bar3(List<? extends Class> lec) {\n" +
		"	                         ^^^^^\n" +
		"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
		"----------\n" +
		"8. WARNING in X.java (at line 10)\n" +
		"	Class<Object> c = lec.get(0); // ok - unchecked\n" +
		"	                  ^^^^^^^^^^\n" +
		"Type safety: The expression of type capture#2-of ? extends Class needs unchecked conversion to conform to Class<Object>\n" +
		"----------\n" +
		"9. ERROR in X.java (at line 12)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=115693 - variation
public void test0878() throws Exception {
	this.runConformTest(
		new String[] {
			"X.java", // =================
			"class A {}\n" +
			"class D extends A {}\n" +
			"abstract class B<T> {\n" +
			"    public T label(String s) { return null; }\n" +
			"}\n" +
			"final class C extends B<A> {\n" +
			"    public static C instance(String s) { return new C(); }\n" +
			"    @Override public String toString() {\n" +
			"    	return \"SUCCESS\"; \n" +
			"    }\n" +
			"}\n" +
			"public class X {\n" +
			"    public static void main(String[] args) {\n" +
			"        D d = (D)C.instance(\"X\").label(\"Y\");\n" +
			"        System.out.println(d);\n" +
			"    }\n" +
			"}\n",
		},
		"null");
	// 	ensure only one checkcast D
	String expectedOutput =
		"  // Method descriptor #15 ([Ljava/lang/String;)V\n" +
		"  // Stack: 2, Locals: 2\n" +
		"  public static void main(java.lang.String[] args);\n" +
		"     0  ldc <String \"X\"> [16]\n" +
		"     2  invokestatic C.instance(java.lang.String) : C [17]\n" +
		"     5  ldc <String \"Y\"> [23]\n" +
		"     7  invokevirtual C.label(java.lang.String) : java.lang.Object [25]\n" +
		"    10  checkcast D [29]\n" +
		"    13  astore_1 [d]\n" +
		"    14  getstatic java.lang.System.out : java.io.PrintStream [31]\n" +
		"    17  aload_1 [d]\n" +
		"    18  invokevirtual java.io.PrintStream.println(java.lang.Object) : void [37]\n" +
		"    21  return\n" +
		"      Line numbers:\n" +
		"        [pc: 0, line: 14]\n" +
		"        [pc: 14, line: 15]\n" +
		"        [pc: 21, line: 16]\n" +
		"      Local variable table:\n" +
		"        [pc: 0, pc: 22] local: args index: 0 type: java.lang.String[]\n" +
		"        [pc: 14, pc: 22] local: d index: 1 type: D\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=122610
public void test0879() {
	this.runConformTest(
		new String[] {
			"X.java", // =================
			"public class X<V, R> {\n" +
			"\n" +
			"    private class InnerClass1 {\n" +
			"            void foo() {\n" +
			"                    X<V, R> c = X.this;\n" +
			"            }\n" +
			"    }\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=121369
public void test0880() {
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"class Foo {\n" +
			"	static <T, U extends java.util.List<T>> U foo() {\n" +
			"		return null;\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"public class X {\n" +
			"	{\n" +
			"		String s = (String) Foo.foo();\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 9)\n" +
		"	String s = (String) Foo.foo();\n" +
		"	           ^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from List<Object> to String\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=121369 - variation
public void test0881() {
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"class Foo {\n" +
			"	static <T, U extends java.util.List<U>> U foo() {\n" +
			"		return null;\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"public class X {\n" +
			"	{\n" +
			"		String s = (String) Foo.foo();\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 9)\n" +
		"	String s = (String) Foo.foo();\n" +
		"	           ^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from List<List<U>> to String\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=121369 - variation
public void test0882() {
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"import java.util.List;\n" +
			"\n" +
			"public class X {\n" +
			"	static <U extends List<U>> U foo(U u) {\n" +
			"		String s = (String) foo(u);\n" +
			"		return u;\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	String s = (String) foo(u);\n" +
		"	           ^^^^^^^^^^^^^^^\n" +
		"Cannot cast from U to String\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=121369 - variation
public void test0883() {
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"import java.util.List;\n" +
			"\n" +
			"public class X {\n" +
			"	static <U extends List<U>> U foo(U u) {\n" +
			"		List<U> listu = null;\n" +
			"		String s = (String)foo(listu);\n" +
			"		return u;\n" +
			"	}\n" +
			"	static <V extends List<V>> V bar(V v) {\n" +
			"		List<V> listv = null;\n" +
			"		String s = (String)foo(listv);\n" +
			"		return v;\n" +
			"	}\n" +
			"}\n",
		},
		(this.complianceLevel < ClassFileConstants.JDK1_8 ?
		"----------\n" +
		"1. ERROR in X.java (at line 6)\n" +
		"	String s = (String)foo(listu);\n" +
		"	           ^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from List<U> to String\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 6)\n" +
		"	String s = (String)foo(listu);\n" +
		"	                   ^^^\n" +
		"Bound mismatch: The generic method foo(U) of type X is not applicable for the arguments (List<U>). The inferred type List<U> is not a valid substitute for the bounded parameter <U extends List<U>>\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 11)\n" +
		"	String s = (String)foo(listv);\n" +
		"	           ^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from List<V> to String\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 11)\n" +
		"	String s = (String)foo(listv);\n" +
		"	                   ^^^\n" +
		"Bound mismatch: The generic method foo(U) of type X is not applicable for the arguments (List<V>). The inferred type List<V> is not a valid substitute for the bounded parameter <U extends List<U>>\n" +
		"----------\n"
		:
			"----------\n" + 
			"1. ERROR in X.java (at line 6)\n" + 
			"	String s = (String)foo(listu);\n" + 
			"	                   ^^^\n" + 
			"The method foo(U) in the type X is not applicable for the arguments (List<U>)\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 11)\n" + 
			"	String s = (String)foo(listv);\n" + 
			"	                   ^^^\n" + 
			"The method foo(U) in the type X is not applicable for the arguments (List<V>)\n" + 
			"----------\n" ));
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=123078
// SHOULD FAIL AT 1.8 (18.2.3): The method getDefault(Class<T>) in the type X<C> is not applicable for the arguments (Class<capture#2-of ? extends X>)
public void test0884() {
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"public abstract class X<C extends X<C>> {\n" +
			"	public static <T extends X<T>> T getDefault(Class<T> clz) {\n" +
			"		return null;\n" +
			"	}\n" +
			"\n" +
			"	public Object getDefault() {\n" +
			"		String s = getClass();\n" +
			"		return (String) getDefault(getClass());\n" +
			"	}\n" +
			"}\n" ,
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	String s = getClass();\n" + 
		"	           ^^^^^^^^^^\n" + 
		"Type mismatch: cannot convert from Class<capture#1-of ? extends X> to String\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 8)\n" + 
		"	return (String) getDefault(getClass());\n" + 
		"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Cannot cast from X to String\n" + 
		"----------\n" + 
		"3. WARNING in X.java (at line 8)\n" + 
		"	return (String) getDefault(getClass());\n" + 
		"	                ^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: Unchecked invocation getDefault(Class<capture#2-of ? extends X>) of the generic method getDefault(Class<T>) of type X<C>\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=125445
public void test0885() {
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"public class X {\n" +
			"	public static <C extends Number, A extends C & Comparable<C>> int m(\n" +
			"			A comparableNumberObj) {\n" +
			"		return comparableNumberObj.compareTo(comparableNumberObj);\n" +
			"	}\n" +
			"}\n" ,
		},
		"----------\n" +
		"1. ERROR in X.java (at line 2)\n" +
		"	public static <C extends Number, A extends C & Comparable<C>> int m(\n" +
		"	                                               ^^^^^^^^^^\n" +
		"Cannot specify any additional bound Comparable<C> when first bound is a type parameter\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=124943
public void test0886() {
	Map customOptions= getCompilerOptions();
	customOptions.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_4);
	runConformTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"X.java", // =================
			"public class X {\n" +
			"	void test() {\n" +
			"		\"Hello\".compareTo((Object) \"Hello\");\n" +
			"	}\n" +
			"}\n" ,
		},
		// compiler options
		null /* no class libraries */,
		customOptions /* custom options */,
		// compiler results
		"" /* expected compiler log */,
		// runtime results
		"" /* expected output string */,
		null /* do not check error string */,
		// javac options
		new JavacTestOptions("-source 1.4 -Xlint:-options") /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=122775
public void test0887() {
	this.runNegativeTest(
		new String[] {
			"Bar.java", // =================
			"class Foo<T> {}\n" +
			"public class Bar<X extends Foo<Foo<? super X>>>{\n" +
			"    Bar(X x){\n" +
			"        Foo<? super X> f = x;\n" +
			"    }\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in Bar.java (at line 4)\n" +
		"	Foo<? super X> f = x;\n" +
		"	                   ^\n" +
		"Type mismatch: cannot convert from X to Foo<? super X>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=122775 - variation
public void test0888() {
	this.runNegativeTest(
		new String[] {
			"Bar.java", // =================
			"class Foo<T> {}\n" +
			"public class Bar<X extends Foo<Foo<? super X>>>{\n" +
			"    Bar(X x){\n" +
			"        Foo<? extends X> f = x;\n" +
			"    }\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in Bar.java (at line 4)\n" +
		"	Foo<? extends X> f = x;\n" +
		"	                     ^\n" +
		"Type mismatch: cannot convert from X to Foo<? extends X>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=122775 - variation
public void test0889() {
	this.runConformTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"Test.java", // =================
			"import java.util.*;\n" +
			"\n" +
			"class Group<E extends Comparable<? super E>> extends ArrayList<E> implements\n" +
			"		Comparable<Group<? extends E>> {\n" +
			"	public int compareTo(Group<? extends E> o) {\n" +
			"		return 0;\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"class Sequence<E extends Comparable<? super E>> extends TreeSet<E> implements\n" +
			"		Comparable<Sequence<? extends E>> {\n" +
			"	public int compareTo(Sequence<? extends E> o) {\n" +
			"		return 0;\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"class Test<T extends Comparable<? super T>> {\n" +
			"	<C extends Collection<T>> void foo(SortedSet<? extends C> setToCheck,\n" +
			"			SortedSet<? extends C> validSet) {\n" +
			"	}\n" +
			"\n" +
			"	public void containsCombination(SortedSet<Group<T>> groups,\n" +
			"			SortedSet<Sequence<T>> sequences) {\n" +
			"		foo(groups, sequences);\n" +
			"	}\n" +
			"}\n",
		},
		// compiler results
		null /* do not check compiler log */,
		// runtime results
		"" /* expected output string */,
		"" /* expected error string */,
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=122775 - variation
public void test0890() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"Simple.java", // =================
			"class A<T extends A<T>> {}\n" +
			"class B extends A<B> {}\n" +
			"class C extends B {}\n" +
			"class D<T> {}\n" +
			"\n" +
			"public class Simple {\n" +
			"	<T extends A<T>, S extends T> D<T> m(S s) {\n" +
			"		C c = null;\n" +
			"		D<B> d = m(c);\n" +
			"		return null;\n" +
			"	}\n" +
			"}\n",
		},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_7 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=122775 - variation
public void test0891() {
	String xSource =
			"interface Function<A, B> {\n" +
			"	B apply(A x);\n" +
			"}\n" +
			"class Id<A> implements Function<A, A> {\n" +
			"	public A apply(A x) {\n" +
			"		return x;\n" +
			"	}\n" +
			"}\n" +
			"class Test {\n" +
			"	<A> Id<A> identity() {\n" +
			"		return new Id<A>();\n" +
			"	}\n" +
			"\n" +
			"	<B> B applyToString(Function<String, B> f) {\n" +
			"		return f.apply(\"abc\");\n" +
			"	}\n" +
			"	void test() {\n" +
			"		String s = applyToString(identity());\n" +
			"	}\n" +
			"}\n";
	if (this.complianceLevel < ClassFileConstants.JDK1_8) {
		this.runNegativeTest(
			new String[] {
				"Test.java",
				xSource
			},
			"----------\n" +
			"1. ERROR in Test.java (at line 18)\n" +
			"	String s = applyToString(identity());\n" +
			"	           ^^^^^^^^^^^^^\n" +
			"The method applyToString(Function<String,B>) in the type Test is not applicable for the arguments (Id<Object>)\n" +
			"----------\n");
	} else {
		runConformTest(
			new String[] {
				"Test.java",
				xSource
			});
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=126180
public void test0892() {
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		C2 c2 = null;\n" +
			"		C3 c3 = null;\n" +
			"		Object oc1 = m1(c2, c3).new C1Member();\n" +
			"	}\n" +
			"\n" +
			"	public static <T> T m1(T t1, T t2) {\n" +
			"		return null;\n" +
			"	}\n" +
			"\n" +
			"	class C1 {}\n" +
			"	interface I1 {}\n" +
			"	class C2 extends C1 implements I1 {}\n" +
			"	class C3 extends C1 implements I1 {\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	Object oc1 = m1(c2, c3).new C1Member();\n" +
		"	                            ^^^^^^^^\n" +
		intersection("X.C1","X.I1.C1Member")+" cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=126177
public void test0893() {
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"public class X {\n" +
			"	static String foo;\n" +
			"\n" +
			"	public static void main(String[] args) {\n" +
			"		C2 c2 = null;\n" +
			"		C3 c3 = null;\n" +
			"		// method access\n" +
			"		m1(c2, c3).c1m1();\n" +
			"		m1(c2, c3).i1m1();\n" +
			"		m1(c2, c3).i2m1();\n" +
			"\n" +
			"		// field access\n" +
			"		int ic1 = m1(c2, c3).c1f1;\n" +
			"		int ii1 = m1(c2, c3).i1f1;\n" +
			"		int ii2 = m1(c2, c3).i2f1;\n" +
			"	\n" +
			"		// member type access\n" +
			"		Object oc1 = m1(c2, c3).new C1Member();\n" +
			"		Object oi1 = m1(c2, c3).new I1Member(); \n" +
			"		Object oi2 = m1(c2, c3).new I2Member();\n" +
			"	}\n" +
			"\n" +
			"	public static <T> T m1(T t1, T t2) {\n" +
			"		return null;\n" +
			"	}\n" +
			"\n" +
			"	class C1 {\n" +
			"		void c1m1() {}\n" +
			"		int c1f1 = 0;\n" +
			"		class C1Member {}\n" +
			"	}\n" +
			"\n" +
			"	interface I1 {\n" +
			"		void i1m1();\n" +
			"		int i1f1 = 1;\n" +
			"		class I1Member {}\n" +
			"	}\n" +
			"\n" +
			"	interface I2 {\n" +
			"		void i2m1();\n" +
			"		int i2f1 = 2;\n" +
			"		class I2Member {}\n" +
			"	}\n" +
			"\n" +
			"	class C2 extends C1 implements I1, I2 {\n" +
			"		public void i1m1() {\n" +
			"		}\n" +
			"		public void i2m1() {\n" +
			"		}\n" +
			"	}\n" +
			"\n" +
			"	class C3 extends C1 implements I1, I2 {\n" +
			"		public void i1m1() {\n" +
			"		}\n" +
			"		public void i2m1() {\n" +
			"		}\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 14)\n" +
		"	int ii1 = m1(c2, c3).i1f1;\n" +
		"	                     ^^^^\n" +
		"The static field X.I1.i1f1 should be accessed in a static way\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 15)\n" +
		"	int ii2 = m1(c2, c3).i2f1;\n" +
		"	                     ^^^^\n" +
		"The static field X.I2.i2f1 should be accessed in a static way\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 19)\n" +
		"	Object oi1 = m1(c2, c3).new I1Member(); \n" +
		"	             ^^^^^^^^^^\n" +
		"Illegal enclosing instance specification for type X.I1.I1Member\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 20)\n" +
		"	Object oi2 = m1(c2, c3).new I2Member();\n" +
		"	             ^^^^^^^^^^\n" +
		"Illegal enclosing instance specification for type X.I2.I2Member\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=126177 - variation
public void test0894() {
	runConformTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"X.java", // =================
			"public class X {\n" +
			"        static class C1 {\n" +
			"                void c1m1() {\n" +
			"                        System.out.print(\"[c1m1]\");\n" +
			"                }\n" +
			"        }\n" +
			"        static interface I {}\n" +
			"        static class C2 extends C1 implements I {}\n" +
			"        static class C3 extends C1 implements I {}\n" +
			"\n" +
			"        public <T> T m1(T t1, T t2) {\n" +
			"                return t1;\n" +
			"        }\n" +
			"\n" +
			"        public <T extends C1 & I> void test(C2 c2, C3 c3, T t) {\n" +
			"                m1(c2, c3).c1m1(); // 1\n" +
			"                t.c1m1(); // 2\n" +
			"                (t != null ? c2 : c3).c1m1(); // 3\n" +
			"        }\n" +
			"\n" +
			"        public static void main(String... args) {\n" +
			"                X x = new X();\n" +
			"                x.test(new C2(), new C3(), new C2()); // 4\n" +
			"                System.out.println();\n" +
			"        }\n" +
			"}\n",
		},
		// compiler results
		"" /* expected compiler log */,
		// runtime results
		"[c1m1][c1m1][c1m1]" /* expected output string */,
		"" /* expected error string */,
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}
public void test0895() {
	if (this.complianceLevel < ClassFileConstants.JDK1_7) {
		this.runNegativeTest(
			new String[] {
				"X.java", // =================
				"interface I {}\n" +
				"public class X {\n" +
				"    Object o = new <Object> I() {};\n" +
				"}\n" ,
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	Object o = new <Object> I() {};\n" +
			"	           ^^^^^^^^^^^^^^^^^^^\n" +
			"The constructor Object() of type Object is not generic; it cannot be parameterized with arguments <Object>\n" +
			"----------\n");
		return;
	}
	this.runNegativeTest(
			new String[] {
				"X.java", // =================
				"interface I {}\n" +
				"public class X {\n" +
				"    Object o = new <Object> I() {};\n" +
				"}\n" ,
				"Y.java",
				"class Y extends Zork {}\n",
			},
			"----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	Object o = new <Object> I() {};\n" +
			"	                ^^^^^^\n" +
			"Unused type arguments for the non generic constructor Object() of type Object; it should not be parameterized with arguments <Object>\n" +
			"----------\n" +
			"----------\n" +
			"1. ERROR in Y.java (at line 1)\n" +
			"	class Y extends Zork {}\n" +
			"	                ^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
}
public void test0896() {
	runConformTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"X.java", // =================
			"public class X {\n" +
			"	interface I {		void f(); 	}\n" +
			"	interface J {		void g(); }\n" +
			"\n" +
			"	static class A implements I, J {\n" +
			"		public void f() {	System.out.print(\"[A#f()]\");}\n" +
			"		public void g() {	System.out.print(\"[A#g()]\");}\n" +
			"	}\n" +
			"\n" +
			"	static class B implements J, I {\n" +
			"		public void f() {	System.out.print(\"[B#f()]\");}\n" +
			"		public void g() {	System.out.print(\"[B#g()]\");}\n" +
			"	}\n" +
			"\n" +
			"	public static void main(String[] args) {\n" +
			"		f(true, new A(), new B());\n" +
			"		f(false, new A(), new B());\n" +
			"		System.out.println();\n" +
			"	}\n" +
			"\n" +
			"	static void f(boolean cond, A a, B b) {\n" +
			"		(cond ? a : b).f();\n" +
			"		(cond ? a : b).g();\n" +
			"	}\n" +
			"}\n",
		},
		// compiler results
		"" /* expected compiler log */,
		// runtime results
		"[A#f()][A#g()][B#f()][B#g()]" /* expected output string */,
		"" /* expected error string */,
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}
public void test0897() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"Test.java", // =================
			"interface I { }\n" +
			"class X { }\n" +
			"class A extends X implements I { }\n" +
			"class B extends X implements I { }\n" +
			"public class Test {\n" +
			"    void test(A a, B b) {\n" +
			"	X x = (a.hashCode() == b.hashCode()) ? a : b;\n" +
			"    }\n" +
			"}\n" +
			"\n",
		},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}
public void test0898() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java", // =================
			"interface I1 {\n" +
			"	void i1();\n" +
			"}\n" +
			"class G1<T extends I1> {\n" +
			"	T get() {\n" +
			"		return null;\n" +
			"	}\n" +
			"}\n" +
			"interface I2 {\n" +
			"	void i2();\n" +
			"}\n" +
			"public class X {\n" +
			"	void f1(G1<?> g1) {\n" +
			"		g1.get().i1();\n" +
			"	}\n" +
			"	void f2(G1<? extends I2> g1) {\n" +
			"		g1.get().i1();\n" +
			"		g1.get().i2();\n" +
			"	}\n" +
			"}\n",
		},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=122331
public void test0899() {
	this.runConformTest(
		new String[] {
			"A.java", // =================
			"public class A<T extends A<T>> extends SomeArbitraryClass<T> {\n" +
			"  public static class B {\n" +
			"    private C c;\n" +
			"    protected void set(C val) {\n" +
			"      c = val;\n" +
			"    }\n" +
			"    protected class C {\n" +
			"    }\n" +
			"  }\n" +
			"}",
			"C.java",
			"public class C {\n" +
			"  \n" +
			"  public C() {\n" +
			"    //do nothing\n" +
			"  }\n" +
			"  \n" +
			"}",
			"ObjThatExtendsB.java",
			"public class ObjThatExtendsB extends A.B {\n" +
			"  protected void doSomeSetting() {\n" +
			"    super.set(new ObjThatExtendsC());\n" +
			"  }\n" +
			"  protected class ObjThatExtendsC extends C {\n" +
			"  }\n" +
			"}",
			"ObjThatExtendsC.java",
			"public class ObjThatExtendsC extends C {\n" +
			"  public ObjThatExtendsC() {\n" +
			"    //do nothing\n" +
			"  }\n" +
			"}",
			"SomeArbitraryClass.java",
			"public class SomeArbitraryClass<T extends SomeArbitraryClass<T>> {\n" +
			"  public SomeArbitraryClass() {\n" +
			"    //do nothing\n" +
			"  }\n" +
			"}"
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=97693
public void test0900() {
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"public class X<R> {\n" +
			"	static interface Interface extends Comparable<String> {}\n" +
			"\n" +
			"	static final class Implements implements Interface {\n" +
			"		public int compareTo(String o) {\n" +
			"			return 0;\n" +
			"		}\n" +
			"	}\n" +
			"\n" +
			"	void method() {\n" +
			"		((Comparable<R>) new Implements()).toString();\n" +
			"		((Comparable) new Implements()).toString();\n" +
			"		((Comparable<?>) new Implements()).toString();\n" +
			"		((Comparable<? extends String>) new Implements()).toString();\n" +
			"		((Comparable<? super String>) new Implements()).toString();\n" +
			"		Zork z;\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 11)\n" +
		"	((Comparable<R>) new Implements()).toString();\n" +
		"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from X.Implements to Comparable<R>\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 12)\n" +
		"	((Comparable) new Implements()).toString();\n" +
		"	  ^^^^^^^^^^\n" +
		"Comparable is a raw type. References to generic type Comparable<T> should be parameterized\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 16)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
// Object array vs Object into generic method
public void test0901() {
	runNegativeTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"public class X {\n" +
			"    static <T> T foo(T p1, T p2) {\n" +
			"        return p1;\n" +
			"    }\n" +
			"    static Object[] bar(int[] i, float[] f) {\n" +
			"        return foo(i, f);\n" +
			"    }\n" +
			"}"},
		"----------\n" +
		"1. ERROR in X.java (at line 6)\n" +
		"	return foo(i, f);\n" +
		"	       ^^^^^^^^^\n" +
		"Type mismatch: cannot convert from "+intersection("Object","Serializable","Cloneable")+" to Object[]\n" +
		"----------\n",
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}

// circular references amongst generic interfaces with co-implementing classes
public void test0902() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"I.java",
			"public interface I<U extends J<? extends I<U>>> {\n" +
			"}",
			"J.java",
			"public interface J<T extends I<? extends J<T>>> {\n" +
			"}",
			"CI.java",
			"class CI<U extends CJ<T, U> & J<T>,\n" +
			"			T extends CI<U, T> & I<U>>\n" +
			"	implements I<U> {\n" +
			"}",
			"CJ.java",
			"class CJ<T extends CI<U, T> & I<U>,\n" +
			"			U extends CJ<T, U> & J<T>>\n" +
			"	implements J<T> {\n" +
			"}"},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}

// https://bugs.eclipse.org/bugs/show_bug.cgi?id=126914
public void test0903() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I<T extends J<T,U>, U extends I<T,U>> {\n" +
			"    // empty\n" +
			"}\n" +
			"interface J<T extends J<T,U>, U extends I<T,U>> {\n" +
			"    // empty\n" +
			"}\n" +
			"final class Y<T, U> extends X<T, U> implements I<X<T, U>, Y<T, U>> {\n" +
			"    // empty\n" +
			"}\n" +
			"abstract class X<T, U> implements J<X<T, U>, Y<T, U>> {\n" +
			"    // empty\n" +
			"}\n"
			},
		"");
}

// https://bugs.eclipse.org/bugs/show_bug.cgi?id=126914
public void test0904() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"interface I<T extends J<T,U>, U extends I<T,U>> {\n" +
			"    // empty\n" +
			"}\n" +
			"interface J<T extends J<T,U>, U extends I<T,U>> {\n" +
			"    // empty\n" +
			"}\n" +
			"abstract class X<T, U> implements J<X<T, U>, Y<T, U>> {\n" +
			"    // empty\n" +
			"}\n" +
			"final class Y<T, U> extends X<T, U> implements I<X<T, U>, Y<T, U>> {\n" +
			"    // empty\n" +
			"}\n"
			},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}

// array in super bound
public void test0905() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"import java.util.List;\n" +
			" \n" +
			"class X {\n" +
			"    void foo(List<? super Object[]> p) {\n" +
			"        p.add(new Object[0]);\n" +
			"    }\n" +
			"}"},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}

// raw types in casts
public void test0906() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface I<V> {\n" +
			"    // empty\n" +
			"}         \n" +
			"public class X implements I {\n" +
			"    I<Integer> x1 = (I<Integer>) (X) null;\n" +
			"    I<Integer> x2 = (I<Integer>) new X();\n" +
			"    I<Integer> x3 = (I<Integer>) null;\n" +
			"    X x4 = (X) (I<Integer>) null;\n" +
			"}"},
			"----------\n" +
			"1. WARNING in X.java (at line 4)\n" +
			"	public class X implements I {\n" +
			"	                          ^\n" +
			"I is a raw type. References to generic type I<V> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 5)\n" +
			"	I<Integer> x1 = (I<Integer>) (X) null;\n" +
			"	                ^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from X to I<Integer>\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 5)\n" +
			"	I<Integer> x1 = (I<Integer>) (X) null;\n" +
			"	                ^^^^^^^^^^^^^^^^^^^^^\n" +
			"Unnecessary cast from X to I<Integer>\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 5)\n" +
			"	I<Integer> x1 = (I<Integer>) (X) null;\n" +
			"	                             ^^^^^^^^\n" +
			"Unnecessary cast from null to X\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 6)\n" +
			"	I<Integer> x2 = (I<Integer>) new X();\n" +
			"	                ^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from X to I<Integer>\n" +
			"----------\n" +
			"6. WARNING in X.java (at line 6)\n" +
			"	I<Integer> x2 = (I<Integer>) new X();\n" +
			"	                ^^^^^^^^^^^^^^^^^^^^\n" +
			"Unnecessary cast from X to I<Integer>\n" +
			"----------\n" +
			"7. WARNING in X.java (at line 7)\n" +
			"	I<Integer> x3 = (I<Integer>) null;\n" +
			"	                ^^^^^^^^^^^^^^^^^\n" +
			"Unnecessary cast from null to I<Integer>\n" +
			"----------\n" +
			"8. WARNING in X.java (at line 8)\n" +
			"	X x4 = (X) (I<Integer>) null;\n" +
			"	           ^^^^^^^^^^^^^^^^^\n" +
			"Unnecessary cast from null to I<Integer>\n" +
			"----------\n");
}

// parametrized method with array extends Object upper bound verification
public void test0907() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.Collection;\n" +
			"import java.util.Collections;\n" +
			"public class X<T extends X<T, V>, V> {\n" +
			"    public void foo() {\n" +
			"        Y o = (new Z<Object>()).<Y, double[]> bar(Collections\n" +
			"                .singleton(new Y()));\n" +
			"        o.toString();\n" +
			"    }\n" +
			"}\n" +
			"class Y extends X<Y, double[]> {\n" +
			"    // empty\n" +
			"}\n" +
			"class Z<V> {\n" +
			"    public <U extends X<U, W>, W extends V> U bar(Collection<U> c) {\n" +
			"        return null;\n" +
			"    }\n" +
			"}\n"},
		"");
}

// check capture for conditional operator - variant
public void test0908() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"public abstract class X {\n" +
			"    protected <T> void foo(Class<? extends T> clazz) {\n" +
			"        Class<? extends T> l = clazz.isInterface() ? bar(clazz) : clazz;\n" +
			"    }\n" +
			"    abstract public <T> Class<? extends T> bar(Class<T> p);\n" +
			"}"},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=126105
public void test0909() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	private static class B<T> {\n" +
			"		private Object x;\n" +
			"\n" +
			"		public B(T x) {\n" +
			"			this.x = x;\n" +
			"		}\n" +
			"	}\n" +
			"\n" +
			"	private static class C {\n" +
			"		private Object x;\n" +
			"\n" +
			"		public C(Object x) {\n" +
			"			this.x = x;\n" +
			"		}\n" +
			"	}\n" +
			"\n" +
			"	public static void main(String[] args) throws Throwable {\n" +
			"		B<String> b = new B<String>(\"foo\");\n" +
			"		System.out.println(b.x);\n" +
			"\n" +
			"		C c = new C(\"foo\");\n" +
			"		System.out.println(c.x);\n" +
			"		Zork z;\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 24)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}

//https://bugs.eclipse.org/bugs/show_bug.cgi?id=127583
public void test0910() {
	int[] capIds = this.complianceLevel < ClassFileConstants.JDK1_8
			? new int[]{ 1, 3, 4, 6, 13}
			: new int[]{ 1, 2, 3, 4, 8};
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.ArrayList;\n" +
			"import java.util.Collection;\n" +
			"import java.util.List;\n" +
			"\n" +
			"public class X {\n" +
			"\n" +
			"	void bar() {\n" +
			"		List<Collection> lc1 = null;\n" +
			"		List<Collection<?>> lc2 = null;\n" +
			"		List<? extends Collection<?>> lc3 = null;\n" +
			"		List<? extends Collection> lc4 = null;\n" +
			"		lc1 = lc2; //1 ko\n" +
			"		lc1 = lc3; //2 ko\n" +
			"		lc1 = lc4; //3 ko\n" +
			"		lc2 = lc1; //4 ko\n" +
			"		lc2 = lc3; //5 ko\n" +
			"		lc2 = lc4; //6 ko\n" +
			"		lc3 = lc1; //7 ko\n" +
			"		lc3 = lc2; //8 ok\n" +
			"		lc3 = lc4; //9 ko\n" +
			"		lc4 = lc1; //10 ok\n" +
			"		lc4 = lc2; //11 ok\n" +
			"		lc4 = lc3; //12 ok\n" +
			"	}\n" +
			"	private final List<Collection> aList = new ArrayList<Collection>();\n" +
			"	public void foo() {\n" +
			"		final List<Collection<?>> listCopy = new ArrayList<Collection<?>>(this.aList); // ko\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 8)\n" +
		"	List<Collection> lc1 = null;\n" +
		"	     ^^^^^^^^^^\n" +
		"Collection is a raw type. References to generic type Collection<E> should be parameterized\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 11)\n" +
		"	List<? extends Collection> lc4 = null;\n" +
		"	               ^^^^^^^^^^\n" +
		"Collection is a raw type. References to generic type Collection<E> should be parameterized\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 12)\n" +
		"	lc1 = lc2; //1 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<Collection<?>> to List<Collection>\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 13)\n" +
		"	lc1 = lc3; //2 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<capture#"+capIds[0]+"-of ? extends Collection<?>> to List<Collection>\n" +
		"----------\n" +
		"5. ERROR in X.java (at line 14)\n" +
		"	lc1 = lc4; //3 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<capture#"+capIds[1]+"-of ? extends Collection> to List<Collection>\n" +
		"----------\n" +
		"6. ERROR in X.java (at line 15)\n" +
		"	lc2 = lc1; //4 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<Collection> to List<Collection<?>>\n" +
		"----------\n" +
		"7. ERROR in X.java (at line 16)\n" +
		"	lc2 = lc3; //5 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<capture#"+capIds[2]+"-of ? extends Collection<?>> to List<Collection<?>>\n" +
		"----------\n" +
		"8. ERROR in X.java (at line 17)\n" +
		"	lc2 = lc4; //6 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<capture#"+capIds[3]+"-of ? extends Collection> to List<Collection<?>>\n" +
		"----------\n" +
		"9. ERROR in X.java (at line 18)\n" +
		"	lc3 = lc1; //7 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<Collection> to List<? extends Collection<?>>\n" +
		"----------\n" +
		"10. ERROR in X.java (at line 20)\n" +
		"	lc3 = lc4; //9 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<capture#"+capIds[4]+"-of ? extends Collection> to List<? extends Collection<?>>\n" +
		"----------\n" +
		"11. WARNING in X.java (at line 25)\n" +
		"	private final List<Collection> aList = new ArrayList<Collection>();\n" +
		"	                   ^^^^^^^^^^\n" +
		"Collection is a raw type. References to generic type Collection<E> should be parameterized\n" +
		"----------\n" +
		"12. WARNING in X.java (at line 25)\n" +
		"	private final List<Collection> aList = new ArrayList<Collection>();\n" +
		"	                                                     ^^^^^^^^^^\n" +
		"Collection is a raw type. References to generic type Collection<E> should be parameterized\n" +
		"----------\n" +
		"13. ERROR in X.java (at line 27)\n" +
		"	final List<Collection<?>> listCopy = new ArrayList<Collection<?>>(this.aList); // ko\n" +
		"	                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"The constructor ArrayList<Collection<?>>(List<Collection>) is undefined\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=127583 - variation
public void test0911() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.ArrayList;\n" +
			"import java.util.Collection;\n" +
			"import java.util.List;\n" +
			"\n" +
			"public class X {\n" +
			"	void bar() {\n" +
			"		List<Collection> lc1 = null;\n" +
			"		List<Collection<?>> lc2 = null;\n" +
			"		List<? super Collection<?>> lc3 = null;\n" +
			"		List<? super Collection> lc4 = null;\n" +
			"		lc1 = lc2; //1 ko\n" +
			"		lc1 = lc3; //2 ko\n" +
			"		lc1 = lc4; //3 ko\n" +
			"		lc2 = lc1; //4 ko\n" +
			"		lc2 = lc3; //5 ko\n" +
			"		lc2 = lc4; //6 ko\n" +
			"		lc3 = lc1; //7 ok\n" +
			"		lc3 = lc2; //8 ok\n" +
			"		lc3 = lc4; //9 ok\n" +
			"		lc4 = lc1; //10 ok\n" +
			"		lc4 = lc2; //11 ko\n" +
			"		lc4 = lc3; //12 ko\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 7)\n" +
		"	List<Collection> lc1 = null;\n" +
		"	     ^^^^^^^^^^\n" +
		"Collection is a raw type. References to generic type Collection<E> should be parameterized\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 10)\n" +
		"	List<? super Collection> lc4 = null;\n" +
		"	             ^^^^^^^^^^\n" +
		"Collection is a raw type. References to generic type Collection<E> should be parameterized\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 11)\n" +
		"	lc1 = lc2; //1 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<Collection<?>> to List<Collection>\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 12)\n" +
		"	lc1 = lc3; //2 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<capture#1-of ? super Collection<?>> to List<Collection>\n" +
		"----------\n" +
		"5. ERROR in X.java (at line 13)\n" +
		"	lc1 = lc4; //3 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<capture#2-of ? super Collection> to List<Collection>\n" +
		"----------\n" +
		"6. ERROR in X.java (at line 14)\n" +
		"	lc2 = lc1; //4 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<Collection> to List<Collection<?>>\n" +
		"----------\n" +
		"7. ERROR in X.java (at line 15)\n" +
		"	lc2 = lc3; //5 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<capture#3-of ? super Collection<?>> to List<Collection<?>>\n" +
		"----------\n" +
		"8. ERROR in X.java (at line 16)\n" +
		"	lc2 = lc4; //6 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<capture#4-of ? super Collection> to List<Collection<?>>\n" +
		"----------\n" +
		"9. ERROR in X.java (at line 21)\n" +
		"	lc4 = lc2; //11 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<Collection<?>> to List<? super Collection>\n" +
		"----------\n" +
		"10. ERROR in X.java (at line 22)\n" +
		"	lc4 = lc3; //12 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<capture#12-of ? super Collection<?>> to List<? super Collection>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=127583 - variation
public void test0912() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			"public class X {\n" +
			"	void foo(List<? extends Collection<String>[]> l1, List<Collection[]> l2) {\n" +
			"		l1 = l2;\n" +
			"		l2 = l1;\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 4)\n" +
		"	void foo(List<? extends Collection<String>[]> l1, List<Collection[]> l2) {\n" +
		"	                                                       ^^^^^^^^^^\n" +
		"Collection is a raw type. References to generic type Collection<E> should be parameterized\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 5)\n" +
		"	l1 = l2;\n" +
		"	     ^^\n" +
		"Type mismatch: cannot convert from List<Collection[]> to List<? extends Collection<String>[]>\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 6)\n" +
		"	l2 = l1;\n" +
		"	     ^^\n" +
		"Type mismatch: cannot convert from List<capture#2-of ? extends Collection<String>[]> to List<Collection[]>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=127583 - variation
public void test0913() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"public class X {\n" +
			"	void bar() {\n" +
			"		List<Collection[]> lc1 = null;\n" +
			"		List<Collection<?>[]> lc2 = null;\n" +
			"		List<? extends Collection<?>[]> lc3 = null;\n" +
			"		List<? extends Collection[]> lc4 = null;\n" +
			"		lc1 = lc2; //1 ko\n" +
			"		lc1 = lc3; //2 ko\n" +
			"		lc1 = lc4; //3 ko\n" +
			"		lc2 = lc1; //4 ko\n" +
			"		lc2 = lc3; //5 ko\n" +
			"		lc2 = lc4; //6 ko\n" +
			"		lc3 = lc1; //7 ko\n" +
			"		lc3 = lc2; //8 ok\n" +
			"		lc3 = lc4; //9 ko\n" +
			"		lc4 = lc1; //10 ok\n" +
			"		lc4 = lc2; //11 ok\n" +
			"		lc4 = lc3; //12 ok		\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 4)\n" +
		"	List<Collection[]> lc1 = null;\n" +
		"	     ^^^^^^^^^^\n" +
		"Collection is a raw type. References to generic type Collection<E> should be parameterized\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 7)\n" +
		"	List<? extends Collection[]> lc4 = null;\n" +
		"	               ^^^^^^^^^^\n" +
		"Collection is a raw type. References to generic type Collection<E> should be parameterized\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 8)\n" +
		"	lc1 = lc2; //1 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<Collection<?>[]> to List<Collection[]>\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 9)\n" +
		"	lc1 = lc3; //2 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<capture#1-of ? extends Collection<?>[]> to List<Collection[]>\n" +
		"----------\n" +
		"5. ERROR in X.java (at line 10)\n" +
		"	lc1 = lc4; //3 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<capture#2-of ? extends Collection[]> to List<Collection[]>\n" +
		"----------\n" +
		"6. ERROR in X.java (at line 11)\n" +
		"	lc2 = lc1; //4 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<Collection[]> to List<Collection<?>[]>\n" +
		"----------\n" +
		"7. ERROR in X.java (at line 12)\n" +
		"	lc2 = lc3; //5 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<capture#3-of ? extends Collection<?>[]> to List<Collection<?>[]>\n" +
		"----------\n" +
		"8. ERROR in X.java (at line 13)\n" +
		"	lc2 = lc4; //6 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<capture#4-of ? extends Collection[]> to List<Collection<?>[]>\n" +
		"----------\n" +
		"9. ERROR in X.java (at line 14)\n" +
		"	lc3 = lc1; //7 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<Collection[]> to List<? extends Collection<?>[]>\n" +
		"----------\n" +
		"10. ERROR in X.java (at line 16)\n" +
		"	lc3 = lc4; //9 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<capture#8-of ? extends Collection[]> to List<? extends Collection<?>[]>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=127583 - variation
public void test0914() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"public class X {\n" +
			"	void bar() {\n" +
			"		List<Collection[]> lc1 = null;\n" +
			"		List<Collection<?>[]> lc2 = null;\n" +
			"		List<? super Collection<?>[]> lc3 = null;\n" +
			"		List<? super Collection[]> lc4 = null;\n" +
			"		lc1 = lc2; //1 ko\n" +
			"		lc1 = lc3; //2 ko\n" +
			"		lc1 = lc4; //3 ko\n" +
			"		lc2 = lc1; //4 ko\n" +
			"		lc2 = lc3; //5 ko\n" +
			"		lc2 = lc4; //6 ko\n" +
			"		lc3 = lc1; //7 ok\n" +
			"		lc3 = lc2; //8 ok\n" +
			"		lc3 = lc4; //9 ok\n" +
			"		lc4 = lc1; //10 ok\n" +
			"		lc4 = lc2; //11 ko\n" +
			"		lc4 = lc3; //12 ko		\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 4)\n" +
		"	List<Collection[]> lc1 = null;\n" +
		"	     ^^^^^^^^^^\n" +
		"Collection is a raw type. References to generic type Collection<E> should be parameterized\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 7)\n" +
		"	List<? super Collection[]> lc4 = null;\n" +
		"	             ^^^^^^^^^^\n" +
		"Collection is a raw type. References to generic type Collection<E> should be parameterized\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 8)\n" +
		"	lc1 = lc2; //1 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<Collection<?>[]> to List<Collection[]>\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 9)\n" +
		"	lc1 = lc3; //2 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<capture#1-of ? super Collection<?>[]> to List<Collection[]>\n" +
		"----------\n" +
		"5. ERROR in X.java (at line 10)\n" +
		"	lc1 = lc4; //3 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<capture#2-of ? super Collection[]> to List<Collection[]>\n" +
		"----------\n" +
		"6. ERROR in X.java (at line 11)\n" +
		"	lc2 = lc1; //4 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<Collection[]> to List<Collection<?>[]>\n" +
		"----------\n" +
		"7. ERROR in X.java (at line 12)\n" +
		"	lc2 = lc3; //5 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<capture#3-of ? super Collection<?>[]> to List<Collection<?>[]>\n" +
		"----------\n" +
		"8. ERROR in X.java (at line 13)\n" +
		"	lc2 = lc4; //6 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<capture#4-of ? super Collection[]> to List<Collection<?>[]>\n" +
		"----------\n" +
		"9. ERROR in X.java (at line 18)\n" +
		"	lc4 = lc2; //11 ko\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<Collection<?>[]> to List<? super Collection[]>\n" +
		"----------\n" +
		"10. ERROR in X.java (at line 19)\n" +
		"	lc4 = lc3; //12 ko		\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from List<capture#12-of ? super Collection<?>[]> to List<? super Collection[]>\n" +
		"----------\n");
}

//https://bugs.eclipse.org/bugs/show_bug.cgi?id=128389
public void test0915() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" +
			"	class Y1 extends Throwable {\n" +
			"		private static final long serialVersionUID = 1L;\n" +
			"		T t;\n" +
			"	}\n" +
			"	static class Y2 extends Throwable {\n" +
			"		private static final long serialVersionUID = 1L;\n" +
			"	}\n" +
			"	class Y3<U> extends Throwable {\n" +
			"		private static final long serialVersionUID = 1L;\n" +
			"\n" +
			"		T t;\n" +
			"	}\n" +
			"}\n" +
			"class Y4<E> extends Throwable {}\n" +
			"\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 2)\n" +
		"	class Y1 extends Throwable {\n" +
		"	                 ^^^^^^^^^\n" +
		"The generic class X<T>.Y1 may not subclass java.lang.Throwable\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 9)\n" +
		"	class Y3<U> extends Throwable {\n" +
		"	                    ^^^^^^^^^\n" +
		"The generic class X<T>.Y3<U> may not subclass java.lang.Throwable\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 15)\n" +
		"	class Y4<E> extends Throwable {}\n" +
		"	      ^^\n" +
		"The serializable class Y4 does not declare a static final serialVersionUID field of type long\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 15)\n" +
		"	class Y4<E> extends Throwable {}\n" +
		"	                    ^^^^^^^^^\n" +
		"The generic class Y4<E> may not subclass java.lang.Throwable\n" +
		"----------\n");
}

// synchronized inheritance for multiple generic types
public void test0916() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"public class X<T extends X2<?>> {\n" +
			"    T m2;\n" +
			"    T getX2() {\n" +
			"        return this.m2;\n" +
			"    }\n" +
			"}\n" +
			"class X2<T extends X3> {\n" +
			"    T m3;\n" +
			"    T getX3() {\n" +
			"        return this.m3;\n" +
			"    }\n" +
			"}\n" +
			"class X3 {\n" +
			"}\n" +
			"class Y1<T extends Y2<?>> extends X<T> {\n" +
			"    public void foo() {\n" +
			"        getX2().getX3().bar(); // getX3 appropriately returns an Y3\n" +
			"    }\n" +
			"}\n" +
			"class Y2<T extends Y3> extends X2<T> {\n" +
			"}\n" +
			"class Y3 extends X3 {\n" +
			"    public void bar() {\n" +
			"    }\n" +
			"}\n"},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}

// https://bugs.eclipse.org/bugs/show_bug.cgi?id=128423
// [1.5][compiler] ClassCastException on illegal code fragment
public void test0917() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T extends A> extends X2<T.M> { }\n" +
			"class X2<T> { }\n" +
			"class A { static class M {} }"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 1)\n" +
		"	public class X<T extends A> extends X2<T.M> { }\n" +
		"	                                       ^^^\n" +
		"Illegal qualified access from the type parameter T\n" +
		"----------\n"
		// cannot select from a type variable
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=128423 - variation
public void test0917a() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T> extends X2<T.clazz> { }\n" +
			"class X2<T> { }\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 1)\n" +
		"	public class X<T> extends X2<T.clazz> { }\n" +
		"	                             ^^^^^^^\n" +
		"Illegal qualified access from the type parameter T\n" +
		"----------\n"
		// cannot select from a type variable
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=128423 - variation
public void test0917b() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T> { Class<T> c = T.class; }"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 1)\n" +
		"	public class X<T> { Class<T> c = T.class; }\n" +
		"	                                 ^^^^^^^\n" +
		"Illegal class literal for the type parameter T\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=128423 - variation
public void test0917c() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T> extends X2<T.class> { }\n" +
			"class X2<T> { }\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 1)\n" +
		"	public class X<T> extends X2<T.class> { }\n" +
		"	                               ^^^^^\n" +
		"Syntax error on token \"class\", Identifier expected\n" +
		"----------\n");
}

//https://bugs.eclipse.org/bugs/show_bug.cgi?id=128560
public void test0918() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"BasicNode.java",
			"class BasicEdge<N extends BasicNode<E, N> & Node<E>, E extends BasicEdge<N, E> & Edge<N>>\n" +
			"		implements Edge<N> {\n" +
			"}\n" +
			"\n" +
			"public class BasicNode<E extends BasicEdge<N, E> & Edge<N>, N extends BasicNode<E, N> & Node<E>>\n" +
			"		implements Node<E> {\n" +
			"}\n" +
			"\n" +
			"interface Edge<N extends Node<? extends Edge<N>>> {\n" +
			"}\n" +
			"\n" +
			"interface Node<E extends Edge<? extends Node<E>>> {\n" +
			"}\n",
		},
	// javac options
	JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}

public void test0919() {
	this.runConformTest(
		new String[] {
			"X.java",
			"class Box<E> {\n" +
			"	private E element;\n" +
			"	void put(E elem) {\n" +
			"		this.element = elem;\n" +
			"	}\n" +
			"	E get() {\n" +
			"		return this.element;\n" +
			"	}\n" +
			"	Pair<E, E> asPair() {\n" +
			"		return new Pair<E, E>(this.element, this.element);\n" +
			"	}\n" +
			"	Box<Box<E>> nest() {\n" +
			"		Box<Box<E>> wrapper = new Box<Box<E>>();\n" +
			"		wrapper.put(this);\n" +
			"		return wrapper;\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"class Pair<U, V> {\n" +
			"	Pair(U u, V v) {\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"class PandoraBox<T extends Box<T>> extends Box<T> {\n" +
			"}\n" +
			"\n" +
			"public class X {\n" +
			"	void test(PandoraBox<?> pbox) {\n" +
			"		Box<?> box = pbox.get();\n" +
			"		Pair<?,?> pair = pbox.asPair();\n" +
			"		Box<?> nbox = pbox.nest();\n" +
			"	}\n" +
			"}\n",
		},
		"");
}
public void test0920() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"class Stack<E> {\n" +
			"	private List<E> contents = new ArrayList<E>();\n" +
			"	void push(E e) {\n" +
			"		this.contents.add(e);\n" +
			"	}\n" +
			"	E pop() {\n" +
			"		int last = this.contents.size() - 1;\n" +
			"		if (last < 0) throw new EmptyStackException();\n" +
			"		return this.contents.remove(last);\n" +
			"	}\n" +
			"	private static <T> void doSwap(Stack<T> s) {\n" +
			"		T t1 = s.pop();\n" +
			"		T t2 = s.pop();\n" +
			"		s.push(t1);\n" +
			"		s.push(t2);\n" +
			"	}\n" +
			"	static void swap(Stack<?> s) { doSwap(s); }\n" +
			"}\n" +
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		Stack<Integer> si = new Stack<Integer>();\n" +
			"		Integer[] ints = { 12, 13, 14, 15, };\n" +
			"		for (Integer i : ints) si.push(i);\n" +
			"		try {\n" +
			"			while(true) {\n" +
			"				System.out.print(\"[\"+si.pop()+\"]\");\n" +
			"			}\n" +
			"		} catch(EmptyStackException e) {\n" +
			"			System.out.println(\"[done]\");\n" +
			"		}\n" +
			"	}\n" +
			"}\n",
		},
		"[15][14][13][12][done]");
}
// FIXME: javac8 rejects
public void test0921() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"Graph.java",
			"class Node<N extends Node<N,E>, E extends Edge<N,E>> {\n" +
			"}\n" +
			"class Edge<N extends Node<N,E>, E extends Edge<N,E>> {\n" +
			"}\n" +
			"class Graph<N extends Node<N,E>, E extends Edge<N,E>>{\n" +
			"	N n;\n" +
			"	E e;\n" +
			"	private Graph(N n, E e) {\n" +
			"		this.n = n;\n" +
			"		this.e = e;\n" +
			"	}\n" +
			"	static <N extends Node<N,E>, E extends Edge<N,E>>\n" +
			"	Graph<N,E> copy(Graph<N,E> g) {\n" +
			"		return create(g.n,g.e);\n" +
			"	}\n" +
			"	static <N extends Node<N,E>, E extends Edge<N,E>>\n" +
			"	Graph<N,E> create(N n, E e) {\n" +
			"		return new Graph<N,E>(n,e);\n" +
			"	}\n" +
			"	Graph<?,?> builder() {\n" +
			"		Graph<?,?> g = null;\n" +
			"		return copy(g);\n" +
			"	}\n" +
			"}\n",
		},
	// javac options
	this.complianceLevel < ClassFileConstants.JDK1_8 ? 
			(JavacTestOptions) JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 :
			JavacTestOptions.DEFAULT/* javac test options */);
}
// Test case which comes from JDT/UI tests TypeEnvironmentTest.testWildcardAssignements
public void test0922() {
	this.runNegativeTest(
		new String[] {
		"Test.java",
		"import java.util.*;\n" +
		"public class Test {\n" +
		"	List<List> list_raw_list;\n" +
		"	{\n" +
		"		Collection<? extends Collection<? extends Number>> col = list_raw_list;\n" +
		"	}\n" +
		"}\n"
		},
		"----------\n" +
		"1. WARNING in Test.java (at line 3)\n" +
		"	List<List> list_raw_list;\n" +
		"	     ^^^^\n" +
		"List is a raw type. References to generic type List<E> should be parameterized\n" +
		"----------\n" +
		"2. ERROR in Test.java (at line 5)\n" +
		"	Collection<? extends Collection<? extends Number>> col = list_raw_list;\n" +
		"	                                                         ^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from List<List> to Collection<? extends Collection<? extends Number>>\n" +
		"----------\n"
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=129129
public void test0923() {
	this.runNegativeTest(
		new String[] {
		"X.java",
		"public class X<T> {\n" +
		"\n" +
		"  static void a(Class<? extends X<?>> c) {}\n" +
		"\n" +
		"  static void b(X<?> t) {\n" +
		"    X.a(t.getClass());\n" +
		"  }\n" +
		"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 6)\n" +
		"	X.a(t.getClass());\n" +
		"	  ^\n" +
		"The method a(Class<? extends X<?>>) in the type X is not applicable for the arguments (Class<capture#2-of ? extends X>)\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=129190
public void test0924() {
	runConformTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"ExtendedOuter.java",
			"class Outer<O> {\n" +
			"	class Inner {\n" +
			"	}\n" +
			"\n" +
			"	static void method(Outer<?>.Inner x) {\n" +
			"		System.out.println(\"SUCCESS\");\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"public class ExtendedOuter<E> extends Outer<E> {\n" +
			"	class ExtendedInner extends Inner {\n" +
			"		{\n" +
			"			Outer.method(this);\n" +
			"		}\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		new ExtendedOuter<String>().new ExtendedInner();\n" +
			"	}\n" +
			"}\n"
		},
		// compiler results
		"" /* expected compiler log */,
		// runtime results
		"SUCCESS" /* expected output string */,
		"" /* expected error string */,
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}
public void test0925() {
	runConformTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			"public class X<A, B> {\n" +
			"	private List<A> toAdd;\n" +
			"\n" +
			"	public X(List<A> toAdd) {\n" +
			"		this.toAdd = toAdd;\n" +
			"	}\n" +
			"\n" +
			"	private List<A> getRelated(B b) {\n" +
			"		// some application logic\n" +
			"		// for demo\n" +
			"		return toAdd;\n" +
			"	}\n" +
			"\n" +
			"	@SuppressWarnings(\"unchecked\")\n" +
			"	public <L extends List<? super A>, LF extends Factory<L>> L addOrCreate4(\n" +
			"			B b, L l, LF lf) {\n" +
			"		if (l == null) {\n" +
			"			l = lf.create();\n" +
			"		}\n" +
			"		((List<? super A>) l).addAll(getRelated(b)); \n" +
			"		l.addAll(getRelated(b));\n" +
			"		return l;\n" +
			"	}\n" +
			"\n" +
			"	public static class ListFactory<T> implements Factory<List<T>> {\n" +
			"		public List<T> create() {\n" +
			"			return new ArrayList<T>();\n" +
			"		}\n" +
			"	}\n" +
			"\n" +
			"	public static interface Factory<T> {\n" +
			"		public T create();\n" +
			"	}\n" +
			"\n" +
			"	public static void main(String... args) {\n" +
			"		ListFactory<Number> lf = new ListFactory<Number>();\n" +
			"		List<Long> longs = new ArrayList<Long>();\n" +
			"		longs.add(new Long(1));\n" +
			"		X<Long, Number> test = new X<Long, Number>(longs);\n" +
			"		List<Number> ret4 = null;\n" +
			"		ret4 = test.addOrCreate4(1, ret4, lf);\n" +
			"		System.out.println(\"SUCCESS\");\n" +
			"	}\n" +
			"}\n"
		},
		// compiler results
		null /* do not check compiler log */,
		// runtime results
		"SUCCESS" /* expected output string */,
		"" /* expected error string */,
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10_b24 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=129261
public void test0926() {
	String xSource =
			"public class X {\n" +
			"	@SuppressWarnings(\"null\")\n" +
			"	public void foo() {\n" +
			"		NonTerminalSourcePart<? extends Tuple<Boolean, Term>> RESULT = null;\n" +
			"		NonTerminalSourcePart<? extends Tuple<? extends Term, ? extends Formula>> t = null;\n" +
			"		RESULT = NonTerminalSourcePart.create(Tuple.create(true, t.value().fst()));\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"class Term {\n" +
			"}\n" +
			"\n" +
			"class Formula {\n" +
			"}\n" +
			"\n" +
			"final class NonTerminalSourcePart<V> {\n" +
			"	static <V> NonTerminalSourcePart<V> create(final V _value) {\n" +
			"		return null;\n" +
			"	}\n" +
			"	final V value() {\n" +
			"		return null;\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"class Tuple<A, B> {\n" +
			"	public static <A, B> Tuple<A, B> create(final A a, final B b) {\n" +
			"		return null;\n" +
			"	}\n" +
			"	public A fst() {\n" +
			"		return null;\n" +
			"	}\n" +
			"}\n";
	if (this.complianceLevel < ClassFileConstants.JDK1_8) {
		runNegativeTest(
			new String[] {
				"X.java",
				xSource
			},
			// compiler results
			"----------\n" + /* expected compiler log */
			"1. ERROR in X.java (at line 6)\n" +
			"	RESULT = NonTerminalSourcePart.create(Tuple.create(true, t.value().fst()));\n" +
			"	         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from NonTerminalSourcePart<Tuple<Boolean,capture#3-of ? extends Term>> to NonTerminalSourcePart<? extends Tuple<Boolean,Term>>\n" +
			"----------\n",
			// javac options
			JavacTestOptions.JavacHasABug.JavacBug6557661 /* javac test options */);		
	} else {
		runConformTest(
			new String[] {
				"X.java",
				xSource
			});
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=129261 - variation
public void test0927() {
	this.runNegativeTest(
		new String[] {
		"X.java",
		"import java.util.*;\n" +
		"@SuppressWarnings(\"null\") public class X {\n" +
		"	public void foo() {\n" +
		"		List<? extends List<Object>> RESULT = null;\n" +
		"		List<? extends Object> lst = null;\n" +
		"		RESULT = Collections.singletonList(Collections.singletonList(lst.get(0)));\n" +
		"	}\n" +
		"	public void bar() {\n" +
		"		List<List<Object>> RESULT = null;\n" +
		"		List<? extends Object> lst = null;\n" +
		"		RESULT = Collections.singletonList(Collections.singletonList(lst.get(0)));\n" +
		"	}\n" +
		"	public void baz() {\n" +
		"		List<List<Object>> RESULT = null;\n" +
		"		List<?> lst = null;\n" +
		"		RESULT = Collections.singletonList(Collections.singletonList(lst.get(0)));\n" +
		"	}\n" +
		"	public void bar2(List<? extends Object> lst) {\n" +
		"		List<Object> RESULT = null;\n" +
		"		RESULT = lst;\n" +
		"		RESULT = Collections.singletonList(lst.get(0));\n" +
		"	}	\n" +
		"	public static void main(String[] args) {\n" +
		"		List<String> ls = new ArrayList<String>();\n" +
		"		ls.add(\"str\");\n" +
		"		new X().bar2(ls);\n" +
		"	}\n" +
		"}\n",
		},
		(this.complianceLevel < ClassFileConstants.JDK1_8 ?
		"----------\n" +
		"1. ERROR in X.java (at line 6)\n" +
		"	RESULT = Collections.singletonList(Collections.singletonList(lst.get(0)));\n" +
		"	         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from List<List<capture#2-of ? extends Object>> to List<? extends List<Object>>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 11)\n" +
		"	RESULT = Collections.singletonList(Collections.singletonList(lst.get(0)));\n" +
		"	         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from List<List<capture#3-of ? extends Object>> to List<List<Object>>\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 16)\n" +
		"	RESULT = Collections.singletonList(Collections.singletonList(lst.get(0)));\n" +
		"	         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from List<List<capture#4-of ?>> to List<List<Object>>\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 20)\n" +
		"	RESULT = lst;\n" +
		"	         ^^^\n" +
		"Type mismatch: cannot convert from List<capture#5-of ? extends Object> to List<Object>\n" +
		"----------\n" +
		"5. ERROR in X.java (at line 21)\n" +
		"	RESULT = Collections.singletonList(lst.get(0));\n" +
		"	         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from List<capture#6-of ? extends Object> to List<Object>\n" +
		"----------\n"
		:
		"----------\n" +
		"1. ERROR in X.java (at line 20)\n" +
		"	RESULT = lst;\n" +
		"	         ^^^\n" +
		"Type mismatch: cannot convert from List<capture#5-of ? extends Object> to List<Object>\n" +
		"----------\n"));
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=129261 - variation
public void test0928() {
	this.runNegativeTest(
		new String[] {
		"X.java",
		"import java.util.*;\n" +
		"public class X {\n" +
		"    public static void main(String[] args) throws Throwable {\n" +
		"	List<?> x1 = new ArrayList<Integer>();\n" +
		"	List<?> x2 = new ArrayList<Integer>();\n" +
		"	x1.addAll(x2);\n" +
		"    }\n" +
		"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 6)\n" +
		"	x1.addAll(x2);\n" +
		"	   ^^^^^^\n" +
		"The method addAll(Collection<? extends capture#1-of ?>) in the type List<capture#1-of ?> is not applicable for the arguments (List<capture#2-of ?>)\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=117119
// SHOULD FAIL AT 1.8 (18.2.3): The method allOf(Class<E>) in the type X is not applicable for the arguments (Class<capture#1-of ? extends Enum>)
public void test0929() {
	this.runNegativeTest(
		new String[] {
		"X.java",
		"import java.util.Collection;\n" +
		"\n" +
		"public class X {\n" +
		"  \n" +
		"  public static <E extends Enum<E>> void fails () {\n" +
		"    Class<? extends Enum> enumType = null;\n" +
		"    final Collection<E> test = allOf(enumType);\n" +
		"\n" +
		"    Collection<? extends Enum> colType = null;\n" +
		"    final Collection<E> test2 = colType;\n" +
		"  }\n" +
		"  \n" +
		"  public static <E extends Enum<E>> Collection<E> allOf(final Class<E> enumType) {\n" +
		"    return null;\n" +
		"  }\n" +
		"}\n",
		},
		"----------\n" + 
		"1. WARNING in X.java (at line 6)\n" + 
		"	Class<? extends Enum> enumType = null;\n" + 
		"	                ^^^^\n" + 
		"Enum is a raw type. References to generic type Enum<E> should be parameterized\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 7)\n" + 
		"	final Collection<E> test = allOf(enumType);\n" + 
		"	                           ^^^^^^^^^^^^^^^\n" + 
		"Type safety: Unchecked invocation allOf(Class<capture#1-of ? extends Enum>) of the generic method allOf(Class<E>) of type X\n" + 
		"----------\n" + 
		"3. WARNING in X.java (at line 7)\n" + 
		"	final Collection<E> test = allOf(enumType);\n" + 
		"	                           ^^^^^^^^^^^^^^^\n" + 
		"Type safety: The expression of type Collection needs unchecked conversion to conform to Collection<E>\n" + 
		"----------\n" + 
		"4. WARNING in X.java (at line 9)\n" + 
		"	Collection<? extends Enum> colType = null;\n" + 
		"	                     ^^^^\n" + 
		"Enum is a raw type. References to generic type Enum<E> should be parameterized\n" + 
		"----------\n" + 
		"5. ERROR in X.java (at line 10)\n" + 
		"	final Collection<E> test2 = colType;\n" + 
		"	                            ^^^^^^^\n" + 
		"Type mismatch: cannot convert from Collection<capture#2-of ? extends Enum> to Collection<E>\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=119238
public void test0930() {
	this.runNegativeTest(
		new String[] {
		"X.java",
		"public class X<T> {\n" +
		"        public static int I;\n" +
		"        public void foo() {\n" +
		"                X.I= 10;\n" +
		"        }\n" +
		"		 {  Zork z; }\n" +
		"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 6)\n" +
		"	{  Zork z; }\n" +
		"	   ^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=119238 - variation
public void test0931() {
	this.runNegativeTest(
		new String[] {
		"X.java",
		"public class X<T> {\n" +
		"        public static int I;\n" +
		"        public void foo() {\n" +
		"                X<T>.I= 10;\n" +
		"        }\n" +
		"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	X<T>.I= 10;\n" +
		"	     ^\n" +
		"Syntax error on token \"I\", VariableDeclaratorId expected after this token\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=119238 - variation
public void _test0932() {
	this.runNegativeTest(
		new String[] {
		"X.java",
		"public class X<T> {\n" +
		"        public static int Method() { return 0; }\n" +
		"        public void foo() {\n" +
		"                X.Method();\n" +
		"        }\n" +
		"        public void bar() {\n" +
		"                X<String>.Method();\n" +
		"        }\n" +
		"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 7)\n" +
		"	X<String>.Method();\n" +
		"	^^^^^^^^^^\n" +
		"Syntax error on token(s), misplaced construct(s)\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=128063
public void test0933() {
	this.runNegativeTest(
		new String[] {
		"a/AbstractFoo.java", //================================
		"package a;\n" +
		"public abstract class AbstractFoo<T extends AbstractFoo<T>> {\n" +
		"	protected static class Inner<T extends AbstractFoo<T>> {\n" +
		"		public Inner() {\n" +
		"		}\n" +
		"\n" +
		"		public final void doSmth() {\n" +
		"		}\n" +
		"	}\n" +
		"}\n",
		"b/CustomFoo.java", //================================
		"package b;\n" +
		"import a.AbstractFoo;\n" +
		"public final class CustomFoo extends AbstractFoo<CustomFoo> {\n" +
		"	private Inner<DefaultFoo> defaultInner;\n" +
		"\n" +
		"	Inner<DefaultFoo> getDefaultInner() {\n" +
		"		return (this.defaultInner == null)\n" +
		"				? this.defaultInner = new Inner<DefaultFoo>()\n" +
		"				: this.defaultInner;\n" +
		"	}	\n" +
		"\n" +
		"	private Inner<CustomFoo> customInner;\n" +
		"\n" +
		"	Inner<CustomFoo> getCustomInner() {\n" +
		"		return (this.customInner == null)\n" +
		"				? this.customInner = new Inner<CustomFoo>()\n" +
		"				: this.customInner;\n" +
		"	}	\n" +
		"}\n",
		"b/DefaultFoo.java", //================================
		"package b;\n" +
		"import a.AbstractFoo;\n" +
		"public final class DefaultFoo extends AbstractFoo<DefaultFoo> {\n" +
		"	private Inner<DefaultFoo> defaultInner;\n" +
		"\n" +
		"	Inner<DefaultFoo> getDefaultInner() {\n" +
		"		return (this.defaultInner == null)\n" +
		"				? this.defaultInner = new Inner<DefaultFoo>()\n" +
		"				: this.defaultInner;\n" +
		"	}	\n" +
		"\n" +
		"	private Inner<CustomFoo> customInner;\n" +
		"\n" +
		"	Inner<CustomFoo> getCustomInner() {\n" +
		"		return (this.customInner == null)\n" +
		"				? this.customInner = new Inner<CustomFoo>()\n" +
		"				: this.customInner;\n" +
		"	}\n" +
		"\n" +
		"	///////////////////////////////////////////////////////////////////////\n" +
		"	public void testCompilationFailure(final CustomFoo foo) {\n" +
		"		final DefaultFoo foo1 = this;\n" +
		"		final CustomFoo foo2 = foo;\n" +
		"\n" +
		"		// These get compiled w/o error:\n" +
		"		foo1.getCustomInner().doSmth();\n" +
		"		foo1.getDefaultInner().doSmth();\n" +
		"\n" +
		"		// These do not (Eclipse 3.2.0 M4):\n" +
		"		foo2.getCustomInner().doSmth();\n" +
		"		foo2.getDefaultInner().doSmth();\n" +
		"\n" +
		"		// Expect error\n" +
		"		String s11 = foo1.getCustomInner();\n" +
		"		String s12 = foo2.getDefaultInner();\n" +
		"		String s21 = foo2.getCustomInner();\n" +
		"		String s22 = foo2.getDefaultInner();\n" +
		"\n" +
		"		// However, if we split statements, everything\'s ok: \n" +
		"		final Inner<CustomFoo> customInner2 = foo2.getCustomInner();\n" +
		"		customInner2.doSmth();\n" +
		"\n" +
		"		final Inner<DefaultFoo> defaultInner2 = foo2.getDefaultInner();\n" +
		"		defaultInner2.doSmth();\n" +
		"	}\n" +
		"}\n",
		},
		"----------\n" +
		"1. ERROR in b\\DefaultFoo.java (at line 34)\n" +
		"	String s11 = foo1.getCustomInner();\n" +
		"	             ^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from AbstractFoo.Inner<CustomFoo> to String\n" +
		"----------\n" +
		"2. ERROR in b\\DefaultFoo.java (at line 35)\n" +
		"	String s12 = foo2.getDefaultInner();\n" +
		"	             ^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from AbstractFoo.Inner<DefaultFoo> to String\n" +
		"----------\n" +
		"3. ERROR in b\\DefaultFoo.java (at line 36)\n" +
		"	String s21 = foo2.getCustomInner();\n" +
		"	             ^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from AbstractFoo.Inner<CustomFoo> to String\n" +
		"----------\n" +
		"4. ERROR in b\\DefaultFoo.java (at line 37)\n" +
		"	String s22 = foo2.getDefaultInner();\n" +
		"	             ^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from AbstractFoo.Inner<DefaultFoo> to String\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=128063 - variation
public void test0934() {
	this.runNegativeTest(
		new String[] {
		"X.java", //================================
		"public class X<T> {\n" +
		"	static class Inner<U> {\n" +
		"		static class InInner <V> {\n" +
		"		}\n" +
		"	}\n" +
		"}\n" +
		"class Y<W> extends X<W> {\n" +
		"	void foo() {\n" +
		"		Inner<W> inner = null;\n" +
		"		String s = inner;\n" +
		"	}\n" +
		"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 10)\n" +
		"	String s = inner;\n" +
		"	           ^^^^^\n" +
		"Type mismatch: cannot convert from X.Inner<W> to String\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=128063 - variation
public void test0935() {
	this.runNegativeTest(
		new String[] {
		"X.java", //================================
		"public class X<T> {\n" +
		"	static class Inner<U> {\n" +
		"		class InInner <V> {\n" +
		"		}\n" +
		"	}\n" +
		"}\n" +
		"class Y<W> extends X<W> {\n" +
		"	void foo() {\n" +
		"		Inner<W>.InInner<W> inner = null;\n" +
		"		String s = inner;\n" +
		"	}\n" +
		"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 10)\n" +
		"	String s = inner;\n" +
		"	           ^^^^^\n" +
		"Type mismatch: cannot convert from X.Inner<W>.InInner<W> to String\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=128063 - variation
public void test0936() {
	this.runNegativeTest(
		new String[] {
		"X.java", //================================
		"public class X<T> {\n" +
		"	class Inner<U> {\n" +
		"		class InInner <V> {\n" +
		"		}\n" +
		"	}\n" +
		"}\n" +
		"class Y<W> extends X<W> {\n" +
		"	void foo() {\n" +
		"		Inner<W> inner = null;\n" +
		"		String s = inner;\n" +
		"		\n" +
		"		Inner<W>.InInner<W> inner2 = null;\n" +
		"		s = inner2;\n" +
		"\n" +
		"	}\n" +
		"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 10)\n" +
		"	String s = inner;\n" +
		"	           ^^^^^\n" +
		"Type mismatch: cannot convert from X<W>.Inner<W> to String\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 13)\n" +
		"	s = inner2;\n" +
		"	    ^^^^^^\n" +
		"Type mismatch: cannot convert from X<W>.Inner<W>.InInner<W> to String\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=129190 - variation
public void test0937() {
	this.runNegativeTest(
		new String[] {
		"ExtendedOuter.java", //================================
		"class Outer<O> {\n" +
		"  class Inner {}\n" +
		"\n" +
		"  static void method(Outer.Inner x) {}\n" +
		"}\n" +
		"\n" +
		"public class ExtendedOuter<E> extends Outer<E> {\n" +
		"  class ExtendedInner extends Inner {\n" +
		"    {\n" +
		"      Outer.method(this);\n" +
		"    }\n" +
		"  }\n" +
		"  void foo() {\n" +
		"    Zork zk;\n" +
		"  }\n" +
		"}\n",
		},
		"----------\n" +
		"1. WARNING in ExtendedOuter.java (at line 4)\n" +
		"	static void method(Outer.Inner x) {}\n" +
		"	                   ^^^^^^^^^^^\n" +
		"Outer.Inner is a raw type. References to generic type Outer<O>.Inner should be parameterized\n" +
		"----------\n" +
		"2. ERROR in ExtendedOuter.java (at line 14)\n" +
		"	Zork zk;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=129190 - variation
public void test0938() {
	this.runNegativeTest(
		new String[] {
		"ExtendedOuter.java", //================================
		"class Outer<O> {\n" +
		"  class Inner {}\n" +
		"\n" +
		"  static void method(Outer<?>.Inner x) {}\n" +
		"}\n" +
		"\n" +
		"public class ExtendedOuter<E> extends Outer<E> {\n" +
		"  class ExtendedInner extends Inner {\n" +
		"    {\n" +
		"      Outer.method(this);\n" +
		"    }\n" +
		"  }\n" +
		"  void foo() {\n" +
		"    Zork zk;\n" +
		"  }\n" +
		"}\n",
		},
		"----------\n" +
		"1. ERROR in ExtendedOuter.java (at line 14)\n" +
		"	Zork zk;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=129190 - variation
public void test0939() {
	this.runNegativeTest(
		new String[] {
		"ExtendedOuter.java", //================================
		"class Outer<O> {\n" +
		"  class Inner {}\n" +
		"\n" +
		"  static <I> void method(Outer<I>.Inner x) {}\n" +
		"}\n" +
		"\n" +
		"public class ExtendedOuter<E> extends Outer<E> {\n" +
		"  class ExtendedInner extends Inner {\n" +
		"    {\n" +
		"      Outer.method(this);\n" +
		"    }\n" +
		"  }\n" +
		"  void foo() {\n" +
		"    Zork zk;\n" +
		"  }\n" +
		"}\n",
		},
		"----------\n" +
		"1. ERROR in ExtendedOuter.java (at line 14)\n" +
		"	Zork zk;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=129190 - variation
// force check that I is inferred to E, not Object
public void test0939b() {
	this.runNegativeTest(
		new String[] {
		"ExtendedOuter.java", //================================
		"class Outer<O> {\n" +
		"  class Inner {}\n" +
		"\n" +
		"  static <I> I method(Outer<I>.Inner x) { return null; }\n" +
		"}\n" +
		"\n" +
		"public class ExtendedOuter<E extends A> extends Outer<E> {\n" +
		"  class ExtendedInner extends Inner {\n" +
		"    {\n" +
		"      Outer.method(this).bar();\n" +
		"    }\n" +
		"  }\n" +
		"  void foo() {\n" +
		"    Zork zk;\n" +
		"  }\n" +
		"}\n" +
		"class A { void bar() {} }\n",
		},
		"----------\n" +
		"1. ERROR in ExtendedOuter.java (at line 14)\n" +
		"	Zork zk;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=129261 - variation
public void test0940() {
	this.runNegativeTest(
		new String[] {
		"X.java", //================================
		"import java.util.*;\n" +
		"public class X {\n" +
		"        <U extends Object> void bar3(List<U> lst) {\n" +
		"            List<Object> RESULT = null;\n" +
		"            RESULT = lst; // 1\n" +
		"            RESULT = Collections.singletonList(lst.get(0)); // 2\n" +
		"    }              \n" +
		"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	RESULT = lst; // 1\n" +
		"	         ^^^\n" +
		"Type mismatch: cannot convert from List<U> to List<Object>\n" +
		"----------\n" +
		(this.complianceLevel < ClassFileConstants.JDK1_8 ?
		"2. ERROR in X.java (at line 6)\n" +
		"	RESULT = Collections.singletonList(lst.get(0)); // 2\n" +
		"	         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from List<U> to List<Object>\n" +
		"----------\n"
		:
		""));
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=129261 - variation
public void test0941() {
	String xSource =
		"import java.util.*;\n" +
		"\n" +
		"public class X {\n" +
		"	<T> Map<T,T> foo(T t1, T t2) {\n" +
		"		return null;\n" +
		"	}\n" +
		"	<U extends Object, V extends U> void bar(U u, V v) {\n" +
		"		Map<Object,Object> map1 = foo(u, v);\n" +
		"		Map<U,U> map2 = foo(u, v);\n" +
		"	}	\n" +
		"}\n";
	if (this.complianceLevel < ClassFileConstants.JDK1_8) {
		this.runNegativeTest(
			new String[] {
			"X.java",
			xSource,
			},
			"----------\n" +
			"1. ERROR in X.java (at line 8)\n" +
			"	Map<Object,Object> map1 = foo(u, v);\n" +
			"	                          ^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Map<U,U> to Map<Object,Object>\n" +
			"----------\n");
	} else {
		runConformTest(new String[] { "X.java", xSource });
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=129261 - variation
public void test0942() {
	String xSource =
		"import java.util.*;\n" +
		"\n" +
		"public class X {\n" +
		"	<T> Map<T,T> foo(T t1, T t2, T t3) {\n" +
		"		return null;\n" +
		"	}\n" +
		"	<U extends Object, V extends U> void bar(U u, V v) {\n" +
		"		Map<Object,Object> map1 = foo(u, v, null);\n" +
		"		Map<U,U> map2 = foo(u, v, null);\n" +
		"	}	\n" +
		"}\n";
	if (this.complianceLevel < ClassFileConstants.JDK1_8) {
		this.runNegativeTest(
			new String[] {
				"X.java",
				xSource,
			},
			"----------\n" +
			"1. ERROR in X.java (at line 8)\n" +
			"	Map<Object,Object> map1 = foo(u, v, null);\n" +
			"	                          ^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Map<U,U> to Map<Object,Object>\n" +
			"----------\n");
	} else {
		runConformTest(new String[] { "X.java", xSource });
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=129261 - variation
public void test0943() {
	String xSource =
		"import java.util.*;\n" +
		"\n" +
		"public class X {\n" +
		"	<T> Map<T,T> foo(T t1, T t2, T t3) {\n" +
		"		return null;\n" +
		"	}\n" +
		"	<U extends Object, V extends U> void bar(U u, V v, List<? extends V> lv) {\n" +
		"		Map<Object,Object> map1 = foo(u, v, lv.get(0));\n" +
		"		Map<U,U> map2 = foo(u, v, lv.get(0));\n" +
		"	}\n" +
		"}\n";
	if (this.complianceLevel < ClassFileConstants.JDK1_8) {	
		this.runNegativeTest(
			new String[] {
			"X.java",
			xSource,
			},
			"----------\n" +
			"1. ERROR in X.java (at line 8)\n" +
			"	Map<Object,Object> map1 = foo(u, v, lv.get(0));\n" +
			"	                          ^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Map<U,U> to Map<Object,Object>\n" +
			"----------\n");
	} else {
		runConformTest(new String[] { "X.java", xSource });
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=129996
public void test0944() {
	this.runNegativeTest(
		new String[] {
		"X.java", //================================
		"import java.util.*;\n" +
		"public class X {\n" +
		"	public static <A> Set<A> method(List<? super A> list) {\n" +
		"		return new HashSet<A>();\n" +
		"	}\n" +
		"	public static void main(String[] args) {\n" +
		"		ArrayList<Number> l = new ArrayList<Number>();\n" +
		"		Set<Integer> s1 = method(l);\n" +
		"		Set<Integer> s2 = (Set<Integer>) method(l);\n" +
		"	}\n" +
		"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 9)\n" +
		"	Set<Integer> s2 = (Set<Integer>) method(l);\n" +
		"	                  ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from Set<Number> to Set<Integer>\n" +
		"----------\n");
}
public void test0945() {
	this.runNegativeTest(
		new String[] {
		"X.java", //================================
		"import java.util.*;\n" +
		"\n" +
		"public class X {\n" +
		"    public static void main(String[] args){\n" +
		"        Object[] objArray = {new Object()};\n" +
		"        ArrayList<String> strList = new ArrayList<String>();\n" +
		"        transferBug(objArray, strList);\n" +
		"        String str = strList.get(0);\n" +
		"}\n" +
		"public static <Var> void  transferBug(Var[] src, Collection<Var> dest){\n" +
		"    dest.add(src[0]);\n" +
		"}\n" +
		"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 7)\n" +
		"	transferBug(objArray, strList);\n" +
		"	^^^^^^^^^^^\n" +
		"The method transferBug(Var[], Collection<Var>) in the type X is not applicable for the arguments (Object[], ArrayList<String>)\n" +
		"----------\n");
}
public void test0946() {
	runConformTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"X.java", //================================
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		operate(Operations.create());\n" +
			"	}\n" +
			"	static <O extends Num<O>> void operate(Operators<O> operators) {\n" +
			"		System.out.println(operators.spawn());\n" +
			"	}\n" +
			"}\n" +
			"class Operations {\n" +
			"	static Operators<?> create() {\n" +
			"		return new IntOperators();\n" +
			"	}\n" +
			"}\n" +
			"interface Num<O> {\n" +
			"	public O spawn();\n" +
			"}\n" +
			"class Int implements Num<Int> {\n" +
			"	public Int spawn() {\n" +
			"		return new Int();\n" +
			"	}\n" +
			"  public String toString() {\n" +
			"    return \"Int\";\n" +
			"  }\n" +
			"}\n" +
			"interface Operators<O extends Num<O>> {\n" +
			"	O spawn();\n" +
			"}\n" +
			"class IntOperators implements Operators<Int> {\n" +
			"	public Int spawn() {\n" +
			"		return new Int();\n" +
			"	}\n" +
			"}\n",
		},
		// compiler results
		null /* do not check compiler log */,
		// runtime results
		"Int" /* expected output string */,
		"" /* expected error string */,
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=129261 - variation
public void test0947() {
	String xSource =
		"public class X {\n" +
		"        public void bar2(Box<?> b) {\n" +
		"        	Box<Runnable> bx = box(b.element);\n" +
		"        	box(b.element).element.run();\n" +
		"        }\n" +
		"        static <U extends Runnable> Box<U> box(U u) {\n" +
		"        	return new Box<U>(u);\n" +
		"        }\n" +
		"}\n" +
		"class Box<E extends Runnable> {\n" +
		"	E element;\n" +
		"	Box(E element) {\n" +
		"		this.element = element;\n" +
		"	}\n" +
		"}\n";
	if (this.complianceLevel < ClassFileConstants.JDK1_8) {
		this.runNegativeTest(
			new String[] {
			"X.java",
			xSource,
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	Box<Runnable> bx = box(b.element);\n" +
			"	                   ^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Box<capture#1-of ?> to Box<Runnable>\n" +
			"----------\n",
			JavacTestOptions.EclipseHasABug.EclipseBug236236);
	} else {
		runConformTest(new String[]{ "X.java", xSource });
	}

}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=129261 - variation
public void test0948() {
	this.runConformTest(
		new String[] {
		"X.java", //================================
		"import java.util.*;\n" +
		"public class X {\n" +
		"        public void bar2(Box<?> b1, Box<Runnable> b2) {\n" +
		"        	Pair<Runnable,Runnable> blist = pair(b1.element, b2.element);\n" +
		"        }\n" +
		"        static <U> Pair<U,U> pair(U u1, U u2) {\n" +
		"        	return new Pair<U,U>(u1,u2);\n" +
		"        }\n" +
		"}\n" +
		"class Pair<E,F> {\n" +
		"	Pair(E e, F f){}\n" +
		"}\n" +
		"class Box<E extends Runnable> {\n" +
		"	E element;\n" +
		"	Box(E element) {\n" +
		"		this.element = element;\n" +
		"	}\n" +
		"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=128418
public void test0949() {
	this.runNegativeTest(
		new String[] {
		"X.java", //================================
		"import java.util.Arrays;\n" +
		"\n" +
		"public class X {\n" +
		"	public <T> Iterable<T> m(T... ts) {\n" +
		"		return Arrays.asList(ts);\n" +
		"	}\n" +
		"	public <T> void m3(Iterable<T>... ts) {\n" +
		"	}\n" +
		"	public void m2() {\n" +
		"		m3(m(3, 3, 3));\n" +
		"		m3(m());\n" +
		"		m3(m(new Object[]{}));\n" +
		"		Zork z;\n" +
		"	}\n" +
		"}\n",
		},
		this.complianceLevel < ClassFileConstants.JDK1_7 ?
		"----------\n" +
		"1. WARNING in X.java (at line 10)\n" +
		"	m3(m(3, 3, 3));\n" +
		"	^^^^^^^^^^^^^^\n" +
		"Type safety: A generic array of Iterable<Integer> is created for a varargs parameter\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 11)\n" +
		"	m3(m());\n" +
		"	^^^^^^^\n" +
		"Type safety: A generic array of Iterable<Object> is created for a varargs parameter\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 12)\n" +
		"	m3(m(new Object[]{}));\n" +
		"	^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: A generic array of Iterable<Object> is created for a varargs parameter\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 13)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" : 
			"----------\n" + 
			"1. WARNING in X.java (at line 4)\n" + 
			"	public <T> Iterable<T> m(T... ts) {\n" + 
			"	                              ^^\n" + 
			"Type safety: Potential heap pollution via varargs parameter ts\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 7)\n" + 
			"	public <T> void m3(Iterable<T>... ts) {\n" + 
			"	                                  ^^\n" + 
			"Type safety: Potential heap pollution via varargs parameter ts\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 10)\n" + 
			"	m3(m(3, 3, 3));\n" + 
			"	^^^^^^^^^^^^^^\n" + 
			"Type safety: A generic array of Iterable<Integer> is created for a varargs parameter\n" + 
			"----------\n" + 
			"4. WARNING in X.java (at line 11)\n" + 
			"	m3(m());\n" + 
			"	^^^^^^^\n" + 
			"Type safety: A generic array of Iterable<Object> is created for a varargs parameter\n" + 
			"----------\n" + 
			"5. WARNING in X.java (at line 12)\n" + 
			"	m3(m(new Object[]{}));\n" + 
			"	^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: A generic array of Iterable<Object> is created for a varargs parameter\n" + 
			"----------\n" + 
			"6. ERROR in X.java (at line 13)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=128418 - variation
public void test0950() {
	this.runNegativeTest(
		new String[] {
		"X.java", //================================
		"import java.util.Arrays;\n" +
		"\n" +
		"public class X {\n" +
		"	public <T> Iterable<T> m(T[]... ts) {\n" +
		"		return Arrays.asList(ts[0]);\n" +
		"	}\n" +
		"	public <T> void m3(Iterable<T>... ts) {\n" +
		"	}\n" +
		"	public void m2() {\n" +
		"		m3(m(new Integer[]{3, 3, 3}));\n" +
		"		m3(m());\n" +
		"		m3(m(new Object[][]{}));\n" +
		"		Zork z;\n" +
		"	}\n" +
		"}\n",
		},
		this.complianceLevel < ClassFileConstants.JDK1_7 ?
		"----------\n" +
		"1. WARNING in X.java (at line 10)\n" +
		"	m3(m(new Integer[]{3, 3, 3}));\n" +
		"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: A generic array of Iterable<Object> is created for a varargs parameter\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 11)\n" +
		"	m3(m());\n" +
		"	^^^^^^^\n" +
		"Type safety: A generic array of Iterable<Object> is created for a varargs parameter\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 12)\n" +
		"	m3(m(new Object[][]{}));\n" +
		"	^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: A generic array of Iterable<Object> is created for a varargs parameter\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 13)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" : 
			"----------\n" + 
			"1. WARNING in X.java (at line 4)\n" + 
			"	public <T> Iterable<T> m(T[]... ts) {\n" + 
			"	                                ^^\n" + 
			"Type safety: Potential heap pollution via varargs parameter ts\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 7)\n" + 
			"	public <T> void m3(Iterable<T>... ts) {\n" + 
			"	                                  ^^\n" + 
			"Type safety: Potential heap pollution via varargs parameter ts\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 10)\n" + 
			"	m3(m(new Integer[]{3, 3, 3}));\n" + 
			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			(this.complianceLevel == ClassFileConstants.JDK1_7?
			"Type safety: A generic array of Iterable<Object> is created for a varargs parameter\n"
			:
			"Type safety: A generic array of Iterable<Integer> is created for a varargs parameter\n" 
			) +
			"----------\n" + 
			"4. WARNING in X.java (at line 11)\n" + 
			"	m3(m());\n" + 
			"	^^^^^^^\n" + 
			"Type safety: A generic array of Iterable<Object> is created for a varargs parameter\n" + 
			"----------\n" + 
			"5. WARNING in X.java (at line 12)\n" + 
			"	m3(m(new Object[][]{}));\n" + 
			"	^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: A generic array of Iterable<Object> is created for a varargs parameter\n" + 
			"----------\n" + 
			"6. ERROR in X.java (at line 13)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=128418 - variation
public void test0951() {
	this.runNegativeTest(
		new String[] {
		"X.java", //================================
		"import java.util.Arrays;\n" +
		"\n" +
		"public class X {\n" +
		"	public <T> Iterable<T> m(T[]... ts) {\n" +
		"		return Arrays.asList(ts[0]);\n" +
		"	}\n" +
		"	public <T> void m3(Iterable<T>... ts) {\n" +
		"	}\n" +
		"	@SuppressWarnings(\"unchecked\")\n" +
		"	public void m2() {\n" +
		"		m3(m(new Integer[]{3, 3, 3}));\n" +
		"		m3(m());\n" +
		"		m3(m(new Object[][]{}));\n" +
		"		Zork z;\n" +
		"	}\n" +
		"}\n",
		},
		this.complianceLevel < ClassFileConstants.JDK1_7 ?
		"----------\n" +
		"1. ERROR in X.java (at line 14)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" :
			"----------\n" + 
			"1. WARNING in X.java (at line 4)\n" + 
			"	public <T> Iterable<T> m(T[]... ts) {\n" + 
			"	                                ^^\n" + 
			"Type safety: Potential heap pollution via varargs parameter ts\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 7)\n" + 
			"	public <T> void m3(Iterable<T>... ts) {\n" + 
			"	                                  ^^\n" + 
			"Type safety: Potential heap pollution via varargs parameter ts\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 14)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=128418 - variation
public void test0952() {
	this.runNegativeTest(
		new String[] {
		"X.java", //================================
		"public class X {\n" +
		"	public <T> Iterable<T> m(T... ts) {\n" +
		"		return null;\n" +
		"	}\n" +
		"	public <T> void m3(Iterable<T>... ts) {\n" +
		"	}\n" +
		"	public void m2() {\n" +
		"		m3(m(null));\n" +
		"		Zork z;\n" +
		"	}\n" +
		"}\n",
		},
		this.complianceLevel < ClassFileConstants.JDK1_7 ?
		"----------\n" +
		"1. WARNING in X.java (at line 8)\n" +
		"	m3(m(null));\n" +
		"	^^^^^^^^^^^\n" +
		"Type safety: A generic array of Iterable<Object> is created for a varargs parameter\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 8)\n" +
		"	m3(m(null));\n" +
		"	   ^^^^^^^\n" +
		"Type null of the last argument to method m(Object...) doesn't exactly match the vararg parameter type. Cast to Object[] to confirm the non-varargs invocation, or pass individual arguments of type Object for a varargs invocation.\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 9)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" : 
			"----------\n" + 
			"1. WARNING in X.java (at line 2)\n" + 
			"	public <T> Iterable<T> m(T... ts) {\n" + 
			"	                              ^^\n" + 
			"Type safety: Potential heap pollution via varargs parameter ts\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 5)\n" + 
			"	public <T> void m3(Iterable<T>... ts) {\n" + 
			"	                                  ^^\n" + 
			"Type safety: Potential heap pollution via varargs parameter ts\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 8)\n" + 
			"	m3(m(null));\n" + 
			"	^^^^^^^^^^^\n" + 
			"Type safety: A generic array of Iterable<Object> is created for a varargs parameter\n" + 
			"----------\n" + 
			"4. WARNING in X.java (at line 8)\n" + 
			"	m3(m(null));\n" + 
			"	   ^^^^^^^\n" + 
			"Type null of the last argument to method m(Object...) doesn't exactly match the vararg parameter type. Cast to Object[] to confirm the non-varargs invocation, or pass individual arguments of type Object for a varargs invocation.\n" + 
			"----------\n" + 
			"5. ERROR in X.java (at line 9)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=106325
public void test0953() {
	if (this.complianceLevel >= ClassFileConstants.JDK1_7) return; 
	this.runNegativeTest(
		new String[] {
		"X.java", //================================
		"import java.lang.ref.WeakReference;\n" +
		"import java.util.Arrays;\n" +
		"import java.util.List;\n" +
		"\n" +
		"public class X {\n" +
		"  void m(WeakReference<Integer> ref) {\n" +
		"    List<WeakReference<Integer>> list= Arrays.asList(ref);\n" +
		"    Zork z;\n" +
		"  }\n" +
		"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 7)\n" +
		"	List<WeakReference<Integer>> list= Arrays.asList(ref);\n" +
		"	                                   ^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: A generic array of WeakReference<Integer> is created for a varargs parameter\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 8)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=130543
public void test0954() {
	this.runNegativeTest(
		new String[] {
		"X.java", //================================
		"import java.util.*;\n" +
		"\n" +
		"public class X<A,B> {\n" +
		"	class Member<C,D> {}\n" +
		"	static class SMember<U,V> {}\n" +
		"	void foo1() {\n" +
		"		X<?,?>[] xs = new X<?,?>[]{};//1\n" +
		"		for(X<?,?> x : xs) {\n" +
		"			System.out.println(x);\n" +
		"		}\n" +
		"	}\n" +
		"	void bar1() {\n" +
		"		Member<?,?>[] members = new Member<?,?>[]{};//2\n" +
		"		for(Member<?,?> m : members) {\n" +
		"			System.out.println(m);\n" +
		"		}\n" +
		"	}\n" +
		"	void bas1() {\n" +
		"		SMember<?,?>[] members = new SMember<?,?>[]{};//3\n" +
		"		for(SMember<?,?> m : members) {\n" +
		"			System.out.println(m);\n" +
		"		}\n" +
		"	}\n" +
		"	void baz1() {\n" +
		"		class Local<E,F>{}\n" +
		"		Local<?,?>[] locals = new Local<?,?>[]{};//4\n" +
		"		for(Local<?,?> l : locals) {\n" +
		"			System.out.println(l);\n" +
		"		}\n" +
		"	}\n" +
		"	void foo2() {\n" +
		"		X<?,?>[] xs = new X<?,?>[5];//5\n" +
		"		for(X<?,?> x : xs) {\n" +
		"			System.out.println(x);\n" +
		"		}\n" +
		"	}\n" +
		"	void bar2() {\n" +
		"		Member<?,?>[] members = new Member<?,?>[5];//6\n" +
		"		for(Member<?,?> m : members) {\n" +
		"			System.out.println(m);\n" +
		"		}\n" +
		"	}\n" +
		"	void bas2() {\n" +
		"		SMember<?,?>[] members = new SMember<?,?>[5];//7\n" +
		"		for(SMember<?,?> m : members) {\n" +
		"			System.out.println(m);\n" +
		"		}\n" +
		"	}\n" +
		"	void baz2() {\n" +
		"		class Local<E,F>{}\n" +
		"		Local<?,?>[] locals = new Local<?,?>[5];//8\n" +
		"		for(Local<?,?> l : locals) {\n" +
		"			System.out.println(l);\n" +
		"		}\n" +
		"	}\n" +
		"	void foo3() {\n" +
		"		X<?,?>[] xs = new X<?,?>[5];//9\n" +
		"		for(X<?,?> x : xs) {\n" +
		"			System.out.println(x);\n" +
		"		}\n" +
		"	}\n" +
		"	void bar3() {\n" +
		"		X<?,?>.Member<?,?>[] members = new X<?,?>.Member<?,?>[5];//10\n" +
		"		for(X<?,?>.Member<?,?> m : members) {\n" +
		"			System.out.println(m);\n" +
		"		}\n" +
		"	}\n" +
		"	static void baz3() {\n" +
		"		class Local<E,F>{}\n" +
		"		Local<?,?>[] locals = new Local<?,?>[5];//11\n" +
		"		for(Local<?,?> l : locals) {\n" +
		"			System.out.println(l);\n" +
		"		}\n" +
		"	}\n" +
		"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 13)\n" +
		"	Member<?,?>[] members = new Member<?,?>[]{};//2\n" +
		"	                                         ^^\n" +
		"Cannot create a generic array of X<A,B>.Member<?,?>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 26)\n" +
		"	Local<?,?>[] locals = new Local<?,?>[]{};//4\n" +
		"	                                      ^^\n" +
		"Cannot create a generic array of Local<?,?>\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 38)\n" +
		"	Member<?,?>[] members = new Member<?,?>[5];//6\n" +
		"	                        ^^^^^^^^^^^^^^^^^^\n" +
		"Cannot create a generic array of X<A,B>.Member<?,?>\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 51)\n" +
		"	Local<?,?>[] locals = new Local<?,?>[5];//8\n" +
		"	                      ^^^^^^^^^^^^^^^^^\n" +
		"Cannot create a generic array of Local<?,?>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=105049
public void test0955() {
	this.runNegativeTest(
		new String[] {
		"X.java", //================================
		"import java.util.List;\n" +
		"public class X<E> {\n" +
		"    void method(Object o) {\n" +
		"        if (o instanceof List<E>[]) { //incorrect: bug 104695\n" +
		"            List<E>[] es= (List<E>[]) o; //unchecked\n" +
		"        }\n" +
		"    }\n" +
		"}\n",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 4)\n" + 
		"	if (o instanceof List<E>[]) { //incorrect: bug 104695\n" + 
		"	    ^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Cannot perform instanceof check against parameterized type List<E>[]. Use the form List<?>[] instead since further generic type information will be erased at runtime\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 5)\n" + 
		"	List<E>[] es= (List<E>[]) o; //unchecked\n" + 
		"	              ^^^^^^^^^^^^^\n" + 
		"Type safety: Unchecked cast from Object to List<E>[]\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=130128
public void test0956() {
	this.runConformTest(
		new String[] {
		"X.java", //================================
		"public class X<F> {\n" +
		"\n" +
		"    public void printNickname(Person<F> person) {\n" +
		"        Person<F>.Nickname nickname = person.getNickname();\n" +
		"        System.out.println(nickname);\n" +
		"    }\n" +
		"\n" +
		"    static class Person<E> {\n" +
		"        private Nickname nickname;\n" +
		"\n" +
		"        public Nickname getNickname() {\n" +
		"            return nickname;\n" +
		"        }\n" +
		"\n" +
		"        public void setNickname(Nickname nickname) {\n" +
		"            this.nickname = nickname;\n" +
		"        }\n" +
		"\n" +
		"        class Nickname {\n" +
		"            private String name;\n" +
		"            private boolean insulting;\n" +
		"        }\n" +
		"    }\n" +
		"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=132348
public void test0957() {
	this.runNegativeTest(
		new String[] {
		"AnyInterface.java", //================================
		"public interface AnyInterface {\n" +
		"        public void doSomething();\n" +
		"}",
		"UsingGenericsClass",
		"public class UsingGenericsClass<A,B extends A & AnyInterface> {\n" +
		"        public UsingGenericsClass(){\n" +
		"        }\n" +
		"}"
		},
		"----------\n" +
		"1. ERROR in UsingGenericsClass (at line 1)\n" +
		"	public class UsingGenericsClass<A,B extends A & AnyInterface> {\n" +
		"	                                                ^^^^^^^^^^^^\n" +
		"Cannot specify any additional bound AnyInterface when first bound is a type parameter\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=131935
public void test0958() {
	this.runNegativeTest(
		new String[] {
		"X.java", //================================
		"import java.lang.ref.ReferenceQueue;\n" +
		"import java.lang.ref.SoftReference;\n" +
		"import java.util.Hashtable;\n" +
		"\n" +
		"public class X {\n" +
		"	private static final Hashtable<Integer, Soft> cache = new Hashtable<Integer, Soft>();\n" +
		"\n" +
		"	private static final ReferenceQueue<String> trash = new ReferenceQueue<String>();\n" +
		"\n" +
		"	private static final class Soft extends SoftReference<String> {\n" +
		"		int key;\n" +
		"\n" +
		"		Soft() {\n" +
		"			super(null);\n" +
		"		}\n" +
		"	}\n" +
		"\n" +
		"	final Thread clean = new Thread(\"BigTableModel cleaner\") {\n" +
		"		@Override\n" +
		"		public void run() {\n" +
		"			for (;;)\n" +
		"				try {\n" +
		"					cache.remove(((Soft) trash.remove()).key);\n" +
		"				} catch (final InterruptedException e) {\n" +
		"					return;\n" +
		"				}\n" +
		"				Zork z;\n" +
		"		}\n" +
		"	};\n" +
		"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 27)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=133803
public void test0959() {
	this.runNegativeTest(
		new String[] {
			"X.java", //================================
			"import java.lang.ref.*;\n" +
			"\n" +
			"class Soft extends SoftReference<String> {\n" +
			"    Soft() { super(null); }\n" +
			"}\n" +
			"\n" +
			"class Bug {\n" +
			"    void m(Reference<? extends Number> remove) {\n" +
			"        Soft soft= (Soft) remove;\n" +
			"    }\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 9)\n" +
		"	Soft soft= (Soft) remove;\n" +
		"	           ^^^^^^^^^^^^^\n" +
		"Cannot cast from Reference<capture#1-of ? extends Number> to Soft\n" +
		"----------\n");
}

//https://bugs.eclipse.org/bugs/show_bug.cgi?id=118273
// SHOULD FAIL AT 1.8 (RET): Type mismatch: cannot convert from X<Comparable<Comparable<T>>> to X
public void test0960() {
	this.runNegativeTest(
		new String[] {
			"X.java", //================================
			"public class X<A> {\n" +
			"        <B extends Comparable<B>> X<B> newInstance() {\n" +
			"                return new X<B>();\n" +
			"        }\n" +
			"\n" +
			"        X<String>[] bugDemo() {\n" +
			"                X x = newInstance();\n" +
			"                return new X[] { x };\n" +
			"        }\n" +
			"    Zork z;\n" +
			"}\n"
		},
		"----------\n" + 
		"1. WARNING in X.java (at line 7)\n" + 
		"	X x = newInstance();\n" + 
		"	^\n" + 
		"X is a raw type. References to generic type X<A> should be parameterized\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 8)\n" + 
		"	return new X[] { x };\n" + 
		"	       ^^^^^^^^^^^^^\n" + 
		"Type safety: The expression of type X[] needs unchecked conversion to conform to X<String>[]\n" + 
		"----------\n" + 
		"3. ERROR in X.java (at line 10)\n" + 
		"	Zork z;\n" + 
		"	^^^^\n" + 
		"Zork cannot be resolved to a type\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=118273 - variation
public void test0961() {
	this.runNegativeTest(
		new String[] {
			"X.java", //================================
			"public class X<A> {\n" +
			"    <B extends Comparable<B>> B newInstance2(X<B> xb) {\n" +
			"            return null;\n" +
			"    }\n" +
			"    void foo() {\n" +
			"        X x = new X();\n" +
			"        Comparable c = newInstance2(x);\n" +
			"    }\n" +
			"    Zork z;\n" +
			"}\n"
		},
		"----------\n" +
		"1. WARNING in X.java (at line 6)\n" +
		"	X x = new X();\n" +
		"	^\n" +
		"X is a raw type. References to generic type X<A> should be parameterized\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 6)\n" +
		"	X x = new X();\n" +
		"	          ^\n" +
		"X is a raw type. References to generic type X<A> should be parameterized\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 7)\n" +
		"	Comparable c = newInstance2(x);\n" +
		"	^^^^^^^^^^\n" +
		"Comparable is a raw type. References to generic type Comparable<T> should be parameterized\n" +
		"----------\n" +
		"4. WARNING in X.java (at line 7)\n" +
		"	Comparable c = newInstance2(x);\n" +
		"	               ^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked invocation newInstance2(X) of the generic method newInstance2(X<B>) of type X<A>\n" +
		"----------\n" +
		"5. WARNING in X.java (at line 7)\n" +
		"	Comparable c = newInstance2(x);\n" +
		"	                            ^\n" +
		(this.complianceLevel < ClassFileConstants.JDK1_8
		? "Type safety: The expression of type X needs unchecked conversion to conform to X<Comparable>\n"
		: "Type safety: The expression of type X needs unchecked conversion to conform to X<Comparable<Comparable<B>>>\n") +
		"----------\n" +
		"6. ERROR in X.java (at line 9)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=134645
public void test0962() {
	runNegativeTest(
		new String[] {
			"X.java", //================================
			"public class X<T> {\n" +
			"    public void bug() throws Exception {\n" +
			"        throw new Exception(\"Bug134645\") {\n" +
			"            @Override\n" +
			"            public String toString() {\n" +
			"                return \"Bug134645\";\n" +
			"            }\n" +
			"        };\n" +
			"    }\n" +
			"}\n"
		},
		// compiler results
		"----------\n" + /* expected compiler log */
		"1. ERROR in X.java (at line 3)\n" +
		"	throw new Exception(\"Bug134645\") {\n" +
		"	          ^^^^^^^^^\n" +
		"The generic class new Exception(){} may not subclass java.lang.Throwable\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 3)\n" +
		"	throw new Exception(\"Bug134645\") {\n" +
		"	          ^^^^^^^^^^^^^^^^^^^^^^\n" +
		"The serializable class  does not declare a static final serialVersionUID field of type long\n" +
		"----------\n",
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=134645 - variation
public void test0963() {
	this.runConformTest(
		new String[] {
			"X.java", //================================
			"public class X {\n" +
			"    public void bug() throws Exception {\n" +
			"        throw new Exception(\"Bug134645\") {\n" +
			"            @Override\n" +
			"            public String toString() {\n" +
			"                return \"Bug134645\";\n" +
			"            }\n" +
			"        };\n" +
			"    }\n" +
			"}\n"
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=134645 - variation
public void test0964() {
	this.runConformTest(
		new String[] {
			"X.java", //================================
			"public class X<T> {\n" +
			"    public static void bug() throws Exception {\n" +
			"        throw new Exception(\"Bug134645\") {\n" +
			"            @Override\n" +
			"            public String toString() {\n" +
			"                return \"Bug134645\";\n" +
			"            }\n" +
			"        };\n" +
			"    }\n" +
			"}\n"
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=97494
public void test0965() {
	this.runNegativeTest(
		new String[] {
			"X.java", //================================
			"public class X<T> {\n" +
			"  protected static final Class<X<?>> theClass = (Class<X<?>>) X.class;\n" +
			"  void foo(Class<X> cx) {\n" +
			"	  Class<X<?>> cx1 = cx;\n" +
			"	  Class<X<?>> cx2 = (Class<X<?>>) cx;\n" +
			"  }\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 2)\n" +
		"	protected static final Class<X<?>> theClass = (Class<X<?>>) X.class;\n" +
		"	                                              ^^^^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from Class<X> to Class<X<?>>\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 3)\n" +
		"	void foo(Class<X> cx) {\n" +
		"	               ^\n" +
		"X is a raw type. References to generic type X<T> should be parameterized\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 4)\n" +
		"	Class<X<?>> cx1 = cx;\n" +
		"	                  ^^\n" +
		"Type mismatch: cannot convert from Class<X> to Class<X<?>>\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 5)\n" +
		"	Class<X<?>> cx2 = (Class<X<?>>) cx;\n" +
		"	                  ^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from Class<X> to Class<X<?>>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=115918
public void test0966() {
	this.runConformTest(
		new String[] {
			"Child.java", //================================
			"public class Child extends Parent implements Comparable<Child> {\n" +
			"  public int compareTo(Child o) { return 0; }\n" +
			"}\n" +
			"class Parent extends Base<Child> {}\n" +
			"class Base<T extends Base> {}\n"
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=81949
public void test0967() {
	this.runConformTest(
		new String[] {
			"CSS.java", //================================
			"interface Ac<S extends St<S,A>,A extends Ac<S,A>> {}\n" +
			"interface St<S extends St<S,A>,A extends Ac<S,A>> {}\n" +
			"class CSN<X, Y> extends CSS<X, Y> implements Ac<CSS<X, Y>, CSN<X, Y>> {}\n" +
			"public class CSS<X, Y> implements St<CSS<X, Y>, CSN<X, Y>> {}\n"
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=108045
public void test0968() {
	this.runNegativeTest(
		new String[] {
			"X.java", //================================
			"import java.util.*;\n" +
			"public class X<T0> extends ArrayList<T0> implements I<T0> {\n" +
			"}\n" +
			"interface I<T1> extends Collection {\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 2)\n" +
		"	public class X<T0> extends ArrayList<T0> implements I<T0> {\n" +
		"	             ^\n" +
		"The interface Collection cannot be implemented more than once with different arguments: Collection<T0> and Collection\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 2)\n" +
		"	public class X<T0> extends ArrayList<T0> implements I<T0> {\n" +
		"	             ^\n" +
		"The serializable class X does not declare a static final serialVersionUID field of type long\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 4)\n" +
		"	interface I<T1> extends Collection {\n" +
		"	                        ^^^^^^^^^^\n" +
		"Collection is a raw type. References to generic type Collection<E> should be parameterized\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=133071
public void test0969() {
	this.runConformTest(
			new String[] {
				"B.java", //================================
				"class B<T extends C> extends A<T> {}\n" +
				"class C extends B<C> {}\n" +
				"class A<T extends C> {}"
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=136946
public void test0970() {
	this.runNegativeTest(
			new String[] {
				"X.java", //================================
				"public interface X<T> { \n" +
				"        interface I1<T> extends X<T> {\n" +
				"                interface I2<T> extends I1<T> {\n" +
				"                }\n" +
				"\n" +
				"                interface I3<T> extends I1<T> {\n" +
				"                }\n" +
				"\n" +
				"                interface I4<T> extends I1.I2<T>, I1.I3<T> {    \n" +
				"                }\n" +
				"        }\n" +
				"}\n" +
				"class XSub<E> implements X<E> {\n" +
				"    I1<E> i1 = null;\n" +
				"    I1.I2<E> i2 = null;\n" +
				"    I1<E>.I2<E> i1i2 = null;\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 16)\n" +
			"	I1<E>.I2<E> i1i2 = null;\n" +
			"	^^^^^^^^\n" +
			"The member type X.I1.I2<T> cannot be qualified with a parameterized type, since it is static. Remove arguments from qualifying type X.I1<E>\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=136946 - variation
public void test0971() {
	this.runNegativeTest(
			new String[] {
				"X.java", //================================
				"public interface X<T> { \n" +
				"        interface I1<T> extends X {\n" +
				"                interface I2<T> extends I1 {\n" +
				"                }\n" +
				"\n" +
				"                interface I3<T> extends I1 {\n" +
				"                }\n" +
				"\n" +
				"                interface I4<T> extends I1.I2, I1.I3 {    \n" +
				"                }\n" +
				"        }\n" +
				"}\n" +
				"class XSub<E> implements X<E> {\n" +
				"    I1 i1 = null;\n" +
				"    I1.I2 i2 = null;\n" +
				"    I1<E>.I2 i1i2 = null;\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in X.java (at line 2)\n" +
			"	interface I1<T> extends X {\n" +
			"	                        ^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 3)\n" +
			"	interface I2<T> extends I1 {\n" +
			"	                        ^^\n" +
			"X.I1 is a raw type. References to generic type X.I1<T> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 6)\n" +
			"	interface I3<T> extends I1 {\n" +
			"	                        ^^\n" +
			"X.I1 is a raw type. References to generic type X.I1<T> should be parameterized\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 9)\n" +
			"	interface I4<T> extends I1.I2, I1.I3 {    \n" +
			"	                        ^^^^^\n" +
			"X.I1.I2 is a raw type. References to generic type X.I1.I2<T> should be parameterized\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 9)\n" +
			"	interface I4<T> extends I1.I2, I1.I3 {    \n" +
			"	                               ^^^^^\n" +
			"X.I1.I3 is a raw type. References to generic type X.I1.I3<T> should be parameterized\n" +
			"----------\n" +
			"6. WARNING in X.java (at line 14)\n" +
			"	I1 i1 = null;\n" +
			"	^^\n" +
			"X.I1 is a raw type. References to generic type X.I1<T> should be parameterized\n" +
			"----------\n" +
			"7. WARNING in X.java (at line 15)\n" +
			"	I1.I2 i2 = null;\n" +
			"	^^^^^\n" +
			"X.I1.I2 is a raw type. References to generic type X.I1.I2<T> should be parameterized\n" +
			"----------\n" +
			"8. ERROR in X.java (at line 16)\n" +
			"	I1<E>.I2 i1i2 = null;\n" +
			"	^^^^^^^^\n" +
			"The member type X.I1.I2<T> cannot be qualified with a parameterized type, since it is static. Remove arguments from qualifying type X.I1<E>\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=137203
// simulate incremental compile
public void test0972() {
	runConformTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"Outer.java", //================================
			"//Outer.java\n" +
			"public class Outer<O> {\n" +
			"  public class Inner {}\n" +
			"\n" +
			"  public static void method(Outer<?>.Inner x) {\n" +
			"    System.out.println(\"SUCCESS\");\n" +
			"  }\n" +
			"  public static void main(String[] args) {\n" +
			"    Outer<?>.Inner x = null;\n" +
			"    method(x);\n" +
			"  }\n" +
			"}\n" +
			"\n",
			"ExtendedOuter.java", //================================
			"public class ExtendedOuter<E> extends Outer<E> {\n" +
			"  class ExtendedInner extends Inner {\n" +
			"    {\n" +
			"      Outer.method(this);\n" +
			"    }\n" +
			"  }\n" +
			"}\n"
		},
		// compiler results
		"" /* expected compiler log */,
		// runtime results
		"SUCCESS" /* expected output string */,
		"" /* expected error string */,
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);

	this.runConformTest(
			new String[] {
				"Outer.java", //================================
				"//Outer.java\n" +
				"public class Outer<O> {\n" +
				"  public class Inner {}\n" +
				"\n" +
				"  public static void method(Outer.Inner x) {\n" +
				"    System.out.println(\"SUCCESS\");\n" +
				"  }\n" +
				"  public static void main(String[] args) {\n" +
				"    Outer.Inner x = null;\n" +
				"    method(x);\n" +
				"  }\n" +
				"}\n" +
				"\n",
			},
			"SUCCESS",
			null,
			false,
			null);
	this.runConformTest(
			new String[] {
					"ExtendedOuter.java", //================================
					"public class ExtendedOuter<E> extends Outer<E> {\n" +
					"  class ExtendedInner extends Inner {\n" +
					"    {\n" +
					"      Outer.method(this);\n" +
					"    }\n" +
					"  }\n" +
					"  public static void main(String[] args) {\n" +
					"    System.out.println(\"SUCCESS\");\n" +
					"  }\n" +
					"}\n"

			},
			"SUCCESS",
			null,
			false,
			null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=137203 - variation
//pure source scenario
public void test0973() {
	this.runConformTest(
			new String[] {
				"Outer.java", //================================
				"//Outer.java\n" +
				"public class Outer<O> {\n" +
				"  public class Inner {}\n" +
				"\n" +
				"  public static void method(Outer.Inner x) {\n" +
				"    System.out.println(\"SUCCESS\");\n" +
				"  }\n" +
				"  public static void main(String[] args) {\n" +
				"    Outer.Inner x = null;\n" +
				"    method(x);\n" +
				"  }\n" +
				"}\n" +
				"\n",
				"ExtendedOuter.java", //================================
				"public class ExtendedOuter<E> extends Outer<E> {\n" +
				"  class ExtendedInner extends Inner {\n" +
				"    {\n" +
				"      Outer.method(this);\n" +
				"    }\n" +
				"  }\n" +
				"}\n"
			},
			"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=137203 - variation
//simulate incremental compile
public void test0974() {
	this.runConformTest(
			new String[] {
				"Outer.java", //================================
				"//Outer.java\n" +
				"public class Outer<O> {\n" +
				"  public class Inner {}\n" +
				"\n" +
				"  public static void method(Outer.Inner x) {\n" +
				"    System.out.println(\"SUCCESS\");\n" +
				"  }\n" +
				"  public static void main(String[] args) {\n" +
				"    Outer.Inner x = null;\n" +
				"    method(x);\n" +
				"  }\n" +
				"}\n" +
				"\n",
				"ExtendedOuter.java", //================================
				"public class ExtendedOuter<E> extends Outer<E> {\n" +
				"  class ExtendedInner extends Inner {\n" +
				"    {\n" +
				"      Outer.method(this);\n" +
				"    }\n" +
				"  }\n" +
				"}\n"
			},
			"SUCCESS");
	this.runConformTest(
			new String[] {
					"ExtendedOuter.java", //================================
					"public class ExtendedOuter<E> extends Outer<E> {\n" +
					"  class ExtendedInner extends Inner {\n" +
					"    {\n" +
					"		Outer.Inner in;\n" +
					"      Outer.method(this);\n" +
					"    }\n" +
					"  }\n" +
					"  public static void main(String[] args) {\n" +
					"    System.out.println(\"SUCCESS\");\n" +
					"  }\n" +
					"}\n"

			},
			"SUCCESS",
			null,
			false,
			null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=122999
public void test0975() {
	this.runNegativeTest(
			new String[] {
				"X.java", //================================
				"import java.util.ArrayList;\n" +
				"\n" +
				"public class X extends ArrayList<Bean> {\n" +
				"   public static class Bean {}\n" +
				"}", // =================
			},
			"----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	public class X extends ArrayList<Bean> {\n" +
			"	             ^\n" +
			"The serializable class X does not declare a static final serialVersionUID field of type long\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 3)\n" +
			"	public class X extends ArrayList<Bean> {\n" +
			"	                                 ^^^^\n" +
			"Bean cannot be resolved to a type\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=139525
public void test0976() {
	this.runConformTest(
			new String[] {
					"S.java", // =================
					"import java.util.Collection;\n" +
					"public class S {\n" +
					"        public static void cow(IDA<?, ?, ?, ?, ?, ?> s) {\n" +
					"                Collection<IDA.Enum1> ids = s.getIds();  // Error here\n" +
					"        }\n" +
					"		public static void main(String[] args) {\n" +
					"			System.out.println(\"SUCCESS\");\n" +
					"        }\n" +
					"}\n", // =================
					"ID.java", // =================
					"import java.util.Collection;\n" +
					"public interface ID {\n" +
					"        Collection<? extends Comparable<?>> getIds();\n" +
					"}\n", // =================
					"IDA.java", // =================
					"import java.util.Collection;\n" +
					"public interface IDA<T1, C1, E1, E2, C2, T2> extends ID {\n" +
					"        enum Enum1 {\n" +
					"                ONE, TWO\n" +
					"        }\n" +
					"        Collection<IDA.Enum1> getIds();\n" +
					"}\n", // =================
			},
			"SUCCESS");
	this.runConformTest(
			new String[] {
					"S.java", // =================
					"import java.util.Collection;\n" +
					"public class S {\n" +
					"        public static void cow(IDA<?, ?, ?, ?, ?, ?> s) {\n" +
					"                Collection<IDA.Enum1> ids = s.getIds();  // Error here\n" +
					"        }\n" +
					"		public static void main(String[] args) {\n" +
					"			System.out.println(\"SUCCESS2\");\n" +
					"        }\n" +
					"}\n", // =================
			},
			"SUCCESS2",
			null,
			false,
			null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=139619
public void test0977() {
	this.runConformTest(
			new String[] {
					"MMTPProtocol.java", // =================
					"import java.io.InputStream;\n" +
					"import java.util.HashSet;\n" +
					"import bug.ProtocolManager;\n" +
					"abstract class AbstractProtocol<R, O> implements ProtocolManager<R, O> {\n" +
					"    public AbstractProtocol(HashSet<O> manager, String grp) {}\n" +
					"    AbstractProtocol(){} \n" +
					"     public void connect(ConnectType type) { }\n" +
					"}\n" +
					"public abstract class MMTPProtocol extends AbstractProtocol<InputStream, String> {\n" +
					"    public void connect(ConnectType type) {}\n" +
					"}\n", // =================
					"bug/ProtocolManager.java", // =================
					"package bug;\n" +
					"public interface ProtocolManager<R, O>{\n" +
					"    public enum ConnectType {Client,Server}\n" +
					"    public void connect(ConnectType type) ;\n" +
					"    public boolean receive(R input) throws Exception;\n" +
					"}", // =================
			},
			"");
	this.runConformTest(
			new String[] {
					"MMTPProtocol.java", // =================
					"import java.io.InputStream;\n" +
					"import java.util.HashSet;\n" +
					"import bug.ProtocolManager;\n" +
					"abstract class AbstractProtocol<R, O> implements ProtocolManager<R, O> {\n" +
					"    public AbstractProtocol(HashSet<O> manager, String grp) {}\n" +
					"    AbstractProtocol(){} \n" +
					"     public void connect(ConnectType type) { }\n" +
					"}\n" +
					"public abstract class MMTPProtocol extends AbstractProtocol<InputStream, String> {\n" +
					"    public void connect(ConnectType type) {}\n" +
					"}\n", // =================
			},
			"",
			null,
			false,
			null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=139669
public void test0978() {
	this.runConformTest(
			new String[] {
					"B.java", // =================
					"public class B<T> implements A<T> {\n" +
					"  public void foo(A.C c) {}\n" +
					"}", // =================
					"A.java", // =================
					"public interface A<T> {\n" +
					"  void foo(A.C c);\n" +
					"  class C {}\n" +
					"}", // =================
			},
			"");
	this.runConformTest(
			new String[] {
					"A.java", // =================
					"public interface A<T> {\n" +
					"  void foo(A.C c);\n" +
					"  class C {}\n" +
					"}", // =================
			},
			"",
			null,
			false,
			null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=139669
public void test0979() {
	this.runConformTest(
			new String[] {
					"B.java", // =================
					"public class B<T> extends A<T> {\n" +
					"  @Override\n" +
					"  public void foo(A.C c) {}\n" +
					"}", // =================
					"A.java", // =================
					"public class A<T> {\n" +
					"  public void foo(A.C c) {}\n" +
					"  public static class C {}\n" +
					"}", // =================
			},
			"");
	this.runConformTest(
			new String[] {
					"A.java", // =================
					"public class A<T> {\n" +
					"  public void foo(A.C c) {}\n" +
					"  public static class C {}\n" +
					"}", // =================
			},
			"",
			null,
			false,
			null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=140772
public void test0980() {
	this.runConformTest(
			new String[] {
					"X.java", // =================
					"import java.util.Collections;\n" +
					"import java.util.Set;\n" +
					"\n" +
					"public class X {\n" +
					"        public Set<Object> keySet() {\n" +
					"                return Collections.<Object> emptySet();\n" +
					"        }\n" +
					"}", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=140569
//simulate incremental compile
public void test0981() {
	this.runConformTest(
			new String[] {
				"Outer.java", //================================
				"//Outer.java\n" +
				"public class Outer<O> {\n" +
				"  public class Inner {}\n" +
				"\n" +
				"  public static void main(String[] args) {\n" +
				"    System.out.println(\"SUCCESS\");\n" +
				"  }\n" +
				"}\n" +
				"\n",
				"ExtendedOuter.java", //================================
				"public class ExtendedOuter<E> extends Outer<E> {\n" +
				"  class ExtendedInner extends Inner {\n" +
				"    public void method(){\n" +
				"      Worker.method(this);\n" +
				"    }\n" +
				"  }\n" +
				"}\n",
				"Worker.java", //================================
				"public class Worker {\n" +
				"  public static void method(Outer.Inner i) {}\n" +
				"}\n", //================================
			},
			"SUCCESS");
	this.runConformTest(
			new String[] {
					"ExtendedOuter.java", //================================
					"public class ExtendedOuter<E> extends Outer<E> {\n" +
					"  class ExtendedInner extends Inner {\n" +
					"    public void method(){\n" +
					"      Worker.method(this);\n" +
					"    }\n" +
					"  }\n" +
					"  public static void main(String[] args) {\n" +
					"    System.out.println(\"SUCCESS\");\n" +
					"  }\n" +
					"}\n", //================================
			},
			"SUCCESS",
			null,
			false,
			null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=140569
//simulate incremental compile
public void test0982() {
	this.runConformTest(
			new String[] {
				"Outer.java", //================================
				"//Outer.java\n" +
				"public class Outer<O> {\n" +
				"  public class Inner {\n" +
				"  		public class Inner2 {}\n" +
				"	}\n" +
				"\n" +
				"  public static void main(String[] args) {\n" +
				"    System.out.println(\"SUCCESS\");\n" +
				"  }\n" +
				"}\n" +
				"\n",
				"ExtendedOuter.java", //================================
				"public class ExtendedOuter<E> extends Outer<E> {\n" +
				"  class ExtendedInner extends Inner {\n" +
				"    class ExtendedInner2 extends Inner2 {\n" +
				"      public void method(){\n" +
				"        Worker.method(this);\n" +
				"      }\n" +
				"    }\n" +
				"  }\n" +
				"}\n",
				"Worker.java", //================================
				"public class Worker {\n" +
				"  public static void method(Outer.Inner.Inner2 i) {}\n" +
				"}\n", //================================
			},
			"SUCCESS");
	this.runConformTest(
			new String[] {
					"ExtendedOuter.java", //================================
					"public class ExtendedOuter<E> extends Outer<E> {\n" +
					"  class ExtendedInner extends Inner {\n" +
					"    class ExtendedInner2 extends Inner2 {\n" +
					"      public void method(){\n" +
					"        Worker.method(this);\n" +
					"      }\n" +
					"    }\n" +
					"  }\n" +
					"  public static void main(String[] args) {\n" +
					"    System.out.println(\"SUCCESS\");\n" +
					"  }\n" +
					"}\n", //================================
			},
			"SUCCESS",
			null,
			false,
			null);
}
public void test0983() {
	this.runNegativeTest(
			new String[] {
					"X.java", // =================
					"import java.util.*;\n" +
					"\n" +
					"public class X {\n" +
					"    public static void main(String[] args) throws Throwable {\n" +
					"	List<?> l1 = new ArrayList<Integer>();\n" +
					"	List<?> l2 = new ArrayList<Integer>();\n" +
					"	l1.addAll(l2);\n" +
					"    }\n" +
					"}\n", // =================
			},
			"----------\n" +
			"1. ERROR in X.java (at line 7)\n" +
			"	l1.addAll(l2);\n" +
			"	   ^^^^^^\n" +
			"The method addAll(Collection<? extends capture#1-of ?>) in the type List<capture#1-of ?> is not applicable for the arguments (List<capture#2-of ?>)\n" +
			"----------\n");
}
// generic inner class within a non generic one
public void test0984() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"public class X {\n" +
			"  public class XX<T> {}\n" +
			"}",
			"I.java",
			"public interface I {\n" +
			"    X.XX<String> foo();\n" +
			"}",
			"Y.java",
			"public class Y extends X implements I {\n" +
			"  public XX<String> foo() {\n" +
			"    return null;\n" +
			"  }\n" +
			"}",
		},
		// runtime results
		"" /* expected output string */);
	runConformTest(
		// test directory preparation
		false /* do not flush output directory */,
		new String[] { /* test files */
			"Y.java",
			"public class Y extends X implements I {\n" +
			"  public XX<String> foo() {\n" +
			"    return null;\n" +
			"  }\n" +
			"}",
			},
		// compiler results
		"" /* expected compiler log */,
		// runtime results
		"" /* expected output string */,
		"" /* expected error string */,
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=141330
public void test0985() {
	Map options = getCompilerOptions();
	options.put(JavaCore.COMPILER_PB_UNCHECKED_TYPE_OPERATION, JavaCore.IGNORE);
	this.runNegativeTest(
			new String[] {
					"X.java", // =================
					"import java.util.*;\n" +
					"public class X {\n" +
					"    public void testBreak() {\n" +
					"        List<Class<Object>>  lco = Arrays.asList(String.class, Integer.class, Long.class);\n" +
					"    }\n" +
					"}\n", // =================
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	List<Class<Object>>  lco = Arrays.asList(String.class, Integer.class, Long.class);\n" +
			"	                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from List<Class<? extends "+intersection("Object","Serializable","Comparable<?>")+">> to List<Class<Object>>\n" +
			"----------\n",
			null,
			true,
			options);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=91709
public void test0986() {
	this.runConformTest(
			new String[] {
					"T.java", // =================
					"public class T {\n" +
					"	public T() {\n" +
					"		S<String> s = new S<String>();\n" +
					"		s.setObj(\"S\");\n" +
					"		System.out.print(s.getObj());\n" +
					"		S<Integer> i = new S<Integer>();\n" +
					"		i.setObj(new Integer(100));\n" +
					"		System.out.print(i.getObj());\n" +
					"		S<MyClass> m = new S<MyClass>();\n" +
					"		m.setObj(new MyClass(\"[Terry]\"));\n" +
					"		System.out.print(m.getObj());\n" +
					"		S<MyClass> x = new S<MyClass>(new MyClass(\"[Corbet]\"));\n" +
					"		System.out.print(x.getObj());\n" +
					"	} // End of Constructor for T.\n" +
					"	public static void main(String[] args) {\n" +
					"		try {\n" +
					"			new T();\n" +
					"			System.out.println(\"SUCCESS\");\n" +
					"		} catch (Exception ex) {\n" +
					"			ex.printStackTrace();\n" +
					"		}\n" +
					"	} // End of main().\n" +
					"\n" +
					"	class MyClass {\n" +
					"		private String str;\n" +
					"		public MyClass(String str) {\n" +
					"			this.str = str;\n" +
					"		} // End of Constructor for MyClass.\n" +
					"		@Override\n" +
					"		public String toString() {\n" +
					"			return (\"MyClass = \" + str);\n" +
					"		} // End of toString().\n" +
					"	} // End of Embedded MyClass Class.\n" +
					"} // End of T Class.\n",  // =================
					"S.java", // =================
					"public class S<$T> extends B<$T> {\n" +
					"	public S() {\n" +
					"		super();\n" +
					"	} // End of Constructor for S.\n" +
					"	public S($T obj) {\n" +
					"		super(obj);\n" +
					"	} // End of Constructor for S.\n" +
					"} // End of S Class.\n",  // =================
					"B.java", // =================
					"public abstract class B<$T> {\n" +
					"	$T obj;\n" +
					"	public B() {\n" +
					"		;\n" +
					"	} // End of Constructor for B.\n" +
					"	public B($T obj) {\n" +
					"		this.obj = obj;\n" +
					"	} // End ofg Constructor of B.\n" +
					"	public $T getObj() {\n" +
					"		return (obj);\n" +
					"	} // End of getObj().\n" +
					"	public void setObj($T obj) {\n" +
					"		this.obj = obj;\n" +
					"	} // End of setObj().\n" +
					"} // End of B Class.", // =================

			},
			"S100MyClass = [Terry]MyClass = [Corbet]SUCCESS");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=140643
public void test0987() {
	String expectedOutput = new CompilerOptions(getCompilerOptions()).sourceLevel < ClassFileConstants.JDK1_6
    ?	"----------\n" +
		"1. ERROR in X.java (at line 7)\n" + 
		"	abstract class GLinkElementView<M,CM> extends AbstractLinkView<M> {}\n" + 
		"	               ^^^^^^^^^^^^^^^^\n" + 
		"The return types are incompatible for the inherited methods EditPart.getViewer(), AbstractLinkView<M>.getViewer()\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 11)\n" + 
		"	public ISheetViewer getViewer() { return null; }	\n" + 
		"	       ^^^^^^^^^^^^\n" + 
		"The return type is incompatible with EditPart.getViewer()\n" + 
		"----------\n" + 
		"3. ERROR in X.java (at line 11)\n" + 
		"	public ISheetViewer getViewer() { return null; }	\n" + 
		"	                    ^^^^^^^^^^^\n" + 
		"The method getViewer() of type AbstractLinkView<M> must override a superclass method\n" + 
		"----------\n"
    :	"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	abstract class GLinkElementView<M,CM> extends AbstractLinkView<M> {}\n" + 
		"	               ^^^^^^^^^^^^^^^^\n" + 
		"The return types are incompatible for the inherited methods EditPart.getViewer(), AbstractLinkView<M>.getViewer()\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 11)\n" + 
		"	public ISheetViewer getViewer() { return null; }	\n" + 
		"	       ^^^^^^^^^^^^\n" + 
		"The return type is incompatible with EditPart.getViewer()\n" + 
		"----------\n";
	this.runNegativeTest(
			new String[] {
				"X.java",//===================
				"public class X {\n" +
				"	void bar(GLinkElementView<?,?> g) {\n" +
				"		g.getViewer();\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"abstract class GLinkElementView<M,CM> extends AbstractLinkView<M> {}\n" +
				"\n" +
				"abstract class AbstractLinkView<M> extends AbstractConnectionEditPart implements ILinkViewElement {\n" +
				"	@Override\n" +
				"	public ISheetViewer getViewer() { return null; }	\n" +
				"}\n" +
				"\n" +
				"abstract class AbstractConnectionEditPart implements EditPart {}\n" +
				"\n" +
				"abstract class AbstractEditPart implements EditPart {\n" +
				"	public EditPartViewer getViewer() { return null; }\n" +
				"}\n" +
				"\n" +
				"interface ILinkViewElement {\n" +
				"	public ISheetViewer getViewer();\n" +
				"}\n" +
				"\n" +
				"interface ISheetViewer {}\n" +
				"\n" +
				"interface EditPart {\n" +
				"	EditPartViewer getViewer();\n" +
				"}\n" +
				"\n" +
				"interface EditPartViewer {}\n", // =================
			},
			expectedOutput);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=140643 - variation
public void test0988() {
	this.runNegativeTest(
			new String[] {
				"X.java",//===================
				"public class X {\n" +
				"	void bar(GLinkElementView<?,?> g) {\n" +
				"		g.getViewer();\n" +
				"	}\n" +
				"}\n" +
				"\n" +
				"abstract class GLinkElementView<M,CM> extends AbstractLinkView<M> {}\n" +
				"\n" +
				"abstract class AbstractLinkView<M> extends AbstractConnectionEditPart implements ILinkViewElement, IModelChangeListener {\n" +
				"	@Override\n" +
				"	public SheetViewer getViewer() { return null; }	\n" +
				"}\n" +
				"\n" +
				"abstract class AbstractConnectionEditPart extends AbstractGraphicalEditPart implements ConnectionEditPart {}\n" +
				"\n" +
				"abstract class AbstractGraphicalEditPart extends AbstractEditPart implements GraphicalEditPart {}\n" +
				"\n" +
				"abstract class AbstractEditPart implements EditPart {\n" +
				"	public EditPartViewer getViewer() { return null; }\n" +
				"}\n" +
				"\n" +
				"interface ILinkViewElement extends INodeViewElement {\n" +
				"	public ISheetViewer getViewer();\n" +
				"}\n" +
				"\n" +
				"class SheetViewer implements ISheetViewer {}\n" +
				"\n" +
				"interface ISheetViewer {}\n" +
				"\n" +
				"interface EditPart {\n" +
				"	EditPartViewer getViewer();\n" +
				"}\n" +
				"\n" +
				"interface ConnectionEditPart extends GraphicalEditPart {}\n" +
				"interface GraphicalEditPart extends EditPart {}\n" +
				"interface EditPartViewer {}\n" +
				"interface IModelChangeListener {}\n" +
				"\n" +
				"interface INodeViewElement {\n" +
				"	public ISheetViewer getViewer();\n" +
				"}", // =================
			},
			"----------\n" +
			"1. ERROR in X.java (at line 7)\n" + 
			"	abstract class GLinkElementView<M,CM> extends AbstractLinkView<M> {}\n" + 
			"	               ^^^^^^^^^^^^^^^^\n" + 
			"The return types are incompatible for the inherited methods EditPart.getViewer(), AbstractLinkView<M>.getViewer()\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 11)\n" + 
			"	public SheetViewer getViewer() { return null; }	\n" + 
			"	       ^^^^^^^^^^^\n" + 
			"The return type is incompatible with AbstractEditPart.getViewer()\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=142653
public void test0989() {
	this.runNegativeTest(
			new String[] {
				"Child.java",//===================
				"public class Child extends Parent<Object> {}\n" +
				"abstract class Parent<T> extends Grandparent<T> implements IParent {}\n" +
				"interface IParent<T> extends IGrandparent<T> {}\n" +
				"abstract class Grandparent<T> implements IGrandparent<T> {}\n" +
				"interface IGrandparent<T> {}", // =================, // =================
			},
			"----------\n" +
			"1. ERROR in Child.java (at line 2)\n" +
			"	abstract class Parent<T> extends Grandparent<T> implements IParent {}\n" +
			"	               ^^^^^^\n" +
			"The interface IGrandparent cannot be implemented more than once with different arguments: IGrandparent<T> and IGrandparent\n" +
			"----------\n" +
			"2. WARNING in Child.java (at line 2)\n" +
			"	abstract class Parent<T> extends Grandparent<T> implements IParent {}\n" +
			"	                                                           ^^^^^^^\n" +
			"IParent is a raw type. References to generic type IParent<T> should be parameterized\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=142653 - variation
public void test0990() {
	this.runNegativeTest(
			new String[] {
				"Child.java",//===================
				"public class Child extends Parent<Object> {}\n" +
				"abstract class Parent<T> extends Grandparent<T> implements IParent<?> {}\n" +
				"interface IParent<T> extends IGrandparent<T> {}\n" +
				"abstract class Grandparent<T> implements IGrandparent<T> {}\n" +
				"interface IGrandparent<T> {}", // =================, // =================
			},
			"----------\n" +
			"1. ERROR in Child.java (at line 1)\n" +
			"	public class Child extends Parent<Object> {}\n" +
			"	             ^^^^^\n" +
			"The hierarchy of the type Child is inconsistent\n" +
			"----------\n" +
			"2. ERROR in Child.java (at line 2)\n" +
			"	abstract class Parent<T> extends Grandparent<T> implements IParent<?> {}\n" +
			"	                                                           ^^^^^^^\n" +
			"The type Parent cannot extend or implement IParent<?>. A supertype may not specify any wildcard\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=142653 - variation
public void test0991() {
	this.runNegativeTest(
			new String[] {
				"X.java",//===================
				"public class X extends SX<String> implements IX<Object> {}\n" +
				"class SX<T> extends TX<Thread> implements IX<T> {}\n" +
				"class TX<U> implements IX<U> {}\n" +
				"interface IX<V> {}\n", // =================, // =================
			},
			"----------\n" +
			"1. ERROR in X.java (at line 1)\n" +
			"	public class X extends SX<String> implements IX<Object> {}\n" +
			"	             ^\n" +
			"The interface IX cannot be implemented more than once with different arguments: IX<Thread> and IX<Object>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 2)\n" +
			"	class SX<T> extends TX<Thread> implements IX<T> {}\n" +
			"	      ^^\n" +
			"The interface IX cannot be implemented more than once with different arguments: IX<Thread> and IX<T>\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=142653 - variation
public void test0992() {
	this.runNegativeTest(
			new String[] {
				"X.java",//===================
				"import java.util.*;\n" +
				"public abstract class X<T0> implements Collection, I<T0> {\n" +
				"	\n" +
				"	void foo() {\n" +
				"		this.add(new Object());\n" +
				"		this.add(null);\n" +
				"	}\n" +
				"}\n" +
				"interface I<T1> extends Collection<String> {\n" +
				"}\n", // =================, // =================
			},
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	public abstract class X<T0> implements Collection, I<T0> {\n" +
			"	                      ^\n" +
			"The interface Collection cannot be implemented more than once with different arguments: Collection<String> and Collection\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 2)\n" +
			"	public abstract class X<T0> implements Collection, I<T0> {\n" +
			"	                                       ^^^^^^^^^^\n" +
			"Collection is a raw type. References to generic type Collection<E> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 5)\n" +
			"	this.add(new Object());\n" +
			"	^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The method add(Object) belongs to the raw type Collection. References to generic type Collection<E> should be parameterized\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 6)\n" +
			"	this.add(null);\n" +
			"	^^^^^^^^^^^^^^\n" +
			"Type safety: The method add(Object) belongs to the raw type Collection. References to generic type Collection<E> should be parameterized\n" +
			"----------\n");
}

//https://bugs.eclipse.org/bugs/show_bug.cgi?id=142897
public void test0993() {
	runConformTest(
		true,
		new String[] {
			"X.java",//===================
			"public class X {\n" +
			"  public class Inner {\n" +
			"    Inner() {\n" +
			"      System.out.println(\"SUCCESS\");\n" +
			"    }\n" +
			"  }\n" +
			"  public static void main(String[] args) {\n" +
			"    new ATest<X>();\n" +
			"  }\n" +
			"}\n" +
			"\n" +
			"class ATest<T extends X> {\n" +
			"   public ATest() {\n" +
			"      T instance = makeInstance();\n" +
			"      X.Inner peq = instance.new Inner(); //**\n" +
			"   }\n" +
			"\n" +
			"   private T makeInstance() {\n" +
			"      return (T) new X();\n" +
			"   }\n" +
			"}", // =================
		},
		null,
		"SUCCESS",
		null,
		JavacTestOptions.JavacHasABug.JavacBug6569404);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=142897 - variation
public void test0994() {
	this.runConformTest(
			new String[] {
				"X.java",//===================
				"public class X {\n" +
				"  public class Inner {\n" +
				"    Inner() {\n" +
				"      System.out.println(\"SUCCESS\");\n" +
				"    }\n" +
				"  }\n" +
				"  void foo(boolean b, X1 x1, X2 x2) {\n" +
				"	  (b ? x1 : x2).new Inner();\n" +
				"  }\n" +
				"  public static void main(String[] args) {\n" +
				"    new X().foo(true, new X1(), new X2());\n" +
				"  }\n" +
				"}\n" +
				"\n" +
				"class X1 extends X implements Comparable<X1> {\n" +
				"  public int compareTo(X1 other) {\n" +
				"    return 0;\n" +
				"  }\n" +
				"}\n" +
				"class X2 extends X implements Comparable<X2> {\n" +
				"  public int compareTo(X2 other) {\n" +
				"    return 0;\n" +
				"  }\n" +
				"}\n", // =================
			},
			"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=142964
public void _test0995() {
	this.runNegativeTest(
			new String[] {
				"X.java",//===================
				"public class X {\n" +
				"  public class Inner {\n" +
				"  }\n" +
				"  void foo(boolean b, X1 x1, X2 x2) {\n" +
				"	  Comparable<? extends X> cx1 = b ? x1 : x2;\n" +
				"	  Comparable<X> cx2 = b ? x1 : x2;\n" +
				"	  String s = b ? x1 : x2;\n" +
				"  }\n" +
				"}\n" +
				"\n" +
				"abstract class X1 extends X implements Comparable<X1> {}\n" +
				"abstract class X2 extends X implements Comparable<X2> {}", // =================
			},
			"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=143793
public void test0996() {
	this.runNegativeTest(
			new String[] {
				"X.java",//===================
				"import java.util.ArrayList;\n" +
				"import java.util.List;\n" +
				"\n" +
				"public class X<T> {\n" +
				"  private T aObject = null;\n" +
				"  public static <U> List<U> castList(final List<? extends Object> pList, final Class<U> pClass) {\n" +
				"    final List<U> result = new ArrayList<U>();\n" +
				"    for (Object o:pList) {\n" +
				"      if (pClass.isInstance(o)) {\n" +
				"        result.add(pClass.cast(o));\n" +
				"      }\n" +
				"    }\n" +
				"    return result;\n" +
				"  }\n" +
				"\n" +
				"  public static void main(final String[] pArgs) {\n" +
				"    final List<Object> l1 = new ArrayList<Object>();\n" +
				"    l1.add(new X<String>());\n" +
				"    l1.add(new X<String>());\n" +
				"    final List<X<?>> l2 = castList(l1, List.class);\n" +
				"    \n" +
				"    List<X> l3 = l2;\n" +
				"    List<X<String>> l4 = null;\n" +
				"    l3 = l4;\n" +
				"  }\n" +
				"\n" +
				"}\n", // =================
			},
			"----------\n" +
			"1. ERROR in X.java (at line 20)\n" +
			"	final List<X<?>> l2 = castList(l1, List.class);\n" +
			"	                      ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from List<List> to List<X<?>>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 22)\n" +
			"	List<X> l3 = l2;\n" +
			"	     ^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 22)\n" +
			"	List<X> l3 = l2;\n" +
			"	             ^^\n" +
			"Type mismatch: cannot convert from List<X<?>> to List<X>\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 24)\n" +
			"	l3 = l4;\n" +
			"	     ^^\n" +
			"Type mismatch: cannot convert from List<X<String>> to List<X>\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=142897 - variation
public void test0997() {
	runConformTest(
		true,
		new String[] {
			"X.java",//===================
			"public class X implements Outer {\n" +
			"  public static void main(String[] args) {\n" +
			"    new ATest<X>();\n" +
			"  }\n" +
			"}\n" +
			"interface Outer {\n" +
			"  public class Inner {\n" +
			"    Inner() {\n" +
			"      System.out.println(\"SUCCESS\");\n" +
			"    }\n" +
			"  }\n" +
			"}\n" +
			"\n" +
			"class ATest<T extends Outer> {\n" +
			"   public ATest() {\n" +
			"      Outer.Inner peq = new T.Inner(); //**\n" +
			"   }\n" +
			"\n" +
			"   private T makeInstance() {\n" +
			"      return (T) new X();\n" +
			"   }\n" +
			"}", // =================
		},
		null,
		"SUCCESS",
		null,
		JavacTestOptions.JavacHasABug.JavacBug6569404);
}
//regression test for https://bugs.eclipse.org/bugs/show_bug.cgi?id=144261
public void test0998() {
	this.runConformTest(
		new String[] {
			"X.java",
			"class X {\n" +
			"    static abstract class Generic<F> {\n" +
			"        static class Inner {\n" +
			"            static class InnerInner { }\n" +
			"            InnerInner createTableModel() {\n" +
			"                return new InnerInner();\n" +
			"            }\n" +
			"        }\n" +
			"    }\n" +
			"    static class SubGeneric<S> extends Generic<S> {\n" +
			"        static class SubInner extends Inner {\n" +
			"            InnerInner createTableModel() {\n" +
			"                return super.createTableModel(); \n" +
			"            }\n" +
			"        }\n" +
			"    }\n" +
			"}",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=144879
// SHOULD FAIL AT 1.8 (18.2.3): The method chain(Iterator<E>...) in the type X is not applicable for the arguments (Iterator[])
public void test0999() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"public class X {\n" +
			"	public static final <T,E extends T> Iterator<T> chain(Iterator<E>... it) {\n" +
			"		return null;\n" +
			"	}\n" +
			"	void foo1() {\n" +
			"		List<Integer> l1 = Arrays.asList(1, 2, 3);\n" +
			"		List<Float> l2 = Arrays.asList(4f, 5f, 6f);\n" +
			"		Iterator<Number> it1 = X.chain(new Iterator[] { l1.iterator(), l2.iterator() });\n" +
			"	}\n" +
			"	void foo2() {\n" +
			"		List<Integer> l1 = Arrays.asList(1, 2, 3);\n" +
			"		List<Float> l2 = Arrays.asList(4f, 5f, 6f);\n" +
			"		Iterator<Number> it2 = X.chain(l1.iterator(), l2.iterator());\n" +
			"	}\n" +
			"	void foo3() {\n" +
			"		List<Integer> l1 = Arrays.asList(1, 2, 3);\n" +
			"		Iterator<Number> it2 = X.chain(l1.iterator(), l1.iterator());\n" +
			"	}\n" +
			"}", // =================
		},
		this.complianceLevel < ClassFileConstants.JDK1_7 ?
		"----------\n" + 
		"1. WARNING in X.java (at line 9)\n" + 
		"	Iterator<Number> it1 = X.chain(new Iterator[] { l1.iterator(), l2.iterator() });\n" + 
		"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: Unchecked invocation chain(Iterator[]) of the generic method chain(Iterator<E>...) of type X\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 9)\n" + 
		"	Iterator<Number> it1 = X.chain(new Iterator[] { l1.iterator(), l2.iterator() });\n" + 
		"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: The expression of type Iterator needs unchecked conversion to conform to Iterator<Number>\n" + 
		"----------\n" + 
		"3. WARNING in X.java (at line 9)\n" + 
		"	Iterator<Number> it1 = X.chain(new Iterator[] { l1.iterator(), l2.iterator() });\n" + 
		"	                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: The expression of type Iterator[] needs unchecked conversion to conform to Iterator<Number>[]\n" + 
		"----------\n" + 
		"4. ERROR in X.java (at line 14)\n" + 
		"	Iterator<Number> it2 = X.chain(l1.iterator(), l2.iterator());\n" + 
		"	                         ^^^^^\n" + 
		"The method chain(Iterator<E>...) in the type X is not applicable for the arguments (Iterator<Integer>, Iterator<Float>)\n" + 
		"----------\n" + 
		"5. WARNING in X.java (at line 18)\n" + 
		"	Iterator<Number> it2 = X.chain(l1.iterator(), l1.iterator());\n" + 
		"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: A generic array of Iterator<Integer> is created for a varargs parameter\n" + 
		"----------\n" :
			"----------\n" + 
			"1. WARNING in X.java (at line 3)\n" + 
			"	public static final <T,E extends T> Iterator<T> chain(Iterator<E>... it) {\n" + 
			"	                                                                     ^^\n" + 
			"Type safety: Potential heap pollution via varargs parameter it\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 9)\n" + 
			"	Iterator<Number> it1 = X.chain(new Iterator[] { l1.iterator(), l2.iterator() });\n" + 
			"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation chain(Iterator[]) of the generic method chain(Iterator<E>...) of type X\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 9)\n" + 
			"	Iterator<Number> it1 = X.chain(new Iterator[] { l1.iterator(), l2.iterator() });\n" + 
			"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: The expression of type Iterator needs unchecked conversion to conform to Iterator<Number>\n" + 
			"----------\n" + 
			"4. WARNING in X.java (at line 9)\n" + 
			"	Iterator<Number> it1 = X.chain(new Iterator[] { l1.iterator(), l2.iterator() });\n" + 
			"	                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			(this.complianceLevel < ClassFileConstants.JDK1_8
			? "Type safety: The expression of type Iterator[] needs unchecked conversion to conform to Iterator<Number>[]\n"
			: "Type safety: The expression of type Iterator[] needs unchecked conversion to conform to Iterator<Object>[]\n") +
			"----------\n" + 
			"5. ERROR in X.java (at line 14)\n" + 
			"	Iterator<Number> it2 = X.chain(l1.iterator(), l2.iterator());\n" + 
			"	                         ^^^^^\n" + 
			"The method chain(Iterator<E>...) in the type X is not applicable for the arguments (Iterator<Integer>, Iterator<Float>)\n" + 
			"----------\n" + 
			"6. WARNING in X.java (at line 18)\n" + 
			"	Iterator<Number> it2 = X.chain(l1.iterator(), l1.iterator());\n" + 
			"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: A generic array of Iterator<Integer> is created for a varargs parameter\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=144879
public void test1000() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"public class X {\n" +
			"	public static final <T> Iterator<T> chain(Iterator<? extends T>... it) {\n" +
			"		return null;\n" +
			"	}\n" +
			"	void foo1() {\n" +
			"		List<Integer> l1 = Arrays.asList(1, 2, 3);\n" +
			"		List<Float> l2 = Arrays.asList(4f, 5f, 6f);\n" +
			"		Iterator<Number> it1 = X.chain(new Iterator[] { l1.iterator(), l2.iterator() });\n" +
			"	}\n" +
			"	void foo2() {\n" +
			"		List<Integer> l1 = Arrays.asList(1, 2, 3);\n" +
			"		List<Float> l2 = Arrays.asList(4f, 5f, 6f);\n" +
			"		Iterator<Number> it2 = X.chain(l1.iterator(), l2.iterator());\n" +
			"	}\n" +
			"	void foo3() {\n" +
			"		List<Integer> l1 = Arrays.asList(1, 2, 3);\n" +
			"		Iterator<Number> it2 = X.chain(l1.iterator(), l1.iterator());\n" +
			"	}\n" +
			"}", // =================
		},
		this.complianceLevel < ClassFileConstants.JDK1_7 ?
		"----------\n" + 
		"1. WARNING in X.java (at line 9)\n" + 
		"	Iterator<Number> it1 = X.chain(new Iterator[] { l1.iterator(), l2.iterator() });\n" + 
		"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: Unchecked invocation chain(Iterator[]) of the generic method chain(Iterator<? extends T>...) of type X\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 9)\n" + 
		"	Iterator<Number> it1 = X.chain(new Iterator[] { l1.iterator(), l2.iterator() });\n" + 
		"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: The expression of type Iterator needs unchecked conversion to conform to Iterator<Number>\n" + 
		"----------\n" + 
		"3. WARNING in X.java (at line 9)\n" + 
		"	Iterator<Number> it1 = X.chain(new Iterator[] { l1.iterator(), l2.iterator() });\n" + 
		"	                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: The expression of type Iterator[] needs unchecked conversion to conform to Iterator<? extends Number>[]\n" +
		"----------\n" + 
		"4. WARNING in X.java (at line 14)\n" + 
		"	Iterator<Number> it2 = X.chain(l1.iterator(), l2.iterator());\n" + 
		"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: A generic array of Iterator<? extends "+ intersection("Number", "Comparable<?>") +"> is created for a varargs parameter\n" + 
		"----------\n" + 
		"5. ERROR in X.java (at line 14)\n" + 
		"	Iterator<Number> it2 = X.chain(l1.iterator(), l2.iterator());\n" + 
		"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type mismatch: cannot convert from Iterator<"+ intersection("Number", "Comparable<?>") +"> to Iterator<Number>\n" + 
		"----------\n" + 
		"6. WARNING in X.java (at line 18)\n" + 
		"	Iterator<Number> it2 = X.chain(l1.iterator(), l1.iterator());\n" + 
		"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: A generic array of Iterator<? extends Integer> is created for a varargs parameter\n" + 
		"----------\n" + 
		"7. ERROR in X.java (at line 18)\n" + 
		"	Iterator<Number> it2 = X.chain(l1.iterator(), l1.iterator());\n" + 
		"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type mismatch: cannot convert from Iterator<Integer> to Iterator<Number>\n" + 
		"----------\n" :
		(this.complianceLevel == ClassFileConstants.JDK1_7 ?
			"----------\n" + 
			"1. WARNING in X.java (at line 3)\n" + 
			"	public static final <T> Iterator<T> chain(Iterator<? extends T>... it) {\n" + 
			"	                                                                   ^^\n" + 
			"Type safety: Potential heap pollution via varargs parameter it\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 9)\n" + 
			"	Iterator<Number> it1 = X.chain(new Iterator[] { l1.iterator(), l2.iterator() });\n" + 
			"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation chain(Iterator[]) of the generic method chain(Iterator<? extends T>...) of type X\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 9)\n" + 
			"	Iterator<Number> it1 = X.chain(new Iterator[] { l1.iterator(), l2.iterator() });\n" + 
			"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: The expression of type Iterator needs unchecked conversion to conform to Iterator<Number>\n" + 
			"----------\n" + 
			"4. WARNING in X.java (at line 9)\n" + 
			"	Iterator<Number> it1 = X.chain(new Iterator[] { l1.iterator(), l2.iterator() });\n" + 
			"	                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: The expression of type Iterator[] needs unchecked conversion to conform to Iterator<? extends Number>[]\n" + 
			"----------\n" + 
			"5. WARNING in X.java (at line 14)\n" + 
			"	Iterator<Number> it2 = X.chain(l1.iterator(), l2.iterator());\n" + 
			"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: A generic array of Iterator<? extends Number&"+ intersection("Comparable<?>") +"> is created for a varargs parameter\n" + 
			"----------\n" + 
			"6. ERROR in X.java (at line 14)\n" + 
			"	Iterator<Number> it2 = X.chain(l1.iterator(), l2.iterator());\n" + 
			"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type mismatch: cannot convert from Iterator<Number&"+ intersection("Comparable<?>") +"> to Iterator<Number>\n" + 
			"----------\n" + 
			"7. WARNING in X.java (at line 18)\n" + 
			"	Iterator<Number> it2 = X.chain(l1.iterator(), l1.iterator());\n" + 
			"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: A generic array of Iterator<? extends Integer> is created for a varargs parameter\n" + 
			"----------\n" + 
			"8. ERROR in X.java (at line 18)\n" + 
			"	Iterator<Number> it2 = X.chain(l1.iterator(), l1.iterator());\n" + 
			"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type mismatch: cannot convert from Iterator<Integer> to Iterator<Number>\n" + 
			"----------\n"
		:	// no more errors in JDK1_8+
			"----------\n" + 
			"1. WARNING in X.java (at line 3)\n" + 
			"	public static final <T> Iterator<T> chain(Iterator<? extends T>... it) {\n" + 
			"	                                                                   ^^\n" + 
			"Type safety: Potential heap pollution via varargs parameter it\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 9)\n" + 
			"	Iterator<Number> it1 = X.chain(new Iterator[] { l1.iterator(), l2.iterator() });\n" + 
			"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation chain(Iterator[]) of the generic method chain(Iterator<? extends T>...) of type X\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 9)\n" + 
			"	Iterator<Number> it1 = X.chain(new Iterator[] { l1.iterator(), l2.iterator() });\n" + 
			"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: The expression of type Iterator needs unchecked conversion to conform to Iterator<Number>\n" + 
			"----------\n" + 
			"4. WARNING in X.java (at line 9)\n" + 
			"	Iterator<Number> it1 = X.chain(new Iterator[] { l1.iterator(), l2.iterator() });\n" + 
			"	                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: The expression of type Iterator[] needs unchecked conversion to conform to Iterator<? extends Object>[]\n" + 
			"----------\n" + 
			"5. WARNING in X.java (at line 14)\n" + 
			"	Iterator<Number> it2 = X.chain(l1.iterator(), l2.iterator());\n" + 
			"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: A generic array of Iterator<? extends Number> is created for a varargs parameter\n" + 
			"----------\n" + 
			"6. WARNING in X.java (at line 18)\n" + 
			"	Iterator<Number> it2 = X.chain(l1.iterator(), l1.iterator());\n" + 
			"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: A generic array of Iterator<? extends Number> is created for a varargs parameter\n" + 
			"----------\n"
		)
	);
}
public void test1001() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	static class Box<T> {}\n" +
			"	static class ABox<T extends A> {}\n" +
			"	static class A {}\n" +
			"	\n" +
			"	void foo(ABox<? extends A> a1, ABox<?> a2) {\n" +
			"		a1 = a2;	\n" +
			"	}\n" +
			"}", // =================
		},
		"");
}
public void test1002() {
	this.runNegativeTest(
		new String[] {
			"Base.java",
			"class Base {\n" +
			"}\n" +
			"class Foo<U extends Base, V extends Bar<U, Foo<U, V>>> {\n" +
			"	U u;\n" +
			"	V v;\n" +
			"}\n" +
			"class Bar<E extends Base, F extends Foo<E, Bar<E, F>>> {\n" +
			"	E e;\n" +
			"	F f;\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in Base.java (at line 3)\n" +
		"	class Foo<U extends Base, V extends Bar<U, Foo<U, V>>> {\n" +
		"	                                           ^^^\n" +
		"Bound mismatch: The type Foo<U,V> is not a valid substitute for the bounded parameter <F extends Foo<E,Bar<E,F>>> of the type Bar<E,F>\n" +
		"----------\n" +
		"2. ERROR in Base.java (at line 7)\n" +
		"	class Bar<E extends Base, F extends Foo<E, Bar<E, F>>> {\n" +
		"	                                           ^^^\n" +
		"Bound mismatch: The type Bar<E,F> is not a valid substitute for the bounded parameter <V extends Bar<U,Foo<U,V>>> of the type Foo<U,V>\n" +
		"----------\n");
}
public void test1003() {
	this.runConformTest(
		new String[] {
			"B.java",
			"class B {\n" +
			"}\n" +
			"class S<BB extends B, SS extends S<BB, SS, TT>, TT extends T<BB, SS, TT>> {\n" +
			"	BB b;\n" +
			"	TT t;\n" +
			"}\n" +
			"class T<BB extends B, SS extends S<BB, SS, TT>, TT extends T<BB, SS, TT>> {\n" +
			"	BB b;\n" +
			"	SS t;\n" +
			"}\n", // =================
		},
		"");
}
public void test1004() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"public class X {\n" +
			"	<B> B getOtherValue() {\n" +
			"		return null;\n" +
			"	}\n" +
			"	<A> A getValue() {\n" +
			"		return getOtherValue();\n" +
			"	}\n" +
			"}", // =================
		},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_7 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=145420
public void test1005() {
	runConformTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"X.java",
			"public class X<T1,T2> {\n" +
			"\n" +
			"    private static final Object NULL_REF = new Object();\n" +
			"    private Object data;\n" +
			"\n" +
			"    private static <RT> RT unwrap(Object obj) {\n" +
			"        return (RT)(obj == NULL_REF ? null : obj);\n" +
			"    }\n" +
			"\n" +
			"    public T1 getAsT1() {\n" +
			"        return unwrap(data);\n" +
			"    }\n" +
			"\n" +
			"    public T2 getAsT2() {\n" +
			"        return unwrap(data);\n" +
			"    }\n" +
			"}", // =================
		},
	// compiler results
	null /* do not check compiler log */,
	// runtime results
	"" /* expected output string */,
	"" /* expected error string */,
	// javac options
	JavacTestOptions.JavacHasABug.JavacBugFixed_7 /* javac test options */);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=145420 - variant
public void test1005b() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T1,T2> {\n" +
			"\n" +
			"    private static final Object NULL_REF = new Object();\n" +
			"    private Object data;\n" +
			"\n" +
			"    private static <RT> RT unwrap(Object obj) {\n" +
			"        return (RT)(obj == NULL_REF ? null : obj);\n" +
			"    }\n" +
			"\n" +
			"    public T1 getAsT1() {\n" +
			"        return unwrap(data);\n" +
			"    }\n" +
			"\n" +
			"    public T2 getAsT2() {\n" +
			"        return unwrap(data);\n" +
			"    }\n" +
			"    Zork z;\n" +
			"}", // =================
		},
		"----------\n" +
		"1. WARNING in X.java (at line 7)\n" +
		"	return (RT)(obj == NULL_REF ? null : obj);\n" +
		"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from Object to RT\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 17)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
public void test1006() {
	this.runConformTest(
		new String[] {
			"X.java",
			"class Reference<T> {\n" +
			"	T target;\n" +
			"	Reference(T target) {\n" +
			"		this.target = target;\n" +
			"	}\n" +
			"	T deref() {\n" +
			"		return this.target;\n" +
			"	}\n" +
			"	static <U> Reference<U> create(U u) {\n" +
			"		return new Reference<U>(u);\n" +
			"	}\n" +
			"}\n" +
			"class BaseObject {}\n" +
			"class Person extends BaseObject {}\n" +
			"class Building extends BaseObject {}\n" +
			"\n" +
			"public class X {\n" +
			"	void foo(Building b, Person p) {\n" +
			"		Reference<Building> bRef = Reference.create(b);\n" +
			"		Reference<Person> pRef = Reference.create(p);\n" +
			"\n" +
			"		final Building building = bRef.deref();\n" +
			"		final Person person = pRef.deref();\n" +
			"	}\n" +
			"}", // =================
		},
		"");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=147381
public void test1007() {
	this.runNegativeTest(
		new String[] {
			"GenericsProblem.java",
			"public class GenericsProblem {\n" +
			"	public <T> void test(T val) {\n" +
			"		GenericsProblem gp = new GenericsProblem();\n" +
			"		Class<? extends GenericsProblem> cl2 = gp.getClass();\n" +
			"		Class<? extends T> cl = val.getClass();\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in GenericsProblem.java (at line 5)\n" +
		"	Class<? extends T> cl = val.getClass();\n" +
		"	                        ^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from Class<capture#2-of ? extends Object> to Class<? extends T>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=148061
// FAIL ERRMSG (type display)
public void test1008() {
	if (this.complianceLevel >= ClassFileConstants.JDK1_8)
		return;
	runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	void foo(L l, C<? extends X> c) {\n" +
			"		X x = bar(l, c);\n" +
			"	}\n" +
			"	<T> T bar(L<T> l, C<? extends T> c) { \n" +
			"		return zork;\n" +
			"	}	\n" +
			"}\n" +
			"class C<E> {}\n" +
			"class L<E> {}\n" +
			"\n" +
			"\n", // =================
		},
		"----------\n" + 
		"1. WARNING in X.java (at line 2)\n" + 
		"	void foo(L l, C<? extends X> c) {\n" + 
		"	         ^\n" + 
		"L is a raw type. References to generic type L<E> should be parameterized\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 3)\n" + 
		"	X x = bar(l, c);\n" + 
		"	      ^^^^^^^^^\n" + 
		"Type safety: Unchecked invocation bar(L, C<capture#1-of ? extends X>) of the generic method bar(L<T>, C<? extends T>) of type X\n" + 
		"----------\n" + 
		"3. WARNING in X.java (at line 3)\n" + 
		"	X x = bar(l, c);\n" + 
		"	          ^\n" + 
		"Type safety: The expression of type L needs unchecked conversion to conform to L<X>\n" + 
		"----------\n" + 
		"4. ERROR in X.java (at line 6)\n" + 
		"	return zork;\n" + 
		"	       ^^^^\n" + 
		"zork cannot be resolved to a variable\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=148061 - variation
public void test1009() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.Map;\n" +
			"public class X {\n" +
			"\n" +
			"	void foo(Map<String,Map> map) {\n" +
			"		bar(map);\n" +
			"	}\n" +
			"	<U,V> void bar(Map<U,Map<U,V>> map) {\n" +
			"	}\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. WARNING in X.java (at line 4)\n" +
		"	void foo(Map<String,Map> map) {\n" +
		"	                    ^^^\n" +
		"Map is a raw type. References to generic type Map<K,V> should be parameterized\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 5)\n" +
		"	bar(map);\n" +
		"	^^^\n" +
		"The method bar(Map<U,Map<U,V>>) in the type X is not applicable for the arguments (Map<String,Map>)\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=148061 - variation
public void test1010() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.Map;\n" +
			"public class X {\n" +
			"\n" +
			"	void foo(Map<String,Map> map) {\n" +
			"		bar(map);\n" +
			"	}\n" +
			"	<U,V> void bar(Map<U,? extends Map<U,V>> map) {\n" +
			"	}\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. WARNING in X.java (at line 4)\n" +
		"	void foo(Map<String,Map> map) {\n" +
		"	                    ^^^\n" +
		"Map is a raw type. References to generic type Map<K,V> should be parameterized\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 5)\n" +
		"	bar(map);\n" +
		"	^^^\n" +
		"The method bar(Map<U,? extends Map<U,V>>) in the type X is not applicable for the arguments (Map<String,Map>)\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=148061 - variation
public void test1011() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"public class X {\n" +
			"	void foo(HashMap map, String s, Map<String,String> map2) {\n" +
			"		bar(map, s, map2); //1\n" +
			"		bar(map2, s, map2); //2\n" +
			"		bar2(map, s, map2); //3\n" +
			"		bar3(map, s, map2); //4\n" +
			"	}\n" +
			"	<U> void bar(Map<U,U> map, U u, Map<U,U> map2) {}\n" +
			"	void bar2(Map<String,String> map, String s, Map<String,String> map2) {}\n" +
			"	<U> void bar3(Map<String,String> map, U s, Map<U,U> map2) {}\n" +
			"}\n", // =================
		},
		"----------\n" + 
		"1. WARNING in X.java (at line 3)\n" + 
		"	void foo(HashMap map, String s, Map<String,String> map2) {\n" + 
		"	         ^^^^^^^\n" + 
		"HashMap is a raw type. References to generic type HashMap<K,V> should be parameterized\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 4)\n" + 
		"	bar(map, s, map2); //1\n" + 
		"	^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: Unchecked invocation bar(HashMap, String, Map<String,String>) of the generic method bar(Map<U,U>, U, Map<U,U>) of type X\n" + 
		"----------\n" + 
		"3. WARNING in X.java (at line 4)\n" + 
		"	bar(map, s, map2); //1\n" + 
		"	    ^^^\n" + 
		"Type safety: The expression of type HashMap needs unchecked conversion to conform to Map<String,String>\n" + 
		"----------\n" + 
		"4. WARNING in X.java (at line 6)\n" + 
		"	bar2(map, s, map2); //3\n" + 
		"	     ^^^\n" + 
		"Type safety: The expression of type HashMap needs unchecked conversion to conform to Map<String,String>\n" + 
		"----------\n" + 
		"5. WARNING in X.java (at line 7)\n" + 
		"	bar3(map, s, map2); //4\n" + 
		"	^^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: Unchecked invocation bar3(HashMap, String, Map<String,String>) of the generic method bar3(Map<String,String>, U, Map<U,U>) of type X\n" + 
		"----------\n" + 
		"6. WARNING in X.java (at line 7)\n" + 
		"	bar3(map, s, map2); //4\n" + 
		"	     ^^^\n" + 
		"Type safety: The expression of type HashMap needs unchecked conversion to conform to Map<String,String>\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=148061 - variation
public void test1012() {
	runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	void foo(L l, C<X> c) {\n" +
			"		X x = bar1(l, c);\n" +
			"		L<X> lx = bar2(l, c);\n" +
			"		C<X> cx = bar3(l, c);\n" +
			"	}\n" +
			"	<T> T bar1(L<T> l, C<T> c) {\n" +
			"		return null;\n" +
			"	}\n" +
			"	<T> L<T> bar2(L<T> l, C<T> c) {\n" +
			"		return null;\n" +
			"	}\n" +
			"	<T> C<T> bar3(L<T> l, C<T> c) {\n" +
			"		return zork;\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"class C<E> {}\n" +
			"class L<E> {}\n", // =================
		},
		"----------\n" + 
		"1. WARNING in X.java (at line 2)\n" + 
		"	void foo(L l, C<X> c) {\n" + 
		"	         ^\n" + 
		"L is a raw type. References to generic type L<E> should be parameterized\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 3)\n" + 
		"	X x = bar1(l, c);\n" + 
		"	      ^^^^^^^^^^\n" + 
		"Type safety: Unchecked invocation bar1(L, C<X>) of the generic method bar1(L<T>, C<T>) of type X\n" + 
		"----------\n" + 
		"3. WARNING in X.java (at line 3)\n" + 
		"	X x = bar1(l, c);\n" + 
		"	           ^\n" + 
		"Type safety: The expression of type L needs unchecked conversion to conform to L<X>\n" + 
		"----------\n" + 
		"4. WARNING in X.java (at line 4)\n" + 
		"	L<X> lx = bar2(l, c);\n" + 
		"	          ^^^^^^^^^^\n" + 
		"Type safety: Unchecked invocation bar2(L, C<X>) of the generic method bar2(L<T>, C<T>) of type X\n" + 
		"----------\n" + 
		"5. WARNING in X.java (at line 4)\n" + 
		"	L<X> lx = bar2(l, c);\n" + 
		"	          ^^^^^^^^^^\n" + 
		"Type safety: The expression of type L needs unchecked conversion to conform to L<X>\n" + 
		"----------\n" + 
		"6. WARNING in X.java (at line 4)\n" + 
		"	L<X> lx = bar2(l, c);\n" + 
		"	               ^\n" + 
		"Type safety: The expression of type L needs unchecked conversion to conform to L<X>\n" + 
		"----------\n" + 
		"7. WARNING in X.java (at line 5)\n" + 
		"	C<X> cx = bar3(l, c);\n" + 
		"	          ^^^^^^^^^^\n" + 
		"Type safety: Unchecked invocation bar3(L, C<X>) of the generic method bar3(L<T>, C<T>) of type X\n" + 
		"----------\n" + 
		"8. WARNING in X.java (at line 5)\n" + 
		"	C<X> cx = bar3(l, c);\n" + 
		"	          ^^^^^^^^^^\n" + 
		"Type safety: The expression of type C needs unchecked conversion to conform to C<X>\n" + 
		"----------\n" + 
		"9. WARNING in X.java (at line 5)\n" + 
		"	C<X> cx = bar3(l, c);\n" + 
		"	               ^\n" + 
		"Type safety: The expression of type L needs unchecked conversion to conform to L<X>\n" + 
		"----------\n" + 
		"10. ERROR in X.java (at line 14)\n" + 
		"	return zork;\n" + 
		"	       ^^^^\n" + 
		"zork cannot be resolved to a variable\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=148061 - variation
public void test1013() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		List<String> ls = new ArrayList<String>();\n" +
			"		ls.add(\"foo\");\n" +
			"		List<X> lx = new ArrayList<X>();\n" +
			"		lx.add(new X());\n" +
			"		new X().foo(ls, lx);\n" +
			"	}\n" +
			"	void done() {\n" +
			"		System.out.println(zork);\n" +
			"	}\n" +
			"	void foo(List l1, List<X> l2) {\n" +
			"		X x = bar1(l1, l2);\n" +
			"		x.done();\n" +
			"		List<X> lx = bar2(l1, l2);\n" +
			"		lx.get(0).done();\n" +
			"	}\n" +
			"	<T> T bar1(List<T> l1, List<T> l2) {\n" +
			"		return l1.get(0);\n" +
			"	}\n" +
			"	<T> List<T> bar2(List<T> l1, List<T> l2) {\n" +
			"		return l1;\n" +
			"	}\n" +
			"}\n", // =================
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 12)\n" + 
		"	System.out.println(zork);\n" + 
		"	                   ^^^^\n" + 
		"zork cannot be resolved to a variable\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 14)\n" + 
		"	void foo(List l1, List<X> l2) {\n" + 
		"	         ^^^^\n" + 
		"List is a raw type. References to generic type List<E> should be parameterized\n" + 
		"----------\n" + 
		"3. WARNING in X.java (at line 15)\n" + 
		"	X x = bar1(l1, l2);\n" + 
		"	      ^^^^^^^^^^^^\n" + 
		"Type safety: Unchecked invocation bar1(List, List<X>) of the generic method bar1(List<T>, List<T>) of type X\n" + 
		"----------\n" + 
		"4. WARNING in X.java (at line 15)\n" + 
		"	X x = bar1(l1, l2);\n" + 
		"	           ^^\n" + 
		"Type safety: The expression of type List needs unchecked conversion to conform to List<X>\n" + 
		"----------\n" + 
		"5. WARNING in X.java (at line 17)\n" + 
		"	List<X> lx = bar2(l1, l2);\n" + 
		"	             ^^^^^^^^^^^^\n" + 
		"Type safety: Unchecked invocation bar2(List, List<X>) of the generic method bar2(List<T>, List<T>) of type X\n" + 
		"----------\n" + 
		"6. WARNING in X.java (at line 17)\n" + 
		"	List<X> lx = bar2(l1, l2);\n" + 
		"	             ^^^^^^^^^^^^\n" + 
		"Type safety: The expression of type List needs unchecked conversion to conform to List<X>\n" + 
		"----------\n" + 
		"7. WARNING in X.java (at line 17)\n" + 
		"	List<X> lx = bar2(l1, l2);\n" + 
		"	                  ^^\n" + 
		"Type safety: The expression of type List needs unchecked conversion to conform to List<X>\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=148061 - variation
public void test1014() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			"public class X {\n" +
			"	void foo1(List l, List<String> ls) {\n" +
			"		Set<Map.Entry<String,String>> mss1 = bar(l, ls).entrySet();\n" +
			"		String s = bar(l, ls).entrySet();\n" +
			"	}\n" +
			"	<U,V> Map<U,V> bar(List<U> lu, List<V> lv) { return null; }\n" +
			"}\n", // =================
		},
		"----------\n" + 
		"1. WARNING in X.java (at line 4)\n" + 
		"	void foo1(List l, List<String> ls) {\n" + 
		"	          ^^^^\n" + 
		"List is a raw type. References to generic type List<E> should be parameterized\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 5)\n" + 
		"	Set<Map.Entry<String,String>> mss1 = bar(l, ls).entrySet();\n" + 
		"	                                     ^^^^^^^^^^\n" + 
		"Type safety: Unchecked invocation bar(List, List<String>) of the generic method bar(List<U>, List<V>) of type X\n" + 
		"----------\n" + 
		"3. WARNING in X.java (at line 5)\n" + 
		"	Set<Map.Entry<String,String>> mss1 = bar(l, ls).entrySet();\n" + 
		"	                                     ^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: The expression of type Set needs unchecked conversion to conform to Set<Map.Entry<String,String>>\n" + 
		"----------\n" + 
		"4. WARNING in X.java (at line 5)\n" + 
		"	Set<Map.Entry<String,String>> mss1 = bar(l, ls).entrySet();\n" + 
		"	                                         ^\n" + 
		"Type safety: The expression of type List needs unchecked conversion to conform to List<Object>\n" + 
		"----------\n" + 
		"5. WARNING in X.java (at line 6)\n" + 
		"	String s = bar(l, ls).entrySet();\n" + 
		"	           ^^^^^^^^^^\n" + 
		"Type safety: Unchecked invocation bar(List, List<String>) of the generic method bar(List<U>, List<V>) of type X\n" + 
		"----------\n" + 
		"6. ERROR in X.java (at line 6)\n" + 
		"	String s = bar(l, ls).entrySet();\n" + 
		"	           ^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type mismatch: cannot convert from Set to String\n" + 
		"----------\n" + 
		"7. WARNING in X.java (at line 6)\n" + 
		"	String s = bar(l, ls).entrySet();\n" + 
		"	               ^\n" + 
		"Type safety: The expression of type List needs unchecked conversion to conform to List<Object>\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=148061 - variation
// FAIL SHOULD RAISE MORE WARNINGS?
public void test1015() {
	if (this.complianceLevel >= ClassFileConstants.JDK1_8)
		return;
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"public class X {\n" +
			"	void foo1(List l, List<String> ls) {\n" +
			"		List<String> ls1 = bar(l, ls);\n" +
			"		String s = bar(l, ls);\n" +
			"	}\n" +
			"	<U,V> List<V> bar(List<U> lu, List<V> lv) { return null; }\n" +
			"}\n", // =================
		},
		"----------\n" + 
		"1. WARNING in X.java (at line 3)\n" + 
		"	void foo1(List l, List<String> ls) {\n" + 
		"	          ^^^^\n" + 
		"List is a raw type. References to generic type List<E> should be parameterized\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 4)\n" + 
		"	List<String> ls1 = bar(l, ls);\n" + 
		"	                   ^^^^^^^^^^\n" + 
		"Type safety: Unchecked invocation bar(List, List<String>) of the generic method bar(List<U>, List<V>) of type X\n" + 
		"----------\n" + 
		"3. WARNING in X.java (at line 4)\n" + 
		"	List<String> ls1 = bar(l, ls);\n" + 
		"	                   ^^^^^^^^^^\n" + 
		"Type safety: The expression of type List needs unchecked conversion to conform to List<String>\n" + 
		"----------\n" + 
		"4. WARNING in X.java (at line 4)\n" + 
		"	List<String> ls1 = bar(l, ls);\n" + 
		"	                       ^\n" + 
		"Type safety: The expression of type List needs unchecked conversion to conform to List<Object>\n" + 
		"----------\n" + 
		"5. WARNING in X.java (at line 5)\n" + 
		"	String s = bar(l, ls);\n" + 
		"	           ^^^^^^^^^^\n" + 
		"Type safety: Unchecked invocation bar(List, List<String>) of the generic method bar(List<U>, List<V>) of type X\n" + 
		"----------\n" + 
		"6. ERROR in X.java (at line 5)\n" + 
		"	String s = bar(l, ls);\n" + 
		"	           ^^^^^^^^^^\n" + 
		"Type mismatch: cannot convert from List to String\n" + 
		"----------\n" + 
		"7. WARNING in X.java (at line 5)\n" + 
		"	String s = bar(l, ls);\n" + 
		"	               ^\n" + 
		"Type safety: The expression of type List needs unchecked conversion to conform to List<Object>\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=148061 - variation
// SHOULD FAIL AT 1.8 (RET): Type mismatch: cannot convert from List<Object> to List
public void test1016() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"public class X {\n" +
			"	void foo1() {\n" +
			"		List ls1 = bar(null);\n" +
			"		List<String> ls2 = bar(null);\n" +
			"		String s = bar(null);\n" +
			"	}\n" +
			"	<U> List<U> bar(List<U> lu) { return null; }\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. WARNING in X.java (at line 4)\n" +
		"	List ls1 = bar(null);\n" +
		"	^^^^\n" +
		"List is a raw type. References to generic type List<E> should be parameterized\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 6)\n" +
		"	String s = bar(null);\n" +
		"	           ^^^^^^^^^\n" +
		"Type mismatch: cannot convert from List<Object> to String\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=148061 - variation
public void test1017() {
	this.runNegativeTest(
		new String[] {
			"SortedList.java",
			"import java.util.*;\n" +
			"\n" +
			"public class SortedList<E extends Comparable> extends LinkedList<E>\n" +
			"{\n" +
			"    public boolean add(E e){\n" +
			"      int index = Collections.binarySearch(this,e);\n" +
			"      if (index<0)\n" +
			"      super.add(-index-1,e);\n" +
			"      return true;\n" +
			"  }\n" +
			"}", // =================
		},
		"----------\n" +
		"1. WARNING in SortedList.java (at line 3)\n" +
		"	public class SortedList<E extends Comparable> extends LinkedList<E>\n" +
		"	             ^^^^^^^^^^\n" +
		"The serializable class SortedList does not declare a static final serialVersionUID field of type long\n" +
		"----------\n" +
		"2. WARNING in SortedList.java (at line 3)\n" +
		"	public class SortedList<E extends Comparable> extends LinkedList<E>\n" +
		"	                                  ^^^^^^^^^^\n" +
		"Comparable is a raw type. References to generic type Comparable<T> should be parameterized\n" +
		"----------\n" +
		"3. WARNING in SortedList.java (at line 5)\n" +
		"	public boolean add(E e){\n" +
		"	               ^^^^^^^^\n" +
		"The method add(E) of type SortedList<E> should be tagged with @Override since it actually overrides a superclass method\n" +
		"----------\n" +
		"4. ERROR in SortedList.java (at line 6)\n" +
		"	int index = Collections.binarySearch(this,e);\n" +
		"	                        ^^^^^^^^^^^^\n" +
		"The method binarySearch(List<? extends Comparable<? super T>>, T) in the type Collections is not applicable for the arguments (SortedList<E>, E)\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=148061 - variation
public void test1018() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<U,V> {\n" +
			"\n" +
			"	void foo(U u) {\n" +
			"		bar(u, new Exception());\n" +
			"	}\n" +
			"	<T extends Exception> T bar(U u, T t) { return null; }\n" +
			"}", // =================
		},
		"");
}
public void test1018a() {
	runConformTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"X.java",
			"class A<T> {}\n" +
			"\n" +
			"class B<E> extends A<X<String>> {}\n" +
			"\n" +
			"public class X<E extends String> extends B<E> {\n" +
			"    public static void main(String[] args) {\n" +
			"        System.out.println(\"SUCCESS\");\n" +
			"    }\n" +
			"}"
		},
		// compiler results
		null /* do not check compiler log */,
		// runtime results
		"SUCCESS" /* expected output string */,
		"" /* expected error string */,
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_7 /* javac test options */);
}
public void test1019() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		double[] d1 = new double[] { 1.0, 2.0, 3.0, 4.0 };\n" +
			"		System.out.println(deepToString(d1));\n" +
			"\n" +
			"		Double[] d2 = new Double[] { 1.0, 2.0, 3.0, 4.0 };\n" +
			"		System.out.println(deepToString(d2));\n" +
			"	\n" +
			"	}\n" +
			"\n" +
			"	public static <T> String deepToString(T[] array) {\n" +
			"		StringBuffer s = new StringBuffer();\n" +
			"		for (T t : array) {\n" +
			"			s.append(t.toString());\n" +
			"			s.append(\",\");\n" +
			"		}\n" +
			"		if (s.length() > 0) {\n" +
			"			s.setLength(s.length() - 1); // removes last \",\"\n" +
			"		}\n" +
			"		return s.toString();\n" +
			"	}\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	System.out.println(deepToString(d1));\n" +
		"	                   ^^^^^^^^^^^^\n" +
		"The method deepToString(T[]) in the type X is not applicable for the arguments (double[])\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=149573
public void test1020() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.List;\n" +
			"\n" +
			"public class X {\n" +
			"	void foo(List<? extends Exception> l1, List<? extends Exception> l2) {\n" +
			"		l1.add(l2.get(0));\n" +
			"	}\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	l1.add(l2.get(0));\n" +
		"	   ^^^\n" +
		"The method add(capture#1-of ? extends Exception) in the type List<capture#1-of ? extends Exception> is not applicable for the arguments (capture#2-of ? extends Exception)\n" +
		"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=149376
public void test1021() {
	this.runConformTest(
		new String[] {
			"p/SomeClass.java",
			"package p;\n" +
			"import static p.SomeClass.SomeEnum.*;\n" +
			"public abstract class SomeClass<T> extends Object {\n" +
			"	public enum SomeEnum {\n" +
			"		A;\n" +
			"	};\n" +
			"}\n",
		},
		""
	);
}
public void test1021b() { // should this case be allowed?
	this.runNegativeTest(
		new String[] {
			"p/SomeClass2.java",
			"package p;\n" +
			"import static p.SomeClass2.M1.*;\n" +
			"public abstract class SomeClass2<T> extends M {\n" +
			"	public static class M1 extends M2 {}\n" +
			"	public static class M2 extends M3 {}\n" +
			"	public static class M3 {\n" +
			"		public static class M {}\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" + 
		"1. ERROR in p\\SomeClass2.java (at line 3)\n" + 
		"	public abstract class SomeClass2<T> extends M {\n" + 
		"	                                            ^\n" + 
		"M cannot be resolved to a type\n" + 
		"----------\n" + 
		"2. ERROR in p\\SomeClass2.java (at line 4)\n" + 
		"	public static class M1 extends M2 {}\n" + 
		"	                               ^^\n" + 
		"Cycle detected: a cycle exists in the type hierarchy between SomeClass2.M1 and SomeClass2<T>\n" + 
		"----------\n"
	);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=151410 (duplicate of 149376)
public void test1021c() {
	runConformTest(
		new String[] {
			"ccs/jdtbug/filters/NameRF.java",
			"package ccs.jdtbug.filters;\n" +
			"import static ccs.jdtbug.ResultFilter.Action.*;\n" +
			"import ccs.jdtbug.*;\n" +
			"public class NameRF implements ResultFilter<String> {\n" +
			"	public NameRF() {}\n" +
			"	public Action getAction(String in, int ntotal, int naccept) {\n" +
			"		return YES;\n" +
			"	}\n" +
			"} // end class\n",
			"ccs/jdtbug/ResultFilter.java",
			"package ccs.jdtbug;\n" +
			"import java.io.*;\n" +
			"public interface ResultFilter<T> {\n" +
			"	public enum Action {\n" +
			"		YES, NO, CANCEL\n" +
			"	}\n" +
			"	public Action getAction(T in, int ntotal, int naccept) throws IOException;\n" +
			"} // end interface\n"
		}
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=150294
public void test1022() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		String testString = \"test string\";\n" +
			"\n" +
			"		testWithNonGeneric(testString);\n" +
			"		testWithGeneric(testString);\n" +
			"	}\n" +
			"\n" +
			"	private static void testWithNonGeneric(String input) {\n" +
			"		Class<? extends String> clazz = input.getClass();\n" +
			"\n" +
			"		System.out.println(clazz.getName());\n" +
			"	}\n" +
			"\n" +
			"	private static <T> void testWithGeneric(T input) {\n" +
			"		Class<? extends T> clazz = input.getClass();\n" +
			"\n" +
			"		System.out.println(clazz.getName());\n" +
			"	}\n" +
			"}", // =================,
		},
		"----------\n" +
		"1. ERROR in X.java (at line 16)\n" +
		"	Class<? extends T> clazz = input.getClass();\n" +
		"	                           ^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from Class<capture#3-of ? extends Object> to Class<? extends T>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=150362
public void test1023() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.Map;\n" +
			"import java.util.Properties;\n" +
			"\n" +
			"public class X {\n" +
			"\n" +
			"	public static void main(String[] args) {\n" +
			"		Properties props = new Properties();\n" +
			"		for (Map.Entry<String, ?> entry : props.entrySet()) {\n" +
			"			System.out.println(entry);\n" +
			"		}\n" +
			"		for (Map.Entry<String, ?> entry : ((Map<String, ?>) props).entrySet()) {\n" +
			"			System.out.println(entry);\n" +
			"		}\n" +
			"		for (Map.Entry<Object, ?> entry : ((Map<Object, ?>) props).entrySet()) {\n" +
			"			System.out.println(entry);\n" +
			"		}\n" +
			"		for (Map.Entry<Object, ?> entry : props.entrySet()) {\n" +
			"			System.out.println(entry);\n" +
			"		}\n" +
			"		for (Map.Entry<?, ?> entry : ((Map<?, ?>) props).entrySet()) {\n" +
			"			System.out.println(entry);\n" +
			"		}\n" +
			"		for (Map.Entry<?, ?> entry : props.entrySet()) {\n" +
			"			System.out.println(entry);\n" +
			"		}\n" +
			"	}\n" +
			"}", // =================,
		},
		"----------\n" +
		"1. ERROR in X.java (at line 8)\n" +
		"	for (Map.Entry<String, ?> entry : props.entrySet()) {\n" +
		"	                                  ^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from element type Map.Entry<Object,Object> to Map.Entry<String,?>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 11)\n" +
		"	for (Map.Entry<String, ?> entry : ((Map<String, ?>) props).entrySet()) {\n" +
		"	                                  ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from Properties to Map<String,?>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=151275
public void test1024() {
	runConformTest(
		true,
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		Integer castInteger = genericCast(1); // works\n" +
			"		int castInt1 = genericCast(1); // fails in javac but works in Eclipse\n" +
			"		int castInt2 = X.<Integer> genericCast(1); // workaround for javac\n" +
			"		int castInt3 = (Integer) genericCast(1); // workaround for javac\n" +
			"	}\n" +
			"	private static <T> T genericCast(Object input) {\n" +
			"		@SuppressWarnings(\"unchecked\")\n" +
			"		T castValue = (T) input;\n" +
			"		return castValue;\n" +
			"	}\n" +
			"}", // =================,
		},
		null,
		"",
		null,
		JavacTestOptions.EclipseJustification.EclipseBug151275);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=155753
public void test1025() {
	this.runConformTest(
		new String[] {
			"GenericBaseClass.java",
			"public class GenericBaseClass<P, C> {\n" +
			"  public GenericBaseClass() {\n" +
			"    if (!(this instanceof ASubGenericClass)) {\n" +
			"      System.out.println(\"I\'m not ASubClass\");\n" +
			"    }\n" +
			"  }\n" +
			"}\n" +
			"\n" +
			"class ASubGenericClass extends GenericBaseClass<GenericBaseClass, GenericBaseClass> {\n" +
			"  public ASubGenericClass() {\n" +
			"    // This compiles with both\n" +
			"    GenericBaseClass<GenericBaseClass, GenericBaseClass> hey = this;\n" +
			"  }\n" +
			"}", // =================
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=155753
public void test1026() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"import java.util.LinkedHashSet;\n" +
			"import java.util.Set;\n" +
			"\n" +
			"public class X {\n" +
			"\n" +
			"    public class A {};\n" +
			"    public class B extends A {};\n" +
			"\n" +
			"	public static void main(String[] args) {\n" +
			"        X g = new X();\n" +
			"        Set<A> set = g.newSet(g.new B());\n" +
			"    }\n" +
			"    public <T, V extends T> Set<T> newSet(V v) {\n" +
			"        Set<T> set = new LinkedHashSet<T>();\n" +
			"        set.add(v);\n" +
			"        return set;\n" +
			"    }\n" +
			"}\n" // =================
		},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_7 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=155753 - variation
public void test1027() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			this.complianceLevel < ClassFileConstants.JDK1_7 ?
			"import java.util.LinkedHashSet;\n" +
			"import java.util.Set;\n" +
			"\n" +
			"public class X {\n" +
			"\n" +
			"    public class A {};\n" +
			"    public class B extends A {};\n" +
			"\n" +
			"    public static void main(String[] args) {\n" +
			"        X g = new X();\n" +
			"        Set<A> set = g.newSet(g.new B());\n" +
			"    }\n" +
			"    public <T, V extends T> Set<T> newSet(V... objects) {\n" +
			"        Set<T> set = new LinkedHashSet<T>();\n" +
			"        for (T t : objects) {\n" +
			"            set.add(t);\n" +
			"        }\n" +
			"        return set;\n" +
			"    }\n" +
			"}\n" +
			"\n" : 
				"import java.util.LinkedHashSet;\n" +
				"import java.util.Set;\n" +
				"\n" +
				"public class X {\n" +
				"\n" +
				"    public class A {};\n" +
				"    public class B extends A {};\n" +
				"\n" +
				"    public static void main(String[] args) {\n" +
				"        X g = new X();\n" +
				"        Set<A> set = g.newSet(g.new B());\n" +
				"    }\n" +
				"    @SuppressWarnings(\"unchecked\")\n" +
				"    public <T, V extends T> Set<T> newSet(V... objects) {\n" +
				"        Set<T> set = new LinkedHashSet<T>();\n" +
				"        for (T t : objects) {\n" +
				"            set.add(t);\n" +
				"        }\n" +
				"        return set;\n" +
				"    }\n" +
				"}\n" +
				"\n", // =================, // =================
		},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_7 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=155753 - variation
public void test1028() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"import java.util.LinkedHashSet;\n" +
			"import java.util.Set;\n" +
			"\n" +
			"public class X {\n" +
			"\n" +
			"	public static void main(String[] args) {\n" +
			"        X g = new X();\n" +
			"        Set<A> set = g.newSet(new B());\n" +
			"    }\n" +
			"    public <T, V extends T> Set<T> newSet(V v) {\n" +
			"        Set<T> set = new LinkedHashSet<T>();\n" +
			"        set.add(v);\n" +
			"        return set;\n" +
			"    }\n" +
			"}\n" +
			"\n" +
			"class A {};\n" +
			"class B extends A {};\n", // =================
		},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_7 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=156016
public void test1029() {
	Map options = getCompilerOptions();
	options.put(JavaCore.COMPILER_PB_UNCHECKED_TYPE_OPERATION, JavaCore.IGNORE);
	String xSource =
			"import java.util.Arrays;\n" +
			"import java.util.List;\n" +
			"\n" +
			"public class X {\n" +
			"        public static <T extends Number> List<T> makeNumberList(T a, T b) {\n" +
			"                return Arrays.asList(a, b);\n" +
			"        }\n" +
			"\n" +
			"        public static void main(String... args) {\n" +
			"                List<Number> name = makeNumberList(5, 5D);\n" +
			"        }\n" +
			"}";
	if (this.complianceLevel < ClassFileConstants.JDK1_8) {
		this.runNegativeTest(
			new String[] {
				"X.java",
				xSource,
			},
			"----------\n" +
			"1. ERROR in X.java (at line 10)\n" +
			"	List<Number> name = makeNumberList(5, 5D);\n" +
			"	                    ^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from List<"+ intersection("Number", "Comparable<?>") +"> to List<Number>\n" +
			"----------\n",
			null,
			true,
			options);
	} else {
		runConformTest(new String[] { "X.java", xSource });
	}
}
public void test1030() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			"public class X {\n" +
			"	public class PointList<W> extends Object implements Iterable<W> {\n" +
			"		private List<W> theList = new ArrayList<W>();\n" +
			"\n" +
			"		public Iterator<W> iterator() {\n" +
			"			return theList.iterator();\n" +
			"		}\n" +
			"	}\n" +
			"\n" +
			"	private PointList<Waypoint> waypoints = new PointList<Waypoint>();\n" +
			"\n" +
			"	public void printWaypoints() {\n" +
			"		for (Waypoint waypoint : waypoints) { // ***** This line does not compile *****\n" +
			"			System.out.println(waypoint.toString());\n" +
			"		}\n" +
			"		for (Iterator<Waypoint> it = waypoints.iterator(); it.hasNext();) {\n" +
			"			Waypoint waypoint = it.next();\n" +
			"			System.out.println(waypoint.toString());\n" +
			"		}\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"class Waypoint {}", // =================
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=156765
// FAIL EXTRA ERR: outer non-generic invocation cannot yet feed expected type into inner inference
public void test1031() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.io.Serializable;\n" +
			"\n" +
			"interface IValue extends Serializable {\n" +
			"	public <T extends Comparable<? super T>> T getComparableValue();\n" +
			"}\n" +
			"\n" +
			"@SuppressWarnings(\"null\")\n" +
			"public class X {\n" +
			"	public static void foo0() {\n" +
			"		IValue val1 = null;\n" +
			"		Object o = val1.getComparableValue(); // 0\n" +
			"	}\n" +
			"	public static void foo1() {\n" +
			"		IValue val1 = null;\n" +
			"		String s = val1.getComparableValue(); // 1\n" +
			"	}\n" +
			"	public static int foo2() {\n" +
			"		IValue val1 = null;\n" +
			"		IValue val2 = null;\n" +
			"		return val1.getComparableValue().compareTo(val2.getComparableValue()); // 2\n" +
			"	}	\n" +
			"	public static int foo3() {\n" +
			"		Comparable<? super String> c = \"aaa\"; // 3\n" +
			"		Comparable<? super Object> o = new Object(); // 4\n" +
			"		return 0;\n" +
			"	}\n" +
			"}", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 24)\n" +
		"	Comparable<? super Object> o = new Object(); // 4\n" +
		"	                               ^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from Object to Comparable<? super Object>\n" +
		"----------\n");
}
public void test1032() {
	runConformTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"X.java",
			"import java.io.*;\n" +
			"\n" +
			"public class X {\n" +
			"	<T> T test(String name) {\n" +
			"\n" +
			"		try {\n" +
			"			InputStream in = new FileInputStream(name);\n" +
			"			return (T) new ObjectInputStream(in).readObject();\n" +
			"		} catch (Exception e) {\n" +
			"		}\n" +
			"		return null;\n" +
			"	}\n" +
			"\n" +
			"	<U> U text() {\n" +
			"		return test(\"data\");\n" +
			"	}\n" +
			"}", // =================
		},
		// compiler results
		null /* do not check compiler log */,
		// runtime results
		"" /* expected output string */,
		"" /* expected error string */,
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_7 /* javac test options */);
}
public void test1032a() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.io.*;\n" +
			"\n" +
			"public class X {\n" +
			"	<T> T test(String name) {\n" +
			"\n" +
			"		try {\n" +
			"			InputStream in = new FileInputStream(name);\n" +
			"			return (T) new ObjectInputStream(in).readObject();\n" +
			"		} catch (Exception e) {\n" +
			"		}\n" +
			"		return null;\n" +
			"	}\n" +
			"\n" +
			"	<U> U text() {\n" +
			"		return test(\"data\");\n" +
			"	}\n" +
			"	Zork z;\n" +
			"}", // =================
		},
		"----------\n" +
		"1. WARNING in X.java (at line 8)\n" +
		"	return (T) new ObjectInputStream(in).readObject();\n" +
		"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from Object to T\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 17)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
public void test1033() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" +
			"	public static void main(String[] args) {\n" +
			"		X x = new X();\n" +
			"		x.bar1(Integer.TYPE);\n" +
			"		x.bar2(Integer.TYPE);\n" +
			"		x.bar2(\"\");\n" +
			"	} \n" +
			"	 void bar1(Class<?>... classes) {}\n" +
			"	 void bar2(Class... classes) {}\n" +
			"	 \n" +
			"}", // =================

		},
		"----------\n" +
		"1. WARNING in X.java (at line 3)\n" +
		"	X x = new X();\n" +
		"	^\n" +
		"X is a raw type. References to generic type X<T> should be parameterized\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 3)\n" +
		"	X x = new X();\n" +
		"	          ^\n" +
		"X is a raw type. References to generic type X<T> should be parameterized\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 4)\n" +
		"	x.bar1(Integer.TYPE);\n" +
		"	^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: The method bar1(Class...) belongs to the raw type X. References to generic type X<T> should be parameterized\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 6)\n" +
		"	x.bar2(\"\");\n" +
		"	  ^^^^\n" +
		"The method bar2(Class...) in the type X is not applicable for the arguments (String)\n" +
		"----------\n" +
		"5. WARNING in X.java (at line 9)\n" +
		"	void bar2(Class... classes) {}\n" +
		"	          ^^^^^\n" +
		"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=158519
// FAIL ERRMSG
public void test1034() {
	this.runNegativeTest(
		new String[] {
			"ChainedClosure.java",
			"interface Closure<I> {\n" +
			"    public void execute(I input);\n" +
			"}\n" +
			"\n" +
			"class ChainedClosure<I> implements Closure<I> {\n" +
			"    private final Closure<? super I>[] iClosures;\n" +
			"    @SuppressWarnings(\"unchecked\")\n" +
			"    public static <I> Closure<I> getInstance(Closure<? super I> closure1, Closure<? super I> closure2) {\n" +
			"        if (closure1 == null || closure2 == null) {\n" +
			"            throw new IllegalArgumentException(\"Closures must not be null\");\n" +
			"        }\n" +
			"        Closure<I>[] closures = new Closure[] { closure1, closure2 };\n" +
			"        return new ChainedClosure<I>(closures);\n" +
			"    }\n" +
			"    public ChainedClosure(Closure<? super I>[] closures) {\n" +
			"        super();\n" +
			"        iClosures = closures;\n" +
			"    }\n" +
			"    public void execute(I input) {\n" +
			"        for (int i = 0; i < iClosures.length; i++) {\n" +
			"            iClosures[i].execute(input);\n" +
			"        }\n" +
			"    }\n" +
			"}\n" +
			"class ClosureUtils {\n" +
			"    public static <J> Closure<J> chainedClosure(Closure<? super J> closure1, Closure<? super J> closure2) {\n" +
			"        return ChainedClosure.getInstance(closure1, closure2);\n" +
			"    }\n" +
			"    public static Closure<String> chainedClosure2(Closure<? super String> closure1, Closure<? super String> closure2) {\n" +
			"        return ChainedClosure.getInstance(closure1, closure2);\n" +
			"    }\n" +
			"    public static <J> Closure<String> chainedClosure3(Closure<? super J> closure1, Closure<? super J> closure2) {\n" +
			"        return ChainedClosure.getInstance(closure1, closure2);\n" +
			"    }\n" +
			"}", // =================

		},
		this.complianceLevel < ClassFileConstants.JDK1_8 ?
		"----------\n" +
		"1. ERROR in ChainedClosure.java (at line 33)\n" +
		"	return ChainedClosure.getInstance(closure1, closure2);\n" +
		"	                      ^^^^^^^^^^^\n" +
		"The method getInstance(Closure<? super I>, Closure<? super I>) in the type ChainedClosure is not applicable for the arguments (Closure<capture#10-of ? super J>, Closure<capture#11-of ? super J>)\n" +
		"----------\n" :
			"----------\n" + 
			"1. ERROR in ChainedClosure.java (at line 33)\n" + 
			"	return ChainedClosure.getInstance(closure1, closure2);\n" + 
			"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type mismatch: cannot convert from Closure<capture#10-of ? super J & capture#11-of ? super J> to Closure<String>\n" + 
			"----------\n",
		JavacTestOptions.DEFAULT);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=158531
public void test1035() {
	this.runConformTest(
		new String[] {
			"ComparableComparator.java",
			"import java.util.Comparator;\n" +
			"\n" +
			"@SuppressWarnings({\"unchecked\", \"rawtypes\"})\n" +
			"class ComparableComparator<T extends Comparable<? super T>> implements Comparator<T> {\n" +
			"\n" +
			"	static ComparableComparator instance = new ComparableComparator();\n" +
			"\n" +
			"public static <W extends Comparable<? super W>> ComparableComparator<W> getInstance() {\n" +
			"	return instance;\n" +
			"}\n" +
			"static <M extends Comparable<M>> Comparator<M> bar() {\n" +
			"	return null;\n" +
			"}\n" +
			"static <M extends String> Comparator<M> baz() {\n" +
			"	return null;\n" +
			"}\n" +
			"public int compare(T obj1, T obj2) {\n" +
			"	return obj1.compareTo(obj2);\n" +
			"}\n" +
			"}\n" +
			"\n" +
			"@SuppressWarnings({\"unchecked\", \"rawtypes\"})\n" +
			"class ComparatorUtils {\n" +
			"\n" +
			"	static Comparator BAR = ComparableComparator.bar();//0\n" +
			"	static Comparator NATURAL_COMPARATOR = ComparableComparator.getInstance();//1\n" +
			"	static Object BAR2 = ComparableComparator.bar();//1a\n" +
			"	static Comparator BAR3 = ComparableComparator.baz();//1b\n" +
			"\n" +
			"public static <T extends Comparable<? super T>> Comparator<T> naturalComparator() {\n" +
			"	return NATURAL_COMPARATOR;\n" +
			"}\n" +
			"\n" +
			"public static <U> Comparator<U> nullLowComparator(Comparator<U> comparator) {\n" +
			"	if (comparator == null)\n" +
			"		comparator = (Comparator<U>) naturalComparator();//2\n" +
			"	return new NullComparator<U>(comparator, false);\n" +
			"}\n" +
			"}\n" +
			"\n" +
			"@SuppressWarnings(\"unchecked\")\n" +
			"class NullComparator<V> implements Comparator<V> {\n" +
			"\n" +
			"	Comparator<V> nonNullComparator;\n" +
			"	boolean nullsAreHigh;\n" +
			"\n" +
			"public NullComparator() {\n" +
			"	this((Comparator<V>) ComparableComparator.getInstance(), true);//3\n" +
			"}\n" +
			"\n" +
			"public NullComparator(Comparator<V> nonNullComparator) {\n" +
			"	this(nonNullComparator, true);\n" +
			"}\n" +
			"\n" +
			"public NullComparator(boolean nullsAreHigh) {\n" +
			"	this((Comparator<V>) ComparableComparator.getInstance(), nullsAreHigh);//4\n" +
			"}\n" +
			"\n" +
			"public NullComparator(Comparator<V> nonNullComparator, boolean nullsAreHigh) {\n" +
			"	this.nonNullComparator = nonNullComparator;\n" +
			"	this.nullsAreHigh = nullsAreHigh;\n" +
			"	if (nonNullComparator == null) {\n" +
			"		throw new NullPointerException(\"null nonNullComparator\");\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"public int compare(V obj1, V obj2) {\n" +
			"	return 0;\n" +
			"}\n" +
			"}", // =================

		});
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=158548
public void test1036() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T extends String> {\n" +
			"	\n" +
			"	List<Zork> list;\n" +
			"	Map<Zork,Zork>.Entry<List<Zork>,List<Zork>>	entry;\n" +
			"	jaavaa.util.Map<Zork,Zork>.Entry<List<Zork>,List<Zork>>	entry2;\n" +
			"	\n" +
			"	p.q.Map.Entry entry3;\n" +
			"	\n" +
			"	String<Object>.Y<List> y; // wrong\n" +
			"	X<Object>.Y<List> y1; // wrong\n" +
			"	X<String>.Y<List> y2;\n" +
			"}", // =================
		},
		"----------\n" +
		"1. WARNING in X.java (at line 1)\n" +
		"	public class X<T extends String> {\n" +
		"	                         ^^^^^^\n" +
		"The type parameter T should not be bounded by the final type String. Final types cannot be further extended\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 3)\n" +
		"	List<Zork> list;\n" +
		"	^^^^\n" +
		"List cannot be resolved to a type\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 3)\n" +
		"	List<Zork> list;\n" +
		"	     ^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 4)\n" +
		"	Map<Zork,Zork>.Entry<List<Zork>,List<Zork>>	entry;\n" +
		"	^^^\n" +
		"Map cannot be resolved to a type\n" +
		"----------\n" +
		"5. ERROR in X.java (at line 4)\n" +
		"	Map<Zork,Zork>.Entry<List<Zork>,List<Zork>>	entry;\n" +
		"	    ^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" +
		"6. ERROR in X.java (at line 4)\n" +
		"	Map<Zork,Zork>.Entry<List<Zork>,List<Zork>>	entry;\n" +
		"	         ^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" +
		"7. ERROR in X.java (at line 4)\n" +
		"	Map<Zork,Zork>.Entry<List<Zork>,List<Zork>>	entry;\n" +
		"	                     ^^^^\n" +
		"List cannot be resolved to a type\n" +
		"----------\n" +
		"8. ERROR in X.java (at line 4)\n" +
		"	Map<Zork,Zork>.Entry<List<Zork>,List<Zork>>	entry;\n" +
		"	                          ^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" +
		"9. ERROR in X.java (at line 4)\n" +
		"	Map<Zork,Zork>.Entry<List<Zork>,List<Zork>>	entry;\n" +
		"	                                ^^^^\n" +
		"List cannot be resolved to a type\n" +
		"----------\n" +
		"10. ERROR in X.java (at line 4)\n" +
		"	Map<Zork,Zork>.Entry<List<Zork>,List<Zork>>	entry;\n" +
		"	                                     ^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" +
		"11. ERROR in X.java (at line 5)\n" +
		"	jaavaa.util.Map<Zork,Zork>.Entry<List<Zork>,List<Zork>>	entry2;\n" +
		"	^^^^^^\n" +
		"jaavaa cannot be resolved to a type\n" +
		"----------\n" +
		"12. ERROR in X.java (at line 5)\n" +
		"	jaavaa.util.Map<Zork,Zork>.Entry<List<Zork>,List<Zork>>	entry2;\n" +
		"	                ^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" +
		"13. ERROR in X.java (at line 5)\n" +
		"	jaavaa.util.Map<Zork,Zork>.Entry<List<Zork>,List<Zork>>	entry2;\n" +
		"	                     ^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" +
		"14. ERROR in X.java (at line 5)\n" +
		"	jaavaa.util.Map<Zork,Zork>.Entry<List<Zork>,List<Zork>>	entry2;\n" +
		"	                                 ^^^^\n" +
		"List cannot be resolved to a type\n" +
		"----------\n" +
		"15. ERROR in X.java (at line 5)\n" +
		"	jaavaa.util.Map<Zork,Zork>.Entry<List<Zork>,List<Zork>>	entry2;\n" +
		"	                                      ^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" +
		"16. ERROR in X.java (at line 5)\n" +
		"	jaavaa.util.Map<Zork,Zork>.Entry<List<Zork>,List<Zork>>	entry2;\n" +
		"	                                            ^^^^\n" +
		"List cannot be resolved to a type\n" +
		"----------\n" +
		"17. ERROR in X.java (at line 5)\n" +
		"	jaavaa.util.Map<Zork,Zork>.Entry<List<Zork>,List<Zork>>	entry2;\n" +
		"	                                                 ^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" +
		"18. ERROR in X.java (at line 7)\n" +
		"	p.q.Map.Entry entry3;\n" +
		"	^\n" +
		"p cannot be resolved to a type\n" +
		"----------\n" +
		"19. ERROR in X.java (at line 9)\n" +
		"	String<Object>.Y<List> y; // wrong\n" +
		"	^^^^^^\n" +
		"The type String is not generic; it cannot be parameterized with arguments <Object>\n" +
		"----------\n" +
		"20. ERROR in X.java (at line 10)\n" +
		"	X<Object>.Y<List> y1; // wrong\n" +
		"	^^^^^^^^^^^\n" +
		"X.Y cannot be resolved to a type\n" +
		"----------\n" +
		"21. ERROR in X.java (at line 10)\n" +
		"	X<Object>.Y<List> y1; // wrong\n" +
		"	  ^^^^^^\n" +
		"Bound mismatch: The type Object is not a valid substitute for the bounded parameter <T extends String> of the type X<T>\n" +
		"----------\n" +
		"22. ERROR in X.java (at line 10)\n" +
		"	X<Object>.Y<List> y1; // wrong\n" +
		"	            ^^^^\n" +
		"List cannot be resolved to a type\n" +
		"----------\n" +
		"23. ERROR in X.java (at line 11)\n" +
		"	X<String>.Y<List> y2;\n" +
		"	^^^^^^^^^^^\n" +
		"X.Y cannot be resolved to a type\n" +
		"----------\n" +
		"24. ERROR in X.java (at line 11)\n" +
		"	X<String>.Y<List> y2;\n" +
		"	            ^^^^\n" +
		"List cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=158548 - variation
public void test1037() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T extends String> {\n" +
			"	\n" +
			"	List<? extends Zork> list;\n" +
			"	Map.Entry<?,? super Zork>	entry;\n" +
			"}", // =================
		},
		"----------\n" +
		"1. WARNING in X.java (at line 1)\n" +
		"	public class X<T extends String> {\n" +
		"	                         ^^^^^^\n" +
		"The type parameter T should not be bounded by the final type String. Final types cannot be further extended\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 3)\n" +
		"	List<? extends Zork> list;\n" +
		"	^^^^\n" +
		"List cannot be resolved to a type\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 3)\n" +
		"	List<? extends Zork> list;\n" +
		"	               ^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 4)\n" +
		"	Map.Entry<?,? super Zork>	entry;\n" +
		"	^^^\n" +
		"Map cannot be resolved to a type\n" +
		"----------\n" +
		"5. ERROR in X.java (at line 4)\n" +
		"	Map.Entry<?,? super Zork>	entry;\n" +
		"	                    ^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=159021 - variation
public void test1038() throws Exception {
	Map options = getCompilerOptions();
	options.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.OPTIMIZE_OUT);
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I<T> {\n" +
			"    int CONST = A.foo();\n" +
			"}\n" +
			"\n" +
			"class A<U> {\n" +
			"        static int foo() {\n" +
			"        System.out.println(\"SUCCESS\");\n" +
			"        return 0;\n" +
			"    }\n" +
			"}\n" +
			"class B<V> implements I<V> {\n" +
			"	static int LOCAL_STATIC;\n" +
			"	int local_field;\n" +
			"    B(int param) {\n" +
			"        int i = CONST; // keep for possible <clinit>\n" +
			"        int j = param; // may optimize out\n" +
			"        int k = LOCAL_STATIC; // may optimize out\n" +
			"        int l = local_field; // may optimize out\n" +
			"    }\n" +
			"}\n" +
			"public class X {\n" +
			"    public static void main(String[] args) {\n" +
			"        new B<String>(12);\n" +
			"    }\n" +
			"}", // =================
		},
		"SUCCESS",
		null,
		false,
		null,
		options,
		null);
	// check the reference to I.CONST still got generated (for <clinit> invocation side-effect)
	String expectedOutput =
		"  // Method descriptor #10 (I)V\n" +
		"  // Stack: 1, Locals: 2\n" +
		"  B(int param);\n" +
		"    0  aload_0 [this]\n" +
		"    1  invokespecial java.lang.Object() [12]\n" +
		"    4  getstatic B.CONST : int [15]\n" +
		"    7  pop\n" +
		"    8  return\n" +
		"      Line numbers:\n" +
		"        [pc: 0, line: 14]\n" +
		"        [pc: 4, line: 15]\n" +
		"        [pc: 8, line: 19]\n" +
		"      Local variable table:\n" +
		"        [pc: 0, pc: 9] local: this index: 0 type: B\n" +
		"        [pc: 0, pc: 9] local: param index: 1 type: int\n";

	File f = new File(OUTPUT_DIR + File.separator + "B.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=159021 - variation
public void test1039() throws Exception {
	Map options = getCompilerOptions();
	options.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.OPTIMIZE_OUT);
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I<T> {\n" +
			"	Value<String> CONST = A.foo(\"[I.CONST]\");\n" +
			"}\n" +
			"class Value<V> {\n" +
			"	static String NAME = \"\";\n" +
			"	V v;\n" +
			"	Value(V v) {\n" +
			"		this.v = v;\n" +
			"	}\n" +
			"}\n" +
			"class A {\n" +
			"	static Value<String> foo(String str) {\n" +
			"		System.out.print(str);\n" +
			"		return new Value<String>(\"str\");\n" +
			"	}\n" +
			"}\n" +
			"class B<V> implements I<V> {\n" +
			"	static Value<String> LOCAL_STATIC = A.foo(\"[B.LOCAL_STATIC]\");\n" +
			"	Value<String> local_field = A.foo(\"[B.local_field]\");\n" +
			"	B(Value<String> param) {\n" +
			"		String i = CONST.NAME; // keep for possible <clinit>\n" +
			"		String j = param.NAME; // may optimize out\n" +
			"		String k = LOCAL_STATIC.NAME; // may optimize out\n" +
			"		String l = local_field.NAME; // may optimize out\n" +
			"	}\n" +
			"}\n" +
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		new B<String>(new Value<String>(\"[PARAM]\"));\n" +
			"	}\n" +
			"}", // =================
		},
		"[B.LOCAL_STATIC][B.local_field][I.CONST]",
		null,
		false,
		null,
		options,
		null);
	// check the reference to I.CONST still got generated (for <clinit> invocation side-effect)
	String expectedOutput =
		"  // Method descriptor #28 (LValue;)V\n" +
		"  // Signature: (LValue<Ljava/lang/String;>;)V\n" +
		"  // Stack: 2, Locals: 2\n" +
		"  B(Value param);\n" +
		"     0  aload_0 [this]\n" +
		"     1  invokespecial java.lang.Object() [30]\n" +
		"     4  aload_0 [this]\n" +
		"     5  ldc <String \"[B.local_field]\"> [32]\n" +
		"     7  invokestatic A.foo(java.lang.String) : Value [17]\n" +
		"    10  putfield B.local_field : Value [34]\n" +
		"    13  getstatic B.CONST : Value [36]\n" +
		"    16  pop\n" +
		"    17  getstatic Value.NAME : java.lang.String [39]\n" +
		"    20  pop\n" +
		"    21  getstatic Value.NAME : java.lang.String [39]\n" +
		"    24  pop\n" +
		"    25  getstatic Value.NAME : java.lang.String [39]\n" +
		"    28  pop\n" +
		"    29  getstatic Value.NAME : java.lang.String [39]\n" +
		"    32  pop\n" +
		"    33  return\n" +
		"      Line numbers:\n" +
		"        [pc: 0, line: 20]\n" +
		"        [pc: 4, line: 19]\n" +
		"        [pc: 13, line: 21]\n" +
		"        [pc: 21, line: 22]\n" +
		"        [pc: 25, line: 23]\n" +
		"        [pc: 29, line: 24]\n" +
		"        [pc: 33, line: 25]\n" +
		"      Local variable table:\n" +
		"        [pc: 0, pc: 34] local: this index: 0 type: B\n" +
		"        [pc: 0, pc: 34] local: param index: 1 type: Value\n";

	File f = new File(OUTPUT_DIR + File.separator + "B.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=159021 - variation
public void test1040() throws Exception {
	Map options = getCompilerOptions();
	options.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.OPTIMIZE_OUT);
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I<T> {\n" +
			"	Value<String> CONST = A.foo(\"[I.CONST]\");\n" +
			"}\n" +
			"class Value<V> {\n" +
			"	static String NAME = \"\";\n" +
			"	V v;\n" +
			"	Value(V v) {\n" +
			"		this.v = v;\n" +
			"	}\n" +
			"}\n" +
			"class A {\n" +
			"	static Value<String> foo(String str) {\n" +
			"		System.out.print(str);\n" +
			"		return new Value<String>(\"str\");\n" +
			"	}\n" +
			"}\n" +
			"class B<V> implements I<V> {\n" +
			"	static Value<String> LOCAL_STATIC = A.foo(\"[B.LOCAL_STATIC]\");\n" +
			"	Value<String> local_field = A.foo(\"[B.local_field]\");\n" +
			"	B(Value<String> param) {\n" +
			"		String i = this.CONST.NAME; // keep for possible <clinit>\n" +
			"		String k = this.LOCAL_STATIC.NAME; // may optimize out\n" +
			"		String l = this.local_field.NAME; // may optimize out\n" +
			"	}\n" +
			"}\n" +
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		new B<String>(new Value<String>(\"[PARAM]\"));\n" +
			"	}\n" +
			"}", // =================
		},
		"[B.LOCAL_STATIC][B.local_field][I.CONST]",
		null,
		false,
		null,
		options,
		null);
	// check the reference to I.CONST still got generated (for <clinit> invocation side-effect)
	String expectedOutput =
		"  // Method descriptor #28 (LValue;)V\n" +
		"  // Signature: (LValue<Ljava/lang/String;>;)V\n" +
		"  // Stack: 2, Locals: 2\n" +
		"  B(Value param);\n" +
		"     0  aload_0 [this]\n" +
		"     1  invokespecial java.lang.Object() [30]\n" +
		"     4  aload_0 [this]\n" +
		"     5  ldc <String \"[B.local_field]\"> [32]\n" +
		"     7  invokestatic A.foo(java.lang.String) : Value [17]\n" +
		"    10  putfield B.local_field : Value [34]\n" +
		"    13  getstatic B.CONST : Value [36]\n" +
		"    16  pop\n" +
		"    17  getstatic Value.NAME : java.lang.String [39]\n" +
		"    20  pop\n" +
		"    21  getstatic Value.NAME : java.lang.String [39]\n" +
		"    24  pop\n" +
		"    25  getstatic Value.NAME : java.lang.String [39]\n" +
		"    28  pop\n" +
		"    29  return\n" +
		"      Line numbers:\n" +
		"        [pc: 0, line: 20]\n" +
		"        [pc: 4, line: 19]\n" +
		"        [pc: 13, line: 21]\n" +
		"        [pc: 21, line: 22]\n" +
		"        [pc: 25, line: 23]\n" +
		"        [pc: 29, line: 24]\n" +
		"      Local variable table:\n" +
		"        [pc: 0, pc: 30] local: this index: 0 type: B\n" +
		"        [pc: 0, pc: 30] local: param index: 1 type: Value\n";

	File f = new File(OUTPUT_DIR + File.separator + "B.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=159245
public void test1041() {
	this.runNegativeTest(
		new String[] {
			"p/X.java",
			"package p;\n" +
			"\n" +
			"public class X<T> {\n" +
			"	{\n" +
			"		X rawx = null;\n" +
			"		X[] rawxs = { rawx };\n" +
			"		System.out.println(rawxs.length);\n" +
			"	}\n" +
			"	{\n" +
			"		p.X rawx = null;\n" +
			"		p.X[] rawxs = { rawx };\n" +
			"		System.out.println(rawxs.length);\n" +
			"	}\n" +
			"	Zork z;\n" +
			"}", // =================
		},
		"----------\n" +
		"1. WARNING in p\\X.java (at line 5)\n" +
		"	X rawx = null;\n" +
		"	^\n" +
		"X is a raw type. References to generic type X<T> should be parameterized\n" +
		"----------\n" +
		"2. WARNING in p\\X.java (at line 6)\n" +
		"	X[] rawxs = { rawx };\n" +
		"	^\n" +
		"X is a raw type. References to generic type X<T> should be parameterized\n" +
		"----------\n" +
		"3. WARNING in p\\X.java (at line 10)\n" +
		"	p.X rawx = null;\n" +
		"	^^^\n" +
		"X is a raw type. References to generic type X<T> should be parameterized\n" +
		"----------\n" +
		"4. WARNING in p\\X.java (at line 11)\n" +
		"	p.X[] rawxs = { rawx };\n" +
		"	^^^\n" +
		"X is a raw type. References to generic type X<T> should be parameterized\n" +
		"----------\n" +
		"5. ERROR in p\\X.java (at line 14)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=159818
public void test1042() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public <T extends Object> void foo(T x) {\n" +
			"	    Class<? extends T> c = x.getClass();\n" +
			"	}\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	Class<? extends T> c = x.getClass();\n" +
		"	                       ^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from Class<capture#1-of ? extends Object> to Class<? extends T>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=159214
public void test1043() {
	this.runNegativeTest(
		new String[] {
			"A.java",
			"class A<T extends Number, S extends T> {\n" +
			"  T t;\n" +
			"  S s;\n" +
			"  void test(A<? extends Long, ? extends S> a) {\n" +
			"    this.t = this.s; //fine\n" +
			"    a.t = a.s;\n" +
			"  }\n" +
			"}", // =================
		},
		"----------\n" +
		"1. ERROR in A.java (at line 6)\n" +
		"	a.t = a.s;\n" +
		"	      ^^^\n" +
		"Type mismatch: cannot convert from capture#4-of ? extends S to capture#1-of ? extends Long\n" +
		"----------\n",
		JavacTestOptions.EclipseJustification.EclipseBug159214);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=159214 - variation
public void test1044() {
	this.runConformTest(
		new String[] {
			"X.java",
			"class X<T extends Number> {\n" +
			"    X<? extends Object> x;\n" +
			"}", // =================
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=159214 - variation
public void test1045() {
	this.runConformTest(
		new String[] {
			"X.java",
			"class X<T extends Number, S extends T> {\n" +
			"        X<? extends Long,? extends S> x;\n" +
			"}",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=160132
public void test1046() {
	this.runConformTest(
		new String[] {
			"X.java", //========================
			"public interface X<E extends Object & X.Entry> {\n" +
			"  interface Entry {\n" +
			"    interface Internal extends Entry {\n" +
			"      Internal createEntry();\n" +
			"    }\n" +
			"  }\n" +
			"}\n", //========================
			"Y.java",
			"public class Y implements X.Entry.Internal {\n" +
			"  public Internal createEntry() {\n" +
			"    return null;\n" +
			"  }\n" +
			"}\n" , //========================
		},
		"");
	// compile Y against X binary
	this.runConformTest(
			new String[] {
				"Y.java", //========================
				"public class Y implements X.Entry.Internal {\n" +
				"  public Internal createEntry() {\n" +
				"    return null;\n" +
				"  }\n" +
				"}\n" , //========================
			},
			"",
			null,
			false,
			null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=160132 - variation
public void test1047() {
	this.runConformTest(
		new String[] {
			"p/X.java", //========================
			"package p;\n" +
			"public interface X<E extends Object & X.Entry> {\n" +
			"  interface Entry {\n" +
			"    interface Internal extends Entry {\n" +
			"      Internal createEntry();\n" +
			"    }\n" +
			"  }\n" +
			"}\n", //========================
			"Y.java",
			"import p.X.Entry.Internal;\n" +
			"public class Y implements Internal {\n" +
			"  public Internal createEntry() {\n" +
			"    return null;\n" +
			"  }\n" +
			"}\n" , //========================
		},
		"");
	// compile Y against X binary
	this.runConformTest(
			new String[] {
				"Y.java", //========================
				"import p.X.Entry.Internal;\n" +
				"public class Y implements Internal {\n" +
				"  public Internal createEntry() {\n" +
				"    return null;\n" +
				"  }\n" +
				"}\n" , //========================
			},
			"",
			null,
			false,
			null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=160132 - variation
public void test1048() {
	this.runConformTest(
		new String[] {
			"X.java", //========================
			"public interface X {\n" +
			"  static class Entry {\n" +
			"    static abstract class Internal extends Entry {\n" +
			"      abstract Internal createEntry();\n" +
			"    }\n" +
			"  }\n" +
			"}\n", //========================
			"Y.java",
			"public class Y extends  X.Entry.Internal {\n" +
			"  @Override public Internal createEntry() {\n" +
			"    return null;\n" +
			"  }\n" +
			"}\n" , //========================
		},
		"");
	// compile Y against X binary
	this.runConformTest(
			new String[] {
				"Y.java", //========================
				"public class Y extends X.Entry.Internal {\n" +
				"  @Override public Internal createEntry() {\n" +
				"    return null;\n" +
				"  }\n" +
				"}\n" , //========================
			},
			"",
			null,
			false,
			null);
}
public void test1049() {
	this.runConformTest(
		new String[] {
			"X.java", //========================
			"import java.util.*;\n" +
			"public class X {\n" +
			"}\n" +
			"\n" +
			"//===================\n" +
			"interface FooHandle<T extends Foo<T>> extends BarHandle<T> {}\n" +
			"interface Foo<T extends Foo<T>> extends FooHandle<T>, Bar<T> {\n" +
			"	FooHandle<T> foo();\n" +
			"}\n" +
			"//===================\n" +
			"interface EveHandle<T extends Baz<T>> extends SimpleHandle {}\n" +
			"interface Eve<T extends Baz<T>> extends Simple, EveHandle<T> {\n" +
			"	List<BobHandle> foo();\n" +
			"	BazHandle<T> handles();\n" +
			"}\n" +
			"\n" +
			"//===================\n" +
			"interface BobHandle extends BillHandle {}\n" +
			"interface Bob extends BobHandle, Bill {}\n" +
			"\n" +
			"//===================\n" +
			"interface BarHandle<T extends Bar<T>> extends BazHandle<T> {\n" +
			"	boolean same(BarHandle<?> o);\n" +
			"}\n" +
			"interface Bar<T extends Bar<T>> extends Baz<T>, BarHandle<T> {\n" +
			"	BarHandle<T> handle();\n" +
			"}\n" +
			"\n" +
			"//===================\n" +
			"interface BazHandle<T extends Baz<T>> {\n" +
			"	T baz();\n" +
			"	boolean same(BazHandle<?> o);\n" +
			"}\n" +
			"interface Baz<T extends Baz<T>> extends BazHandle<T> {\n" +
			"	BazHandle<T> handle();\n" +
			"	T baz();\n" +
			"}\n" +
			"\n" +
			"//===================\n" +
			"interface BillHandle extends FooHandle<Bill> {}\n" +
			"interface Bill extends BillHandle, Foo<Bill> {}\n" +
			"\n" +
			"//===================\n" +
			"interface SimpleHandle extends BazHandle<Simple> {}\n" +
			"interface Simple extends Baz<Simple>, SimpleHandle {}\n" +
			"\n" +
			"//===================\n" +
			"interface KeyHandle extends FooHandle<Key> {}\n" +
			"interface Key extends Foo<Key>, KeyHandle {}\n" +
			"\n" +
			"//===================\n" +
			"interface ClydeHandle extends BillHandle {}\n" +
			"interface Clyde extends ClydeHandle, Bill {\n" +
			"	void add(BobHandle h);\n" +
			"	public List<BobHandle> handles();\n" +
			"}\n" +
			"\n" +
			"//===================\n" +
			"interface FredHandle<T extends Fred<T>> extends BarHandle<T> {}\n" +
			"interface Fred<T extends Fred<T>> extends FredHandle<T>, Bar<T> {}\n" +
			"\n", // =================
		},
		"");
}
public void test1050() {
	String expectedOutput =
		"xxx\n" +
    	"true\n" +
    	"ClassCastException: Object[] cannot be cast to String[]\n" +
    	"ClassCastException: Object[] cannot be cast to String[]";

	this.runConformTest(
		new String[] {
			"X.java", //========================
			"class Container<E> {\n" +
			"  public Container() {\n" +
			"    data = (E[]) new Object[100];\n" +
			"  }\n" +
			"  protected E[] data;\n" +
			"  protected int size;\n" +
			"  E get(int index) {\n" +
			"    return data[index];\n" +
			"  }\n" +
			"  void add(E object) {\n" +
			"    data[size++] = object;\n" +
			"  }\n" +
			"  E[] data() {\n" +
			"    return data;\n" +
			"  }\n" +
			"}\n" +
			"class StringContainer extends Container<String> {\n" +
			"  public StringContainer() {\n" +
			"  }\n" +
			"  public void doSomething() {\n" +
			"    add(\"xxx\");\n" +
			"    System.out.println(get(0));\n" +
			"    System.out.println((\"\" + data()).\n" +
			"      startsWith(\"[Ljava.lang.Object;@\"));\n" +
			"    try {\n" +
			"      System.out.println(data[0]);\n" +
			"    } catch (ClassCastException e) {\n" +
			"      System.out.println(\"ClassCastException: Object[] cannot be cast to String[]\");\n" +
			"    }\n" +
			"    try {\n" +
			"      System.out.println(data()[0]);\n" +
			"    } catch (ClassCastException e) {\n" +
			"      System.out.println(\"ClassCastException: Object[] cannot be cast to String[]\");\n" +
			"    }\n" +
			"  }\n" +
			"}\n" +
			"public class X {\n" +
			"  public static void main(String[] args) {\n" +
			"    StringContainer x = new StringContainer();\n" +
			"    x.doSomething();\n" +
			"  }\n" +
			"}", // =================
		},
		expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=114088
public void test1051() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.List;\n" +
			"\n" +
			"public class X {\n" +
			"	public interface Intf<N> {\n" +
			"		void foo(List<Conc<N>.Inner> ls);\n" +
			"	}\n" +
			"\n" +
			"	public class Conc<N> {\n" +
			"		Intf<N> impl;\n" +
			"		public Conc(Intf<N> impl) {\n" +
			"			this.impl = impl;\n" +
			"		}\n" +
			"		public class Inner { }\n" +
			"\n" +
			"		public void bar(List<Conc<N>.Inner> ls) {\n" +
			"			impl.foo(ls);\n" +
			"		}\n" +
			"	}\n" +
			"}",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=115691
public void test1052() {
	Map options = getCompilerOptions();
	options.put(CompilerOptions.OPTION_ReportUncheckedTypeOperation, CompilerOptions.ERROR);
	options.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.ERROR);
	options.put(CompilerOptions.OPTION_ReportUnnecessaryTypeCheck, CompilerOptions.ERROR);
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X extends java.util.ArrayList<Integer> {\n" +
			"	private static final long serialVersionUID = 713223190582506215L;\n" +
			"	static void test() {\n" +
			"		java.util.ArrayList<?> a1 = new X();\n" +
			"		X b1 = (X) a1;\n" +
			"		X c1 = X.class.cast(a1);\n" +
			"		java.util.ArrayList<Integer> a2 = new X();\n" +
			"		X b2 = (X) a2;\n" +
			"	}\n" +
			"}",
		},
		"",
		null,
		true,
		null,
		options,
		null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=122163
public void test1053() {
	this.runConformTest(
		new String[] {
			"X.java",
			"class X<V,R> {\n" +
			"    class innerclass {\n" +
			"        void foo() {\n" +
			"            X<V,R> c = X.this;\n" +
			"        }\n" +
			"    }\n" +
			"}",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=142935
public void test1054() {
	Map customOptions = getCompilerOptions();
	// check no unsafe type operation problem is issued
	customOptions.put(CompilerOptions.OPTION_ReportUncheckedTypeOperation, CompilerOptions.IGNORE);
	customOptions.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.IGNORE);
	String expectedOutput =
		"----------\n" +
		"1. ERROR in X.java (at line 11)\n" +
		"	Bar bar= clazz.getAnnotation(Bar.class);\n" +
		"	         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from Annotation to Bar\n" +
		"----------\n";
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.lang.annotation.Retention;\n" +
			"import java.lang.annotation.RetentionPolicy;\n" +
			"import java.lang.reflect.Method;\n" +
			"\n" +
			"@Bar\n" +
			"public class X {\n" +
			"\n" +
			"        @Bar\n" +
			"        public void bar() throws Exception {\n" +
			"                Class clazz= X.class;\n" +
			"                Bar bar= clazz.getAnnotation(Bar.class);\n" +
			"                Method method= clazz.getMethod(\"bar\");\n" +
			"                Bar bar2= method.getAnnotation(Bar.class);\n" +
			"        }\n" +
			"}\n" +
			"\n" +
			"@Retention(RetentionPolicy.RUNTIME)\n" +
			"@interface Bar {\n" +
			"}",
		},
		expectedOutput,
		null,
		true,
		customOptions);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=142935
public void test1055() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.lang.annotation.Retention;\n" +
			"import java.lang.annotation.RetentionPolicy;\n" +
			"import java.lang.reflect.Method;\n" +
			"\n" +
			"@Bar\n" +
			"public class X {\n" +
			"\n" +
			"        @Bar\n" +
			"        public void bar() throws Exception {\n" +
			"                Class<X> clazz= X.class;\n" +
			"                Bar bar= clazz.getAnnotation(Bar.class);\n" +
			"                Method method= clazz.getMethod(\"bar\");\n" +
			"                Bar bar2= method.getAnnotation(Bar.class);\n" +
			"        }\n" +
			"}\n" +
			"\n" +
			"@Retention(RetentionPolicy.RUNTIME)\n" +
			"@interface Bar {\n" +
			"}",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=162400
public void test1056() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	static <T> T foo() {\n" +
			"		return null;\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		String[] s = { foo() };\n" +
			"	}	\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=159738
public void test1057() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.Map;\n" +
			"\n" +
			"class GenericType<E extends Object & Comparable<E> & Map.Entry<String, E>> {\n" +
			"	public void doSomething(E e) {\n" +
			"		System.out.println(e.compareTo(e.getValue()));\n" +
			"	}\n" +
			"}\n" +
			"class ConcreteType {\n" +
			"	public void doSomething(Object obj) {\n" +
			"		System.out.println(((Comparable) obj).compareTo(((Map.Entry) obj).getValue()));\n" +
			"	}\n" +
			"}\n" +
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		try {\n" +
			"			new GenericType().doSomething(\"a1\");\n" +
			"		} catch (Throwable e) {\n" +
			"			System.out.print(\"[\" + e.getClass().getSimpleName() + \":1]\");\n" +
			"		}\n" +
			"		try {\n" +
			"			new ConcreteType().doSomething(\"a2\");\n" +
			"		} catch (Throwable e) {\n" +
			"			System.out.print(\"[\" + e.getClass().getSimpleName() + \":2]\");\n" +
			"		}\n" +
			"	}\n" +
			"}\n", // =================,
		},
		"[ClassCastException:1][ClassCastException:2]");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=141289
public void test1058() throws Exception {
	runConformTest(
		// 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" +
			"                int foo = 0;\n" +
			"                String bar = \"zero\";\n" +
			"                System.out.println((foo != 0 ? foo : bar).compareTo(null));\n" +
			"        	} catch(NullPointerException e) {\n" +
			"        		System.out.println(\"SUCCESS\");\n" +
			"        	}\n" +
			"        }\n" +
			"}", // =================
		},
		// compiler results
		"" /* expected compiler log */,
		// runtime results
		"SUCCESS" /* expected output string */,
		"" /* expected error string */,
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
	String expectedOutput =
		"  // Method descriptor #15 ([Ljava/lang/String;)V\n" +
		"  // Stack: 3, Locals: 3\n" +
		"  public static void main(java.lang.String[] args);\n" +
		"     0  iconst_0\n" +
		"     1  istore_1 [foo]\n" +
		"     2  ldc <String \"zero\"> [16]\n" +
		"     4  astore_2 [bar]\n" +
		"     5  getstatic java.lang.System.out : java.io.PrintStream [18]\n" +
		"     8  iload_1 [foo]\n" +
		"     9  ifeq 19\n" +
		"    12  iload_1 [foo]\n" +
		"    13  invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [24]\n" +
		"    16  goto 20\n" +
		"    19  aload_2 [bar]\n" +
		"    20  aconst_null\n" +
		"    21  invokeinterface java.lang.Comparable.compareTo(java.lang.Object) : int [30] [nargs: 2]\n" +
		"    26  invokevirtual java.io.PrintStream.println(int) : void [36]\n" +
		"    29  goto 41\n" +
		"    32  astore_1 [e]\n" +
		"    33  getstatic java.lang.System.out : java.io.PrintStream [18]\n" +
		"    36  ldc <String \"SUCCESS\"> [42]\n" +
		"    38  invokevirtual java.io.PrintStream.println(java.lang.String) : void [44]\n" +
		"    41  return\n" +
		"      Exception Table:\n" +
		"        [pc: 0, pc: 29] -> 32 when : java.lang.NullPointerException\n" +
		"      Line numbers:\n" +
		"        [pc: 0, line: 4]\n" +
		"        [pc: 2, line: 5]\n" +
		"        [pc: 5, line: 6]\n" +
		"        [pc: 29, line: 7]\n" +
		"        [pc: 33, line: 8]\n" +
		"        [pc: 41, line: 10]\n" +
		"      Local variable table:\n" +
		"        [pc: 0, pc: 42] local: args index: 0 type: java.lang.String[]\n" +
		"        [pc: 2, pc: 29] local: foo index: 1 type: int\n" +
		"        [pc: 5, pc: 29] local: bar index: 2 type: java.lang.String\n" +
		"        [pc: 33, pc: 41] local: e index: 1 type: java.lang.NullPointerException\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=160795
public void test1059() {
	this.runNegativeTest(
		new String[] {
			"A.java", // =================
			"class A<T> {\n" +
			"    <S> S test(A<S> a) {\n" +
			"        return null;\n" +
			"    }\n" +
			"\n" +
			"    void m() {\n" +
			"        A<?> a = null;\n" +
			"        Number b = test(a);\n" +
			"    }\n" +
			"}", // =================
		},
		"----------\n" +
		"1. ERROR in A.java (at line 8)\n" +
		"	Number b = test(a);\n" +
		"	           ^^^^^^^\n" +
		"Type mismatch: cannot convert from capture#1-of ? to Number\n" +
		"----------\n");
}
// See corresponding FIXME in TypeBinding.isTypeArgumentContainedBy(..)
public void test1060() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java", // =================
			"import java.util.Collection;\n" +
			"import java.util.List;\n" +
			"\n" +
			"public class X {\n" +
			"    public static <B> void m(List<? super B> list,Collection<? super B> coll) {\n" +
			"        m(list,coll);\n" +
			"    }\n" +
			"}", // =================
		},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_7 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=159752
public void test1061() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"predicate/Predicate.java", // =================
			"package predicate;\n" +
			"public interface Predicate<T> {\n" +
			"	public boolean evaluate(T object);\n" +
			"}\n" +
			"final class AndPredicate<T> implements Predicate<T> {\n" +
			"	private final Predicate<? super T> iPredicate1;\n" +
			"	private final Predicate<? super T> iPredicate2;\n" +
			"	public static <T> Predicate<T> getInstance(Predicate<? super T> predicate1,\n" +
			"			Predicate<? super T> predicate2) {\n" +
			"		if (predicate1 == null || predicate2 == null) {\n" +
			"			throw new IllegalArgumentException(\"Predicate must not be null\");\n" +
			"		}\n" +
			"		return new AndPredicate<T>(predicate1, predicate2);\n" +
			"	}\n" +
			"	public AndPredicate(Predicate<? super T> predicate1,\n" +
			"			Predicate<? super T> predicate2) {\n" +
			"		super();\n" +
			"		iPredicate1 = predicate1;\n" +
			"		iPredicate2 = predicate2;\n" +
			"	}\n" +
			"	public boolean evaluate(T object) {\n" +
			"		return iPredicate1.evaluate(object) && iPredicate2.evaluate(object);\n" +
			"	}\n" +
			"}\n" +
			"class PredicateUtils {\n" +
			"\n" +
			"	public static <T> Predicate<T> andPredicate(\n" +
			"			Predicate<? super T> predicate1, Predicate<? super T> predicate2) {\n" +
			"		return AndPredicate.getInstance(predicate1, predicate2);\n" +
			"	}\n" +
			"}", // =================
		},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_7 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=148041
public void test1062() {
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"import java.util.HashSet;\n" +
			"import java.util.Iterator;\n" +
			"import java.util.Set;\n" +
			"\n" +
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		Set<X> set = new HashSet<X>();\n" +
			"		for (Iterator<X> iterator = set.iterator(); iterator.hasNext();) {\n" +
			"			Set<X> element1 = iterator.next();\n" +
			"			Set<X> element2 = (Set<X>) iterator.next(); // warning\n" +
			"		}\n" +
			"	}\n" +
			"}", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 9)\n" +
		"	Set<X> element1 = iterator.next();\n" +
		"	                  ^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from X to Set<X>\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 10)\n" +
		"	Set<X> element2 = (Set<X>) iterator.next(); // warning\n" +
		"	                  ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from X to Set<X>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=148041 - variation
public void test1063() {
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"import java.util.HashSet;\n" +
			"import java.util.Iterator;\n" +
			"import java.util.Set;\n" +
			"\n" +
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		Set<Cloneable> set = new HashSet<Cloneable>();\n" +
			"		for (Iterator<Cloneable> iterator = set.iterator(); iterator.hasNext();) {\n" +
			"			Set<Cloneable> element1 = iterator.next();\n" +
			"			Set<Cloneable> element2 = (Set<Cloneable>) iterator.next(); // warning\n" +
			"		}\n" +
			"	}\n" +
			"}", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 9)\n" +
		"	Set<Cloneable> element1 = iterator.next();\n" +
		"	                          ^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from Cloneable to Set<Cloneable>\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 10)\n" +
		"	Set<Cloneable> element2 = (Set<Cloneable>) iterator.next(); // warning\n" +
		"	                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from Cloneable to Set<Cloneable>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=148041 - variation
public void test1064() {
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"import java.util.HashSet;\n" +
			"import java.util.Iterator;\n" +
			"\n" +
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		HashSet<X> set = new HashSet<X>();\n" +
			"		for (Iterator<X> iterator = set.iterator(); iterator.hasNext();) {\n" +
			"			HashSet<X> element1 = iterator.next();\n" +
			"			HashSet<X> element2 = (HashSet<X>) iterator.next();\n" +
			"		}\n" +
			"	}\n" +
			"}", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 8)\n" +
		"	HashSet<X> element1 = iterator.next();\n" +
		"	                      ^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from X to HashSet<X>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 9)\n" +
		"	HashSet<X> element2 = (HashSet<X>) iterator.next();\n" +
		"	                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from X to HashSet<X>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=141289 - variation
public void test1065() throws Exception {
	runConformTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"X.java", // =================
			"public class X {\n" +
			"	void testFoo(boolean t, A a, B b) {\n" +
			"		System.out.print((t ? a : b).foo());\n" +
			"	}\n" +
			"	void testBar(boolean t, A a, B b) {\n" +
			"		System.out.print((t ? a : b).bar());\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		X x = new X();\n" +
			"		A a = new A();\n" +
			"		B b = new B();\n" +
			"		x.testFoo(true, a, b);\n" +
			"		x.testFoo(false, a, b);\n" +
			"		x.testBar(true, a, b);\n" +
			"		x.testBar(false, a, b);\n" +
			"	}\n" +
			"}\n" +
			"interface Foo { 	String foo(); }\n" +
			"interface Bar { String bar(); }\n" +
			"class A implements Foo, Bar {\n" +
			"	public String foo() { return \"[A#foo()]\"; }\n" +
			"	public String bar() { return \"[A#bar()]\"; }\n" +
			"}\n" +
			"class B implements Foo, Bar {\n" +
			"	public String foo() { return \"[B#foo()]\"; }\n" +
			"	public String bar() { return \"[B#bar()]\"; }\n" +
			"}\n", // =================
		},
		// compiler results
		"" /* expected compiler log */,
		// runtime results
		"[A#foo()][B#foo()][A#bar()][B#bar()]" /* expected output string */,
		"" /* expected error string */,
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
	// 	check presence of checkcast in #testFoo() and #testBar()
	String expectedOutput = this.complianceLevel == ClassFileConstants.JDK1_5
			?	"  // Method descriptor #15 (ZLA;LB;)V\n" +
				"  // Stack: 2, Locals: 4\n" +
				"  void testFoo(boolean t, A a, B b);\n" +
				"     0  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
				"     3  iload_1 [t]\n" +
				"     4  ifeq 11\n" +
				"     7  aload_2 [a]\n" +
				"     8  goto 12\n" +
				"    11  aload_3 [b]\n" +
				"    12  invokeinterface Foo.foo() : java.lang.String [22] [nargs: 1]\n" +
				"    17  invokevirtual java.io.PrintStream.print(java.lang.String) : void [28]\n" +
				"    20  return\n" +
				"      Line numbers:\n" +
				"        [pc: 0, line: 3]\n" +
				"        [pc: 20, line: 4]\n" +
				"      Local variable table:\n" +
				"        [pc: 0, pc: 21] local: this index: 0 type: X\n" +
				"        [pc: 0, pc: 21] local: t index: 1 type: boolean\n" +
				"        [pc: 0, pc: 21] local: a index: 2 type: A\n" +
				"        [pc: 0, pc: 21] local: b index: 3 type: B\n" +
				"  \n" +
				"  // Method descriptor #15 (ZLA;LB;)V\n" +
				"  // Stack: 2, Locals: 4\n" +
				"  void testBar(boolean t, A a, B b);\n" +
				"     0  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
				"     3  iload_1 [t]\n" +
				"     4  ifeq 11\n" +
				"     7  aload_2 [a]\n" +
				"     8  goto 12\n" +
				"    11  aload_3 [b]\n" +
				"    12  checkcast Bar [41]\n" +
				"    15  invokeinterface Bar.bar() : java.lang.String [43] [nargs: 1]\n" +
				"    20  invokevirtual java.io.PrintStream.print(java.lang.String) : void [28]\n" +
				"    23  return\n" +
				"      Line numbers:\n" +
				"        [pc: 0, line: 6]\n" +
				"        [pc: 23, line: 7]\n" +
				"      Local variable table:\n" +
				"        [pc: 0, pc: 24] local: this index: 0 type: X\n" +
				"        [pc: 0, pc: 24] local: t index: 1 type: boolean\n" +
				"        [pc: 0, pc: 24] local: a index: 2 type: A\n" +
				"        [pc: 0, pc: 24] local: b index: 3 type: B\n"
			:	"  // Method descriptor #15 (ZLA;LB;)V\n" +
				"  // Stack: 2, Locals: 4\n" +
				"  void testFoo(boolean t, A a, B b);\n" +
				"     0  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
				"     3  iload_1 [t]\n" +
				"     4  ifeq 11\n" +
				"     7  aload_2 [a]\n" +
				"     8  goto 12\n" +
				"    11  aload_3 [b]\n" +
				"    12  invokeinterface Foo.foo() : java.lang.String [22] [nargs: 1]\n" +
				"    17  invokevirtual java.io.PrintStream.print(java.lang.String) : void [28]\n" +
				"    20  return\n" +
				"      Line numbers:\n" +
				"        [pc: 0, line: 3]\n" +
				"        [pc: 20, line: 4]\n" +
				"      Local variable table:\n" +
				"        [pc: 0, pc: 21] local: this index: 0 type: X\n" +
				"        [pc: 0, pc: 21] local: t index: 1 type: boolean\n" +
				"        [pc: 0, pc: 21] local: a index: 2 type: A\n" +
				"        [pc: 0, pc: 21] local: b index: 3 type: B\n" +
				"      Stack map table: number of frames 2\n" +
				"        [pc: 11, same_locals_1_stack_item, stack: {java.io.PrintStream}]\n" +
				"        [pc: 12, full, stack: {java.io.PrintStream, Foo}, locals: {X, int, A, B}]\n" +
				"  \n" +
				"  // Method descriptor #15 (ZLA;LB;)V\n" +
				"  // Stack: 2, Locals: 4\n" +
				"  void testBar(boolean t, A a, B b);\n" +
				"     0  getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
				"     3  iload_1 [t]\n" +
				"     4  ifeq 11\n" +
				"     7  aload_2 [a]\n" +
				"     8  goto 12\n" +
				"    11  aload_3 [b]\n" +
				"    12  checkcast Bar [46]\n" +
				"    15  invokeinterface Bar.bar() : java.lang.String [48] [nargs: 1]\n" +
				"    20  invokevirtual java.io.PrintStream.print(java.lang.String) : void [28]\n" +
				"    23  return\n" +
				"      Line numbers:\n" +
				"        [pc: 0, line: 6]\n" +
				"        [pc: 23, line: 7]\n" +
				"      Local variable table:\n" +
				"        [pc: 0, pc: 24] local: this index: 0 type: X\n" +
				"        [pc: 0, pc: 24] local: t index: 1 type: boolean\n" +
				"        [pc: 0, pc: 24] local: a index: 2 type: A\n" +
				"        [pc: 0, pc: 24] local: b index: 3 type: B\n" +
				"      Stack map table: number of frames 2\n" +
				"        [pc: 11, same_locals_1_stack_item, stack: {java.io.PrintStream}]\n" +
				"        [pc: 12, full, stack: {java.io.PrintStream, Foo}, locals: {X, int, A, B}]\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=141289 - variation
public void test1066() throws Exception {
	this.runConformTest(
		new String[] {
			"X.java", // =================
			"import java.util.*;\n" +
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		X x = new X();\n" +
			"		List l = new ArrayList();\n" +
			"		l.add(\"zork\");\n" +
			"		List<A> la = l;\n" +
			"		List<B> lb = l;\n" +
			"		boolean t = true, f = false;\n" +
			"		try {\n" +
			"			System.out.print((t ? la.get(0) : lb.get(0)).foo());\n" +
			"		} catch (Throwable e) {\n" +
			"			System.out.print(\"[\" + e.getClass().getSimpleName() + \":foo(1)]\");\n" +
			"		}		\n" +
			"		try {\n" +
			"			System.out.print((f ? la.get(0) : lb.get(0)).foo());\n" +
			"		} catch (Throwable e) {\n" +
			"			System.out.print(\"[\" + e.getClass().getSimpleName() + \":foo(2)]\");\n" +
			"		}		\n" +
			"		try {\n" +
			"			System.out.print((t ? la.get(0) : lb.get(0)).bar());\n" +
			"		} catch (Throwable e) {\n" +
			"			System.out.print(\"[\" + e.getClass().getSimpleName() + \":bar(1)]\");\n" +
			"		}		\n" +
			"		try {\n" +
			"			System.out.print((f ? la.get(0) : lb.get(0)).bar());\n" +
			"		} catch (Throwable e) {\n" +
			"			System.out.print(\"[\" + e.getClass().getSimpleName() + \":bar(2)]\");\n" +
			"		}		\n" +
			"	}\n" +
			"}\n" +
			"interface Foo { 	String foo(); }\n" +
			"interface Bar { String bar(); }\n" +
			"abstract class A implements Foo, Bar { }\n" +
			"abstract class B implements Foo, Bar { }\n", // =================
		},
		"[ClassCastException:foo(1)][ClassCastException:foo(2)][ClassCastException:bar(1)][ClassCastException:bar(2)]");
	// 	check presence of checkcast
	String expectedOutput = this.complianceLevel == ClassFileConstants.JDK1_5
			?	"  // Stack: 4, Locals: 8\n" +
				"  public static void main(java.lang.String[] args);\n" +
				"      0  new X [1]\n" +
				"      3  dup\n" +
				"      4  invokespecial X() [16]\n" +
				"      7  astore_1 [x]\n" +
				"      8  new java.util.ArrayList [17]\n" +
				"     11  dup\n" +
				"     12  invokespecial java.util.ArrayList() [19]\n" +
				"     15  astore_2 [l]\n" +
				"     16  aload_2 [l]\n" +
				"     17  ldc <String \"zork\"> [20]\n" +
				"     19  invokeinterface java.util.List.add(java.lang.Object) : boolean [22] [nargs: 2]\n" +
				"     24  pop\n" +
				"     25  aload_2 [l]\n" +
				"     26  astore_3 [la]\n" +
				"     27  aload_2 [l]\n" +
				"     28  astore 4 [lb]\n" +
				"     30  iconst_1\n" +
				"     31  istore 5 [t]\n" +
				"     33  iconst_0\n" +
				"     34  istore 6 [f]\n" +
				"     36  getstatic java.lang.System.out : java.io.PrintStream [28]\n" +
				"     39  iload 5 [t]\n" +
				"     41  ifeq 57\n" +
				"     44  aload_3 [la]\n" +
				"     45  iconst_0\n" +
				"     46  invokeinterface java.util.List.get(int) : java.lang.Object [34] [nargs: 2]\n" +
				"     51  checkcast Foo [38]\n" +
				"     54  goto 68\n" +
				"     57  aload 4 [lb]\n" +
				"     59  iconst_0\n" +
				"     60  invokeinterface java.util.List.get(int) : java.lang.Object [34] [nargs: 2]\n" +
				"     65  checkcast Foo [38]\n" +
				"     68  invokeinterface Foo.foo() : java.lang.String [40] [nargs: 1]\n" +
				"     73  invokevirtual java.io.PrintStream.print(java.lang.String) : void [44]\n" +
				"     76  goto 115\n" +
				"     79  astore 7 [e]\n" +
				"     81  getstatic java.lang.System.out : java.io.PrintStream [28]\n" +
				"     84  new java.lang.StringBuilder [50]\n" +
				"     87  dup\n" +
				"     88  ldc <String \"[\"> [52]\n" +
				"     90  invokespecial java.lang.StringBuilder(java.lang.String) [54]\n" +
				"     93  aload 7 [e]\n" +
				"     95  invokevirtual java.lang.Object.getClass() : java.lang.Class [56]\n" +
				"     98  invokevirtual java.lang.Class.getSimpleName() : java.lang.String [60]\n" +
				"    101  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [65]\n" +
				"    104  ldc <String \":foo(1)]\"> [69]\n" +
				"    106  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [65]\n" +
				"    109  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [71]\n" +
				"    112  invokevirtual java.io.PrintStream.print(java.lang.String) : void [44]\n" +
				"    115  getstatic java.lang.System.out : java.io.PrintStream [28]\n" +
				"    118  iload 6 [f]\n" +
				"    120  ifeq 136\n" +
				"    123  aload_3 [la]\n" +
				"    124  iconst_0\n" +
				"    125  invokeinterface java.util.List.get(int) : java.lang.Object [34] [nargs: 2]\n" +
				"    130  checkcast Foo [38]\n" +
				"    133  goto 147\n" +
				"    136  aload 4 [lb]\n" +
				"    138  iconst_0\n" +
				"    139  invokeinterface java.util.List.get(int) : java.lang.Object [34] [nargs: 2]\n" +
				"    144  checkcast Foo [38]\n" +
				"    147  invokeinterface Foo.foo() : java.lang.String [40] [nargs: 1]\n" +
				"    152  invokevirtual java.io.PrintStream.print(java.lang.String) : void [44]\n" +
				"    155  goto 194\n" +
				"    158  astore 7 [e]\n" +
				"    160  getstatic java.lang.System.out : java.io.PrintStream [28]\n" +
				"    163  new java.lang.StringBuilder [50]\n" +
				"    166  dup\n" +
				"    167  ldc <String \"[\"> [52]\n" +
				"    169  invokespecial java.lang.StringBuilder(java.lang.String) [54]\n" +
				"    172  aload 7 [e]\n" +
				"    174  invokevirtual java.lang.Object.getClass() : java.lang.Class [56]\n" +
				"    177  invokevirtual java.lang.Class.getSimpleName() : java.lang.String [60]\n" +
				"    180  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [65]\n" +
				"    183  ldc <String \":foo(2)]\"> [74]\n" +
				"    185  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [65]\n" +
				"    188  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [71]\n" +
				"    191  invokevirtual java.io.PrintStream.print(java.lang.String) : void [44]\n" +
				"    194  getstatic java.lang.System.out : java.io.PrintStream [28]\n" +
				"    197  iload 5 [t]\n" +
				"    199  ifeq 215\n" +
				"    202  aload_3 [la]\n" +
				"    203  iconst_0\n" +
				"    204  invokeinterface java.util.List.get(int) : java.lang.Object [34] [nargs: 2]\n" +
				"    209  checkcast Foo [38]\n" +
				"    212  goto 226\n" +
				"    215  aload 4 [lb]\n" +
				"    217  iconst_0\n" +
				"    218  invokeinterface java.util.List.get(int) : java.lang.Object [34] [nargs: 2]\n" +
				"    223  checkcast Foo [38]\n" +
				"    226  checkcast Bar [76]\n" +
				"    229  invokeinterface Bar.bar() : java.lang.String [78] [nargs: 1]\n" +
				"    234  invokevirtual java.io.PrintStream.print(java.lang.String) : void [44]\n" +
				"    237  goto 276\n" +
				"    240  astore 7 [e]\n" +
				"    242  getstatic java.lang.System.out : java.io.PrintStream [28]\n" +
				"    245  new java.lang.StringBuilder [50]\n" +
				"    248  dup\n" +
				"    249  ldc <String \"[\"> [52]\n" +
				"    251  invokespecial java.lang.StringBuilder(java.lang.String) [54]\n" +
				"    254  aload 7 [e]\n" +
				"    256  invokevirtual java.lang.Object.getClass() : java.lang.Class [56]\n" +
				"    259  invokevirtual java.lang.Class.getSimpleName() : java.lang.String [60]\n" +
				"    262  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [65]\n" +
				"    265  ldc <String \":bar(1)]\"> [81]\n" +
				"    267  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [65]\n" +
				"    270  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [71]\n" +
				"    273  invokevirtual java.io.PrintStream.print(java.lang.String) : void [44]\n" +
				"    276  getstatic java.lang.System.out : java.io.PrintStream [28]\n" +
				"    279  iload 6 [f]\n" +
				"    281  ifeq 297\n" +
				"    284  aload_3 [la]\n" +
				"    285  iconst_0\n" +
				"    286  invokeinterface java.util.List.get(int) : java.lang.Object [34] [nargs: 2]\n" +
				"    291  checkcast Foo [38]\n" +
				"    294  goto 308\n" +
				"    297  aload 4 [lb]\n" +
				"    299  iconst_0\n" +
				"    300  invokeinterface java.util.List.get(int) : java.lang.Object [34] [nargs: 2]\n" +
				"    305  checkcast Foo [38]\n" +
				"    308  checkcast Bar [76]\n" +
				"    311  invokeinterface Bar.bar() : java.lang.String [78] [nargs: 1]\n" +
				"    316  invokevirtual java.io.PrintStream.print(java.lang.String) : void [44]\n" +
				"    319  goto 358\n" +
				"    322  astore 7 [e]\n" +
				"    324  getstatic java.lang.System.out : java.io.PrintStream [28]\n" +
				"    327  new java.lang.StringBuilder [50]\n" +
				"    330  dup\n" +
				"    331  ldc <String \"[\"> [52]\n" +
				"    333  invokespecial java.lang.StringBuilder(java.lang.String) [54]\n" +
				"    336  aload 7 [e]\n" +
				"    338  invokevirtual java.lang.Object.getClass() : java.lang.Class [56]\n" +
				"    341  invokevirtual java.lang.Class.getSimpleName() : java.lang.String [60]\n" +
				"    344  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [65]\n" +
				"    347  ldc <String \":bar(2)]\"> [83]\n" +
				"    349  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [65]\n" +
				"    352  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [71]\n" +
				"    355  invokevirtual java.io.PrintStream.print(java.lang.String) : void [44]\n" +
				"    358  return\n" +
				"      Exception Table:\n" +
				"        [pc: 36, pc: 76] -> 79 when : java.lang.Throwable\n" +
				"        [pc: 115, pc: 155] -> 158 when : java.lang.Throwable\n" +
				"        [pc: 194, pc: 237] -> 240 when : java.lang.Throwable\n" +
				"        [pc: 276, pc: 319] -> 322 when : java.lang.Throwable\n" +
				"      Line numbers:\n" +
				"        [pc: 0, line: 4]\n" +
				"        [pc: 8, line: 5]\n" +
				"        [pc: 16, line: 6]\n" +
				"        [pc: 25, line: 7]\n" +
				"        [pc: 27, line: 8]\n" +
				"        [pc: 30, line: 9]\n" +
				"        [pc: 36, line: 11]\n" +
				"        [pc: 76, line: 12]\n" +
				"        [pc: 81, line: 13]\n" +
				"        [pc: 115, line: 16]\n" +
				"        [pc: 155, line: 17]\n" +
				"        [pc: 160, line: 18]\n" +
				"        [pc: 194, line: 21]\n" +
				"        [pc: 237, line: 22]\n" +
				"        [pc: 242, line: 23]\n" +
				"        [pc: 276, line: 26]\n" +
				"        [pc: 319, line: 27]\n" +
				"        [pc: 324, line: 28]\n" +
				"        [pc: 358, line: 30]\n" +
				"      Local variable table:\n" +
				"        [pc: 0, pc: 359] local: args index: 0 type: java.lang.String[]\n" +
				"        [pc: 8, pc: 359] local: x index: 1 type: X\n" +
				"        [pc: 16, pc: 359] local: l index: 2 type: java.util.List\n" +
				"        [pc: 27, pc: 359] local: la index: 3 type: java.util.List\n" +
				"        [pc: 30, pc: 359] local: lb index: 4 type: java.util.List\n" +
				"        [pc: 33, pc: 359] local: t index: 5 type: boolean\n" +
				"        [pc: 36, pc: 359] local: f index: 6 type: boolean\n" +
				"        [pc: 81, pc: 115] local: e index: 7 type: java.lang.Throwable\n" +
				"        [pc: 160, pc: 194] local: e index: 7 type: java.lang.Throwable\n" +
				"        [pc: 242, pc: 276] local: e index: 7 type: java.lang.Throwable\n" +
				"        [pc: 324, pc: 358] local: e index: 7 type: java.lang.Throwable\n" +
				"      Local variable type table:\n" +
				"        [pc: 27, pc: 359] local: la index: 3 type: java.util.List<A>\n" +
				"        [pc: 30, pc: 359] local: lb index: 4 type: java.util.List<B>\n"
			:	"  // Method descriptor #15 ([Ljava/lang/String;)V\n" +
				"  // Stack: 4, Locals: 8\n" +
				"  public static void main(java.lang.String[] args);\n" +
				"      0  new X [1]\n" +
				"      3  dup\n" +
				"      4  invokespecial X() [16]\n" +
				"      7  astore_1 [x]\n" +
				"      8  new java.util.ArrayList [17]\n" +
				"     11  dup\n" +
				"     12  invokespecial java.util.ArrayList() [19]\n" +
				"     15  astore_2 [l]\n" +
				"     16  aload_2 [l]\n" +
				"     17  ldc <String \"zork\"> [20]\n" +
				"     19  invokeinterface java.util.List.add(java.lang.Object) : boolean [22] [nargs: 2]\n" +
				"     24  pop\n" +
				"     25  aload_2 [l]\n" +
				"     26  astore_3 [la]\n" +
				"     27  aload_2 [l]\n" +
				"     28  astore 4 [lb]\n" +
				"     30  iconst_1\n" +
				"     31  istore 5 [t]\n" +
				"     33  iconst_0\n" +
				"     34  istore 6 [f]\n" +
				"     36  getstatic java.lang.System.out : java.io.PrintStream [28]\n" +
				"     39  iload 5 [t]\n" +
				"     41  ifeq 57\n" +
				"     44  aload_3 [la]\n" +
				"     45  iconst_0\n" +
				"     46  invokeinterface java.util.List.get(int) : java.lang.Object [34] [nargs: 2]\n" +
				"     51  checkcast Foo [38]\n" +
				"     54  goto 68\n" +
				"     57  aload 4 [lb]\n" +
				"     59  iconst_0\n" +
				"     60  invokeinterface java.util.List.get(int) : java.lang.Object [34] [nargs: 2]\n" +
				"     65  checkcast Foo [38]\n" +
				"     68  invokeinterface Foo.foo() : java.lang.String [40] [nargs: 1]\n" +
				"     73  invokevirtual java.io.PrintStream.print(java.lang.String) : void [44]\n" +
				"     76  goto 115\n" +
				"     79  astore 7 [e]\n" +
				"     81  getstatic java.lang.System.out : java.io.PrintStream [28]\n" +
				"     84  new java.lang.StringBuilder [50]\n" +
				"     87  dup\n" +
				"     88  ldc <String \"[\"> [52]\n" +
				"     90  invokespecial java.lang.StringBuilder(java.lang.String) [54]\n" +
				"     93  aload 7 [e]\n" +
				"     95  invokevirtual java.lang.Object.getClass() : java.lang.Class [56]\n" +
				"     98  invokevirtual java.lang.Class.getSimpleName() : java.lang.String [60]\n" +
				"    101  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [65]\n" +
				"    104  ldc <String \":foo(1)]\"> [69]\n" +
				"    106  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [65]\n" +
				"    109  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [71]\n" +
				"    112  invokevirtual java.io.PrintStream.print(java.lang.String) : void [44]\n" +
				"    115  getstatic java.lang.System.out : java.io.PrintStream [28]\n" +
				"    118  iload 6 [f]\n" +
				"    120  ifeq 136\n" +
				"    123  aload_3 [la]\n" +
				"    124  iconst_0\n" +
				"    125  invokeinterface java.util.List.get(int) : java.lang.Object [34] [nargs: 2]\n" +
				"    130  checkcast Foo [38]\n" +
				"    133  goto 147\n" +
				"    136  aload 4 [lb]\n" +
				"    138  iconst_0\n" +
				"    139  invokeinterface java.util.List.get(int) : java.lang.Object [34] [nargs: 2]\n" +
				"    144  checkcast Foo [38]\n" +
				"    147  invokeinterface Foo.foo() : java.lang.String [40] [nargs: 1]\n" +
				"    152  invokevirtual java.io.PrintStream.print(java.lang.String) : void [44]\n" +
				"    155  goto 194\n" +
				"    158  astore 7 [e]\n" +
				"    160  getstatic java.lang.System.out : java.io.PrintStream [28]\n" +
				"    163  new java.lang.StringBuilder [50]\n" +
				"    166  dup\n" +
				"    167  ldc <String \"[\"> [52]\n" +
				"    169  invokespecial java.lang.StringBuilder(java.lang.String) [54]\n" +
				"    172  aload 7 [e]\n" +
				"    174  invokevirtual java.lang.Object.getClass() : java.lang.Class [56]\n" +
				"    177  invokevirtual java.lang.Class.getSimpleName() : java.lang.String [60]\n" +
				"    180  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [65]\n" +
				"    183  ldc <String \":foo(2)]\"> [74]\n" +
				"    185  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [65]\n" +
				"    188  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [71]\n" +
				"    191  invokevirtual java.io.PrintStream.print(java.lang.String) : void [44]\n" +
				"    194  getstatic java.lang.System.out : java.io.PrintStream [28]\n" +
				"    197  iload 5 [t]\n" +
				"    199  ifeq 215\n" +
				"    202  aload_3 [la]\n" +
				"    203  iconst_0\n" +
				"    204  invokeinterface java.util.List.get(int) : java.lang.Object [34] [nargs: 2]\n" +
				"    209  checkcast Foo [38]\n" +
				"    212  goto 226\n" +
				"    215  aload 4 [lb]\n" +
				"    217  iconst_0\n" +
				"    218  invokeinterface java.util.List.get(int) : java.lang.Object [34] [nargs: 2]\n" +
				"    223  checkcast Foo [38]\n" +
				"    226  checkcast Bar [76]\n" +
				"    229  invokeinterface Bar.bar() : java.lang.String [78] [nargs: 1]\n" +
				"    234  invokevirtual java.io.PrintStream.print(java.lang.String) : void [44]\n" +
				"    237  goto 276\n" +
				"    240  astore 7 [e]\n" +
				"    242  getstatic java.lang.System.out : java.io.PrintStream [28]\n" +
				"    245  new java.lang.StringBuilder [50]\n" +
				"    248  dup\n" +
				"    249  ldc <String \"[\"> [52]\n" +
				"    251  invokespecial java.lang.StringBuilder(java.lang.String) [54]\n" +
				"    254  aload 7 [e]\n" +
				"    256  invokevirtual java.lang.Object.getClass() : java.lang.Class [56]\n" +
				"    259  invokevirtual java.lang.Class.getSimpleName() : java.lang.String [60]\n" +
				"    262  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [65]\n" +
				"    265  ldc <String \":bar(1)]\"> [81]\n" +
				"    267  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [65]\n" +
				"    270  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [71]\n" +
				"    273  invokevirtual java.io.PrintStream.print(java.lang.String) : void [44]\n" +
				"    276  getstatic java.lang.System.out : java.io.PrintStream [28]\n" +
				"    279  iload 6 [f]\n" +
				"    281  ifeq 297\n" +
				"    284  aload_3 [la]\n" +
				"    285  iconst_0\n" +
				"    286  invokeinterface java.util.List.get(int) : java.lang.Object [34] [nargs: 2]\n" +
				"    291  checkcast Foo [38]\n" +
				"    294  goto 308\n" +
				"    297  aload 4 [lb]\n" +
				"    299  iconst_0\n" +
				"    300  invokeinterface java.util.List.get(int) : java.lang.Object [34] [nargs: 2]\n" +
				"    305  checkcast Foo [38]\n" +
				"    308  checkcast Bar [76]\n" +
				"    311  invokeinterface Bar.bar() : java.lang.String [78] [nargs: 1]\n" +
				"    316  invokevirtual java.io.PrintStream.print(java.lang.String) : void [44]\n" +
				"    319  goto 358\n" +
				"    322  astore 7 [e]\n" +
				"    324  getstatic java.lang.System.out : java.io.PrintStream [28]\n" +
				"    327  new java.lang.StringBuilder [50]\n" +
				"    330  dup\n" +
				"    331  ldc <String \"[\"> [52]\n" +
				"    333  invokespecial java.lang.StringBuilder(java.lang.String) [54]\n" +
				"    336  aload 7 [e]\n" +
				"    338  invokevirtual java.lang.Object.getClass() : java.lang.Class [56]\n" +
				"    341  invokevirtual java.lang.Class.getSimpleName() : java.lang.String [60]\n" +
				"    344  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [65]\n" +
				"    347  ldc <String \":bar(2)]\"> [83]\n" +
				"    349  invokevirtual java.lang.StringBuilder.append(java.lang.String) : java.lang.StringBuilder [65]\n" +
				"    352  invokevirtual java.lang.StringBuilder.toString() : java.lang.String [71]\n" +
				"    355  invokevirtual java.io.PrintStream.print(java.lang.String) : void [44]\n" +
				"    358  return\n" +
				"      Exception Table:\n" +
				"        [pc: 36, pc: 76] -> 79 when : java.lang.Throwable\n" +
				"        [pc: 115, pc: 155] -> 158 when : java.lang.Throwable\n" +
				"        [pc: 194, pc: 237] -> 240 when : java.lang.Throwable\n" +
				"        [pc: 276, pc: 319] -> 322 when : java.lang.Throwable\n" +
				"      Line numbers:\n" +
				"        [pc: 0, line: 4]\n" +
				"        [pc: 8, line: 5]\n" +
				"        [pc: 16, line: 6]\n" +
				"        [pc: 25, line: 7]\n" +
				"        [pc: 27, line: 8]\n" +
				"        [pc: 30, line: 9]\n" +
				"        [pc: 36, line: 11]\n" +
				"        [pc: 76, line: 12]\n" +
				"        [pc: 81, line: 13]\n" +
				"        [pc: 115, line: 16]\n" +
				"        [pc: 155, line: 17]\n" +
				"        [pc: 160, line: 18]\n" +
				"        [pc: 194, line: 21]\n" +
				"        [pc: 237, line: 22]\n" +
				"        [pc: 242, line: 23]\n" +
				"        [pc: 276, line: 26]\n" +
				"        [pc: 319, line: 27]\n" +
				"        [pc: 324, line: 28]\n" +
				"        [pc: 358, line: 30]\n" +
				"      Local variable table:\n" +
				"        [pc: 0, pc: 359] local: args index: 0 type: java.lang.String[]\n" +
				"        [pc: 8, pc: 359] local: x index: 1 type: X\n" +
				"        [pc: 16, pc: 359] local: l index: 2 type: java.util.List\n" +
				"        [pc: 27, pc: 359] local: la index: 3 type: java.util.List\n" +
				"        [pc: 30, pc: 359] local: lb index: 4 type: java.util.List\n" +
				"        [pc: 33, pc: 359] local: t index: 5 type: boolean\n" +
				"        [pc: 36, pc: 359] local: f index: 6 type: boolean\n" +
				"        [pc: 81, pc: 115] local: e index: 7 type: java.lang.Throwable\n" +
				"        [pc: 160, pc: 194] local: e index: 7 type: java.lang.Throwable\n" +
				"        [pc: 242, pc: 276] local: e index: 7 type: java.lang.Throwable\n" +
				"        [pc: 324, pc: 358] local: e index: 7 type: java.lang.Throwable\n" +
				"      Local variable type table:\n" +
				"        [pc: 27, pc: 359] local: la index: 3 type: java.util.List<A>\n" +
				"        [pc: 30, pc: 359] local: lb index: 4 type: java.util.List<B>\n" +
				"      Stack map table: number of frames 16\n" +
				"        [pc: 57, full, stack: {java.io.PrintStream}, locals: {java.lang.String[], X, java.util.List, java.util.List, java.util.List, int, int}]\n" +
				"        [pc: 68, full, stack: {java.io.PrintStream, Foo}, locals: {java.lang.String[], X, java.util.List, java.util.List, java.util.List, int, int}]\n" +
				"        [pc: 79, same_locals_1_stack_item, stack: {java.lang.Throwable}]\n" +
				"        [pc: 115, same]\n" +
				"        [pc: 136, same_locals_1_stack_item, stack: {java.io.PrintStream}]\n" +
				"        [pc: 147, full, stack: {java.io.PrintStream, Foo}, locals: {java.lang.String[], X, java.util.List, java.util.List, java.util.List, int, int}]\n" +
				"        [pc: 158, same_locals_1_stack_item, stack: {java.lang.Throwable}]\n" +
				"        [pc: 194, same]\n" +
				"        [pc: 215, same_locals_1_stack_item, stack: {java.io.PrintStream}]\n" +
				"        [pc: 226, full, stack: {java.io.PrintStream, Foo}, locals: {java.lang.String[], X, java.util.List, java.util.List, java.util.List, int, int}]\n" +
				"        [pc: 240, same_locals_1_stack_item, stack: {java.lang.Throwable}]\n" +
				"        [pc: 276, same]\n" +
				"        [pc: 297, same_locals_1_stack_item, stack: {java.io.PrintStream}]\n" +
				"        [pc: 308, full, stack: {java.io.PrintStream, Foo}, locals: {java.lang.String[], X, java.util.List, java.util.List, java.util.List, int, int}]\n" +
				"        [pc: 322, same_locals_1_stack_item, stack: {java.lang.Throwable}]\n" +
				"        [pc: 358, 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=162991
// using only source types
public void test1067() {
	this.runConformTest(
		new String[] {
			"Something.java",
			"public interface Something {\n" +
			"\n" +
			"}", // =================
			"Doing.java", // =================
			"public interface Doing {\n" +
			"        public <S extends Something, T extends S> T get(Class<S> clazz);\n" +
			"}", // =================
			"DoingImpl.java", // =================
			"public class DoingImpl implements Doing {\n" +
			"        public <S extends Something, T extends S> T get(Class<S> clazz) {\n" +
			"                return null;\n" +
			"        }\n" +
			"}" // =================
		},
		"");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=162991
// using source and binary types
public void test1068() {
	this.runConformTest(
		new String[] {
			"Something.java",
			"public interface Something {\n" +
			"\n" +
			"}", // =================
			"Doing.java", // =================
			"public interface Doing {\n" +
			"        public <S extends Something, T extends S> T get(Class<S> clazz);\n" +
			"}", // =================
		},
		"");
	this.runConformTest(
		new String[] {
			"DoingImpl.java", // =================
			"public class DoingImpl implements Doing {\n" +
			"        public <S extends Something, T extends S> T get(Class<S> clazz) {\n" +
			"                return null;\n" +
			"        }\n" +
			"}" // =================
		},
		"",
		null,
		false,
		null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=163262
public void test1069() {
	this.runConformTest(
		new String[] {
			"Bug.java", // =================
			"public class Bug<A> {\n" +
			"   void bug() {\n" +
			"      new Runnable() {\n" +
			"         public void run() {\n" +
			"            Bug<A> bug = Bug.this;\n" +
			"         }\n" +
			"      };\n" +
			"   }\n" +
			"}",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=163262
public void test1070() {
	this.runConformTest(
		new String[] {
			"Bug.java", // =================
			"public class Bug<A> {\n" +
			"   Bug<A> reproduce() {\n" +
			"      return Bug.this;\n" +
			"   }\n" +
			"}",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=159939
public void test1071() {
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"import java.util.*;\n" +
			"public class X {\n" +
			"        List<void[]> x = null;\n" +
			"        void[] y;\n" +
			"        void[] foo(void[] arg) {\n" +
			"                void[] local;\n" +
			"        }\n" +
			"}",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	List<void[]> x = null;\n" +
		"	     ^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 4)\n" +
		"	void[] y;\n" +
		"	^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 5)\n" +
		"	void[] foo(void[] arg) {\n" +
		"	^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 5)\n" +
		"	void[] foo(void[] arg) {\n" +
		"	           ^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"5. ERROR in X.java (at line 6)\n" +
		"	void[] local;\n" +
		"	^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=159939
public void test1072() {
	Map options = getCompilerOptions();
	options.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.IGNORE);
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"import java.util.*;\n" +
			"public class X {\n" +
			"        List<void[]> x = null;\n" +
			"        void[] y;\n" +
			"        void[] foo(void[] arg) {\n" +
			"                void[] local;\n" +
			"                Class c = void[].class;\n" +
			"        }\n" +
			"}",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	List<void[]> x = null;\n" +
		"	     ^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 4)\n" +
		"	void[] y;\n" +
		"	^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 5)\n" +
		"	void[] foo(void[] arg) {\n" +
		"	^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 5)\n" +
		"	void[] foo(void[] arg) {\n" +
		"	           ^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"5. ERROR in X.java (at line 6)\n" +
		"	void[] local;\n" +
		"	^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"6. ERROR in X.java (at line 7)\n" +
		"	Class c = void[].class;\n" +
		"	          ^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n",
		null,
		true,
		options);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=159939
public void test1073() {
	Map options = getCompilerOptions();
	options.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.IGNORE);
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"import java.util.*;\n" +
			"public class X {\n" +
			"        List<void[]> x = null;\n" +
			"        void[] y;\n" +
			"        void[] foo(void[] arg) {\n" +
			"                try {\n" +
			"                        void[] local;\n" +
			"                        Class c = void[].class;\n" +
			"                } catch(void[] e) {\n" +
			"                }\n" +
			"        }\n" +
			"}",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	List<void[]> x = null;\n" +
		"	     ^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 4)\n" +
		"	void[] y;\n" +
		"	^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 5)\n" +
		"	void[] foo(void[] arg) {\n" +
		"	^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 5)\n" +
		"	void[] foo(void[] arg) {\n" +
		"	           ^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"5. ERROR in X.java (at line 7)\n" +
		"	void[] local;\n" +
		"	^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"6. ERROR in X.java (at line 8)\n" +
		"	Class c = void[].class;\n" +
		"	          ^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"7. ERROR in X.java (at line 9)\n" +
		"	} catch(void[] e) {\n" +
		"	        ^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n",
		null,
		true,
		options);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=159939
public void test1074() {
	Map options = getCompilerOptions();
	options.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.IGNORE);
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"import java.util.*;\n" +
			"public class X {\n" +
			"        List<void[]> x = null;\n" +
			"        void[] y;\n" +
			"        void[] foo(void[] arg) {\n" +
			"                try {\n" +
			"                        void[] local = new void[0];\n" +
			"                        void[] local1 = new void[]{ null, null };\n" +
			"                        void[] local2 = { null, null };\n" +
			"                        System.out.println((void[]) null);\n" +
			"                        Class c = void[].class;\n" +
			"                } catch(void[] e) {\n" +
			"                }\n" +
			"        }\n" +
			"}",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	List<void[]> x = null;\n" +
		"	     ^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 4)\n" +
		"	void[] y;\n" +
		"	^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 5)\n" +
		"	void[] foo(void[] arg) {\n" +
		"	^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 5)\n" +
		"	void[] foo(void[] arg) {\n" +
		"	           ^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"5. ERROR in X.java (at line 7)\n" +
		"	void[] local = new void[0];\n" +
		"	^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"6. ERROR in X.java (at line 7)\n" +
		"	void[] local = new void[0];\n" +
		"	               ^^^^^^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"7. ERROR in X.java (at line 8)\n" +
		"	void[] local1 = new void[]{ null, null };\n" +
		"	^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"8. ERROR in X.java (at line 8)\n" +
		"	void[] local1 = new void[]{ null, null };\n" +
		"	                ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"9. ERROR in X.java (at line 9)\n" +
		"	void[] local2 = { null, null };\n" +
		"	^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"10. ERROR in X.java (at line 10)\n" +
		"	System.out.println((void[]) null);\n" +
		"	                    ^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"11. ERROR in X.java (at line 11)\n" +
		"	Class c = void[].class;\n" +
		"	          ^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"12. ERROR in X.java (at line 12)\n" +
		"	} catch(void[] e) {\n" +
		"	        ^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n",
		null,
		true,
		options);
}

//https://bugs.eclipse.org/bugs/show_bug.cgi?id=163680
public void test1075() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"public class X <T extends X<?>.J>{\n" +
			"	public class J implements I<T>{}\n" +
			"}\n",
			"I.java",
			"public interface I <T> {}\n",
			"Y.java",
			"public class Y extends X {}\n",
		},
		// runtime results
		"" /* expected output string */);
	runConformTest(
		// test directory preparation
		false /* do not flush output directory */,
		new String[] {
			"Y.java",
			"public class Y extends X {}",
		},
		// compiler results
		null /* do not check compiler log */,
		// runtime results
		"" /* expected output string */,
		"" /* expected error string */,
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}

// FAIL ERRMSG
public void test1076() {
	if (this.complianceLevel >= ClassFileConstants.JDK1_8)
		return;
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.List;\n" +
			"public class X {\n" +
			"	List<Thread> threads;\n" +
			"	void foo(String[] strings) {}\n" +
			"	void bar() {\n" +
			"		foo(this.threads.toArray(new String[this.threads.size()]));\n" +
			"		foo(myToArray(this.threads, new String[this.threads.size()]));\n" +
			"		foo(myToArray2(this.threads, new String[this.threads.size()]));\n" +
			"	}\n" +
			"	\n" +
			"	static <T, E> T[] myToArray(List<E> list, T[] a) {\n" +
			"		return list.toArray(a);\n" +
			"	}\n" +
			"	static <T, E extends T> T[] myToArray2(List<E> list, T[] a) {\n" +
			"		return list.toArray(a);\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 8)\n" +
		"	foo(myToArray2(this.threads, new String[this.threads.size()]));\n" +
		"	    ^^^^^^^^^^\n" +
		"Bound mismatch: The generic method myToArray2(List<E>, T[]) of type X is not applicable for the arguments (List<Thread>, String[]). The inferred type Thread is not a valid substitute for the bounded parameter <E extends T>\n" +
		"----------\n");
}
// check presence of field hiding warning
public void test1077() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	static class Y<T> {\n" +
			"		static int foo;\n" +
			"	}\n" +
			"	static class Z<U> extends Y<U> {\n" +
			"		int foo;\n" +
			"		{\n" +
			"			foo = 1;\n" +
			"		}\n" +
			"	}\n" +
			"	Zork z;\n" +
			"}\n" +
			"\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 6)\n" +
		"	int foo;\n" +
		"	    ^^^\n" +
		"The field X.Z<U>.foo is hiding a field from type X.Y<U>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 11)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=165143
public void test1078() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.List;\n" +
			"import java.util.Map;\n" +
			"\n" +
			"public class X \n" +
			"{\n" +
			"  public static void main(String[] args)\n" +
			"  {\n" +
			"    Object object = null;\n" +
			"\n" +
			"    List list = (List)object;//[1]\n" +
			"\n" +
			"    foo((List)object);//[2]\n" +
			"    foo((List<?>)object);//[3]\n" +
			"    foo((List<Object>)object);//[4]unchecked cast\n" +
			"    foo((List<? extends Object>)object);//[5]\n" +
			"\n" +
			"    foo((Map)object);//[6]\n" +
			"    foo((Map<?, ?>)object);//[7]\n" +
			"    foo((Map<Object, ?>)object);//[8]unchecked cast\n" +
			"    foo((Map<?, Object>)object);//[9]unchecked cast\n" +
			"    foo((Map<Object, Object>)object);//[10]unchecked cast\n" +
			"    foo((Map<? extends Object, Object>)object);//[11]unchecked cast\n" +
			"    foo((Map<? extends Object, ? extends Object>)object);//[12]\n" +
			"    Zork z;\n" +
			"  }\n" +
			"\n" +
			"  public static void foo(List<?> list) {\n" +
			"  }\n" +
			"\n" +
			"  public static void foo(Map<?, ?> map) {\n" +
			"  }\n" +
			"}", // =================,
		},
		// unchecked warnings on [4][5][8][9][10][11][12]
		"----------\n" +
		"1. WARNING in X.java (at line 10)\n" +
		"	List list = (List)object;//[1]\n" +
		"	^^^^\n" +
		"List is a raw type. References to generic type List<E> should be parameterized\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 10)\n" +
		"	List list = (List)object;//[1]\n" +
		"	             ^^^^\n" +
		"List is a raw type. References to generic type List<E> should be parameterized\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 12)\n" +
		"	foo((List)object);//[2]\n" +
		"	     ^^^^\n" +
		"List is a raw type. References to generic type List<E> should be parameterized\n" +
		"----------\n" +
		"4. WARNING in X.java (at line 14)\n" +
		"	foo((List<Object>)object);//[4]unchecked cast\n" +
		"	    ^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from Object to List<Object>\n" +
		"----------\n" +
		"5. WARNING in X.java (at line 15)\n" +
		"	foo((List<? extends Object>)object);//[5]\n" +
		"	    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from Object to List<? extends Object>\n" +
		"----------\n" +
		"6. WARNING in X.java (at line 17)\n" +
		"	foo((Map)object);//[6]\n" +
		"	     ^^^\n" +
		"Map is a raw type. References to generic type Map<K,V> should be parameterized\n" +
		"----------\n" +
		"7. WARNING in X.java (at line 19)\n" +
		"	foo((Map<Object, ?>)object);//[8]unchecked cast\n" +
		"	    ^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from Object to Map<Object,?>\n" +
		"----------\n" +
		"8. WARNING in X.java (at line 20)\n" +
		"	foo((Map<?, Object>)object);//[9]unchecked cast\n" +
		"	    ^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from Object to Map<?,Object>\n" +
		"----------\n" +
		"9. WARNING in X.java (at line 21)\n" +
		"	foo((Map<Object, Object>)object);//[10]unchecked cast\n" +
		"	    ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from Object to Map<Object,Object>\n" +
		"----------\n" +
		"10. WARNING in X.java (at line 22)\n" +
		"	foo((Map<? extends Object, Object>)object);//[11]unchecked cast\n" +
		"	    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from Object to Map<? extends Object,Object>\n" +
		"----------\n" +
		"11. WARNING in X.java (at line 23)\n" +
		"	foo((Map<? extends Object, ? extends Object>)object);//[12]\n" +
		"	    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from Object to Map<? extends Object,? extends Object>\n" +
		"----------\n" +
		"12. ERROR in X.java (at line 24)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=165143 - variation
public void test1079() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<E> {\n" +
			"    X<? extends String> bar(Object o) {\n" +
			"    	return (AX<? extends String>) o;\n" +
			"   	 Zork z;\n" +
			"    }\n" +
			"}\n" +
			"class AX<F> extends X<F> {}\n", // =================,
		},
		"----------\n" +
		"1. WARNING in X.java (at line 3)\n" +
		"	return (AX<? extends String>) o;\n" +
		"	       ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from Object to AX<? extends String>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 4)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=165143 - variation
public void test1080() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<E> {\n" +
			"	CX<E> foo(X<String> x) {\n" +
			"		return (CX<E>) x; // unchecked\n" +
			"	}\n" +
			"	BX bar(X<String> x) {\n" +
			"		return (BX) x;\n" +
			"	}\n" +
			"   Zork z;\n" +
			"}\n" +
			"class AX<F> extends X<F> {}\n" +
			"class BX extends AX<String> {}\n" +
			"class CX<G> extends AX<String> {}\n", // =================,
		},
		"----------\n" +
		"1. WARNING in X.java (at line 3)\n" +
		"	return (CX<E>) x; // unchecked\n" +
		"	       ^^^^^^^^^\n" +
		"Type safety: Unchecked cast from X<String> to CX<E>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 8)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=165143 - variation
public void test1081() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<E> {\n" +
			"	AX<Object> foo(X<String> x) {\n" +
			"		return (BX) x;\n" +
			"	}\n" +
			"}\n" +
			"class AX<F> extends X<F> {}\n" +
			"class BX extends AX<Object> {}\n", // =================,
		},
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	return (BX) x;\n" +
		"	       ^^^^^^\n" +
		"Cannot cast from X<String> to BX\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=165143 - variation
public void test1082() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<E> {\n" +
			"	CX<E> foo(X<String> x) {\n" +
			"		return (CX<E>) x; // unchecked\n" +
			"	}\n" +
			"   Zork z;\n" +
			"}\n" +
			"class AX<F> extends X<F> {}\n" +
			"class CX<G> extends AX {}\n", // =================,
		},
		"----------\n" +
		"1. WARNING in X.java (at line 3)\n" +
		"	return (CX<E>) x; // unchecked\n" +
		"	       ^^^^^^^^^\n" +
		"Type safety: Unchecked cast from X<String> to CX<E>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 5)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 8)\n" +
		"	class CX<G> extends AX {}\n" +
		"	                    ^^\n" +
		"AX is a raw type. References to generic type AX<F> should be parameterized\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=106451 - variation
public void test1083() {
	this.runNegativeTest(
		new String[] {
			"X.java", // =================
			"import java.io.Serializable;\n" +
			"import java.util.LinkedList;\n" +
			"\n" +
			"class SerializableList extends LinkedList<Serializable> {\n" +
			"	private static final long serialVersionUID = 1L; \n" +
			"}\n" +
			"public class X {\n" +
			"    @SuppressWarnings({\"nls\", \"unused\"})\n" +
			"    public static void main(String[] args) {\n" +
			"        LinkedList<String> linkedList= new LinkedList<String>();\n" +
			"        linkedList.add(\"Hello\");\n" +
			"        java.util.List<? extends Serializable> a = linkedList;\n" +
			"        java.util.List<String> b = (LinkedList<String>) a; // unchecked\n" +
			"        java.util.List<Integer> c = (LinkedList<Integer>) a; // unchecked\n" +
			"        java.util.List<Runtime> d = (LinkedList<Runtime>) a; // inconvertible / unchecked ?\n" +
			"        c.get(0).intValue(); // fails at run time\n" +
			"        d.get(0).gc(); // fails at run time\n" +
			"        Zork z;\n" +
			"    }\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. WARNING in X.java (at line 13)\n" +
		"	java.util.List<String> b = (LinkedList<String>) a; // unchecked\n" +
		"	                           ^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from List<capture#1-of ? extends Serializable> to LinkedList<String>\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 14)\n" +
		"	java.util.List<Integer> c = (LinkedList<Integer>) a; // unchecked\n" +
		"	                            ^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from List<capture#2-of ? extends Serializable> to LinkedList<Integer>\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 15)\n" +
		"	java.util.List<Runtime> d = (LinkedList<Runtime>) a; // inconvertible / unchecked ?\n" +
		"	                            ^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from List<capture#3-of ? extends Serializable> to LinkedList<Runtime>\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 18)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}

// https://bugs.eclipse.org/bugs/show_bug.cgi?id=158870
public void test1084() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"class Y<T> {\n" +
			"}\n" +
			"class Z<T> {\n" +
			"}\n" +
			"class X {\n" +
			"  void foo() {\n" +
			"    Z<Y<?>> l1 = null;\n" +
			"    Z<Y> l2 = (Z<Y>) l1;\n" +
			"  }\n" +
			"}",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 8)\n" +
		"	Z<Y> l2 = (Z<Y>) l1;\n" +
		"	  ^\n" +
		"Y is a raw type. References to generic type Y<T> should be parameterized\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 8)\n" +
		"	Z<Y> l2 = (Z<Y>) l1;\n" +
		"	          ^^^^^^^^^\n" +
		"Cannot cast from Z<Y<?>> to Z<Y>\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 8)\n" +
		"	Z<Y> l2 = (Z<Y>) l1;\n" +
		"	             ^\n" +
		"Y is a raw type. References to generic type Y<T> should be parameterized\n" +
		"----------\n");
}

//https://bugs.eclipse.org/bugs/show_bug.cgi?id=165291
public void test1085() {
	this.runNegativeTest(
		new String[] {
			"Y.java",
			"class Z {\n" +
			"        Z z1 = z1;\n" +
			"        Z[] z2 = z2;\n" +
			"}\n" +
			"public class Y<E> {\n" +
			"		E e0 = es[0];\n" +
			"		E e = e;\n" +
			"        E[] es = es;\n" +
			"		E e2 = e2.e;\n" +
			"}", // =================
		},
		"----------\n" + 
		"1. ERROR in Y.java (at line 2)\n" + 
		"	Z z1 = z1;\n" + 
		"	       ^^\n" + 
		"Cannot reference a field before it is defined\n" + 
		"----------\n" + 
		"2. ERROR in Y.java (at line 3)\n" + 
		"	Z[] z2 = z2;\n" + 
		"	         ^^\n" + 
		"Cannot reference a field before it is defined\n" + 
		"----------\n" + 
		"3. ERROR in Y.java (at line 6)\n" + 
		"	E e0 = es[0];\n" + 
		"	       ^^\n" + 
		"Cannot reference a field before it is defined\n" + 
		"----------\n" + 
		"4. ERROR in Y.java (at line 7)\n" + 
		"	E e = e;\n" + 
		"	      ^\n" + 
		"Cannot reference a field before it is defined\n" + 
		"----------\n" + 
		"5. ERROR in Y.java (at line 8)\n" + 
		"	E[] es = es;\n" + 
		"	         ^^\n" + 
		"Cannot reference a field before it is defined\n" + 
		"----------\n" + 
		"6. ERROR in Y.java (at line 9)\n" + 
		"	E e2 = e2.e;\n" + 
		"	       ^^\n" + 
		"Cannot reference a field before it is defined\n" + 
		"----------\n" + 
		"7. ERROR in Y.java (at line 9)\n" + 
		"	E e2 = e2.e;\n" + 
		"	          ^\n" + 
		"e cannot be resolved or is not a field\n" + 
		"----------\n");
}

//https://bugs.eclipse.org/bugs/show_bug.cgi?id=165645
public void test1086() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"interface IFoo { void foo(); }\n" +
			"interface IBar { void bar(); }\n" +
			"public class X<Bar extends IFoo> {\n" +
			"	class Bar implements IBar { public void bar(){} }\n" +
			"	void foo(Bar b) {\n" +
			"		b.foo(); // unbound (Bar is member type)\n" +
			"		b.bar(); // ok\n" +
			"	}\n" +
			"}\n", // =================,
		},
		"----------\n" +
		"1. ERROR in X.java (at line 6)\n" +
		"	b.foo(); // unbound (Bar is member type)\n" +
		"	  ^^^\n" +
		"The method foo() is undefined for the type X<Bar>.Bar\n" +
		"----------\n");
}

//https://bugs.eclipse.org/bugs/show_bug.cgi?id=165645 - variation
public void test1087() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"public class X<M> {\n" +
			"	static public class M {\n" +
			"	}\n" +
			"	static public class M2 extends M {\n" +
			"	}\n" +
			"}\n" +
			"\n", // =================
		},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_7 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=165679
public void test1088() {
	this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<M> {\n" +
				"	static public class M {}\n" +
				"	Zork z;\n" +
				"	void foo() {\n" +
				"		class M {} // hides member\n" +
				"	}\n" +
				"}\n" +
				"class Y <T> {\n" +
				"	class Local {}\n" +
				"	void foo() {\n" +
				"		class T {}; // hiding warning\n" +
				"		class Local {};\n" +
				"	}\n" +
				"	static void bar() {\n" +
				"		class T {}; // no hiding warning\n" +
				"		class Local {}; // no hiding warning\n" +
				"	}	\n" +
				"}\n", // =================
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 5)\n" +
			"	class M {} // hides member\n" +
			"	      ^\n" +
			"The type M is hiding the type X.M\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 11)\n" +
			"	class T {}; // hiding warning\n" +
			"	      ^\n" +
			"The nested type T is hiding the type parameter T of type Y<T>\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 12)\n" +
			"	class Local {};\n" +
			"	      ^^^^^\n" +
			"The type Local is hiding the type Y<T>.Local\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=165679 - variation
public void test1089() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	class U {}\n" +
			"	<T> void foo(T t) {\n" +
			"		class T {\n" +
			"			T t = t;\n" +
			"		}\n" +
			"		class U {\n" +
			"		}\n" +
			"	}\n" +
			"}\n" +
			"\n", // =================
		},
		"----------\n" +
		"1. WARNING in X.java (at line 4)\n" +
		"	class T {\n" +
		"	      ^\n" +
		"The nested type T is hiding the type parameter T of the generic method foo(T) of type X\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 5)\n" +
		"	T t = t;\n" +
		"	  ^\n" +
		"The field T.t is hiding another local variable defined in an enclosing scope\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 5)\n" +
		"	T t = t;\n" +
		"	      ^\n" +
		"Cannot reference a field before it is defined\n" +
		"----------\n" +
		"4. WARNING in X.java (at line 7)\n" +
		"	class U {\n" +
		"	      ^\n" +
		"The type U is hiding the type X.U\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=165679 - variation
public void _test1090() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X <T,U> {\n" +
			"	class T {} // warn hiding type parameter\n" +
			"	class U<U> {}// warn hiding type parameter+warn param hiding member type\n" +
			"	\n" +
			"	void foo() {\n" +
			"		class Local {\n" +
			"			class T {} // warn hiding type parameter\n" +
			"			class U<U> {}// warn hiding type parameter+warn param hiding member type\n" +
			"		}\n" +
			"	}\n" +
			"	static void bar() {\n" +
			"		class Local {\n" +
			"			class T {} // no warn\n" +
			"			class U<U> {} // no warn\n" +
			"		}\n" +
			"	}\n" +
			"}", // =================
		},
		"???");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=165909
public void test1091() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.Map;\n" +
			"\n" +
			"public class X {\n" +
			"	void foo() {\n" +
			"		  Object a = null;\n" +
			"		  Map.Entry<String, String> aa = (Map.Entry<String, String>)a;		\n" +
			"	}\n" +
			"	void bar() {\n" +
			"		  Number a = null;\n" +
			"		  Map.Entry<String, String> aa = (Map.Entry<String, String>)a;		\n" +
			"		  Zork z;\n" +
			"	}\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. WARNING in X.java (at line 6)\n" +
		"	Map.Entry<String, String> aa = (Map.Entry<String, String>)a;		\n" +
		"	                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from Object to Map.Entry<String,String>\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 10)\n" +
		"	Map.Entry<String, String> aa = (Map.Entry<String, String>)a;		\n" +
		"	                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from Number to Map.Entry<String,String>\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 11)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=166490
public void test1092() {
	Map customOptions = getCompilerOptions();
	customOptions.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.IGNORE);
	this.runConformTest(
		new String[] {
			"Class_01.java",
			"public interface Class_01<H extends Class_02<? extends Class_01>> extends\n" +
			"		Class_09<H> {\n" +
			"}",
			"Class_02.java",
			"public interface Class_02<E extends Class_01<? extends Class_02>> extends\n" +
			"		Class_10<E> {\n" +
			"}",
			"Class_03.java",
			"public abstract class Class_03<E extends Class_01<? super H>, H extends Class_02<? super E>, P extends Class_06<? extends Class_07>>\n" +
			"		extends Class_08<E, H, P> implements Class_05 {\n" +
			"}",
			"Class_04.java",
			"public interface Class_04 extends Class_06<Class_18>, Class_19{\n" +
			"}",
			"Class_05.java",
			"public interface Class_05{\n" +
			"}",
			"Class_06.java",
			"public interface Class_06<H extends Class_07<? extends Class_06>> extends\n" +
			"		Class_13<H, Class_12>, Class_17 {\n" +
			"}",
			"Class_07.java",
			"public interface Class_07<P extends Class_06<? extends Class_07>> extends\n" +
			"		Class_14<P, Class_12> {\n" +
			"}",
			"Class_08.java",
			"public abstract class Class_08<E extends Class_09<? super H>, H extends Class_10<? super E>, P extends Class_06<? extends Class_07>>\n" +
			"		extends Class_11<E, H, Class_12> implements Class_05 {\n" +
			"}",
			"Class_09.java",
			"public interface Class_09<H extends Class_10<? extends Class_09>> extends\n" +
			"		Class_13<H, Class_12>, Class_17 {\n" +
			"}",
			"Class_10.java",
			"public interface Class_10<E extends Class_09<? extends Class_10>> extends\n" +
			"		Class_14<E, Class_12> {\n" +
			"}",
			"Class_11.java",
			"public abstract class Class_11<E extends Class_13<? super H, O>, H extends Class_14<? super E, O>, O>\n" +
			"		extends Class_15<E, H, O> implements Class_05 {\n" +
			"}",
			"Class_12.java",
			"public final class Class_12 {\n" +
			"}",
			"Class_13.java",
			"public interface Class_13<H extends Class_14<?, O>, O>{\n" +
			"}",
			"Class_14.java",
			"public interface Class_14<E extends Class_13<?, O>, O>{\n" +
			"}",
			"Class_15.java",
			"public abstract class Class_15<E extends Class_13<? super H, O>, H extends Class_14<? super E, O>, O>\n" +
			"		extends Class_16 {\n" +
			"}",
			"Class_16.java",
			"public abstract class Class_16{\n" +
			"}",
			"Class_17.java",
			"public interface Class_17{\n" +
			"}",
			"Class_18.java",
			"public interface Class_18 extends Class_07<Class_04>{\n" +
			"}",
			"Class_19.java",
			"public interface Class_19{\n" +
			"}",
			"MyClass.java",
			"abstract class MyClass<E extends Class_01<? super H>, H extends Class_02<? super E>>\n" +
			"		extends Class_03<E, H, Class_04> implements Class_05 {\n" +
			"}"
		},
		"",
		null,
		true,
		null,
		customOptions,
		null);

	// incremental build
	this.runConformTest(
			new String[] {
					"Class_01.java",
					"public interface Class_01<H extends Class_02<? extends Class_01>> extends\n" +
					"		Class_09<H> {\n" +
					"}",
			},
			"",
			null,
			false,
			null,
			customOptions,
			null);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=156952
// invalid bug - regression test only
public void test1093() {
	Map customOptions = getCompilerOptions();
	customOptions.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.IGNORE);
	this.runNegativeTest(new String[] {
			"X.java",
			"public class X<T> {\n" +
			"  X<T> foo() {\n" +
			"    return this;\n" +
			"  }\n" +
			"  T bar(T p) {\n" +
			"    return p;\n" + "  }\n"	+
			"  public static void main (String args) {\n" +
			"    X<String> x1 = new X<String>();\n"	+
			"    System.out.println(x1.foo().bar(\"OK\"));\n" + // OK
			"    X x2 = new X<String>();\n"	+
			"    System.out.println(x2.foo().bar(\"OK\"));\n" + // KO: type safety issue
			"  }\n" +
			"}\n"
		},
		"----------\n" +
		"1. WARNING in X.java (at line 12)\n" +
		"	System.out.println(x2.foo().bar(\"OK\"));\n" +
		"	                   ^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: The method bar(Object) belongs to the raw type X. References to generic type X<T> should be parameterized\n" +
		"----------\n",
		null /* no extra class libraries */,
		true /* flush output directory */,
		customOptions,
		false /* do not generate output */,
		false /* do not show category */,
		false /* do not show warning token */,
		false  /* do not skip javac for this peculiar test */,
		false  /* do not perform statements recovery */);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=167268
public void test1094() {
	Map customOptions = getCompilerOptions();
	customOptions.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.IGNORE);
	this.runConformTest(
		new String[] {
			"Crazy.java",
			"public interface Crazy<O extends Other, T extends O> {}",
			"ExampleFactory.java",
			"public interface ExampleFactory {\n" +
			"	<O extends Other, T extends O> Crazy<O, T> createCrazy();\n" +
			"}",
			"Other.java",
			"public interface Other {}",
			"ExampleFactoryImpl.java",
			"public class ExampleFactoryImpl implements ExampleFactory {\n" +
			"	public <O extends Other, T extends O> Crazy<O, T> createCrazy() {\n" +
			"		return null;\n" +
			"	}\n" +
			"}"
		},
		"",
		null /* no extra class libraries */,
		true /* flush output directory */,
		null /* vm arguments*/,
		customOptions,
		null /* compiler requestor*/);
	this.runConformTest(
		new String[] {
			"ExampleFactoryImpl.java",
			"public class ExampleFactoryImpl implements ExampleFactory {\n" +
			"	public <O extends Other, T extends O> Crazy<O, T> createCrazy() {\n" +
			"		return null;\n" +
			"	}\n" +
			"}"
		},
		"",
		null /* no extra class libraries */,
		false /* flush output directory */,
		null /* vm arguments*/,
		customOptions,
		null /* compiler requestor*/);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=167952
//invalid bug - regression test only
public void test1095() {
	Map customOptions = getCompilerOptions();
	customOptions.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.IGNORE);
	customOptions.put(CompilerOptions.OPTION_ReportUncheckedTypeOperation, CompilerOptions.IGNORE);
	runNegativeTest(
	// test directory preparation
	true /* flush output directory */,
	new String[] { /* test files */
		"X.java",
		"import java.lang.reflect.Constructor;\n" +
		"\n" +
		"@interface Annot {\n" +
		"	String message() default \"\"; //$NON-NLS-1$\n" +
		"}\n" +
		"\n" +
		"public class X {\n" +
		"	X() {\n" +
		"	}\n" +
		"	public String getAnnotationValue(Constructor constructor){\n" +
		"		Annot annotation = constructor.getAnnotation(Annot.class);\n" +
		"		return (annotation != null) ? annotation.message() : null;\n" +
		"	}\n" +
		"}"
	},
	// compiler options
	null /* no class libraries */,
	customOptions /* custom options */,
	// compiler results
	"----------\n" + /* expected compiler log */
	"1. ERROR in X.java (at line 11)\n" +
	"	Annot annotation = constructor.getAnnotation(Annot.class);\n" +
	"	                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
	"Type mismatch: cannot convert from Annotation to Annot\n" +
	"----------\n",
	// javac options
	JavacTestOptions.JavacHasABug.JavacBug6400189 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=167952
//invalid bug - regression test only
public void test1096() {
	Map customOptions = getCompilerOptions();
	customOptions.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.IGNORE);
	customOptions.put(CompilerOptions.OPTION_ReportUncheckedTypeOperation, CompilerOptions.IGNORE);
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.lang.reflect.Constructor;\n" +
			"\n" +
			"@interface Annot {\n" +
			"	String message() default \"\"; //$NON-NLS-1$\n" +
			"}\n" +
			"\n" +
			"public class X {\n" +
			"	X() {\n" +
			"	}\n" +
			"	public String getAnnotationValue(Constructor<X> constructor){\n" +
			"		Annot annotation = constructor.getAnnotation(Annot.class);\n" +
			"		return (annotation != null) ? annotation.message() : null;\n" +
			"	}\n" +
			"}"
		},
		"",
		null /* no extra class libraries */,
		true /* flush output directory */,
		null,
		customOptions,
		null/* do not perform statements recovery */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=168232
public void _test1097() {
	runNegativeTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"public class X {\n" +
			"	String[] foo = new <Zork>String[] {};\n" +
			"}"
		},
		// compiler results
		"----------\n" + /* expected compiler log */
		"1. ERROR in X.java (at line 2)\n" +
		"	String[] foo = new <Zork>String[] {};\n" +
		"	               ^^^^^^^^^^^^^^^^^^\n" +
		"Syntax error on token(s), misplaced construct(s)\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 2)\n" +
		"	String[] foo = new <Zork>String[] {};\n" +
		"	                        ^\n" +
		"Syntax error on token \">\", , expected\n" +
		"----------\n",
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_7 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=152961
public void test1098() {
	String errMessage = isMinimumCompliant(ClassFileConstants.JDK11) ?
			"----------\n" +
			"1. ERROR in X.java (at line 9)\n" +
			"	class Y extends Zork {}\n" +
			"	                ^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n"
			:
			"----------\n" +
			"1. WARNING in X.java (at line 5)\n" +
			"	private class Y<T> extends A {\n" +
			"	              ^\n" +
			"Access to enclosing constructor X.A() is emulated by a synthetic accessor method\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 9)\n" +
			"	class Y extends Zork {}\n" +
			"	                ^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n";		
	this.runNegativeTest(new String[] {
			"X.java",
			"public class X { \n" +
			"   private class A {\n" +
			"    class B {}\n" +
			"  }\n" +
			"  private class Y<T> extends A {\n" +
			"  }\n" +
			"  Y<String>.B d = null;\n" +
			"}\n" +
			"class Y extends Zork {}\n"
		},
		errMessage);
}
public void test1099() {
	runConformTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			"public class X {\n" +
			"\n" +
			"    public class A {};\n" +
			"    public class B extends A {\n" +
			"    	@Override\n" +
			"    	public String toString() {\n" +
			"    		return \"SUCCESS\";\n" +
			"    	}\n" +
			"    }\n" +
			"\n" +
			"    public static void main(String[] args) {\n" +
			"        X x = new X();\n" +
			"        List<A> l = x.newList(x.new B());\n" +
			"		for (A a: l) {\n" +
			"			System.out.println(a);\n" +
			"		}\n" +
			"    }\n" +
			"\n" +
			"    public <U, V extends U> List<U> newList(V... values) {\n" +
			"        List<U> l = new ArrayList<U>();\n" +
			"        for (V v : values) {\n" +
			"            l.add(v);\n" +
			"        }\n" +
			"        return l;\n" +
			"    }\n" +
			"\n" +
			"}\n"
		},
		// compiler results
		this.complianceLevel < ClassFileConstants.JDK1_7 ? "" :
				"----------\n" + 
				"1. WARNING in X.java (at line 21)\n" + 
				"	public <U, V extends U> List<U> newList(V... values) {\n" + 
				"	                                             ^^^^^^\n" + 
				"Type safety: Potential heap pollution via varargs parameter values\n" + 
				"----------\n",
		// runtime results
		"SUCCESS" /* expected output string */,
		"" /* expected error string */,
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_7 /* javac test options */);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=170318
public void test1100() {
	this.runNegativeTest(new String[] {
			"X.java",
			"class X<T> {\n" +
			"}\n" +
			"class Y<T> {\n" +
			"  public void foo(final X<?> x) {\n" +
			"  }\n" +
			"}\n" +
			"class Z extends Y {\n" +
			"  public void foo(final X<?> x) {\n" +
			"    super.foo(x);\n" +
			"  }\n" +
			"}"
		},
		"----------\n" +
		"1. WARNING in X.java (at line 7)\n" +
		"	class Z extends Y {\n" +
		"	                ^\n" +
		"Y is a raw type. References to generic type Y<T> should be parameterized\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 8)\n" +
		"	public void foo(final X<?> x) {\n" +
		"	            ^^^^^^^^^^^^^^^^^\n" +
		"Name clash: The method foo(X<?>) of type Z has the same erasure as foo(X) of type Y but does not override it\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 9)\n" +
		"	super.foo(x);\n" +
		"	^^^^^^^^^^^^\n" +
		"Type safety: The method foo(X) belongs to the raw type Y. References to generic type Y<T> should be parameterized\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=172189
public void test1101() {
	this.runNegativeTest(new String[] {
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			"public final class X<A, B> {\n" +
			"    public A a;\n" +
			"    public B b;\n" +
			"    public X(A pa, B pb) {\n" +
			"        a = pa;\n" +
			"        b = pb;\n" +
			"    }\n" +
			"    public static <A, B> X<A, B> create(A pa, B pb) {\n" +
			"        return new X<A, B>(pa, pb);\n" +
			"    }\n" +
			"    public static void main(String[] args) {\n" +
			"        List<X<String, Object>> list = new ArrayList<X<String,Object>>();\n" +
			"        list.add(X.<?, Object>create(\"\", \"\"));\n" +
			"    }\n" +
			"}"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 15)\n" +
		"	list.add(X.<?, Object>create(\"\", \"\"));\n" +
		"	            ^\n" +
		"Wildcard is not allowed at this location\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=174434
public void test1102() {
	this.runNegativeTest(new String[] {
			"X.java",
			"public class X {\n" +
			"	<T> X(T t) {\n" +
			"	}\n" +
			"\n" +
			"	class A {\n" +
			"		<T> A(T t) {\n" +
			"		}\n" +
			"	}\n" +
			"\n" +
			"	public static void main(String[] args) {\n" +
			"		new<?> X(null);\n" +
			"	}\n" +
			"}"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 11)\n" +
		"	new<?> X(null);\n" +
		"	    ^\n" +
		"Wildcard is not allowed at this location\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=174434
public void test1103() {
	this.runNegativeTest(new String[] {
			"X.java",
			"public class X {\n" +
			"	<T> X(T t) {\n" +
			"	}\n" +
			"	X(int i) {\n" +
			"		<?>this(null);\n" +
			"	}\n" +
			"}"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	<?>this(null);\n" +
		"	 ^\n" +
		"Wildcard is not allowed at this location\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=174434
public void test1104() {
	this.runNegativeTest(new String[] {
			"X.java",
			"public class X {\n" +
			"	<T> X(T t) { }\n" +
			"	\n" +
			"	class A {\n" +
			"		<T> A(T t) { }\n" +
			"	}\n" +
			"\n" +
			"	public static void main(String[] args) {\n" +
			"		new X(null).new <?> A(null);\n" +
			"	}\n" +
			"}"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 9)\n" +
		"	new X(null).new <?> A(null);\n" +
		"	                 ^\n" +
		"Wildcard is not allowed at this location\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=174724
public void test1105() {
	Map customOptions = getCompilerOptions();
	customOptions.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.IGNORE);
	this.runNegativeTest(new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		Class foo = Class.<? extends Object>forName(Integer.class.getName());\n" +
			"	}\n" +
			"}"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	Class foo = Class.<? extends Object>forName(Integer.class.getName());\n" +
		"	                   ^^^^^^^^^^^^^^^^\n" +
		"Wildcard is not allowed at this location\n" +
		"----------\n",
		null,
		true,
		customOptions);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=174766
public void test1106() {
	runNegativeTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"public class X<T> {\n" +
			"	public class Y extends Exception {\n" +
			"     private static final long serialVersionUID = 1L;\n" +
			"	}\n" +
			"}"
		},
		// compiler results
		"----------\n" +  /* expected compiler log */
		"1. ERROR in X.java (at line 2)\n" +
		"	public class Y extends Exception {\n" +
		"	                       ^^^^^^^^^\n" +
		"The generic class X<T>.Y may not subclass java.lang.Throwable\n" +
		"----------\n",
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=172913
public void test1107() throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.ArrayList;\n" +
			"import java.util.Collection;\n" +
			"import java.util.HashMap;\n" +
			"import java.util.Iterator;\n" +
			"import java.util.List;\n" +
			"\n" +
			"public class X {\n" +
			"  private void processLocks(HashMap locksMap, Object key) {\n" +
			"    for (Iterator iter = locksMap.keySet().iterator(); iter.hasNext();) {\n" +
			"      Object call = iter.next();\n" +
			"      List locks = externLocks((Collection) locksMap.get(call), call);\n" +
			"      // ...\n" +
			"    }\n" +
			"  }\n" +
			"  private List externLocks(Collection locks, Object call) {\n" +
			"    List result = new ArrayList();\n" +
			"    // ..\n" +
			"    return result;\n" +
			"  }\n" +
			"}\n",
		},
		"");
	// ensure only one instance of: checkcast java.util.Collection
	String expectedOutput =
		"  // Method descriptor #15 (Ljava/util/HashMap;Ljava/lang/Object;)V\n" +
		"  // Stack: 3, Locals: 6\n" +
		"  private void processLocks(java.util.HashMap locksMap, java.lang.Object key);\n" +
		"     0  aload_1 [locksMap]\n" +
		"     1  invokevirtual java.util.HashMap.keySet() : java.util.Set [16]\n" +
		"     4  invokeinterface java.util.Set.iterator() : java.util.Iterator [22] [nargs: 1]\n" +
		"     9  astore_3 [iter]\n" +
		"    10  goto 38\n" +
		"    13  aload_3 [iter]\n" +
		"    14  invokeinterface java.util.Iterator.next() : java.lang.Object [28] [nargs: 1]\n" +
		"    19  astore 4 [call]\n" +
		"    21  aload_0 [this]\n" +
		"    22  aload_1 [locksMap]\n" +
		"    23  aload 4 [call]\n" +
		"    25  invokevirtual java.util.HashMap.get(java.lang.Object) : java.lang.Object [34]\n" +
		"    28  checkcast java.util.Collection [38]\n" +
		"    31  aload 4 [call]\n" +
		"    33  " +
		(isMinimumCompliant(ClassFileConstants.JDK11) ? "invokevirtual" : "invokespecial") +
		" X.externLocks(java.util.Collection, java.lang.Object) : java.util.List [40]\n" +
		"    36  astore 5\n" +
		"    38  aload_3 [iter]\n" +
		"    39  invokeinterface java.util.Iterator.hasNext() : boolean [44] [nargs: 1]\n" +
		"    44  ifne 13\n" +
		"    47  return\n" +
		"      Line numbers:\n" +
		"        [pc: 0, line: 9]\n" +
		"        [pc: 13, line: 10]\n" +
		"        [pc: 21, line: 11]\n" +
		"        [pc: 38, line: 9]\n" +
		"        [pc: 47, line: 14]\n" +
		"      Local variable table:\n" +
		"        [pc: 0, pc: 48] local: this index: 0 type: X\n" +
		"        [pc: 0, pc: 48] local: locksMap index: 1 type: java.util.HashMap\n" +
		"        [pc: 0, pc: 48] local: key index: 2 type: java.lang.Object\n" +
		"        [pc: 10, pc: 47] local: iter index: 3 type: java.util.Iterator\n" +
		"        [pc: 21, pc: 38] local: call index: 4 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 test1108() {
	this.runConformTest(
		new String[] {
			"X.java",
			"interface UnaryFunction <A, R, X extends Throwable> {\n" +
			"    public R invoke(A o) throws X;\n" +
			"}\n" +
			" \n" +
			"public class X implements UnaryFunction<String,Void,RuntimeException> {\n" +
			"    public Void invoke(String o) throws RuntimeException {\n" +
			"        return null;\n" +
			"    }\n" +
			"}\n", // =================
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=176591
//?: cuts assignment context
public void test1109() {
	String xSource =
			"class X {\n" +
			"  public Y<String> foo()\n" +
			"  {\n" +
			"    return true ? Z.bar() : null;\n" +
			"  }\n" +
			"}\n" +
			"class Y<T> {\n" +
			"}\n" +
			"class Z {\n" +
			"  static <U> Y<U> bar() {\n" +
			"    return null;\n" +
			"  }\n" +
			"}\n";
	if (this.complianceLevel < ClassFileConstants.JDK1_8) {
		this.runNegativeTest(
			new String[] {
				"X.java",
				xSource,
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	return true ? Z.bar() : null;\n" +
			"	       ^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Y<Object> to Y<String>\n" +
			"----------\n");	
	} else {
		runConformTest(
			new String[] {
				"X.java",
				xSource
			});
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=176591
//variant
public void test1110() {
	this.runConformTest(
		new String[] {
			"X.java",
			"class X {\n" +
			"  public Y<String> foo()\n" +
			"  {\n" +
			"    return true ? Z.<String>bar() : null;\n" +
			"  }\n" +
			"}\n" +
			"class Y<T> {\n" +
			"}\n" +
			"class Z {\n" +
			"  static <U> Y<U> bar() {\n" +
			"    return null;\n" +
			"  }\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=177194
public void test1111() {
	Map settings = getCompilerOptions();
	settings.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.OPTIMIZE_OUT);
	this.runConformTest(
		new String[] {
			"X.java",
			"class A<T> {\n" +
			"        public T foo(Object o) {\n" +
			"                return (T) o; // should get unchecked warning\n" +
			"        }\n" +
			"}\n" +
			"\n" +
			"public class X {\n" +
			"        public static void main(String[] args) {\n" +
			"                A<X> a = new A<X>();\n" +
			"                try {\n" +
			"	                X s = a.foo(new Object());\n" +
			"                } catch(ClassCastException e) {\n" +
			"                	System.out.println(\"SUCCESS\");\n" +
			"                	return;\n" +
			"                }\n" +
			"            	System.out.println(\"FAILED\");\n" +
			"        }\n" +
			"}\n", // =================
		},
		"SUCCESS",
		null,
		true,
		null,
		settings,
		null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=177194 - variation
public void test1112() {
	Map settings = getCompilerOptions();
	settings.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.OPTIMIZE_OUT);
	this.runConformTest(
		new String[] {
			"X.java",
			"class A<T> {\n" +
			"        public T foo;\n" +
			"}\n" +
			"\n" +
			"public class X {\n" +
			"        public static void main(String[] args) {\n" +
			"                A<X> a = new A<X>();\n" +
			"				 A ua = a;\n" +
			"				 ua.foo = new Object();\n" +
			"                try {\n" +
			"	                X s = a.foo;\n" +
			"                } catch(ClassCastException e) {\n" +
			"                	System.out.println(\"SUCCESS\");\n" +
			"                	return;\n" +
			"                }\n" +
			"            	System.out.println(\"FAILED\");\n" +
			"        }\n" +
			"}\n", // =================
		},
		"SUCCESS",
		null,
		true,
		null,
		settings,
		null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=177194 - variation
public void test1113() {
	Map settings = getCompilerOptions();
	settings.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.OPTIMIZE_OUT);
	this.runConformTest(
		new String[] {
			"X.java",
			"class A<T> {\n" +
			"        public T foo;\n" +
			"}\n" +
			"\n" +
			"public class X extends A<X>{\n" +
			"        public static void main(String[] args) {\n" +
			"			new X().foo();\n" +
			"		 }\n" +
			" 		 public void foo() {\n" +
			"				 A ua = this;\n" +
			"				 ua.foo = new Object();\n" +
			"                try {\n" +
			"	                X s = foo;\n" +
			"                } catch(ClassCastException e) {\n" +
			"                	System.out.println(\"SUCCESS\");\n" +
			"                	return;\n" +
			"                }\n" +
			"            	System.out.println(\"FAILED\");\n" +
			"        }\n" +
			"}\n", // =================
		},
		"SUCCESS",
		null,
		true,
		null,
		settings,
		null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=177194 - variation
public void test1114() {
	Map settings = getCompilerOptions();
	settings.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.OPTIMIZE_OUT);
	this.runConformTest(
		new String[] {
			"X.java",
			"class A<T> {\n" +
			"        public T foo;\n" +
			"}\n" +
			"\n" +
			"public class X extends A<X>{\n" +
			"        public static void main(String[] args) {\n" +
			"			new X().foo();\n" +
			"		 }\n" +
			" 		 public void foo() {\n" +
			"				 A ua = this;\n" +
			"				 ua.foo = new Object();\n" +
			"                try {\n" +
			"	                X s = this.foo;\n" +
			"                } catch(ClassCastException e) {\n" +
			"                	System.out.println(\"SUCCESS\");\n" +
			"                	return;\n" +
			"                }\n" +
			"            	System.out.println(\"FAILED\");\n" +
			"        }\n" +
			"}\n", // =================
		},
		"SUCCESS",
		null,
		true,
		null,
		settings,
		null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=177194 - variation
public void test1115() {
	Map settings = getCompilerOptions();
	settings.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.OPTIMIZE_OUT);
	this.runConformTest(
		new String[] {
			"X.java",
			"class A<T> {\n" +
			"        public T foo;\n" +
			"}\n" +
			"\n" +
			"public class X {\n" +
			"		 static X ROOT;\n" +
			"        public static void main(String[] args) {\n" +
			"                A<X> a = new A<X>();\n" +
			"				 A ua = a;\n" +
			"				 ua.foo = new Object();\n" +
			"                try {\n" +
			"	                X s = a.foo.ROOT;\n" +
			"                } catch(ClassCastException e) {\n" +
			"                	System.out.println(\"SUCCESS\");\n" +
			"                	return;\n" +
			"                }\n" +
			"            	System.out.println(\"FAILED\");\n" +
			"        }\n" +
			"}\n", // =================
		},
		"SUCCESS",
		null,
		true,
		null,
		settings,
		null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=177194 - variation
public void test1116() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.io.Serializable;\n" +
			"\n" +
			"interface I {\n" +
			"    int CONST = 1;\n" +
			"}\n" +
			"\n" +
			"class Z<T extends Serializable&I> {\n" +
			"    T c;\n" +
			"    Z(T c) {\n" +
			"        this.c = c;\n" +
			"    }\n" +
			"    int foo() {\n" +
			"        return c.CONST;\n" +
			"    }\n" +
			"}\n" +
			"\n" +
			"public class X implements Serializable, I {\n" +
			"    public static void main(String argv[]) {\n" +
			"        Z<X> z = new Z<X>(new X());\n" +
			"        Z rawz = z;\n" +
			"        rawz.c = new Serializable(){};\n" +
			"        try {\n" +
			"	        z.foo();\n" +
			"        } catch(ClassCastException e) {\n" +
			"        	System.out.println(\"SUCCESS\");\n" +
			"        }\n" +
			"    }\n" +
			"}\n", // =================
		},
		"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=177194 - variation
public void test1117() throws Exception {
	Map options = getCompilerOptions();
	options.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.OPTIMIZE_OUT);
	this.runConformTest(
		new String[] {
			"X.java",
			"interface I<T> {\n" +
			"	Value<String> CONST = null;\n" +
			"}\n" +
			"class Value<V> {\n" +
			"	String NAME = \"VALUE\";\n" +
			"}\n" +
			"class B<V> implements I<V> {\n" +
			"	B(Value<String> param) {\n" +
			"		Value<String> v0 = CONST;\n" +
			"		Value<String> v1 = this.CONST;\n" +
			"		String s2 = CONST.NAME;\n" +
			"		Value<String> v3 = I.CONST;\n" +
			"		Value<String> v4 = B.CONST;\n" +
			"	}\n" +
			"}\n" +
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		try {\n" +
			"			new B<String>(new Value<String>());\n" +
			"		} catch(NullPointerException e) {\n" +
			"			System.out.println(\"SUCCESS\");\n" +
			"		}\n" +
			"	}\n" +
			"}\n", // =================
		},
		"SUCCESS",
		null,
		false,
		null,
		options,
		null);
	// check the reference to I.CONST is generated as B.CONST, except for v3 still issuing I.CONST
	String expectedOutput =
		"  // Method descriptor #8 (LValue;)V\n" +
		"  // Signature: (LValue<Ljava/lang/String;>;)V\n" +
		"  // Stack: 1, Locals: 2\n" +
		"  B(Value param);\n" +
		"     0  aload_0 [this]\n" +
		"     1  invokespecial java.lang.Object() [12]\n" +
		"     4  getstatic B.CONST : Value [15]\n" +
		"     7  pop\n" +
		"     8  getstatic B.CONST : Value [15]\n" +
		"    11  pop\n" +
		"    12  getstatic B.CONST : Value [15]\n" +
		"    15  getfield Value.NAME : java.lang.String [19]\n" +
		"    18  pop\n" +
		"    19  getstatic I.CONST : Value [25]\n" +
		"    22  pop\n" +
		"    23  getstatic B.CONST : Value [15]\n" +
		"    26  pop\n" +
		"    27  return\n" +
		"      Line numbers:\n" +
		"        [pc: 0, line: 8]\n" +
		"        [pc: 4, line: 9]\n" +
		"        [pc: 8, line: 10]\n" +
		"        [pc: 12, line: 11]\n" +
		"        [pc: 19, line: 12]\n" +
		"        [pc: 23, line: 13]\n" +
		"        [pc: 27, line: 14]\n" +
		"      Local variable table:\n" +
		"        [pc: 0, pc: 28] local: this index: 0 type: B\n" +
		"        [pc: 0, pc: 28] local: param index: 1 type: Value\n" +
		"      Local variable type table:\n" +
		"        [pc: 0, pc: 28] local: this index: 0 type: B<V>\n" +
		"        [pc: 0, pc: 28] local: param index: 1 type: Value<java.lang.String>\n";

	File f = new File(OUTPUT_DIR + File.separator + "B.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=177715
public void test1118() {
	String source = "import java.util.List;\n" +
			"\n" +
			"public class X {\n" +
			"	X() {\n" +
			"		Class<? extends List<?>> cls = null;\n" +
			"		foo(cls);\n" +
			"	}\n" +
			"\n" +
			"	<I, T extends List<I>> T foo(Class<T> pClass) {\n" +
			"		return null;\n" +
			"	}\n" +
			"}\n";
	if (this.complianceLevel < ClassFileConstants.JDK1_8) {
		runConformTest(
				new String[] { "X.java", source },
				JavacTestOptions.EclipseHasABug.EclipseBug177715 /* javac test options */);
	} else {
		runNegativeTest(
			new String[] { "X.java", source },
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	foo(cls);\n" +
			"	^^^\n" +
			"The method foo(Class<T>) in the type X is not applicable for the arguments (Class<capture#1-of ? extends List<?>>)\n" + 
			"----------\n");
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=169728
public void test1119() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T extends Comparable<T> & Runnable> {\n" +
			"	T get() {\n" +
			"		return null;\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		\n" +
			"		X<OnlyRunnable> x1 = null; // error\n" +
			"		X<OnlyComparable> x2 = null; // error\n" +
			"		X<ComparableRunnable> x3 = null; // ok\n" +
			"		X<ComparableRunnableThrowable> x4 = null; // ok\n" +
			"		\n" +
			"		foo1(x1); // ok\n" +
			"		foo1(x2); // ok\n" +
			"		foo1(x3); // ok\n" +
			"		foo1(x4); // ok\n" +
			"\n" +
			"		foo2(x1); // error\n" +
			"		foo2(x2); // error\n" +
			"		foo2(x3); // error\n" +
			"		foo2(x4); // ok\n" +
			"	}\n" +
			"	\n" +
			"	static void foo1(X<?> x) {\n" +
			"		x.get().run(); // ok\n" +
			"		x.get().compareTo(null); // ok\n" +
			"		x.get().compareTo(x.get()); // error\n" +
			"	}\n" +
			"	static void foo2(X<? extends Throwable> x) {\n" +
			"		x.get().run(); // ok\n" +
			"		x.get().compareTo(null); // ok\n" +
			"		x.get().compareTo(x.get()); // error\n" +
			"	}	\n" +
			"}\n" +
			"\n" +
			"abstract class OnlyRunnable implements Runnable {}\n" +
			"abstract class OnlyComparable implements Comparable<OnlyComparable> {}\n" +
			"abstract class ComparableRunnable implements Comparable<ComparableRunnable>, Runnable {}\n" +
			"abstract class ComparableRunnableThrowable extends Throwable implements Comparable<ComparableRunnable>, Runnable {\n" +
			"	private static final long serialVersionUID = 1L;\n" +
			"}", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 7)\n" +
		"	X<OnlyRunnable> x1 = null; // error\n" +
		"	  ^^^^^^^^^^^^\n" +
		"Bound mismatch: The type OnlyRunnable is not a valid substitute for the bounded parameter <T extends Comparable<T> & Runnable> of the type X<T>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 8)\n" +
		"	X<OnlyComparable> x2 = null; // error\n" +
		"	  ^^^^^^^^^^^^^^\n" +
		"Bound mismatch: The type OnlyComparable is not a valid substitute for the bounded parameter <T extends Comparable<T> & Runnable> of the type X<T>\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 10)\n" +
		"	X<ComparableRunnableThrowable> x4 = null; // ok\n" +
		"	  ^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Bound mismatch: The type ComparableRunnableThrowable is not a valid substitute for the bounded parameter <T extends Comparable<T> & Runnable> of the type X<T>\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 17)\n" +
		"	foo2(x1); // error\n" +
		"	^^^^\n" +
		"The method foo2(X<? extends Throwable>) in the type X<T> is not applicable for the arguments (X<OnlyRunnable>)\n" +
		"----------\n" +
		"5. ERROR in X.java (at line 18)\n" +
		"	foo2(x2); // error\n" +
		"	^^^^\n" +
		"The method foo2(X<? extends Throwable>) in the type X<T> is not applicable for the arguments (X<OnlyComparable>)\n" +
		"----------\n" +
		"6. ERROR in X.java (at line 19)\n" +
		"	foo2(x3); // error\n" +
		"	^^^^\n" +
		"The method foo2(X<? extends Throwable>) in the type X<T> is not applicable for the arguments (X<ComparableRunnable>)\n" +
		"----------\n" +
		"7. ERROR in X.java (at line 26)\n" +
		"	x.get().compareTo(x.get()); // error\n" +
		"	        ^^^^^^^^^\n" +
		"The method compareTo(capture#3-of ?) in the type Comparable<capture#3-of ?> is not applicable for the arguments (capture#4-of ?)\n" +
		"----------\n" +
		"8. ERROR in X.java (at line 31)\n" +
		"	x.get().compareTo(x.get()); // error\n" +
		"	        ^^^^^^^^^\n" +
		"The method compareTo(capture#7-of ? extends Throwable) in the type Comparable<capture#7-of ? extends Throwable> is not applicable for the arguments (capture#8-of ? extends Throwable)\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=166963
public void test1120() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public X() {\n" +
			"		System.out.println();\n" +
			"		this(zork);\n" +
			"		Zork.this.this();\n" +
			"		<Zork>this();\n" +
			"	}\n" +
			"}", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	this(zork);\n" +
		"	^^^^^^^^^^^\n" +
		"Constructor call must be the first statement in a constructor\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 4)\n" +
		"	this(zork);\n" +
		"	     ^^^^\n" +
		"zork cannot be resolved to a variable\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 5)\n" +
		"	Zork.this.this();\n" +
		"	^^^^^^^^^^^^^^^^^\n" +
		"Constructor call must be the first statement in a constructor\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 5)\n" +
		"	Zork.this.this();\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" +
		"5. ERROR in X.java (at line 6)\n" +
		"	<Zork>this();\n" +
		"	 ^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" +
		"6. ERROR in X.java (at line 6)\n" +
		"	<Zork>this();\n" +
		"	      ^^^^^^^\n" +
		"Constructor call must be the first statement in a constructor\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=181270
public void test1121() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" +
			"	void foo() {\n" +
			"		System.out.println(T[].class);\n" +
			"	}\n" +
			"}", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	System.out.println(T[].class);\n" +
		"	                   ^^^^^^^^^\n" +
		"Illegal class literal for the type parameter T\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=181270
public void test1122() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	<T> void foo() {\n" +
			"		System.out.println(T[].class);\n" +
			"	}\n" +
			"}", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	System.out.println(T[].class);\n" +
		"	                   ^^^^^^^^^\n" +
		"Illegal class literal for the type parameter T\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=181270 - variation
public void test1123() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	void foo() {\n" +
			"		Class<Integer> c1 = int.class;\n" +
			"		Class<Integer> c2 = Integer.class;\n" +
			"		Class<Integer[]> c3 = int[].class;\n" +
			"		Class<int[]> c4 = int[].class;\n" +
			"		Class<Void> c5 = void.class;\n" +
			"		Class<void[]> c6 = void[].class;\n" +
			"	}\n" +
			"}", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	Class<Integer[]> c3 = int[].class;\n" +
		"	                      ^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from Class<int[]> to Class<Integer[]>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 8)\n" +
		"	Class<void[]> c6 = void[].class;\n" +
		"	      ^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 8)\n" +
		"	Class<void[]> c6 = void[].class;\n" +
		"	                   ^^^^^^\n" +
		"void[] is an invalid type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=182192
public void test1124() {
	String errMessage = isMinimumCompliant(ClassFileConstants.JDK11) ?
			"----------\n" +
			"1. WARNING in X.java (at line 13)\n" +
			"	public static class InnerClassThatShowsBug extends X {\n" +
			"	                                                   ^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 15)\n" +
			"	super(null);\n" +
			"	^^^^^^^^^^^^\n" +
			"Type safety: The constructor X(Object) belongs to the raw type X. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 19)\n" +
			"	for (Map.Entry<String, String> entry : myMap().entrySet()) {\n" +
			"	                                       ^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from element type Object to Map.Entry<String,String>\n" +
			"----------\n"
			:
			"----------\n" +
			"1. WARNING in X.java (at line 13)\n" +
			"	public static class InnerClassThatShowsBug extends X {\n" +
			"	                                                   ^\n" +
			"X is a raw type. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 15)\n" +
			"	super(null);\n" +
			"	^^^^^^^^^^^^\n" +
			"Type safety: The constructor X(Object) belongs to the raw type X. References to generic type X<T> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 15)\n" +
			"	super(null);\n" +
			"	^^^^^^^^^^^^\n" +
			"Access to enclosing constructor X<T>(T) is emulated by a synthetic accessor method\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 19)\n" +
			"	for (Map.Entry<String, String> entry : myMap().entrySet()) {\n" +
			"	                                       ^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from element type Object to Map.Entry<String,String>\n" +
			"----------\n";
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.HashMap;\n" +
			"import java.util.Map;\n" +
			"\n" +
			"public class X<T> {\n" +
			"\n" +
			"	static protected final Map<String, String> myMap = new HashMap<String, String>();\n" +
			"	private final T theGenericThing;\n" +
			"\n" +
			"	private X(T something) {\n" +
			"		this.theGenericThing = something;\n" +
			"	}\n" +
			"\n" +
			"	public static class InnerClassThatShowsBug extends X {\n" +
			"		public InnerClassThatShowsBug() {\n" +
			"			super(null);\n" +
			"		}\n" +
			"\n" +
			"		public void printMap() {\n" +
			"			for (Map.Entry<String, String> entry : myMap().entrySet()) {\n" +
			"				System.out.println(entry.getKey() + \" => \" + entry.getValue());\n" +
			"			}\n" +
			"		}\n" +
			"		protected Map<String, String> myMap2() {\n" +
			"			return myMap;\n" +
			"		}\n" +
			"		public void printMap2() {\n" +
			"			for (Map.Entry<String, String> entry : myMap2().entrySet()) {\n" +
			"				System.out.println(entry.getKey() + \" => \" + entry.getValue());\n" +
			"			}\n" +
			"		}\n" +
			"	}\n" +
			"\n" +
			"	protected Map<String, String> myMap() {\n" +
			"		return myMap;\n" +
			"	}\n" +
			"}", // =================
		}, errMessage);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=183216
public void test1125() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"class A {\n" +
			"    class B<T> {\n" +
			"        T t;\n" +
			"        T getValue() {\n" +
			"            return t;\n" +
			"        }\n" +
			"    }\n" +
			"}\n" +
			"\n" +
			"class C<T> extends A {\n" +
			"	Zork z;\n" +
			"}\n" +
			"\n" +
			"public class X {\n" +
			"    static C.B<Double> c = new C().new B<Double>();\n" +
			"\n" +
			"    public static void main(String[] args) {\n" +
			"        C.B<String> temp = new C().new B<String>();\n" +
			"        String s = temp.getValue();\n" +
			"        System.out.println(s);\n" +
			"        foo(bar());\n" +
			"    }\n" +
			"\n" +
			"    static C.B<? extends Number> bar() {\n" +
			"        return new C().new B<Integer>();\n" +
			"    }\n" +
			"\n" +
			"    static void foo(C.B<?> arg) {\n" +
			"        Object o = arg.getValue();\n" +
			"        Double d = c.getValue();\n" +
			"        System.out.println(o);\n" +
			"        System.out.println(d);\n" +
			"    }\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 11)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 15)\n" +
		"	static C.B<Double> c = new C().new B<Double>();\n" +
		"	                           ^\n" +
		"C is a raw type. References to generic type C<T> should be parameterized\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 18)\n" +
		"	C.B<String> temp = new C().new B<String>();\n" +
		"	                       ^\n" +
		"C is a raw type. References to generic type C<T> should be parameterized\n" +
		"----------\n" +
		"4. WARNING in X.java (at line 25)\n" +
		"	return new C().new B<Integer>();\n" +
		"	           ^\n" +
		"C is a raw type. References to generic type C<T> should be parameterized\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=183216 - variation
public void test1126() {
	this.runConformTest(
		new String[] {
			"X.java",
			"class A {\n" +
			"    class B<T> {\n" +
			"        T t;\n" +
			"        T getValue() {\n" +
			"            return t;\n" +
			"        }\n" +
			"    }\n" +
			"}\n" +
			"\n" +
			"public class X {\n" +
			"    static A.B<Double> c = new A().new B<Double>();\n" +
			"\n" +
			"    public static void main(String[] args) {\n" +
			"        A.B<String> temp = new A().new B<String>();\n" +
			"        String s = temp.getValue();\n" +
			"        System.out.print(s);\n" +
			"        foo(bar());\n" +
			"    }\n" +
			"\n" +
			"    static A.B<? extends Number> bar() {\n" +
			"        return new A().new B<Integer>();\n" +
			"    }\n" +
			"\n" +
			"    static void foo(A.B<?> arg) {\n" +
			"        Object o = arg.getValue();\n" +
			"        Double d = c.getValue();\n" +
			"        System.out.print(o);\n" +
			"        System.out.print(d);\n" +
			"    }\n" +
			"}\n", // =================
		},
		"nullnullnull");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=183216 - variation
public void test1127() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"class A<E> {\n" +
			"    class B<T> {\n" +
			"        T t;\n" +
			"        T getValue() {\n" +
			"            return t;\n" +
			"        }\n" +
			"    }\n" +
			"}\n" +
			"\n" +
			"class C<T> extends A<T> {\n" +
			"}\n" +
			"\n" +
			"public class X {\n" +
			"    static C.B<Double> c = new C().new B<Double>();\n" +
			"\n" +
			"    public static void main(String[] args) {\n" +
			"        C.B<String> temp = new C().new B<String>();\n" +
			"        String s = temp.getValue();\n" +
			"        System.out.println(s);\n" +
			"        foo(bar());\n" +
			"    }\n" +
			"\n" +
			"    static C.B<? extends Number> bar() {\n" +
			"        return new C().new B<Integer>();\n" +
			"    }\n" +
			"\n" +
			"    static void foo(C.B<?> arg) {\n" +
			"        Object o = arg.getValue();\n" +
			"        Double d = c.getValue();\n" +
			"        System.out.println(o);\n" +
			"        System.out.println(d);\n" +
			"    }\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 14)\n" +
		"	static C.B<Double> c = new C().new B<Double>();\n" +
		"	       ^^^\n" +
		"The member type A.B<Double> must be qualified with a parameterized type, since it is not static\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 14)\n" +
		"	static C.B<Double> c = new C().new B<Double>();\n" +
		"	                           ^\n" +
		"C is a raw type. References to generic type C<T> should be parameterized\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 14)\n" +
		"	static C.B<Double> c = new C().new B<Double>();\n" +
		"	                                   ^\n" +
		"The member type A.B<Double> must be qualified with a parameterized type, since it is not static\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 17)\n" +
		"	C.B<String> temp = new C().new B<String>();\n" +
		"	^^^\n" +
		"The member type A.B<String> must be qualified with a parameterized type, since it is not static\n" +
		"----------\n" +
		"5. WARNING in X.java (at line 17)\n" +
		"	C.B<String> temp = new C().new B<String>();\n" +
		"	                       ^\n" +
		"C is a raw type. References to generic type C<T> should be parameterized\n" +
		"----------\n" +
		"6. ERROR in X.java (at line 17)\n" +
		"	C.B<String> temp = new C().new B<String>();\n" +
		"	                               ^\n" +
		"The member type A.B<String> must be qualified with a parameterized type, since it is not static\n" +
		"----------\n" +
		"7. ERROR in X.java (at line 23)\n" +
		"	static C.B<? extends Number> bar() {\n" +
		"	       ^^^\n" +
		"The member type A.B<? extends Number> must be qualified with a parameterized type, since it is not static\n" +
		"----------\n" +
		"8. WARNING in X.java (at line 24)\n" +
		"	return new C().new B<Integer>();\n" +
		"	           ^\n" +
		"C is a raw type. References to generic type C<T> should be parameterized\n" +
		"----------\n" +
		"9. ERROR in X.java (at line 24)\n" +
		"	return new C().new B<Integer>();\n" +
		"	                   ^\n" +
		"The member type A.B<Integer> must be qualified with a parameterized type, since it is not static\n" +
		"----------\n" +
		"10. ERROR in X.java (at line 27)\n" +
		"	static void foo(C.B<?> arg) {\n" +
		"	                ^^^\n" +
		"The member type A.B<?> must be qualified with a parameterized type, since it is not static\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=183216 - variation
public void test1128() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"class A<T> {\n" +
			"	class Member<U> {}\n" +
			"}\n" +
			"\n" +
			"public class X extends A {\n" +
			"	void foo() {\n" +
			"		new Member<String>();\n" +
			"		new X().new Member<String>();\n" +
			"	}\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. WARNING in X.java (at line 5)\n" +
		"	public class X extends A {\n" +
		"	                       ^\n" +
		"A is a raw type. References to generic type A<T> should be parameterized\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 7)\n" +
		"	new Member<String>();\n" +
		"	    ^^^^^^\n" +
		"The member type A.Member<String> must be qualified with a parameterized type, since it is not static\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 8)\n" +
		"	new X().new Member<String>();\n" +
		"	            ^^^^^^\n" +
		"The member type A.Member<String> must be qualified with a parameterized type, since it is not static\n" +
		"----------\n");
}
public void test1129() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.io.Serializable;\n" +
			"\n" +
			"abstract class Arg1 implements Comparable<Arg1>, Serializable {\n" +
			"	private static final long serialVersionUID = 1L;\n" +
			"}\n" +
			"abstract class Arg2 implements Serializable, Comparable<Arg2> {\n" +
			"	private static final long serialVersionUID = 1L;\n" +
			"}\n" +
			"\n" +
			"interface IX<T> {}\n" +
			"\n" +
			"public class X {\n" +
			"	void foo1(boolean b, IX<String> arg2) {\n" +
			"		IX<String> o = b ? null : arg2;\n" +
			"		IX<String> o2 = b ? arg2 : null;\n" +
			"	}\n" +
			"	void foo2(boolean b, IX<String> arg1, IX<? extends Object> arg2) {\n" +
			"		String s = b ? arg1 : arg2;\n" +
			"	}\n" +
			"	void foo3(boolean b, Arg1 arg1, Arg2 arg2) {\n" +
			"		String s = b ? arg1 : arg2;\n" +
			"	}\n" +
			"}  ", // =================
		},
		this.complianceLevel < ClassFileConstants.JDK1_8 ?
		"----------\n" +
		"1. ERROR in X.java (at line 18)\n" +
		"	String s = b ? arg1 : arg2;\n" +
		"	           ^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from IX<capture#2-of ? extends Object> to String\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 21)\n" +
		"	String s = b ? arg1 : arg2;\n" +
		"	           ^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from Object&Comparable<?>&Serializable to String\n" +
		"----------\n" :
			"----------\n" + 
			"1. ERROR in X.java (at line 18)\n" + 
			"	String s = b ? arg1 : arg2;\n" + 
			"	               ^^^^\n" + 
			"Type mismatch: cannot convert from IX<String> to String\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 18)\n" + 
			"	String s = b ? arg1 : arg2;\n" + 
			"	                      ^^^^\n" + 
			"Type mismatch: cannot convert from IX<capture#1-of ? extends Object> to String\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 21)\n" + 
			"	String s = b ? arg1 : arg2;\n" + 
			"	               ^^^^\n" + 
			"Type mismatch: cannot convert from Arg1 to String\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 21)\n" + 
			"	String s = b ? arg1 : arg2;\n" + 
			"	                      ^^^^\n" + 
			"Type mismatch: cannot convert from Arg2 to String\n" + 
			"----------\n");
}
public void test1130() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.io.Serializable;\n" +
			"import java.util.List;\n" +
			"\n" +
			"interface IX<T extends Comparable<T>&Serializable> {}\n" +
			"\n" +
			"public class X<T extends Comparable<T>&Serializable> {\n" +
			"	void foo4(boolean b, List<? extends T> l1, List<? extends Comparable<T>> l2) {\n" +
			"		String s = b ? l1.get(0) : l2.get(0);\n" +
			"	}\n" +
			"}\n", // =================
		},
		this.complianceLevel < ClassFileConstants.JDK1_8 ? 
			"----------\n" +
			"1. ERROR in X.java (at line 8)\n" +
			"	String s = b ? l1.get(0) : l2.get(0);\n" +
			"	           ^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Comparable<T> to String\n" +
			"----------\n" :
				"----------\n" + 
				"1. ERROR in X.java (at line 8)\n" + 
				"	String s = b ? l1.get(0) : l2.get(0);\n" + 
				"	               ^^^^^^^^^\n" + 
				"Type mismatch: cannot convert from capture#1-of ? extends T to String\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 8)\n" + 
				"	String s = b ? l1.get(0) : l2.get(0);\n" + 
				"	                           ^^^^^^^^^\n" + 
				"Type mismatch: cannot convert from capture#2-of ? extends Comparable<T> to String\n" + 
				"----------\n");
}
public void test1131() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.io.Serializable;\n" +
			"import java.util.List;\n" +
			"\n" +
			"public class X<T extends Comparable<T>&Serializable> {\n" +
			"	<V extends T> void foo4(boolean b, List<? extends V> l1, List<? extends Comparable<V>> l2) {\n" +
			"		String s = b ? l1.get(0) : l2.get(0);\n" +
			"	}\n" +
			"} \n", // =================
		},
		this.complianceLevel < ClassFileConstants.JDK1_8 ? 
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	String s = b ? l1.get(0) : l2.get(0);\n" +
			"	           ^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Comparable<capture#3-of ? extends T> to String\n" +
			"----------\n" : 
				"----------\n" + 
				"1. ERROR in X.java (at line 6)\n" + 
				"	String s = b ? l1.get(0) : l2.get(0);\n" + 
				"	               ^^^^^^^^^\n" + 
				"Type mismatch: cannot convert from capture#1-of ? extends V to String\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 6)\n" + 
				"	String s = b ? l1.get(0) : l2.get(0);\n" + 
				"	                           ^^^^^^^^^\n" + 
				"Type mismatch: cannot convert from capture#2-of ? extends Comparable<V> to String\n" + 
				"----------\n");
}
public void test1132() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			"public class X<T> {\n" +
			"\n" +
			"	public void thisDoesntCompile() {\n" +
			"		X myThing = new X<Object>();\n" +
			"		Integer i = myThing.getList().get(0); // Type Mismatch error - Since\n" +
			"												// myThing is unbounded, return\n" +
			"												// type List<Integer> becomes unbounded\n" +
			"	}\n" +
			"\n" +
			"	public List<Integer> getList() {\n" +
			"		ArrayList<Integer> l = new ArrayList<Integer>();\n" +
			"		l.add(Integer.valueOf(0));\n" +
			"		return l;\n" +
			"	}\n" +
			"\n" +
			"	public void thisMethodCompilesOk() {\n" +
			"		X<Object> myThing = new X<Object>();\n" +
			"		Integer i = myThing.getList().get(0);\n" +
			"	}\n" +
			"\n" +
			"	public void thisMethodAlsoCompilesOk() {\n" +
			"		X myThing = new X<Object>();\n" +
			"		List<Integer> l = myThing.getList();\n" +
			"		Integer i = l.get(0);\n" +
			"	}\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. WARNING in X.java (at line 6)\n" +
		"	X myThing = new X<Object>();\n" +
		"	^\n" +
		"X is a raw type. References to generic type X<T> should be parameterized\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 7)\n" +
		"	Integer i = myThing.getList().get(0); // Type Mismatch error - Since\n" +
		"	            ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from Object to Integer\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 24)\n" +
		"	X myThing = new X<Object>();\n" +
		"	^\n" +
		"X is a raw type. References to generic type X<T> should be parameterized\n" +
		"----------\n" +
		"4. WARNING in X.java (at line 25)\n" +
		"	List<Integer> l = myThing.getList();\n" +
		"	                  ^^^^^^^^^^^^^^^^^\n" +
		"Type safety: The expression of type List needs unchecked conversion to conform to List<Integer>\n" +
		"----------\n");
}
public void test1133() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			"class Y {\n" +
			"	List<String> foo() { return null; }\n" +
			"}\n" +
			"\n" +
			"public class X<T> extends Y {\n" +
			"	List<String> bar() { return null; }\n" +
			"	\n" +
			"	void m(X x) {\n" +
			"		List<Object> l1 = x.foo();\n" +
			"		List<Object> l2 = x.bar();\n" +
			"	}\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. WARNING in X.java (at line 10)\n" +
		"	void m(X x) {\n" +
		"	       ^\n" +
		"X is a raw type. References to generic type X<T> should be parameterized\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 11)\n" +
		"	List<Object> l1 = x.foo();\n" +
		"	                  ^^^^^^^\n" +
		"Type mismatch: cannot convert from List<String> to List<Object>\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 12)\n" +
		"	List<Object> l2 = x.bar();\n" +
		"	                  ^^^^^^^\n" +
		"Type safety: The expression of type List needs unchecked conversion to conform to List<Object>\n" +
		"----------\n");
}
public void test1134() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			"class Y<U> {\n" +
			"	List<String> foo() { return null; }\n" +
			"}\n" +
			"\n" +
			"public class X<T> extends Y<T> {\n" +
			"	List<String> bar() { return null; }\n" +
			"	\n" +
			"	void m(X x) {\n" +
			"		List<Object> l1 = x.foo();\n" +
			"		List<Object> l2 = x.bar();\n" +
			"		Zork z;\n" +
			"	}\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. WARNING in X.java (at line 10)\n" +
		"	void m(X x) {\n" +
		"	       ^\n" +
		"X is a raw type. References to generic type X<T> should be parameterized\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 11)\n" +
		"	List<Object> l1 = x.foo();\n" +
		"	                  ^^^^^^^\n" +
		"Type safety: The expression of type List needs unchecked conversion to conform to List<Object>\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 12)\n" +
		"	List<Object> l2 = x.bar();\n" +
		"	                  ^^^^^^^\n" +
		"Type safety: The expression of type List needs unchecked conversion to conform to List<Object>\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 13)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=185422
public void test1135() {
	runNegativeTest(
		new String[] { /* test files */
			"X.java",
			"class Foo <T>{\n" +
			"    private T myT;\n" +
			"\n" +
			"    public T getT() {\n" +
			"        return myT;\n" +
			"    }\n" +
			"\n" +
			"    public void setT(T aT) {\n" +
			"        myT = aT;\n" +
			"    }\n" +
			"}\n" +
			"\n" +
			"public class X extends Foo<X.Baz> {\n" +
			"	X.Baz baz;\n" +
			"    public static void main(String[] args) {\n" +
			"        X myBar = new X();\n" +
			"        myBar.setT(new Baz());\n" +
			"        System.out.println(myBar.getT().toString());\n" +
			"    }\n" +
			"\n" +
			"    private static class Baz {\n" +
			"        @Override\n" +
			"        public String toString() {\n" +
			"            return \"Baz\";\n" +
			"        }\n" +
			"    }    \n" +
			"}\n", // =================
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 13)\n" + 
		"	public class X extends Foo<X.Baz> {\n" + 
		"	                           ^^^^^\n" + 
		"The type X.Baz is not visible\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=154029
public void test1136() {
	Map options = getCompilerOptions();
	options.put(JavaCore.COMPILER_PB_UNCHECKED_TYPE_OPERATION, JavaCore.IGNORE);
	String xSource =
			"import java.util.*;\n" +
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		List<Object>  l1 = Arrays.asList(1, \"X\");\n" +
			"		\n" +
			"		B<String> b = null;\n" +
			"		C<String>c = null;\n" +
			"		List<Object>  l2 = Arrays.asList(b, c);\n" +
			"	}\n" +
			"}\n" +
			"class A<T> {}\n" +
			"interface I {}\n" +
			"class B<T> extends A<T> implements I {}\n" +
			"class C<T> extends A<T> implements I {}\n";
	if (this.complianceLevel < ClassFileConstants.JDK1_8) {
		this.runNegativeTest(
			new String[] {
				"X.java",
				xSource,
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	List<Object>  l1 = Arrays.asList(1, \"X\");\n" +
			"	                   ^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from List<Object&"+ intersection("Comparable<?>") +"&Serializable> to List<Object>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 8)\n" +
			"	List<Object>  l2 = Arrays.asList(b, c);\n" +
			"	                   ^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from List<A<String>&I> to List<Object>\n" +
			"----------\n",
			null,
			true,
			options);
	} else {
		runConformTest(new String[] { "X.java", xSource }, options);
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=154267
public void test1137() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.awt.Container;\n" +
			"import java.util.Collection;\n" +
			"\n" +
			"abstract class Kollection<T extends Container> implements Collection<T> {}\n" +
			"abstract class Kontainer extends Container {\n" +
			"	private static final long serialVersionUID = 1L;\n" +
			"}\n" +
			"\n" +
			"public class X {\n" +
			"	private <T extends Container> Collection<T> foo() {\n" +
			"		return null;\n" +
			"	}\n" +
			"	private <T extends Container> Kollection<T> bar() {\n" +
			"		return null;\n" +
			"	}\n" +
			"\n" +
			"	private void showProblem() {\n" +
			"		Collection<?> result = foo();\n" +
			"		Collection<? extends Container> result1 = foo();\n" +
			"		\n" +
			"		Collection<?> result2 = (Collection<Container>)foo();\n" +
			"		String result3 = foo();\n" +
			"		String result4 = (String) foo();		\n" +
			"\n" +
			"		Kollection<?> result5 = bar();\n" +
			"		Kollection<? extends Kontainer> result6 = bar();\n" +
			"	}\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. WARNING in X.java (at line 21)\n" +
		"	Collection<?> result2 = (Collection<Container>)foo();\n" +
		"	                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Unnecessary cast from Collection<Container> to Collection<Container>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 22)\n" +
		"	String result3 = foo();\n" +
		"	                 ^^^^^\n" +
		"Type mismatch: cannot convert from Collection<Container> to String\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 23)\n" +
		"	String result4 = (String) foo();		\n" +
		"	                 ^^^^^^^^^^^^^^\n" +
		"Cannot cast from Collection<Container> to String\n" +
		"----------\n");
}
public void test1138() {
	// binary prerequisite
	this.runConformTest(
		new String[] {
			"p/E.java",
			"package p;\n" +
			"public enum E {\n" +
			"}\n", // =================
		},
		"");
	this.runConformTest(
			new String[] {
				"X.java",
				"import static p.E.*;\n" +
				"public class X implements java.io.Serializable {\n" +
				"}\n", // =================
			},
			"",
			null, // use default class-path
			false, // do not flush previous output dir content
			null); // no special vm args		);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=186833
public void test1139() {
	this.runNegativeTest(
		new String[] {
			"p/X.java",
			"package p;\n" +
			"import p.X.Super;\n" +
			"import static p.Top.*;\n" +
			"\n" +
			"class Top<T> {\n" +
			"	static class A<U> {}\n" +
			"}\n" +
			"\n" +
			"public class X extends Super<A<X>> {\n" +
			"	static class Super<T> extends Top<T>{\n" +
			"	}\n" +
			"}", // =================
		},
		"----------\n" +
		"1. ERROR in p\\X.java (at line 9)\n" +
		"	public class X extends Super<A<X>> {\n" +
		"	                       ^^^^^\n" +
		"Cycle detected: the type X cannot extend/implement itself or one of its own member types\n" +
		"----------\n"
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=186788
public void test1140() {
	this.runNegativeTest(
		new String[] {
			"p/X.java",
			"package p;\n" +
			"import static p.X.Super;\n" +
			"import static p.Top.*;\n" +
			"\n" +
			"class Top<T> {\n" +
			"        static class A<U> {}\n" +
			"}\n" +
			"\n" +
			"public class X extends Super<A<X>> {\n" +
			"        class Super<T> extends Top<T>{\n" +
			"        }\n" +
			"}", // =================
		},
		"----------\n" +
		"1. ERROR in p\\X.java (at line 2)\n" +
		"	import static p.X.Super;\n" +
		"	              ^^^^^^^^^\n" +
		"The import p.X.Super cannot be resolved\n" +
		"----------\n" +
		"2. ERROR in p\\X.java (at line 9)\n" +
		"	public class X extends Super<A<X>> {\n" +
		"	                       ^^^^^\n" +
		"Super cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=186833 - variation
public void test1141() {
	this.runNegativeTest(
		new String[] {
			"p/X.java",
			"package p;\n" +
			"import static p.Top.*;\n" +
			"\n" +
			"class Top<T> {\n" +
			"	static class A<U> {}\n" +
			"}\n" +
			"\n" +
			"public class X extends p.X.Super<A<X>> {\n" +
			"	static class Super<T> extends Top<T>{\n" +
			"	}\n" +
			"}", // =================
		},
		"----------\n" +
		"1. ERROR in p\\X.java (at line 8)\n" +
		"	public class X extends p.X.Super<A<X>> {\n" +
		"	                       ^^^^^^^^^\n" +
		"Cycle detected: the type X cannot extend/implement itself or one of its own member types\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=190945
public void test1142() {
	runNegativeTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"import java.util.Comparator;\n" +
			"import java.util.List;\n" +
			"public class X {\n" +
			"  public static <T> Comparator<T> compound(Comparator<? super T> a, Comparator<? super T> b) {\n" +
			"	  return compound(asList(a, b));\n" +
			"  }\n" +
			"\n" +
			"  public static <T> Comparator<T> compound(Iterable<? extends Comparator<? super T>> comparators) {\n" +
			"    return null;\n" +
			"  }\n" +
			"  public static <E> List<E> asList(E a, E b) {\n" +
			"    return null;\n" +
			"  }\n" +
			"}\n", // =================
		},
		// compiler results
		"----------\n" + /* expected compiler log */
		"1. ERROR in X.java (at line 5)\n" +
		"	return compound(asList(a, b));\n" +
		"	       ^^^^^^^^\n" +
		"The method compound(Iterable<? extends Comparator<? super T>>) in the type X is not applicable for the arguments (List<Comparator<? extends Object>>)\n" +
		"----------\n",
		// javac options
		JavacTestOptions.JavacHasABug.JavacBug6573446 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=190945 - variation
public void test1143() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.Comparator;\n" +
			"import java.util.List;\n" +
			"public class X {\n" +
			"  public static <T> Comparator<T> compound(Comparator<? super T> a, Comparator<? super T> b) {\n" +
			"	  int i = asList(a, b);\n" +
			"  }\n" +
			"\n" +
			"  public static <T> Comparator<T> compound(Iterable<? extends Comparator<? super T>> comparators) {\n" +
			"    return null;\n" +
			"  }\n" +
			"  public static <E> List<E> asList(E a, E b) {\n" +
			"    return null;\n" +
			"  }\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	int i = asList(a, b);\n" +
		"	        ^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from List<Comparator<? extends Object>> to int\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=190945 - variation
public void test1144() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.Comparator;\n" +
			"import java.util.List;\n" +
			"public class X {\n" +
			"  Iterable<Comparator<? extends Object>> itc1;\n" +
			"  Iterable<? extends Comparator<? super Object>> itc2 = itc1;\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	Iterable<? extends Comparator<? super Object>> itc2 = itc1;\n" +
		"	                                                      ^^^^\n" +
		"Type mismatch: cannot convert from Iterable<Comparator<? extends Object>> to Iterable<? extends Comparator<? super Object>>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=190945 - variation
public void test1145() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			"public class X {\n" +
			"	<T> Comparator<T> compound(Comparator<? super T> a, Comparator<? super T> b) {\n" +
			"		return compound(asList(a));\n" +
			"	}\n" +
			"	<T> Comparator<T> compound(Iterable<? extends Comparator<? super T>> c) {\n" +
			"		return null;\n" +
			"	}\n" +
			"	<E> List<E> asList(E a) {\n" +
			"		return null;\n" +
			"	}\n" +
			"}\n", // =================
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=190945 - variation
public void test1146() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"public class X {\n" +
			"	public static <T> Comparator<T> compound(\n" +
			"			Comparator<? super T> a,\n" +
			"			Comparator<? super T> b, \n" +
			"			Comparator<? super T>... rest) {\n" +
			"		int i = asList(a, b, rest);\n" +
			"		int j = asList2(a, b);\n" +
			"		return compound(asList(a, b, rest));\n" +
			"	}\n" +
			"	public static <U> Comparator<U> compound(Iterable<? extends Comparator<? super U>> comparators) {\n" +
			"		return null;\n" +
			"	}\n" +
			"	public static <E> List<E> asList(E a, E b, E... rest) {\n" +
			"		return null;\n" +
			"	}\n" +
			"	public static <E> List<E> asList2(E a, E b) {\n" +
			"		return null;\n" +
			"	}	\n" +
			"}\n", // =================
		},
		this.complianceLevel < ClassFileConstants.JDK1_7 ?
		"----------\n" +
		"1. ERROR in X.java (at line 7)\n" +
		"	int i = asList(a, b, rest);\n" +
		"	        ^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from List<Comparator<?>> to int\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 8)\n" +
		"	int j = asList2(a, b);\n" +
		"	        ^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from List<Comparator<? extends Object>> to int\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 9)\n" +
		"	return compound(asList(a, b, rest));\n" +
		"	       ^^^^^^^^\n" +
		"The method compound(Iterable<? extends Comparator<? super U>>) in the type X is not applicable for the arguments (List<Comparator<?>>)\n" +
		"----------\n":
		(this.complianceLevel == ClassFileConstants.JDK1_7 ?
			"----------\n" + 
			"1. WARNING in X.java (at line 6)\n" + 
			"	Comparator<? super T>... rest) {\n" + 
			"	                         ^^^^\n" + 
			"Type safety: Potential heap pollution via varargs parameter rest\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 7)\n" + 
			"	int i = asList(a, b, rest);\n" + 
			"	        ^^^^^^^^^^^^^^^^^^\n" + 
			"Type mismatch: cannot convert from List<Comparator<?>> to int\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 8)\n" + 
			"	int j = asList2(a, b);\n" + 
			"	        ^^^^^^^^^^^^^\n" + 
			"Type mismatch: cannot convert from List<Comparator<? extends Object>> to int\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 9)\n" + 
			"	return compound(asList(a, b, rest));\n" + 
			"	       ^^^^^^^^\n" + 
			"The method compound(Iterable<? extends Comparator<? super U>>) in the type X is not applicable for the arguments (List<Comparator<?>>)\n" + 
			"----------\n" + 
			"5. WARNING in X.java (at line 14)\n" + 
			"	public static <E> List<E> asList(E a, E b, E... rest) {\n" + 
			"	                                                ^^^^\n" + 
			"Type safety: Potential heap pollution via varargs parameter rest\n" + 
			"----------\n"
			: // 1.8 : one fewer error due to better type inference:
			"----------\n" + 
			"1. WARNING in X.java (at line 6)\n" + 
			"	Comparator<? super T>... rest) {\n" + 
			"	                         ^^^^\n" + 
			"Type safety: Potential heap pollution via varargs parameter rest\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 7)\n" + 
			"	int i = asList(a, b, rest);\n" + 
			"	        ^^^^^^^^^^^^^^^^^^\n" + 
			"Type mismatch: cannot convert from List<Comparator<? super T>> to int\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 8)\n" + 
			"	int j = asList2(a, b);\n" + 
			"	        ^^^^^^^^^^^^^\n" + 
			"Type mismatch: cannot convert from List<Comparator<? extends Object>> to int\n" + 
			"----------\n" + 
			"4. WARNING in X.java (at line 14)\n" + 
			"	public static <E> List<E> asList(E a, E b, E... rest) {\n" + 
			"	                                                ^^^^\n" + 
			"Type safety: Potential heap pollution via varargs parameter rest\n" + 
			"----------\n"));
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=190945 - variation
public void test1147() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"public class X {\n" +
			"	void foo(Comparator<? super X> cx, Comparator<? super X>[] cxs) {\n" +
			"		int i = cx;\n" +
			"		int j = cxs;\n" +
			"		int k = cxs[0];\n" +
			"		int l = asList2(cxs[0], cxs[1]);\n" +
			"	}\n" +
			"	public static <E> List<E> asList2(E a, E b) {\n" +
			"		return null;\n" +
			"	}	\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	int i = cx;\n" +
		"	        ^^\n" +
		"Type mismatch: cannot convert from Comparator<capture#1-of ? super X> to int\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 5)\n" +
		"	int j = cxs;\n" +
		"	        ^^^\n" +
		"Type mismatch: cannot convert from Comparator<? super X>[] to int\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 6)\n" +
		"	int k = cxs[0];\n" +
		"	        ^^^^^^\n" +
		"Type mismatch: cannot convert from Comparator<capture#2-of ? super X> to int\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 7)\n" +
		"	int l = asList2(cxs[0], cxs[1]);\n" +
		"	        ^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from List<Comparator<? extends Object>> to int\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=190945 - variation
// FAIL ERRMSG
public void test1148() {
	if (this.complianceLevel >= ClassFileConstants.JDK1_8)
		return;
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"public class X {\n" +
			"	public static <T> Comparator<T> compound(Comparator<? super T> a, Comparator<? super T> b, Comparator<? super T>... rest) {\n" +
			"		int i = asList(a, b, rest);\n" +
			"		int j = compound(asList(a, b, rest));\n" +
			"		compound(asList(a, b, rest));\n" +
			"		if (true) return compound(asList(a, b, rest));\n" +
			"		\n" +
			"		List<Comparator<?>> c = null;\n" +
			"		compound(c);\n" +
			"		return compound(c);\n" +
			"	}\n" +
			"	public static <U> Comparator<U> compound(Iterable<? extends Comparator<? super U>> comparators) {\n" +
			"		return null;\n" +
			"	}\n" +
			"	public static <E> List<E> asList(E a, E b, E... rest) {\n" +
			"		return null;\n" +
			"	}\n" +
			"}\n", // =================
		},
		this.complianceLevel < ClassFileConstants.JDK1_7 ?
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	int i = asList(a, b, rest);\n" +
		"	        ^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from List<Comparator<?>> to int\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 5)\n" +
		"	int j = compound(asList(a, b, rest));\n" +
		"	        ^^^^^^^^\n" +
		"The method compound(Iterable<? extends Comparator<? super U>>) in the type X is not applicable for the arguments (List<Comparator<?>>)\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 6)\n" +
		"	compound(asList(a, b, rest));\n" +
		"	^^^^^^^^\n" +
		"The method compound(Iterable<? extends Comparator<? super U>>) in the type X is not applicable for the arguments (List<Comparator<?>>)\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 7)\n" +
		"	if (true) return compound(asList(a, b, rest));\n" +
		"	                 ^^^^^^^^\n" +
		"The method compound(Iterable<? extends Comparator<? super U>>) in the type X is not applicable for the arguments (List<Comparator<?>>)\n" +
		"----------\n" +
		"5. ERROR in X.java (at line 10)\n" +
		"	compound(c);\n" +
		"	^^^^^^^^\n" +
		"The method compound(Iterable<? extends Comparator<? super U>>) in the type X is not applicable for the arguments (List<Comparator<?>>)\n" +
		"----------\n" +
		"6. ERROR in X.java (at line 11)\n" +
		"	return compound(c);\n" +
		"	       ^^^^^^^^\n" +
		"The method compound(Iterable<? extends Comparator<? super U>>) in the type X is not applicable for the arguments (List<Comparator<?>>)\n" +
		"----------\n":
		this.complianceLevel == ClassFileConstants.JDK1_7 ?
			"----------\n" + 
			"1. WARNING in X.java (at line 3)\n" + 
			"	public static <T> Comparator<T> compound(Comparator<? super T> a, Comparator<? super T> b, Comparator<? super T>... rest) {\n" + 
			"	                                                                                                                    ^^^^\n" + 
			"Type safety: Potential heap pollution via varargs parameter rest\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 4)\n" + 
			"	int i = asList(a, b, rest);\n" + 
			"	        ^^^^^^^^^^^^^^^^^^\n" + 
			"Type mismatch: cannot convert from List<Comparator<?>> to int\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 5)\n" + 
			"	int j = compound(asList(a, b, rest));\n" + 
			"	        ^^^^^^^^\n" + 
			"The method compound(Iterable<? extends Comparator<? super U>>) in the type X is not applicable for the arguments (List<Comparator<?>>)\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 6)\n" + 
			"	compound(asList(a, b, rest));\n" + 
			"	^^^^^^^^\n" + 
			"The method compound(Iterable<? extends Comparator<? super U>>) in the type X is not applicable for the arguments (List<Comparator<?>>)\n" + 
			"----------\n" + 
			"5. ERROR in X.java (at line 7)\n" + 
			"	if (true) return compound(asList(a, b, rest));\n" + 
			"	                 ^^^^^^^^\n" + 
			"The method compound(Iterable<? extends Comparator<? super U>>) in the type X is not applicable for the arguments (List<Comparator<?>>)\n" + 
			"----------\n" + 
			"6. ERROR in X.java (at line 10)\n" + 
			"	compound(c);\n" + 
			"	^^^^^^^^\n" + 
			"The method compound(Iterable<? extends Comparator<? super U>>) in the type X is not applicable for the arguments (List<Comparator<?>>)\n" + 
			"----------\n" + 
			"7. ERROR in X.java (at line 11)\n" + 
			"	return compound(c);\n" + 
			"	       ^^^^^^^^\n" + 
			"The method compound(Iterable<? extends Comparator<? super U>>) in the type X is not applicable for the arguments (List<Comparator<?>>)\n" + 
			"----------\n" + 
			"8. WARNING in X.java (at line 16)\n" + 
			"	public static <E> List<E> asList(E a, E b, E... rest) {\n" + 
			"	                                                ^^^^\n" + 
			"Type safety: Potential heap pollution via varargs parameter rest\n" + 
			"----------\n"
		: // fewer errors in 1.8+:
			"----------\n" + 
			"1. WARNING in X.java (at line 3)\n" + 
			"	public static <T> Comparator<T> compound(Comparator<? super T> a, Comparator<? super T> b, Comparator<? super T>... rest) {\n" + 
			"	                                                                                                                    ^^^^\n" + 
			"Type safety: Potential heap pollution via varargs parameter rest\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 4)\n" + 
			"	int i = asList(a, b, rest);\n" + 
			"	        ^^^^^^^^^^^^^^^^^^\n" + 
			"Type mismatch: cannot convert from List<Comparator<?>> to int\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 5)\n" + 
			"	int j = compound(asList(a, b, rest));\n" + 
			"	        ^^^^^^^^\n" + 
			"The method compound(Iterable<? extends Comparator<? super U>>) in the type X is not applicable for the arguments (List<Comparator<?>>)\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 10)\n" + 
			"	compound(c);\n" + 
			"	^^^^^^^^\n" + 
			"The method compound(Iterable<? extends Comparator<? super U>>) in the type X is not applicable for the arguments (List<Comparator<?>>)\n" + 
			"----------\n" + 
			"5. ERROR in X.java (at line 11)\n" + 
			"	return compound(c);\n" + 
			"	       ^^^^^^^^\n" + 
			"The method compound(Iterable<? extends Comparator<? super U>>) in the type X is not applicable for the arguments (List<Comparator<?>>)\n" + 
			"----------\n" + 
			"6. WARNING in X.java (at line 16)\n" + 
			"	public static <E> List<E> asList(E a, E b, E... rest) {\n" + 
			"	                                                ^^^^\n" + 
			"Type safety: Potential heap pollution via varargs parameter rest\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=198051
public void test1149() {
	String bSource =
		"public class B {\n" +
		"    	void b() throws ClassNotFoundException {\n" +
		"	    new<ClassNotFoundException> A();\n" +
		"    }\n" +
		"}\n";
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"A.java",
			"public class A {\n" +
			"    <T extends Throwable> A() throws T {}\n" +
			"    void a() throws ClassNotFoundException {\n" +
			"	    new<ClassNotFoundException> A();\n" +
			"    }\n" +
			"}\n",
			"B.java",
			bSource
		},
		// javac options
		JavacTestOptions.EclipseJustification.EclipseBug234815 /* javac test options */);
	runConformTest(
		// test directory preparation
		false /* do not flush output directory */,
		new String[] { /* test files */
			"B.java",
			bSource
		},
		// compiler results
		"" /* expected compiler log */,
		// runtime results
		"" /* expected output string */,
		"" /* expected error string */,
		// javac options
		JavacTestOptions.EclipseJustification.EclipseBug234815 /* javac test options */);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=234815 (invalid)
public void test1149b() {
	runConformTest(
		new String[] {
			"A.java",
			"public class A {\n" +
			"    <T extends Throwable> void foo() throws T {}\n" +
			"    void a() throws ClassNotFoundException {\n" +
			"	   new A().<ClassNotFoundException>foo();\n" +
			"    }\n" +
			"}\n",
		},
		""
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=189158
public void test1150() throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.lang.ref.Reference;\n"+
			"public class X<T> {\n" +
			"	static class Rather {\n" +
			"		static class Deeply {\n" +
			"			static class Inside {\n" +
			"			}\n" +
			"		}\n" +
			"	}\n" +
			"	Reference<X.Rather.Deeply> x;\n" +
			"	Reference<X.Rather> y;	\n" +
			"	Reference<X.Rather.Deeply.Inside> z;	\n" +
			"\n" +
			"	public static void main(String[] args) throws Exception {\n" +
			"		System.out.print(X.class.getDeclaredField(\"x\").getGenericType());\n" +
			"		System.out.print(\"##\");\n" +
			"		System.out.print(X.class.getDeclaredField(\"y\").getGenericType());\n" +
			"		System.out.print(\"##\");\n" +
			"		System.out.print(X.class.getDeclaredField(\"z\").getGenericType());\n" +
			"		System.out.println();\n" +
			"	}\n" +
			"}\n"
		},
		"java.lang.ref.Reference<X$Rather$Deeply>##java.lang.ref.Reference<X$Rather>##java.lang.ref.Reference<X$Rather$Deeply$Inside>"
	);
	String expectedOutput =
		"  // Field descriptor #6 Ljava/lang/ref/Reference;\n" +
		"  // Signature: Ljava/lang/ref/Reference<LX$Rather$Deeply;>;\n" +
		"  java.lang.ref.Reference x;\n" +
		"  \n" +
		"  // Field descriptor #6 Ljava/lang/ref/Reference;\n" +
		"  // Signature: Ljava/lang/ref/Reference<LX$Rather;>;\n" +
		"  java.lang.ref.Reference y;\n" +
		"  \n" +
		"  // Field descriptor #6 Ljava/lang/ref/Reference;\n" +
		"  // Signature: Ljava/lang/ref/Reference<LX$Rather$Deeply$Inside;>;\n" +
		"  java.lang.ref.Reference z;\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=189158 - variation
public void test1151() throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.lang.ref.Reference;\n"+
			"public class X<T> {\n" +
			"	class Other<U> {\n" +
			"		class Deeply {\n" +
			"			class Inside<V> {\n" +
			"			}			\n" +
			"		}\n" +
			"	}\n" +
			"	Reference<X<String>.Other<Thread>.Deeply> t;\n" +
			"	Reference<X<String>.Other<Thread>.Deeply.Inside<Number>> u;\n" +
			"\n" +
			"	public static void main(String[] args) throws Exception {\n" +
			"		System.out.print(X.class.getDeclaredField(\"t\").getGenericType());\n" +
			"		//System.out.print(\"##\");\n" +
			"		//System.out.print(X.class.getDeclaredField(\"u\").getGenericType());\n" + // TODO disabled due to bug in libs (unable to re-read the generated signature)
			"		System.out.println();\n" +
			"	}\n" +
			"}\n"
		},
		//"java.lang.ref.Reference<X<java.lang.String>.Other<java.lang.Thread>.Deeply>##java.lang.ref.Reference<X<java.lang.String>.Other<java.lang.Thread>.Deeply$Inside<java.lang.Number>>"
		(reflectNestedClassUseDollar 
		? "java.lang.ref.Reference<X<java.lang.String>$Other<java.lang.Thread>$Deeply>"
		: "java.lang.ref.Reference<X<java.lang.String>.Other<java.lang.Thread>.Deeply>")
	);
	String expectedOutput =
		"  // Field descriptor #6 Ljava/lang/ref/Reference;\n" +
		"  // Signature: Ljava/lang/ref/Reference<LX<Ljava/lang/String;>.Other<Ljava/lang/Thread;>.Deeply;>;\n" +
		"  java.lang.ref.Reference t;\n" +
		"  \n" +
		"  // Field descriptor #6 Ljava/lang/ref/Reference;\n" +
		"  // Signature: Ljava/lang/ref/Reference<LX<Ljava/lang/String;>.Other<Ljava/lang/Thread;>.Deeply.Inside<Ljava/lang/Number;>;>;\n" +
		"  java.lang.ref.Reference u;\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=189158 - variation
public void test1152() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.lang.ref.Reference;\n"+
			"public class X<T> {\n" +
			"	class Other<U> {\n" +
			"		class Deeply {\n" +
			"			class Inside<V> {\n" +
			"			}			\n" +
			"		}\n" +
			"	}\n" +
			"	Reference<X<String>.Other<Thread>.Deeply.Inside> u;\n" +
			"\n" +
			"	public static void main(String[] args) throws Exception {\n" +
			"		System.out.print(X.class.getDeclaredField(\"u\").getGenericType());\n" +
			"		System.out.println();\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 9)\n" +
		"	Reference<X<String>.Other<Thread>.Deeply.Inside> u;\n" +
		"	          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"The member type X<String>.Other<Thread>.Deeply.Inside must be parameterized, since it is qualified with a parameterized type\n" +
		"----------\n"	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=189158 - variation
public void test1153() {
	// check proper decoding of binary signatures, by compiling against generated binary
	this.runConformTest(
		new String[] {
			"p/X.java",
			"package p;\n" +
			"import java.lang.ref.Reference;\n" +
			"public class X<T> {\n" +
			"	public static class Rather {\n" +
			"		public static class Deeply {\n" +
			"			public static class Inside {\n" +
			"			}\n" +
			"		}\n" +
			"	}\n" +
			"	public class Other<U> {\n" +
			"		public class Deeply {\n" +
			"			public class Inside<V> {\n" +
			"			}			\n" +
			"		}\n" +
			"	}\n" +
			"	public Reference<X.Rather.Deeply> x;\n" +
			"	public Reference<X.Rather> y;	\n" +
			"	public Reference<X.Rather.Deeply.Inside> z;	\n" +
			"	public Reference<X<String>.Other<Thread>.Deeply> t;\n" +
			"	public Reference<X<String>.Other<Thread>.Deeply.Inside<Number>> u;\n" +
			"}\n",
		},
		""
	);
	this.runConformTest(
		new String[] {
			"Y.java",
			"import java.lang.ref.Reference;\n" +
			"import p.X;\n" +
			"public class Y {\n" +
			"	Reference<X.Rather.Deeply> x;\n" +
			"	Reference<X.Rather> y;	\n" +
			"	Reference<X.Rather.Deeply.Inside> z;	\n" +
			"	Reference<X<String>.Other<Thread>.Deeply> t;\n" +
			"	Reference<X<String>.Other<Thread>.Deeply.Inside<Number>> u;\n" +
			"	Y(X someX) {\n" +
			"		this.x = someX.x;\n" +
			"		this. y = someX.y;	\n" +
			"		this.z = someX.z;	\n" +
			"		this.t = someX.t;\n" +
			"		this.u = someX.u;		\n" +
			"	}\n" +
			"	public static void main(String[] args) throws Exception {\n" +
			"		System.out.print(Y.class.getDeclaredField(\"x\").getGenericType());\n" +
			"		System.out.print(\"##\");\n" +
			"		System.out.print(Y.class.getDeclaredField(\"y\").getGenericType());\n" +
			"		System.out.print(\"##\");\n" +
			"		System.out.print(Y.class.getDeclaredField(\"z\").getGenericType());\n" +
			"		System.out.print(\"##\");\n" +
			"		System.out.print(Y.class.getDeclaredField(\"t\").getGenericType());\n" +
			"		//System.out.print(\"##\");\n" +
			"		//System.out.print(Y.class.getDeclaredField(\"u\").getGenericType());\n" + // TODO disabled due to bug in libs (unable to re-read the generated signature)
			"		System.out.println();\n" +
			"	}\n" +
			"}\n"
		},
		"java.lang.ref.Reference<p.X$Rather$Deeply>##java.lang.ref.Reference<p.X$Rather>##java.lang.ref.Reference<p.X$Rather$Deeply$Inside>##"+
		(reflectNestedClassUseDollar 
		? "java.lang.ref.Reference<p.X<java.lang.String>$Other<java.lang.Thread>$Deeply>"
		: "java.lang.ref.Reference<p.X<java.lang.String>.Other<java.lang.Thread>.Deeply>"),
		null,
		false, // do not flush output
		null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=189158 - variation
public void test1154() throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.lang.ref.Reference;\n" +
			"public class X {\n" +
			"	class Other<U> {\n" +
			"		class Deeply {\n" +
			"			class Deeper {\n" +
			"				class Inside<V> {\n" +
			"				}			\n" +
			"			}\n" +
			"		}\n" +
			"	}\n" +
			"	Reference<X.Other<Thread>.Deeply> t;\n" +
			"	Reference<X.Other<Thread>.Deeply.Deeper.Inside<Number>> u;\n" +
			"\n" +
			"	public static void main(String[] args) throws Exception {\n" +
			"		//System.out.print(X.class.getDeclaredField(\"t\").getGenericType());\n" +  // TODO disabled due to bug in libs (unable to re-read the generated signature)
			"		//System.out.print(\"##\");\n" +
			"		//System.out.print(X.class.getDeclaredField(\"u\").getGenericType());\n" + // TODO disabled due to bug in libs (unable to re-read the generated signature)
			"		System.out.println();\n" +
			"	}\n" +
			"}\n"
		},
		"");

	String expectedOutput =
		"  // Field descriptor #6 Ljava/lang/ref/Reference;\n" +
		"  // Signature: Ljava/lang/ref/Reference<LX$Other<Ljava/lang/Thread;>.Deeply;>;\n" +
		"  java.lang.ref.Reference t;\n" +
		"  \n" +
		"  // Field descriptor #6 Ljava/lang/ref/Reference;\n" +
		"  // Signature: Ljava/lang/ref/Reference<LX$Other<Ljava/lang/Thread;>.Deeply.Deeper.Inside<Ljava/lang/Number;>;>;\n" +
		"  java.lang.ref.Reference u;\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=189158 - variation
public void test1155() throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.lang.ref.Reference;\n" +
			"public class X<T> {\n" +
			"	class Other<U> {\n" +
			"		class Deeply {\n" +
			"			class Deeper {\n" +
			"				class Inside<V> {\n" +
			"				}			\n" +
			"			}\n" +
			"		}\n" +
			"	}\n" +
			"	Reference<X<String>.Other<Thread>.Deeply> t;\n" +
			"	Reference<X<String>.Other<Thread>.Deeply.Deeper.Inside<Number>> u;\n" +
			"\n" +
			"	public static void main(String[] args) throws Exception {\n" +
			"		System.out.print(X.class.getDeclaredField(\"t\").getGenericType());\n" +
			"		//System.out.print(\"##\");\n" +
			"		//System.out.print(X.class.getDeclaredField(\"u\").getGenericType());\n" + // TODO disabled due to bug in libs (unable to re-read the generated signature)
			"		System.out.println();\n" +
			"	}\n" +
			"}\n"
		},
		(reflectNestedClassUseDollar
		? "java.lang.ref.Reference<X<java.lang.String>$Other<java.lang.Thread>$Deeply>"
		: "java.lang.ref.Reference<X<java.lang.String>.Other<java.lang.Thread>.Deeply>")	);

	String expectedOutput =
		"  // Field descriptor #6 Ljava/lang/ref/Reference;\n" +
		"  // Signature: Ljava/lang/ref/Reference<LX<Ljava/lang/String;>.Other<Ljava/lang/Thread;>.Deeply;>;\n" +
		"  java.lang.ref.Reference t;\n" +
		"  \n" +
		"  // Field descriptor #6 Ljava/lang/ref/Reference;\n" +
		"  // Signature: Ljava/lang/ref/Reference<LX<Ljava/lang/String;>.Other<Ljava/lang/Thread;>.Deeply.Deeper.Inside<Ljava/lang/Number;>;>;\n" +
		"  java.lang.ref.Reference u;\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=196253
public void test1156() {
	this.runConformTest(
		new String[] {
			"C.java",
			"public class C {\n" +
			"	R<X.N<X.N<?>>> xx = D.r;\n" +
			"}",
			"D.java",
			"public class D {\n" +
			"	public static R<X.N<X.N<?>>> r;\n" +
			"}",
			"R.java",
			"public class R<T> {}",
			"X.java",
			"public class X<T> {\n" +
			"	public static class N<U> {}\n" +
			"}"
		},
		""
	);
	this.runConformTest(
		new String[] {
			"C.java",
			"public class C {\n" +
			"	R<X.N<X.N<?>>> xx = D.r;\n" +
			"}",
		},
		"",
		null,
		false, // do not flush output
		null
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=202624
public void test1157() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"        public <A, B> void func(Class<? extends XX<A,B>> cls) {}\n" +
			"        public void func() {\n" +
			"                func(XX.class);\n" +
			"                \n" +
			"                Class<? extends XX<String,String>> c = XX.class;\n" +
			"        }\n" +
			"        class XX<A, B> {}\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	func(XX.class);\n" +
		"	^^^^\n" +
		"The method func(Class<? extends X.XX<A,B>>) in the type X is not applicable for the arguments (Class<X.XX>)\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 6)\n" +
		"	Class<? extends XX<String,String>> c = XX.class;\n" +
		"	                                       ^^^^^^^^\n" +
		"Type mismatch: cannot convert from Class<X.XX> to Class<? extends X.XX<String,String>>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=202404
public void test1158() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			" class A {}\n" +
			" class B extends A {}\n" +
			" class C extends A{}\n" +
			" \n" +
			" class D<U extends A, V extends U> {}\n" +
			"\n" +
			"public class X {\n" +
			"	void foo() {\n" +
			"		D<?, ? super A> d1 = null;\n" +
			"		D<?, ? extends A> d2 = null;\n" +
			"		D<B, C> d3 = null;\n" +
			"		D<?, ?> d4 = null;\n" +
			"	}\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 11)\n" +
		"	D<B, C> d3 = null;\n" +
		"	     ^\n" +
		"Bound mismatch: The type C is not a valid substitute for the bounded parameter <V extends U> of the type D<U,V>\n" +
		"----------\n"
		);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=202404 - variation
public void test1159() {
	this.runConformTest(
		new String[] {
			"X.java",
			"class Y<U extends Y<U>> {}\n" +
			"public class X<V extends X<V>> extends Y<V>{\n" +
			"	void foo(X<? extends V> x) {}\n" +
			"}\n", // =================
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=202404 - variation
public void test1160() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"class Y<T extends Y<T>> {}\n" +
			"class Z<U extends Y<U>> {}\n" +
			"public class X<V extends Z<V>> extends Z<V>{\n" +
			"	void foo(X<? extends V> x) {}\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	public class X<V extends Z<V>> extends Z<V>{\n" +
		"	                           ^\n" +
		"Bound mismatch: The type V is not a valid substitute for the bounded parameter <U extends Y<U>> of the type Z<U>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 3)\n" +
		"	public class X<V extends Z<V>> extends Z<V>{\n" +
		"	                                         ^\n" +
		"Bound mismatch: The type V is not a valid substitute for the bounded parameter <U extends Y<U>> of the type Z<U>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=202404 - variation
public void test1161() {
	this.runConformTest(
		new String[] {
			"X.java",
			"class Y<T extends Y<T>> {}\n" +
			"class Z<U extends Y<U>> extends Y<U> {}\n" +
			"public class X<V extends Z<V>> extends Z<V> {\n" +
			"	void foo(X<? extends V> x) {}\n" +
			"}\n", // =================
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=202404 - variation
public void test1162() {
	this.runConformTest(
		new String[] {
			"X.java",
			"class Y<T extends Y<T>> {}\n" +
			"class Z<U extends Z<U>> extends Y<U> {}\n" +
			"public class X<V extends X<V>> extends Z<V>{\n" +
			"	void foo(Y<? extends V> y) {}\n" +
			"}\n", // =================
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=203061 - variation
public void test1163() {
	String errMessage = isMinimumCompliant(ClassFileConstants.JDK11) ?
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	Object o1 = mObj;\n" +
			"	            ^^^^\n" +
			"The blank final field mObj may not have been initialized\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 7)\n" +
			"	Object o2 = mObj;\n" +
			"	            ^^^^\n" +
			"The blank final field mObj may not have been initialized\n" +
			"----------\n"
			:
			"----------\n" +
			"1. WARNING in X.java (at line 5)\n" +
			"	Object o1 = mObj;\n" +
			"	            ^^^^\n" +
			"Read access to enclosing field X<T>.mObj is emulated by a synthetic accessor method\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 5)\n" +
			"	Object o1 = mObj;\n" +
			"	            ^^^^\n" +
			"The blank final field mObj may not have been initialized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 7)\n" +
			"	Object o2 = mObj;\n" +
			"	            ^^^^\n" +
			"Read access to enclosing field X<T>.mObj is emulated by a synthetic accessor method\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 7)\n" +
			"	Object o2 = mObj;\n" +
			"	            ^^^^\n" +
			"The blank final field mObj may not have been initialized\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 9)\n" +
			"	Object o3 = mObj;\n" +
			"	            ^^^^\n" +
			"Read access to enclosing field X<T>.mObj is emulated by a synthetic accessor method\n" +
			"----------\n";
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public final class X<T> {\n" +
			"	private final Object mObj;\n" +
			"	private final Object mDependent = new Object() {\n" +
			"		{\n" +
			"			Object o1 = mObj;\n" +
			"		}\n" +
			"		Object o2 = mObj;\n" +
			"		void foo() {\n" +
			"			Object o3 = mObj;\n" +
			"		}\n" +
			"	};\n" +
			"	public X() {\n" +
			"		mObj = \"\";\n" +
			"	}\n" +
			"}\n", // =================
		},
		errMessage);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=203061 - variation
public void test1164() {
	String errMessage = isMinimumCompliant(ClassFileConstants.JDK11) ?
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	Object o1 = mObj;\n" +
			"	            ^^^^\n" +
			"The blank final field mObj may not have been initialized\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 6)\n" +
			"	mObj = \"1\";\n" +
			"	^^^^\n" +
			"The final field X<T>.mObj cannot be assigned\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 8)\n" +
			"	Object o2 = mObj = \"2\";\n" +
			"	            ^^^^\n" +
			"The final field X<T>.mObj cannot be assigned\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 11)\n" +
			"	mObj = \"3\";\n" +
			"	^^^^\n" +
			"The final field X<T>.mObj cannot be assigned\n" +
			"----------\n"
			:
			"----------\n" +
			"1. WARNING in X.java (at line 5)\n" +
			"	Object o1 = mObj;\n" +
			"	            ^^^^\n" +
			"Read access to enclosing field X<T>.mObj is emulated by a synthetic accessor method\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 5)\n" +
			"	Object o1 = mObj;\n" +
			"	            ^^^^\n" +
			"The blank final field mObj may not have been initialized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 6)\n" +
			"	mObj = \"1\";\n" +
			"	^^^^\n" +
			"Write access to enclosing field X<T>.mObj is emulated by a synthetic accessor method\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 6)\n" +
			"	mObj = \"1\";\n" +
			"	^^^^\n" +
			"The final field X<T>.mObj cannot be assigned\n" +
			"----------\n" +
			"5. WARNING in X.java (at line 8)\n" +
			"	Object o2 = mObj = \"2\";\n" +
			"	            ^^^^\n" +
			"Write access to enclosing field X<T>.mObj is emulated by a synthetic accessor method\n" +
			"----------\n" +
			"6. ERROR in X.java (at line 8)\n" +
			"	Object o2 = mObj = \"2\";\n" +
			"	            ^^^^\n" +
			"The final field X<T>.mObj cannot be assigned\n" +
			"----------\n" +
			"7. WARNING in X.java (at line 10)\n" +
			"	Object o3 = mObj;\n" +
			"	            ^^^^\n" +
			"Read access to enclosing field X<T>.mObj is emulated by a synthetic accessor method\n" +
			"----------\n" +
			"8. WARNING in X.java (at line 11)\n" +
			"	mObj = \"3\";\n" +
			"	^^^^\n" +
			"Write access to enclosing field X<T>.mObj is emulated by a synthetic accessor method\n" +
			"----------\n" +
			"9. ERROR in X.java (at line 11)\n" +
			"	mObj = \"3\";\n" +
			"	^^^^\n" +
			"The final field X<T>.mObj cannot be assigned\n" +
			"----------\n";	this.runNegativeTest(
		new String[] {
			"X.java",
			"public final class X<T> {\n" +
			"	private final Object mObj;\n" +
			"	private final Object mDependent = new Object() {\n" +
			"		{\n" +
			"			Object o1 = mObj;\n" +
			"			mObj = \"1\";\n" +
			"		}\n" +
			"		Object o2 = mObj = \"2\";\n" +
			"		void foo() {\n" +
			"			Object o3 = mObj;\n" +
			"			mObj = \"3\";\n" +
			"		}\n" +
			"	};\n" +
			"	public X() {\n" +
			"		mObj = \"\";\n" +
			"	}\n" +
			"}\n"
		}, errMessage);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=202404 - variation
public void test1165() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			" interface A {}\n" +
			" class B implements A {}\n" +
			" class C implements A{}\n" +
			" \n" +
			" class D<U extends A, V extends U> {}\n" +
			"\n" +
			"public class X {\n" +
			"	void foo() {\n" +
			"		D<?, ? super A> d1 = null;\n" +
			"		D<?, ? extends A> d2 = null;\n" +
			"		D<B, C> d3 = null;\n" +
			"		D<?, ?> d4 = null;\n" +
			"	}\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 11)\n" +
		"	D<B, C> d3 = null;\n" +
		"	     ^\n" +
		"Bound mismatch: The type C is not a valid substitute for the bounded parameter <V extends U> of the type D<U,V>\n" +
		"----------\n"
		);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=203318
public void test1166() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<T extends Number> {\n" +
			"	T get() {	return null; };\n" +
			"    void foo(X<? extends Object> x) {\n" +
			"		x.get().intValue();    	\n" +
			"    }\n" +
			"}\n", // =================
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=179902
public void test1167() {
	this.runNegativeTest(
		new String[] {
			"Foo.java",
			"public class Foo<F extends Enum<F>> {\n" +
			"  class Bar<B> {\n" +
			"    Bar(Foo<? extends B> bar) {}\n" +
			"  }\n" +
			"}\n", // =================
		},
		"----------\n" + 
	"1. ERROR in Foo.java (at line 3)\n" + 
	"	Bar(Foo<? extends B> bar) {}\n" + 
	"	        ^^^^^^^^^^^\n" + 
	"Bound mismatch: The type ? extends B is not a valid substitute for the bounded parameter <F extends Enum<F>> of the type Foo<F>\n" + 
	"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=169049
public void test1168() {
	this.runNegativeTest(
		new String[] {
			"example/Container.java",
			"package example;\n" +
			"class A<E> {}\n" +
			"class B<E> extends A<E> {}\n" +
			"\n" +
			"public interface Container<T, U extends T, V extends A<T>> {\n" +
			"	<T1, U1 extends T1, V1 extends A<T1>> void f(\n" +
			"			Container<?, ?, ?> a, \n" +
			"			Container<?, ? extends T1, ?> b, \n" +
			"			Container<T1, U1, V1> c, \n" +
			"			Container<? extends T1, ? extends U1, ? extends V1> d, \n" +
			"			Container<T1, ? extends U1, ? extends V1> e, \n" +
			"			Container<T1, ? extends U1, A<T>> f, \n" +
			"			Container<T1, U1, A<U1>> g,\n" +
			"			Container<T1, U1, A<T1>> h);\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in example\\Container.java (at line 12)\n" +
		"	Container<T1, ? extends U1, A<T>> f, \n" +
		"	                            ^\n" +
		"Bound mismatch: The type A<T> is not a valid substitute for the bounded parameter <V extends A<T>> of the type Container<T,U,V>\n" +
		"----------\n" +
		"2. ERROR in example\\Container.java (at line 13)\n" +
		"	Container<T1, U1, A<U1>> g,\n" +
		"	                  ^\n" +
		"Bound mismatch: The type A<U1> is not a valid substitute for the bounded parameter <V extends A<T>> of the type Container<T,U,V>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=169049 - variation
public void test1169() {
	this.runNegativeTest(
		new String[] {
			"example/Container2.java",
			"package example;\n" +
			"class A<E> {}\n" +
			"class B<E> extends A<E> {}\n" +
			"\n" +
			"public interface Container2<T, U extends T, V extends A<? extends T>> {\n" +
			"	<T1, U1 extends T1, V1 extends A<? extends T1>> void g(\n" +
			"			Container2<?, ?, ?> a, \n" +
			"			Container2<?, ? extends T1, ?> b, \n" +
			"			Container2<T1, U1, V1> c, \n" +
			"			Container2<? extends T1, ? extends U1, ? extends V1> d, \n" +
			"			Container2<T1, ? extends U1, ? extends V1> e, \n" +
			"			Container2<T1, ? extends U1, A<T>> f, \n" +
			"			Container2<T1, U1, A<U1>> g, \n" +
			"			Container2<? extends T1, U1, ? extends V1> h);\n" +
			"\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in example\\Container2.java (at line 12)\n" +
		"	Container2<T1, ? extends U1, A<T>> f, \n" +
		"	                             ^\n" +
		"Bound mismatch: The type A<T> is not a valid substitute for the bounded parameter <V extends A<? extends T>> of the type Container2<T,U,V>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=169049 - variation
public void test1170() {
	this.runNegativeTest(
		new String[] {
			"example/Container3.java",
			"package example;\n" +
			"class A<E> {}\n" +
			"class B<E> extends A<E> {}\n" +
			"\n" +
			"public interface Container3<T, U extends T, V extends A<? super T>> {\n" +
			"	<T1, U1 extends T1, V1 extends A<? super T1>> void g(\n" +
			"			Container3<?, ?, ?> a, \n" +
			"			Container3<?, ? extends T1, ?> b, \n" +
			"			Container3<T1, U1, V1> c, \n" +
			"			Container3<? extends T1, ? extends U1, ? extends V1> d, \n" +
			"			Container3<T1, ? extends U1, ? extends V1> e, \n" +
			"			Container3<T1, ? extends U1, A<T>> f, \n" +
			"			Container3<T1, U1, A<U1>> g, \n" +
			"			Container3<? extends T1, U1, ? extends V1> h, \n" +
			"			Container3<T1, ? extends U1, A<? super T>> i, \n" +
			"			Container3<T1, ? extends U1, A> j);\n" +
			"\n" +
			"	<T1, U1 extends T1, V1 extends B<? super T1>> void h(\n" +
			"			Container3<?, ?, ?> a, \n" +
			"			Container3<?, ? extends T1, ?> b, \n" +
			"			Container3<T1, U1, V1> c, \n" +
			"			Container3<? extends T1, ? extends U1, ? extends V1> d, \n" +
			"			Container3<T1, ? extends U1, ? extends V1> e, \n" +
			"			Container3<T1, ? extends U1, B<T>> f, \n" +
			"			Container3<T1, U1, B<U1>> g, \n" +
			"			Container3<? extends T1, U1, ? extends V1> h, \n" +
			"			Container3<T1, ? extends U1, B<? super T>> i, \n" +
			"			Container3<T1, ? extends U1, B> j);\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in example\\Container3.java (at line 12)\n" +
		"	Container3<T1, ? extends U1, A<T>> f, \n" +
		"	                             ^\n" +
		"Bound mismatch: The type A<T> is not a valid substitute for the bounded parameter <V extends A<? super T>> of the type Container3<T,U,V>\n" +
		"----------\n" +
		"2. ERROR in example\\Container3.java (at line 13)\n" +
		"	Container3<T1, U1, A<U1>> g, \n" +
		"	                   ^\n" +
		"Bound mismatch: The type A<U1> is not a valid substitute for the bounded parameter <V extends A<? super T>> of the type Container3<T,U,V>\n" +
		"----------\n" +
		"3. ERROR in example\\Container3.java (at line 15)\n" +
		"	Container3<T1, ? extends U1, A<? super T>> i, \n" +
		"	                             ^\n" +
		"Bound mismatch: The type A<? super T> is not a valid substitute for the bounded parameter <V extends A<? super T>> of the type Container3<T,U,V>\n" +
		"----------\n" +
		"4. WARNING in example\\Container3.java (at line 16)\n" +
		"	Container3<T1, ? extends U1, A> j);\n" +
		"	                             ^\n" +
		"A is a raw type. References to generic type A<E> should be parameterized\n" +
		"----------\n" +
		"5. ERROR in example\\Container3.java (at line 16)\n" +
		"	Container3<T1, ? extends U1, A> j);\n" +
		"	                             ^\n" +
		"Bound mismatch: The type A is not a valid substitute for the bounded parameter <V extends A<? super T>> of the type Container3<T,U,V>\n" +
		"----------\n" +
		"6. ERROR in example\\Container3.java (at line 24)\n" +
		"	Container3<T1, ? extends U1, B<T>> f, \n" +
		"	                             ^\n" +
		"Bound mismatch: The type B<T> is not a valid substitute for the bounded parameter <V extends A<? super T>> of the type Container3<T,U,V>\n" +
		"----------\n" +
		"7. ERROR in example\\Container3.java (at line 25)\n" +
		"	Container3<T1, U1, B<U1>> g, \n" +
		"	                   ^\n" +
		"Bound mismatch: The type B<U1> is not a valid substitute for the bounded parameter <V extends A<? super T>> of the type Container3<T,U,V>\n" +
		"----------\n" +
		"8. ERROR in example\\Container3.java (at line 27)\n" +
		"	Container3<T1, ? extends U1, B<? super T>> i, \n" +
		"	                             ^\n" +
		"Bound mismatch: The type B<? super T> is not a valid substitute for the bounded parameter <V extends A<? super T>> of the type Container3<T,U,V>\n" +
		"----------\n" +
		"9. WARNING in example\\Container3.java (at line 28)\n" +
		"	Container3<T1, ? extends U1, B> j);\n" +
		"	                             ^\n" +
		"B is a raw type. References to generic type B<E> should be parameterized\n" +
		"----------\n" +
		"10. ERROR in example\\Container3.java (at line 28)\n" +
		"	Container3<T1, ? extends U1, B> j);\n" +
		"	                             ^\n" +
		"Bound mismatch: The type B is not a valid substitute for the bounded parameter <V extends A<? super T>> of the type Container3<T,U,V>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=203905
public void test1171() {
	this.runConformTest(
		new String[] {
			"Function.java",
			"public abstract class Function<A, B> {\n" +
			"        public abstract B apply(A a);\n" +
			"\n" +
			"        /** (f andThen g)(x) = g(f(x)) */\n" +
			"        public <C1> Function<A, C1> andThen(final Function<B, C1> g) {\n" +
			"                return new Function<A, C1>() {\n" +
			"                		@Override\n" +
			"                        public C1 apply(A a) {\n" +
			"                                return g.apply(Function.this.apply(a));\n" +
			"                        }\n" +
			"                };\n" +
			"        }\n" +
			"\n" +
			"        /** (f compose g)(x) = f(g(x)) */\n" +
			"        public <C2> Function<C2, B> compose(final Function<C2, A> g) {\n" +
			"                return g.andThen(this);\n" +
			"        }\n" +
			"}\n", // =================
		},
		"");
}
public void test1172() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" +
			"	T field;\n" +
			"	void foo(X<String> xs, X<Number> xn, boolean b) {\n" +
			"		(b ? xs : xn).field = xs.field;\n" +
			"	}\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	(b ? xs : xn).field = xs.field;\n" +
		"	                      ^^^^^^^^\n" +
		"Type mismatch: cannot convert from String to capture#1-of ? extends Serializable\n" +
		"----------\n");
}
public void test1173() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" +
			"	T field;\n" +
			"	void foo(X<Integer> x1, X<Long> x2, boolean b) {\n" +
			"		(b ? x1 : x2).field = x1.field;\n" +
			"	}\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	(b ? x1 : x2).field = x1.field;\n" +
		"	                      ^^^^^^^^\n" +
		"Type mismatch: cannot convert from Integer to capture#1-of ? extends "+intersection("Number","Comparable<?>")+"\n" +
		"----------\n");
}
public void test1174() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" +
			"	T field;\n" +
			"	void foo(X<Integer> x1, X<Long> x2, boolean b) {\n" +
			"		(b ? x1 : x2).field = (b ? x1 : x2).field;\n" +
			"	}\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	(b ? x1 : x2).field = (b ? x1 : x2).field;\n" +
		"	                      ^^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from capture#2-of ? extends "+intersection("Number","Comparable<?>")+" to capture#1-of ? extends "+intersection("Number","Comparable<?>")+"\n" +
		"----------\n");
}
public void test1175() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T extends A & B> {\n" +
			"	T field;\n" +
			"	void foo(X<? extends C> x1, X<? extends C> x2, boolean b) {\n" +
			"		(b ? x1 : x2).field = new C();\n" +
			"	}\n" +
			"}\n" +
			"class A {}\n" +
			"interface B {}\n" +
			"class C extends A implements B {}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	(b ? x1 : x2).field = new C();\n" +
		"	                      ^^^^^^^\n" +
		"Type mismatch: cannot convert from C to capture#3-of ? extends C\n" +
		"----------\n");
}
public void test1176() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"public class X<T extends Foo & Bar> {\n" +
			"	T get() { return null; }\n" +
			"	void method(X<? extends C> x1, X<? extends C> x2, boolean b) {\n" +
			"		(b ? x1 : x2).get().foo();\n" +
			"		(b ? x1 : x2).get().bar();\n" +
			"	}\n" +
			"}\n" +
			"class Foo {\n" +
			"	void foo() {/**/}\n" +
			"}\n" +
			"interface Bar {\n" +
			"	void bar();\n" +
			"}\n" +
			"abstract class C extends Foo implements Bar {/**/}\n" +
			"\n", // =================
		},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}
public void test1177() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"public class X<T extends Foo & Bar> {\n" +
			"	T get() { return null; }\n" +
			"	void method(X<? extends Runnable> x1, X<? extends java.io.Serializable> x2, boolean b) {\n" +
			"		(b ? x1 : x2).get().foo();\n" +
			"		(b ? x1 : x2).get().bar();\n" +
			"	}\n" +
			"}\n" +
			"class Foo {\n" +
			"	void foo() {/**/}\n" +
			"}\n" +
			"interface Bar {\n" +
			"	void bar();\n" +
			"}\n" +
			"\n", // =================
		},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}
public void test1178() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"public class X<T extends Foo & Bar> {\n" +
			"	T get() { return null; }\n" +
			"	void method(X<? extends C> x1, X<? extends D> x2, boolean b) {\n" +
			"		(b ? x1 : x2).get().baz();\n" +
			"	}\n" +
			"}\n" +
			"class Foo {\n" +
			"	void foo() {/**/}\n" +
			"}\n" +
			"interface Bar {\n" +
			"	void bar();\n" +
			"}\n" +
			"abstract class C extends Foo implements Bar {\n" +
			"	void baz() {/**/}\n" +
			"}\n" +
			"abstract class D extends C {/**/}\n" +
			"abstract class E extends C {/**/}\n" +
			"\n", // =================
		},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}
public void test1179() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T extends Object&V, V> {}\n" +
			"\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 1)\n" +
		"	public class X<T extends Object&V, V> {}\n" +
		"	                                ^\n" +
		"The type V is not an interface; it cannot be specified as a bounded parameter\n" +
		"----------\n");
}
public void test1180() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static <S, T extends Comparable<S>, R extends S & T> R max1(T arg1, S arg2) {\n" +
			"		return (R) ((arg1.compareTo(arg2) > 0) ? arg1 : arg2);\n" +
			"	}\n" +
			"\n" +
			"	public static <T extends Comparable<S>, S, R extends S & Comparable<S>> R max2(T arg1, S arg2) {\n" +
			"		return (R) ((arg1.compareTo(arg2) > 0) ? arg1 : arg2);\n" +
			"	}\n" +
			"\n" +
			"	public static <T extends Comparable<S>, S, R extends Comparable<S>> R max3(T arg1, S arg2) {\n" +
			"		return (R) ((arg1.compareTo(arg2) > 0) ? arg1 : arg2);\n" +
			"	}\n" +
			"\n" +
			"	public static void main(String[] args) {\n" +
			"	}\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 2)\n" +
		"	public static <S, T extends Comparable<S>, R extends S & T> R max1(T arg1, S arg2) {\n" +
		"	                                                         ^\n" +
		"Cannot specify any additional bound T when first bound is a type parameter\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 3)\n" +
		"	return (R) ((arg1.compareTo(arg2) > 0) ? arg1 : arg2);\n" +
		"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from Object to R\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 6)\n" +
		"	public static <T extends Comparable<S>, S, R extends S & Comparable<S>> R max2(T arg1, S arg2) {\n" +
		"	                                                         ^^^^^^^^^^\n" +
		"Cannot specify any additional bound Comparable<S> when first bound is a type parameter\n" +
		"----------\n" +
		"4. WARNING in X.java (at line 7)\n" +
		"	return (R) ((arg1.compareTo(arg2) > 0) ? arg1 : arg2);\n" +
		"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from Object to R\n" +
		"----------\n" +
		"5. WARNING in X.java (at line 11)\n" +
		"	return (R) ((arg1.compareTo(arg2) > 0) ? arg1 : arg2);\n" +
		"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from Object to R\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=204534
public void test1181() {
	// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6182950
	String expectedCompilerLog = (this.complianceLevel == ClassFileConstants.JDK1_6)?
			"----------\n" + 
			"1. ERROR in X.java (at line 2)\n" + 
			"	public static <S, T extends Comparable<S>, R extends S & T> R max(T arg1, S arg2) {\n" + 
			"	                                                         ^\n" + 
			"Cannot specify any additional bound T when first bound is a type parameter\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 2)\n" + 
			"	public static <S, T extends Comparable<S>, R extends S & T> R max(T arg1, S arg2) {\n" + 
			"	                                                              ^^^^^^^^^^^^^^^^^^^\n" + 
			"Erasure of method max(T, S) is the same as another method in type X\n" +
			"----------\n" + 
			"3. WARNING in X.java (at line 3)\n" + 
			"	return (R) ((arg1.compareTo(arg2) > 0) ? arg1 : arg2);\n" + 
			"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked cast from Object to R\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 5)\n" + 
			"	public static <T extends Comparable<S>, S, R extends S & Comparable<S>> R max(T arg1, S arg2) {\n" + 
			"	                                                         ^^^^^^^^^^\n" + 
			"Cannot specify any additional bound Comparable<S> when first bound is a type parameter\n" + 
			"----------\n" + 
			"5. ERROR in X.java (at line 5)\n" + 
			"	public static <T extends Comparable<S>, S, R extends S & Comparable<S>> R max(T arg1, S arg2) {\n" + 
			"	                                                                          ^^^^^^^^^^^^^^^^^^^\n" + 
			"Erasure of method max(T, S) is the same as another method in type X\n" +
			"----------\n" + 
			"6. WARNING in X.java (at line 6)\n" + 
			"	return (R) ((arg1.compareTo(arg2) > 0) ? arg1 : arg2);\n" + 
			"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked cast from Object to R\n" + 
			"----------\n" + 
			"7. WARNING in X.java (at line 8)\n" + 
			"	public static <T extends Comparable<S>, S, R extends Comparable<S>> R max(T arg1, S arg2) {\n" + 
			"	                                                                      ^^^^^^^^^^^^^^^^^^^\n" + 
			"Erasure of method max(T, S) is the same as another method in type X\n" +
			"----------\n" + 
			"8. WARNING in X.java (at line 9)\n" + 
			"	return (R) ((arg1.compareTo(arg2) > 0) ? arg1 : arg2);\n" + 
			"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked cast from Object to R\n" + 
			"----------\n":
				"----------\n" + 
				"1. ERROR in X.java (at line 2)\n" + 
				"	public static <S, T extends Comparable<S>, R extends S & T> R max(T arg1, S arg2) {\n" + 
				"	                                                         ^\n" + 
				"Cannot specify any additional bound T when first bound is a type parameter\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 2)\n" + 
				"	public static <S, T extends Comparable<S>, R extends S & T> R max(T arg1, S arg2) {\n" + 
				"	                                                              ^^^^^^^^^^^^^^^^^^^\n" + 
				"Erasure of method max(T, S) is the same as another method in type X\n" +
				"----------\n" + 
				"3. WARNING in X.java (at line 3)\n" + 
				"	return (R) ((arg1.compareTo(arg2) > 0) ? arg1 : arg2);\n" + 
				"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Type safety: Unchecked cast from Object to R\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 5)\n" + 
				"	public static <T extends Comparable<S>, S, R extends S & Comparable<S>> R max(T arg1, S arg2) {\n" + 
				"	                                                         ^^^^^^^^^^\n" + 
				"Cannot specify any additional bound Comparable<S> when first bound is a type parameter\n" + 
				"----------\n" + 
				"5. ERROR in X.java (at line 5)\n" + 
				"	public static <T extends Comparable<S>, S, R extends S & Comparable<S>> R max(T arg1, S arg2) {\n" + 
				"	                                                                          ^^^^^^^^^^^^^^^^^^^\n" + 
				"Erasure of method max(T, S) is the same as another method in type X\n" +
				"----------\n" + 
				"6. WARNING in X.java (at line 6)\n" + 
				"	return (R) ((arg1.compareTo(arg2) > 0) ? arg1 : arg2);\n" + 
				"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Type safety: Unchecked cast from Object to R\n" + 
				"----------\n" + 
				"7. ERROR in X.java (at line 8)\n" + 
				"	public static <T extends Comparable<S>, S, R extends Comparable<S>> R max(T arg1, S arg2) {\n" + 
				"	                                                                      ^^^^^^^^^^^^^^^^^^^\n" + 
				"Erasure of method max(T, S) is the same as another method in type X\n" +
				"----------\n" + 
				"8. WARNING in X.java (at line 9)\n" + 
				"	return (R) ((arg1.compareTo(arg2) > 0) ? arg1 : arg2);\n" + 
				"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Type safety: Unchecked cast from Object to R\n" + 
				"----------\n";
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static <S, T extends Comparable<S>, R extends S & T> R max(T arg1, S arg2) {\n" +
			"		return (R) ((arg1.compareTo(arg2) > 0) ? arg1 : arg2);\n" +
			"	}\n" +
			"	public static <T extends Comparable<S>, S, R extends S & Comparable<S>> R max(T arg1, S arg2) {\n" +
			"		return (R) ((arg1.compareTo(arg2) > 0) ? arg1 : arg2);\n" +
			"	}\n" +
			"	public static <T extends Comparable<S>, S, R extends Comparable<S>> R max(T arg1, S arg2) {\n" +
			"		return (R) ((arg1.compareTo(arg2) > 0) ? arg1 : arg2);\n" +
			"	}\n" +
			"	public static void main(String[] args) {}\n" +
			"}\n", // =================
		},
		expectedCompilerLog
	);
/*
X.java:2: a type variable may not be followed by other bounds
        public static <S, T extends Comparable<S>, R extends S & T> R max(T arg1, S arg2) {
                                                                 ^
X.java:5: a type variable may not be followed by other bounds
        public static <T extends Comparable<S>, S, R extends S & Comparable<S>>
R max(T arg1, S arg2) {
                                                                           ^
X.java:5: name clash: <T#1,S#2,R#3>max(T#1,S#2) and <S#4,T#5,R#6>max(T#5,S#4) have the same erasure
        public static <T extends Comparable<S>, S, R extends S & Comparable<S>>
R max(T arg1, S arg2) {

  ^
  where T#1,S#2,R#3,S#4,T#5,R#6 are type-variables:
    T#1 extends Comparable<S#2> declared in method <T#1,S#2,R#3>max(T#1,S#2)
    S#2 extends Object declared in method <T#1,S#2,R#3>max(T#1,S#2)
    R#3 extends S#2 declared in method <T#1,S#2,R#3>max(T#1,S#2)
    S#4 extends Object declared in method <S#4,T#5,R#6>max(T#5,S#4)
    T#5 extends Comparable<S#4> declared in method <S#4,T#5,R#6>max(T#5,S#4)
    R#6 extends S#4 declared in method <S#4,T#5,R#6>max(T#5,S#4)
X.java:8: name clash: <T#1,S#2,R#3>max(T#1,S#2) and <S#4,T#5,R#6>max(T#5,S#4) have the same erasure
        public static <T extends Comparable<S>, S, R extends Comparable<S>> R max(T arg1, S arg2) {
                                                                              ^
  where T#1,S#2,R#3,S#4,T#5,R#6 are type-variables:
    T#1 extends Comparable<S#2> declared in method <T#1,S#2,R#3>max(T#1,S#2)
    S#2 extends Object declared in method <T#1,S#2,R#3>max(T#1,S#2)
    R#3 extends Comparable<S#2> declared in method <T#1,S#2,R#3>max(T#1,S#2)
    S#4 extends Object declared in method <S#4,T#5,R#6>max(T#5,S#4)
    T#5 extends Comparable<S#4> declared in method <S#4,T#5,R#6>max(T#5,S#4)
    R#6 extends S#4 declared in method <S#4,T#5,R#6>max(T#5,S#4)
X.java:3: warning: [unchecked] unchecked cast
                return (R) ((arg1.compareTo(arg2) > 0) ? arg1 : arg2);
                           ^
  required: R
  found:    Object
  where R,S,T are type-variables:
    R extends S declared in method <S,T,R>max(T,S)
    S extends Object declared in method <S,T,R>max(T,S)
    T extends Comparable<S> declared in method <S,T,R>max(T,S)
X.java:6: warning: [unchecked] unchecked cast
                return (R) ((arg1.compareTo(arg2) > 0) ? arg1 : arg2);
                           ^
  required: R
  found:    Object
  where R,T,S are type-variables:
    R extends S declared in method <T,S,R>max(T,S)
    T extends Comparable<S> declared in method <T,S,R>max(T,S)
    S extends Object declared in method <T,S,R>max(T,S)
X.java:9: warning: [unchecked] unchecked cast
                return (R) ((arg1.compareTo(arg2) > 0) ? arg1 : arg2);
                           ^
  required: R
  found:    Object
  where R,T,S are type-variables:
    R extends Comparable<S> declared in method <T,S,R>max(T,S)
    T extends Comparable<S> declared in method <T,S,R>max(T,S)
    S extends Object declared in method <T,S,R>max(T,S)
4 errors
3 warnings
 */
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=204536
public void test1182() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T extends Zork & Zork & Object> {\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 1)\n" +
		"	public class X<T extends Zork & Zork & Object> {\n" +
		"	                         ^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 1)\n" +
		"	public class X<T extends Zork & Zork & Object> {\n" +
		"	                                ^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 1)\n" +
		"	public class X<T extends Zork & Zork & Object> {\n" +
		"	                                       ^^^^^^\n" +
		"The type Object is not an interface; it cannot be specified as a bounded parameter\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=204536 - variation
public void test1183() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T extends Zork & Runnable> {\n" +
			"	void foo(T t) {\n" +
			"		t.run();\n" +
			"	}\n" +
			"	\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 1)\n" +
		"	public class X<T extends Zork & Runnable> {\n" +
		"	                         ^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=204536 - variation
public void test1184() {
	// check that unresolved first bound got erased into Object (and not Runnable)
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T extends Zork & Runnable> {\n" +
			"	T get() { return null; }\n" +
			"	void foo(X x) {\n" +
			"		Runnable r = x.get();\n" +
			"	}\n" +
			"	\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 1)\n" +
		"	public class X<T extends Zork & Runnable> {\n" +
		"	                         ^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 3)\n" +
		"	void foo(X x) {\n" +
		"	         ^\n" +
		"X is a raw type. References to generic type X<T> should be parameterized\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 4)\n" +
		"	Runnable r = x.get();\n" +
		"	               ^^^\n" +
		"The method get() from the type X refers to the missing type Zork\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=203587
public void test1185() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<U, V> {\n" +
			"	<T> void foo(Class<X> c) {};\n" +
			"	<A, B> void foo(Class<X<A, B>> c) {}\n" +
			"	void foo2(Class<X<U, V>> c) {};\n" +
			"	<A, B> void foo2(Class<X<U, V>> c) {}\n" +
			"}"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 2)\n" +
		"	<T> void foo(Class<X> c) {};\n" +
		"	         ^^^^^^^^^^^^^^^\n" +
		"Erasure of method foo(Class<X>) is the same as another method in type X<U,V>\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 2)\n" +
		"	<T> void foo(Class<X> c) {};\n" +
		"	                   ^\n" +
		"X is a raw type. References to generic type X<U,V> should be parameterized\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 3)\n" +
		"	<A, B> void foo(Class<X<A, B>> c) {}\n" +
		"	            ^^^^^^^^^^^^^^^^^^^^^\n" +
		"Erasure of method foo(Class<X<A,B>>) is the same as another method in type X<U,V>\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 4)\n" +
		"	void foo2(Class<X<U, V>> c) {};\n" +
		"	     ^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Duplicate method foo2(Class<X<U,V>>) in type X<U,V>\n" +
		"----------\n" +
		"5. ERROR in X.java (at line 5)\n" +
		"	<A, B> void foo2(Class<X<U, V>> c) {}\n" +
		"	            ^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Duplicate method foo2(Class<X<U,V>>) in type X<U,V>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=158870 - variation
public void test1186() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.io.Serializable;\n" +
			"\n" +
			"public class X<T> {\n" +
			"	void foo1(X<? extends String> x1, X<? extends Number> x2) {\n" +
			"		x1 = (X<? extends String>) x2;\n" +
			"	}\n" +
			"	void foo2(X<? extends String> x1, X<? extends Runnable> x2) {\n" +
			"		x1 = (X<? extends String>) x2;\n" +
			"	}	\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	x1 = (X<? extends String>) x2;\n" +
		"	     ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from X<capture#2-of ? extends Number> to X<? extends String>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 8)\n" +
		"	x1 = (X<? extends String>) x2;\n" +
		"	     ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from X<capture#5-of ? extends Runnable> to X<? extends String>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=158870 - variation
public void test1187() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.io.Serializable;\n" +
			"public class X<T> {\n" +
			"	void foo3(X<? extends Serializable> x1, X<? extends Runnable> x2) {\n" +
			"		x1 = (X<? extends Serializable>) x2;\n" +
			"	}	\n" +
			"	void foo4(X<? extends Runnable> x1, X<? extends String> x2) {\n" +
			"		x1 = (X<? extends Runnable>) x2;\n" +
			"	}	\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. WARNING in X.java (at line 4)\n" +
		"	x1 = (X<? extends Serializable>) x2;\n" +
		"	     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from X<capture#2-of ? extends Runnable> to X<? extends Serializable>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 7)\n" +
		"	x1 = (X<? extends Runnable>) x2;\n" +
		"	     ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from X<capture#5-of ? extends String> to X<? extends Runnable>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=158870 - variation
public void test1188() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	<T extends String, S extends Comparable<T>> void foo(Integer i) {\n" +
			"        S a = (S) i; // error?\n" +
			"	}\n" +
			"	<U extends Comparable<U>> void bar(Integer i) {\n" +
			"        U a = (U) i; // unchecked?\n" +
			"	}\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. WARNING in X.java (at line 2)\n" +
		"	<T extends String, S extends Comparable<T>> void foo(Integer i) {\n" +
		"	           ^^^^^^\n" +
		"The type parameter T should not be bounded by the final type String. Final types cannot be further extended\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 3)\n" +
		"	S a = (S) i; // error?\n" +
		"	      ^^^^^\n" +
		"Cannot cast from Integer to S\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 6)\n" +
		"	U a = (U) i; // unchecked?\n" +
		"	      ^^^^^\n" +
		"Type safety: Unchecked cast from Integer to U\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=158870 - variation
public void test1189() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	<T extends String, S extends Comparable<T>> void foo(Number n) {\n" +
			"        S a = (S) n; // unchecked?\n" +
			"	}\n" +
			"	<U extends Comparable<U>> void bar(Number n) {\n" +
			"        U a = (U) n; // unchecked?\n" +
			"	}\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. WARNING in X.java (at line 2)\n" +
		"	<T extends String, S extends Comparable<T>> void foo(Number n) {\n" +
		"	           ^^^^^^\n" +
		"The type parameter T should not be bounded by the final type String. Final types cannot be further extended\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 3)\n" +
		"	S a = (S) n; // unchecked?\n" +
		"	      ^^^^^\n" +
		"Type safety: Unchecked cast from Number to S\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 6)\n" +
		"	U a = (U) n; // unchecked?\n" +
		"	      ^^^^^\n" +
		"Type safety: Unchecked cast from Number to U\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=158870 - variation
public void test1190() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	<U extends Integer, T extends U, S extends Comparable<T>> void foo2(Integer i) {\n" +
			"        S a = (S) i; // unchecked1?\n" +
			"        Comparable<T> b = (Comparable<T>) i; // unchecked2?\n" +
			"	}		\n" +
			"	<U extends String, T extends U, S extends Comparable<T>> void foo3(Integer i) {\n" +
			"        S a = (S) i; // error?\n" +
			"        Comparable<T> b = (Comparable<T>) i; // error3?\n" +
			"	}	\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. WARNING in X.java (at line 2)\n" +
		"	<U extends Integer, T extends U, S extends Comparable<T>> void foo2(Integer i) {\n" +
		"	           ^^^^^^^\n" +
		"The type parameter U should not be bounded by the final type Integer. Final types cannot be further extended\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 3)\n" +
		"	S a = (S) i; // unchecked1?\n" +
		"	      ^^^^^\n" +
		"Type safety: Unchecked cast from Integer to S\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 4)\n" +
		"	Comparable<T> b = (Comparable<T>) i; // unchecked2?\n" +
		"	                  ^^^^^^^^^^^^^^^^^\n" +
		"Type safety: Unchecked cast from Integer to Comparable<T>\n" +
		"----------\n" +
		"4. WARNING in X.java (at line 6)\n" +
		"	<U extends String, T extends U, S extends Comparable<T>> void foo3(Integer i) {\n" +
		"	           ^^^^^^\n" +
		"The type parameter U should not be bounded by the final type String. Final types cannot be further extended\n" +
		"----------\n" +
		"5. ERROR in X.java (at line 7)\n" +
		"	S a = (S) i; // error?\n" +
		"	      ^^^^^\n" +
		"Cannot cast from Integer to S\n" +
		"----------\n" +
		"6. ERROR in X.java (at line 8)\n" +
		"	Comparable<T> b = (Comparable<T>) i; // error3?\n" +
		"	                  ^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from Integer to Comparable<T>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=158870 - variation
public void test1191() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	void foo(SomeEnum en) {\n" +
			"		Enum<?> myvar = en;\n" +
			"		SomeEnum en2 = (SomeEnum) myvar;\n" +
			"		if (myvar instanceof SomeEnum) {\n" +
			"			return;\n" +
			"		}\n" +
			"	}\n" +
			"	Zork z;\n" +
			"}\n" +
			"enum SomeEnum {\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 9)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=165352
public void test1192() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"public class X {\n" +
			"        void foo(ArrayList<Object> a) {\n" +
			"                Object o = (List<? extends String>) a; // ko\n" +
			"        }\n" +
			"        void bar(List<Object> a) {\n" +
			"                Object o = (ArrayList<? extends String>) a; // ko\n" +
			"        }\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	Object o = (List<? extends String>) a; // ko\n" +
		"	           ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from ArrayList<Object> to List<? extends String>\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 4)\n" +
		"	Object o = (List<? extends String>) a; // ko\n" +
		"	           ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Unnecessary cast from ArrayList<Object> to List<? extends String>\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 7)\n" +
		"	Object o = (ArrayList<? extends String>) a; // ko\n" +
		"	           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from List<Object> to ArrayList<? extends String>\n" +
		"----------\n" +
		"4. WARNING in X.java (at line 7)\n" +
		"	Object o = (ArrayList<? extends String>) a; // ko\n" +
		"	           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Unnecessary cast from List<Object> to ArrayList<? extends String>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=148046 - variation
public void test1193() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"class A {}\n" +
			"class B extends A {}\n" +
			"public class X<T> {\n" +
			"        public void foo(X<? super A> param) {\n" +
			"                X<B> bar = (X<B>) param; // unchecked warning vs error\n" +
			"        }\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	X<B> bar = (X<B>) param; // unchecked warning vs error\n" +
		"	           ^^^^^^^^^^^^\n" +
		"Cannot cast from X<capture#1-of ? super A> to X<B>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=120088
public void test1194() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		X t = new X();\n" +
			"		if (t.getClass() == Object.class)\n" +
			"			System.out.println(\"OK\");\n" +
			"	}\n" +
			"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	if (t.getClass() == Object.class)\n" +
		"	    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Incompatible operand types Class<capture#1-of ? extends X> and Class<Object>\n" +
		"----------\n");
}
public void test1195() {
	this.runConformTest(
		new String[] {
			"java/lang/Class.java",
			"package java.lang;\n" +
			"public class Class<T> {\n" +
			"	Class<? super T> getSuperclass() { return null; }\n" +
			"	void foo() {\n" +
			"		boolean foo = getSuperclass() == Enum.class;\n" +
			"	}\n" +
			"}\n", // =================
		},
		"");
}
public void test1196() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"public class X<T> {\n" +
			"	Class<? super T> getSuperclass() { return null; }\n" +
			"	void foo() {\n" +
			"		boolean foo = getSuperclass() == Enum.class;\n" +
			"	}\n" +
			"}\n" +
			"class Y {\n" +
			"	void bar() {\n" +
			"		boolean bar = this.getClass().getSuperclass() == Enum.class;\n" +
			"	}		\n" +
			"}\n", // =================
		},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_6_10 /* javac test options */);
}
public void test1197() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	void test() {\n" +
			"		B b = new C();\n" +
			"		Class<? extends B> cb = C.class;\n" +
			"		YYY<C> y = new XXX();\n" +
			"		Class<? extends YYY<C>> cy = XXX.class;\n" +
			"		YYY<? extends B> yb = new XXX();\n" +
			"		Class<? extends YYY<? extends B>> ybc = XXX.class;\n" +
			"		Class<? extends YYY> ybb = yb.getClass();\n" +
			"		Class<? extends YYY<?>> ybb2 = yb.getClass();\n" +
			"		Class<? extends YYY<? extends B>> ybb3 = yb.getClass();\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"class Obj {}\n" +
			"class B extends Obj {}\n" +
			"class C extends B {}\n" +
			"class ZZZ<T extends Obj> {}\n" +
			"class YYY<T extends B> extends ZZZ<T> {}\n" +
			"class XXX extends YYY<C> {} \n", // =================
		},
		"----------\n" +
		"1. WARNING in X.java (at line 9)\n" +
		"	Class<? extends YYY> ybb = yb.getClass();\n" +
		"	                ^^^\n" +
		"YYY is a raw type. References to generic type YYY<T> should be parameterized\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 10)\n" +
		"	Class<? extends YYY<?>> ybb2 = yb.getClass();\n" +
		"	                               ^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from Class<capture#4-of ? extends YYY> to Class<? extends YYY<?>>\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 11)\n" +
		"	Class<? extends YYY<? extends B>> ybb3 = yb.getClass();\n" +
		"	                                         ^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from Class<capture#6-of ? extends YYY> to Class<? extends YYY<? extends B>>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=121024 - variation
public void test1198() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"    interface Listener {}\n" +
			"    interface ErrorListener {}  \n" +
			"    static Object createParser(Listener l) {\n" +
			"    	System.out.println(\"FAILED\");\n" +
			"      return null;\n" +
			"    }\n" +
			"    static <L extends Object & Listener & ErrorListener> Object createParser(L l) {\n" +
			"    	System.out.println(\"SUCCESS\");\n" +
			"      return null;\n" +
			"    }\n" +
			"    public static void main(String[] args) {\n" +
			"      class A implements Listener, ErrorListener {\n" +
			"      }\n" +
			"      createParser(new A()); // error here\n" +
			"    }\n" +
			"}\n", // =================
		},
		"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=121024 - variation
public void test1198a() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"    interface Listener {}\n" +
			"    interface ErrorListener {}  \n" +
			"    static Object createParser(Listener l) {\n" +
			"    	System.out.println(\"FAILED\");\n" +
			"      return null;\n" +
			"    }\n" +
			"    static <L extends Object & ErrorListener & Listener> Object createParser(L l) {\n" +
			"    	System.out.println(\"SUCCESS\");\n" +
			"      return null;\n" +
			"    }\n" +
			"    public static void main(String[] args) {\n" +
			"      class A implements Listener, ErrorListener {\n" +
			"      }\n" +
			"      createParser(new A()); // error here\n" +
			"    }\n" +
			"}\n", // =================
		},
		"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=121024 - variation
public void test1199() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"    interface Listener {}\n" +
			"    interface ErrorListener {}  \n" +
			"    static Object createParser(Listener l) {\n" +
			"    	System.out.println(\"SUCCESS\");\n" +
			"      return null;\n" +
			"    }\n" +
			"    static <L extends ErrorListener & Listener> Object createParser(L l) {\n" +
			"    	System.out.println(\"FAILED\");\n" +
			"      return null;\n" +
			"    }\n" +
			"    public static void main(String[] args) {\n" +
			"      class A implements Listener {\n" +
			"      }\n" +
			"      createParser(new A()); // error here\n" +
			"    }\n" +
			"}\n", // =================
		},
		"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=205594
public void test1200() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public class Map<T1, T2> {\n" +
			"	}\n" +
			"\n" +
			"	public <K, V> Map<K, V> make(K key, V value) {\n" +
			"		return null;\n" +
			"	}\n" +
			"\n" +
			"	public Map<Class<?>, X> method1() {\n" +
			"		X value = new X();\n" +
			"		Class<?> type = X.class;\n" +
			"		return make(type, value);//1\n" +
			"	}\n" +
			"	public Map<Class<?>, X> method2() {\n" +
			"		X value = new X();\n" +
			"		Class<?> type = X.class;\n" +
			"		return (Map<Class<?>, X>) make(type, value);//2\n" +
			"	}\n" +
			"	public Map<Class<?>, X> method3() {\n" +
			"		X value = new X();\n" +
			"		return make(X.class, value);//3\n" +
			"	}\n" +
			"	public Map<Class<?>, X> method4() {\n" +
			"		X value = new X();\n" +
			"		return (Map<Class<?>, X>) make(X.class, value);//4\n" +
			"	}	\n" +
			"}\n", // =================
		},
		(this.complianceLevel < ClassFileConstants.JDK1_8 ?
		"----------\n" +
		"1. ERROR in X.java (at line 12)\n" +
		"	return make(type, value);//1\n" +
		"	       ^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from X.Map<Class<capture#1-of ?>,X> to X.Map<Class<?>,X>\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 17)\n" +
		"	return (Map<Class<?>, X>) make(type, value);//2\n" +
		"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from X.Map<Class<capture#2-of ?>,X> to X.Map<Class<?>,X>\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 21)\n" +
		"	return make(X.class, value);//3\n" +
		"	       ^^^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from X.Map<Class<X>,X> to X.Map<Class<?>,X>\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 25)\n" +
		"	return (Map<Class<?>, X>) make(X.class, value);//4\n" +
		"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from X.Map<Class<X>,X> to X.Map<Class<?>,X>\n" +
		"----------\n"
		: // fewer errors in 1.8+:
			"----------\n" +
			"1. ERROR in X.java (at line 17)\n" +
			"	return (Map<Class<?>, X>) make(type, value);//2\n" +
			"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Cannot cast from X.Map<Class<capture#2-of ?>,X> to X.Map<Class<?>,X>\n" + // FIXME: javac8 only reports a warning here
			"----------\n" +
			"2. ERROR in X.java (at line 25)\n" +
			"	return (Map<Class<?>, X>) make(X.class, value);//4\n" +
			"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Cannot cast from X.Map<Class<X>,X> to X.Map<Class<?>,X>\n" +
			"----------\n"));
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=174282
public void test1201() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"    public MyClass f() {\n" +
			"        SuperClass<? extends SuperDataModel> val = null;\n" +
			"        return (MyClass) val;\n" +
			"    }\n" +
			"}\n" +
			"class MyClass extends SuperClass<MyDataModel> {\n" +
			"}\n" +
			"class MyDataModel extends SuperDataModel {\n" +
			"}\n" +
			"class SuperClass<A extends SuperDataModel> {\n" +
			"}\n" +
			"class SuperDataModel {\n" +
			"}\n", // =================
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=168230
public void test1202() {
	String expectedOutput = this.complianceLevel < ClassFileConstants.JDK1_7
		? 	"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	X.<String>foo();\n" +
			"	          ^^^\n" +
			"The method foo() of type X is not generic; it cannot be parameterized with arguments <String>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 5)\n" +
			"	X.<Zork>foo();\n" +
			"	   ^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 5)\n" +
			"	X.<Zork>foo();\n" +
			"	        ^^^\n" +
			"The method foo() of type X is not generic; it cannot be parameterized with arguments <Zork>\n" +
			"----------\n"
		: 	"----------\n" +
			"1. WARNING in X.java (at line 4)\n" +
			"	X.<String>foo();\n" +
			"	   ^^^^^^\n" +
			"Unused type arguments for the non generic method foo() of type X; it should not be parameterized with arguments <String>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 5)\n" +
			"	X.<Zork>foo();\n" +
			"	   ^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 5)\n" +
			"	X.<Zork>foo();\n" +
			"	   ^^^^\n" +
			"Unused type arguments for the non generic method foo() of type X; it should not be parameterized with arguments <Zork>\n" +
			"----------\n";

	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"    public static void foo() {}\n" +
			"    public static void bar() {\n" +
			"        X.<String>foo();\n" +
			"        X.<Zork>foo();\n" +
			"    }\n" +
			"}\n", // =================
		},
		expectedOutput);
}

// https://bugs.eclipse.org/bugs/show_bug.cgi?id=168230 - variation
// split because of https://bugs.eclipse.org/bugs/show_bug.cgi?id=207935
public void test1203a() {
	String[] sources =
		new String[] {
			"X.java",
			"public class X {\n" +
			"  public static String foo(String one, String two) {\n" +
			"    return X.<String>foo(one, two);\n" +
			"  }\n" +
			"  public String bar(String one, String two) {\n" +
			"    return this.<String>bar(one, two);\n" +
			"  }\n" +
			"}\n", // =================
		};
	if (this.complianceLevel < ClassFileConstants.JDK1_7) {
		runNegativeTest(
			sources,
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	return X.<String>foo(one, two);\n" +
			"	                 ^^^\n" +
			"The method foo(String, String) of type X is not generic; it cannot be parameterized with arguments <String>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 6)\n" +
			"	return this.<String>bar(one, two);\n" +
			"	                    ^^^\n" +
			"The method bar(String, String) of type X is not generic; it cannot be parameterized with arguments <String>\n" +
			"----------\n");
	} else {
		runConformTest(
			true,
			sources,
			"----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	return X.<String>foo(one, two);\n" +
			"	          ^^^^^^\n" +
			"Unused type arguments for the non generic method foo(String, String) of type X; it should not be parameterized with arguments <String>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 6)\n" +
			"	return this.<String>bar(one, two);\n" +
			"	             ^^^^^^\n" +
			"Unused type arguments for the non generic method bar(String, String) of type X; it should not be parameterized with arguments <String>\n" +
			"----------\n",
			null, null,
			JavacTestOptions.Excuse.EclipseHasSomeMoreWarnings);
	}
}

// https://bugs.eclipse.org/bugs/show_bug.cgi?id=207935
// this case is not solved as expected in 1.5 and 1.6 mode; keeping the 1.7 mode
// activated test in all modes so we can track any changes
public void test1203b() {
	String expectedOutput = this.complianceLevel < ClassFileConstants.JDK1_7
		? 	"----------\n" + 
			"1. WARNING in X.java (at line 4)\n" + 
			"	return this.<String>foobar(one, two);\n" + 
			"	             ^^^^^^\n" + 
			"Unused type arguments for the non generic method foobar(String, String) of type X; it should not be parameterized with arguments <String>\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 8)\n" + 
			"	return this.<String>foobar2(one, two);// silenced\n" + 
			"	                    ^^^^^^^\n" + 
			"The method foobar2(String, String) of type X is not generic; it cannot be parameterized with arguments <String>\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 16)\n" + 
			"	this.<String,String>foobar(one, two);\n" + 
			"	                    ^^^^^^\n" + 
			"Incorrect number of type arguments for generic method <T>foobar(String, String) of type Y; it cannot be parameterized with arguments <String, String>\n" + 
			"----------\n"
		: 	"----------\n" +
			"1. WARNING in X.java (at line 4)\n" +
			"	return this.<String>foobar(one, two);\n" +
			"	             ^^^^^^\n" +
			"Unused type arguments for the non generic method foobar(String, String) of type X; it should not be parameterized with arguments <String>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 16)\n" +
			"	this.<String,String>foobar(one, two);\n" +
			"	                    ^^^^^^\n" +
			"Incorrect number of type arguments for generic method <T>foobar(String, String) of type Y; it cannot be parameterized with arguments <String, String>\n" +
			"----------\n";

	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X extends Y {\n" +
			"  @Override\n" +
			"  public String foobar(String one, String two) {\n" +
			"    return this.<String>foobar(one, two);\n" +
			"  }\n" +
			"	@SuppressWarnings(\"unused\")\n" +
			"  public String foobar2(String one, String two) {\n" +
			"    return this.<String>foobar2(one, two);// silenced\n" +
			"  }\n" +
			"}\n" +
			"class Y {\n" +
			"  public <T> String foobar(String one, String two) {\n" +
			"    return null;\n" +
			"  }\n" +
			"  void test(String one, String two) {\n" +
			"	  this.<String,String>foobar(one, two);\n" +
			"  }\n" +
			"}\n", // =================
		},
		expectedOutput);
}

// https://bugs.eclipse.org/bugs/show_bug.cgi?id=207935
public void test1203c() {
	String[] sources =
		new String[] {
			"X.java",
			"public class X extends Y {\n" +
			"	public static void main(String[] args) {\n" +
			"		String s = \"\";\n" +
			"		new X().<String> a(s);\n" + // fails before 7
			"		new X().<String> b(s, s);\n" + // fails before 7
			"		new X().<String> c(s, s);\n" + // works in 1.5, 6.0 & 7.0
			"		new X().<String> d(s, s);\n" + // works in 1.5, 6.0 & 7.0
			"	}\n" +
			"	@Override void a(String one) {}\n" +
			"	void b(String one, Object two) {}\n" +
			"	@Override void c(String one, String two) {}\n" +
			"	@Override void d(String one, Object two) {}\n" +
			"}\n" +
			"class Y extends Z {\n" +
			"	void a(String one) {}\n" +
			"	<U> void b(String one) {}\n" +
			"	@Override void c(String one, String two) {}\n" +
			"}\n" +
			"class Z {\n" +
			"	<U> void c(String one, String two) {}\n" +
			"	<U> void d(String one, U u) {}\n" +
			"}"
		};
	if (this.complianceLevel < ClassFileConstants.JDK1_7) {
		runNegativeTest(
			sources,
			"----------\n" + 
			"1. ERROR in X.java (at line 4)\n" + 
			"	new X().<String> a(s);\n" + 
			"	                 ^\n" + 
			"The method a(String) of type X is not generic; it cannot be parameterized with arguments <String>\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 5)\n" + 
			"	new X().<String> b(s, s);\n" + 
			"	                 ^\n" + 
			"The method b(String, Object) of type X is not generic; it cannot be parameterized with arguments <String>\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 6)\n" + 
			"	new X().<String> c(s, s);\n" + 
			"	         ^^^^^^\n" + 
			"Unused type arguments for the non generic method c(String, String) of type X; it should not be parameterized with arguments <String>\n" + 
			"----------\n" + 
			"4. WARNING in X.java (at line 7)\n" + 
			"	new X().<String> d(s, s);\n" + 
			"	         ^^^^^^\n" + 
			"Unused type arguments for the non generic method d(String, Object) of type X; it should not be parameterized with arguments <String>\n" + 
			"----------\n");
	} else {
		runConformTest(
			true,
			sources,
			"----------\n" + 
			"1. WARNING in X.java (at line 4)\n" + 
			"	new X().<String> a(s);\n" + 
			"	         ^^^^^^\n" + 
			"Unused type arguments for the non generic method a(String) of type X; it should not be parameterized with arguments <String>\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 5)\n" + 
			"	new X().<String> b(s, s);\n" + 
			"	         ^^^^^^\n" + 
			"Unused type arguments for the non generic method b(String, Object) of type X; it should not be parameterized with arguments <String>\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 6)\n" + 
			"	new X().<String> c(s, s);\n" + 
			"	         ^^^^^^\n" + 
			"Unused type arguments for the non generic method c(String, String) of type X; it should not be parameterized with arguments <String>\n" + 
			"----------\n" + 
			"4. WARNING in X.java (at line 7)\n" + 
			"	new X().<String> d(s, s);\n" + 
			"	         ^^^^^^\n" + 
			"Unused type arguments for the non generic method d(String, Object) of type X; it should not be parameterized with arguments <String>\n" + 
			"----------\n",
			null, null,
			JavacTestOptions.Excuse.EclipseHasSomeMoreWarnings);
	}
}

// https://bugs.eclipse.org/bugs/show_bug.cgi?id=207935
public void test1203d() {
	String[] sources =
		new String[] {
			"X.java",
			"public class X implements I {\n" +
			"	public static void main(String[] args) {\n" +
			"		String s = \"\";\n" +
			"		new X().<String> a(s);\n" + // fails before 7
			"		new X().<String> b(s, s);\n" + // fails before 7
			"		new X().<String> c(s, s);\n" + // fails before 7
			"		new X().<String> d(s, s);\n" + // fails before 7
			"	}\n" +
			"	public void a(String one) {}\n" +
			"	public void b(String one, Object two) {}\n" +
			"	public void c(String one, String two) {}\n" +
			"	public void d(String one, Object two) {}\n" +
			"}\n" +
			"interface I extends J {\n" +
			"	void a(String one);\n" +
			"	void c(String one, String two);\n" +
			"}\n" +
			"interface J {\n" +
			"	<U> void c(String one, String two);\n" +
			"	<U> void d(String one, U u);\n" +
			"}"
		};
	if (this.complianceLevel < ClassFileConstants.JDK1_7) {
		runNegativeTest(
			sources,
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" + 
			"	new X().<String> a(s);\n" + 
			"	                 ^\n" + 
			"The method a(String) of type X is not generic; it cannot be parameterized with arguments <String>\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 5)\n" + 
			"	new X().<String> b(s, s);\n" + 
			"	                 ^\n" + 
			"The method b(String, Object) of type X is not generic; it cannot be parameterized with arguments <String>\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 6)\n" + 
			"	new X().<String> c(s, s);\n" + 
			"	                 ^\n" + 
			"The method c(String, String) of type X is not generic; it cannot be parameterized with arguments <String>\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 7)\n" + 
			"	new X().<String> d(s, s);\n" + 
			"	                 ^\n" + 
			"The method d(String, Object) of type X is not generic; it cannot be parameterized with arguments <String>\n" + 
			"----------\n");
	} else {
		runConformTest(
			true,
			sources,
			"----------\n" +
			"1. WARNING in X.java (at line 4)\n" + 
			"	new X().<String> a(s);\n" + 
			"	         ^^^^^^\n" + 
			"Unused type arguments for the non generic method a(String) of type X; it should not be parameterized with arguments <String>\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 5)\n" + 
			"	new X().<String> b(s, s);\n" + 
			"	         ^^^^^^\n" + 
			"Unused type arguments for the non generic method b(String, Object) of type X; it should not be parameterized with arguments <String>\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 6)\n" + 
			"	new X().<String> c(s, s);\n" + 
			"	         ^^^^^^\n" + 
			"Unused type arguments for the non generic method c(String, String) of type X; it should not be parameterized with arguments <String>\n" + 
			"----------\n" + 
			"4. WARNING in X.java (at line 7)\n" + 
			"	new X().<String> d(s, s);\n" + 
			"	         ^^^^^^\n" + 
			"Unused type arguments for the non generic method d(String, Object) of type X; it should not be parameterized with arguments <String>\n" + 
			"----------\n",
			null, null,
			JavacTestOptions.Excuse.EclipseHasSomeMoreWarnings);
	}
}

//https://bugs.eclipse.org/bugs/show_bug.cgi?id=207299
public void test1204() {
	this.runConformTest(
		new String[] {
			"ExpressionGraph.java",
			"import java.util.*;\n" +
			"public class ExpressionGraph<G extends ExpressionGraph<G, V>, V extends IVertex<G, V>> {\n" +
			"	void foo(Set<V> set, Collection<? extends V> col) {\n" +
			"		if (set == col) return;\n" +
			"	}\n" +
			"}\n" +
			"interface IVertex<G extends ExpressionGraph<G, V>, V extends IVertex<G, V>> {	\n" +
			"	// empty\n" +
			"}\n", // =================
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=207299 - variation
public void test1205() {
	this.runConformTest(
		new String[] {
			"ExpressionGraph.java",
			"import java.util.*;\n" +
			"\n" +
			"public class ExpressionGraph<G extends ExpressionGraph<G, V, L>, V extends ExpressionVertex<G, V, L>, L> extends AbstractGraph<G, V> {\n" +
			"	void foo(Set<V> set, Collection<? extends V> col) {\n" +
			"		if (set == col) return;\n" +
			"	}\n" +
			"\n" +
			"	interface IVertex<G extends ExpressionGraph<G, V, L>, V extends IVertex<G, V, L>, L> extends ExpressionVertex<G, V, L> {	\n" +
			"		// empty\n" +
			"	}\n" +
			"	static abstract class Vertex<G extends ExpressionGraph<G, V, L>, V extends IVertex<G, V, L>, L> /*extends TaggableVertex<G, V>*/ implements IVertex<G, V, L> {	\n" +
			"		// empty\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"abstract class AbstractGraph<G extends AbstractGraph<G,V>, V extends Vertex<G,V>> implements Graph<G,V> {\n" +
			"	// empty\n" +
			"}\n" +
			"interface Graph<G extends Graph<G,V>, V extends Vertex<G,V>> {	\n" +
			"	// empty\n" +
			"}\n" +
			"interface Vertex<G extends Graph<G,V>, V extends Vertex<G,V>> {\n" +
			"	// empty\n" +
			"}\n" +
			"interface ExpressionVertex<G extends Graph<G,V>, V extends ExpressionVertex<G,V,L>, L> extends Vertex<G,V> {\n" +
			"	// empty\n" +
			"}\n", // =================
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=207573
public void test1206() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public final <E extends Exception> E throwE(E ex, Object... args) throws E {\n" +
			"		Object[] oar = new Object[0];\n" +
			"		return throwE(oar, ex, args);\n" +
			"	}\n" +
			"\n" +
			"	public final <E extends Exception> E throwE(Object[] oar, E ex, Object... args) throws E {\n" +
			"		throw ex;\n" +
			"	}\n" +
			"}", // =================
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=207573 - variation
public void test1207() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"    public final <E extends Exception> E throwE (E ex) throws E {\n" +
			"    	throw ex;\n" +
			"    }\n" +
			"    void foo(Object[] objs) {\n" +
			"    	throwE(objs);\n" +
			"    }\n" +
			"}\n", // =================
		},
		this.complianceLevel < ClassFileConstants.JDK1_8 ?
		"----------\n" +
		"1. ERROR in X.java (at line 6)\n" +
		"	throwE(objs);\n" +
		"	^^^^^^\n" +
		"Bound mismatch: The generic method throwE(E) of type X is not applicable for the arguments (Object[]). The inferred type Object[] is not a valid substitute for the bounded parameter <E extends Exception>\n" +
		"----------\n" :
			"----------\n" + 
			"1. ERROR in X.java (at line 6)\n" + 
			"	throwE(objs);\n" + 
			"	^^^^^^\n" + 
			"The method throwE(E) in the type X is not applicable for the arguments (Object[])\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=207573 - variation
public void test1208() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public final <E extends Exception> E throwE2(E ex, Object... args) throws E {\n" +
			"		Object[] oar = new Object[0];\n" +
			"		return throwE(oar, ex, args);\n" +
			"	}\n" +
			"\n" +
			"	public final <E extends Exception> E throwE(Object[] oar, E ex, Object... args) throws E {\n" +
			"		throw ex;\n" +
			"	}\n" +
			"}", // =================
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=207573 - variation
public void test1209() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"    public final <E extends Exception> E throwE (E ex, Object ... args) throws E {\n" +
			"    	throw ex;\n" +
			"    }\n" +
			"    void foo(Object[] objs) {\n" +
			"    	throwE(objs);\n" +
			"    }\n" +
			"}", // =================
		},
		this.complianceLevel < ClassFileConstants.JDK1_8 ? 
		"----------\n" +
		"1. ERROR in X.java (at line 6)\n" +
		"	throwE(objs);\n" +
		"	^^^^^^\n" +
		"Bound mismatch: The generic method throwE(E, Object...) of type X is not applicable for the arguments (Object[]). The inferred type Object[] is not a valid substitute for the bounded parameter <E extends Exception>\n" +
		"----------\n" :
			"----------\n" + 
			"1. ERROR in X.java (at line 6)\n" + 
			"	throwE(objs);\n" + 
			"	^^^^^^\n" + 
			"The method throwE(E, Object...) in the type X is not applicable for the arguments (Object[])\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=207573 - variation
// FAIL ERRMSG
public void test1210() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"    public final <E extends Exception> E throwE (Object ... args) throws E {\n" +
			"    	return null;\n" +
			"    }\n" +
			"    void foo(Object[] objs) {\n" +
			"    	Object[] o  = throwE(objs);\n" +
			"    }\n" +
			"}\n", // =================
		},
		(this.complianceLevel < ClassFileConstants.JDK1_8 ?
		"----------\n" + 
		"1. ERROR in X.java (at line 6)\n" + 
		"	Object[] o  = throwE(objs);\n" + 
		"	              ^^^^^^\n" + 
		"Bound mismatch: The generic method throwE(Object...) of type X is not applicable for the arguments (Object[]). The inferred type Object[]&Exception is not a valid substitute for the bounded parameter <E extends Exception>\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 6)\n" + 
		"	Object[] o  = throwE(objs);\n" + 
		"	              ^^^^^^^^^^^^\n" + 
		"Type mismatch: cannot convert from Object[]&Exception to Object[]\n" + 
		"----------\n"
		:
		"----------\n" + 
		"1. ERROR in X.java (at line 6)\n" + 
		"	Object[] o  = throwE(objs);\n" + 
		"	              ^^^^^^^^^^^^\n" + 
		"Type mismatch: cannot convert from RuntimeException to Object[]\n" + 
		"----------\n"));
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=208030
public void test1211() {
	if (this.complianceLevel < ClassFileConstants.JDK1_7) {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public X(String t){\n" +
				"		System.out.println(t);\n" +
				"		Zork z;\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		class Local extends X {\n" +
				"			Local() {\n" +
				"				<String>super(\"FAILED\");\n" +
				"			}\n" +
				"		};\n" +
				"		new <String>Local();\n" +
				"		new <String>Local(){};\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 9)\n" +
			"	<String>super(\"FAILED\");\n" +
			"	        ^^^^^^^^^^^^^^^^\n" +
			"The constructor X(String) of type X is not generic; it cannot be parameterized with arguments <String>\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 12)\n" +
			"	new <String>Local();\n" +
			"	^^^^^^^^^^^^^^^^^^^\n" +
			"The constructor Local() of type Local is not generic; it cannot be parameterized with arguments <String>\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 13)\n" +
			"	new <String>Local(){};\n" +
			"	^^^^^^^^^^^^^^^^^^^^^\n" +
			"The constructor Local() of type Local is not generic; it cannot be parameterized with arguments <String>\n" +
			"----------\n");
		return;
	}
	this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"	public X(String t){\n" +
				"		System.out.println(t);\n" +
				"		Zork z;\n" +
				"	}\n" +
				"	public static void main(String[] args) {\n" +
				"		class Local extends X {\n" +
				"			Local() {\n" +
				"				<String>super(\"FAILED\");\n" +
				"			}\n" +
				"		};\n" +
				"		new <String>Local();\n" +
				"		new <String>Local(){};\n" +
				"	}\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 4)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 9)\n" +
			"	<String>super(\"FAILED\");\n" +
			"	 ^^^^^^\n" +
			"Unused type arguments for the non generic constructor X(String) of type X; it should not be parameterized with arguments <String>\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 12)\n" +
			"	new <String>Local();\n" +
			"	     ^^^^^^\n" +
			"Unused type arguments for the non generic constructor Local() of type Local; it should not be parameterized with arguments <String>\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 13)\n" +
			"	new <String>Local(){};\n" +
			"	     ^^^^^^\n" +
			"Unused type arguments for the non generic constructor Local() of type Local; it should not be parameterized with arguments <String>\n" +
			"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=77918
// generic variants
public void test1212() {
	Map customOptions = getCompilerOptions();
	customOptions.put(CompilerOptions.OPTION_ReportRedundantSuperinterface,  CompilerOptions.ERROR);
	runNegativeTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"X.java",
			"public class X<T> implements I<T> {}\n" +
			"class Y<T extends Z> extends X<T> implements I<T>, J {}\n" +
			"class Z {}" +
			"interface I <T> {}\n" +
			"interface J {}\n"
		},
		// compiler options
		null /* no class libraries */,
		customOptions /* custom options */,
		// compiler results
		"----------\n" + /* expected compiler log */
		"1. ERROR in X.java (at line 2)\n" +
		"	class Y<T extends Z> extends X<T> implements I<T>, J {}\n" +
		"	                                             ^\n" +
		"Redundant superinterface I<T> for the type Y<T>, already defined by X<T>\n" +
		"----------\n",
		// javac options
		JavacTestOptions.SKIP /* skip javac tests - configured eclipse specific warning as error */);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=77918
// generic variants - the 'different arguments' error overrides the
// redundant error
public void test1213() {
	Map customOptions = getCompilerOptions();
	customOptions.put(CompilerOptions.OPTION_ReportRedundantSuperinterface, CompilerOptions.ERROR);
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T> implements I<T> {}\n" +
			"class Y<T extends Z, U extends T> extends X<T> implements I<U>, J {}\n" +
			"class Z {}" +
			"interface I <T> {}\n" +
			"interface J {}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 2)\n" +
		"	class Y<T extends Z, U extends T> extends X<T> implements I<U>, J {}\n" +
		"	      ^\n" +
		"The interface I cannot be implemented more than once with different arguments: I<T> and I<U>\n" +
		"----------\n",
		null /* no extra class libraries */,
		true /* flush output directory */,
		customOptions);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=208873
public void test1214() {
	runConformTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"X.java",
			"public class X {\n" +
			"	public interface Loader {\n" +
			"		public <T extends Integer, K extends String> T load(final K key);\n" +
			"	}\n" +
			"	Loader loader;\n" +
			"	public <K extends String, T extends Integer> T get(final K key) {\n" +
			"		T data = this.loader.load(key);\n" +
			"		return null;\n" +
			"	}\n" +
			"}\n", // =================
		},
		// compiler results
		null /* do not check compiler log */,
		// runtime results
		"" /* expected output string */,
		"" /* expected error string */,
		// javac options
		JavacTestOptions.JavacHasABug.JavacBug5042462 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=208873 - variation
public void test1215() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"public class X {\n" +
			"    <T, U extends T, V extends T> T cond1(boolean z, U x1, V x2) {\n" +
			"        return (z? x1: x2);\n" +
			"    }\n" +
			"}\n",
		},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBug5042462 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=209153
public void test1216() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		p.A myA = new p.A();\n" +
			"		myA.p = myA.box.get(); // [msgSend] generic cast to P -> error\n" +
			"		Object o = myA.box.get(); // ok, since no generic cast actually inserted\n" +
			"		myA.p = myA.getBox().t;// [fieldRef] generic cast to P -> error\n" +
			"		myA.p = myA.box.t;// [qName] generic cast to P -> error\n" +
			"		int pval = myA.box.t.pval;// intermediate access through P already flagged as error\n" +
			"	}\n" +
			"}\n",
			"p/A.java",
			"package p;\n" +
			"public class A {\n" +
			"	public static class Box<T> {\n" +
			"		public T t;\n" +
			"		public void set(T t) { this.t = t; }\n" +
			"		public T get()	{ return this.t; }\n" +
			"	}\n" +
			"	private class P {\n" +
			"		public int pval;\n" +
			"	}\n" +
			"	public P p;\n" +
			"	public Box<P> box;\n" +
			"	public Box<P> getBox() { return this.box; }\n" +
			"	public A next;\n" +
			"	public A getNext() { return this;} \n" +
			"	public A() {\n" +
			"		this.box = new Box<P>();\n" +
			"		this.box.set(new P());\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	myA.p = myA.box.get(); // [msgSend] generic cast to P -> error\n" +
		"	        ^^^^^^^^^^^^^\n" +
		"The type A.P is not visible\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 6)\n" +
		"	myA.p = myA.getBox().t;// [fieldRef] generic cast to P -> error\n" +
		"	        ^^^^^^^^^^^^^^\n" +
		"The type A.P is not visible\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 7)\n" +
		"	myA.p = myA.box.t;// [qName] generic cast to P -> error\n" +
		"	        ^^^\n" +
		"The type A.P is not visible\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 8)\n" +
		"	int pval = myA.box.t.pval;// intermediate access through P already flagged as error\n" +
		"	           ^^^^^^^^^\n" +
		"The type A.P is not visible\n" +
		"----------\n" +
		(isMinimumCompliant(ClassFileConstants.JDK11) ? "" :
		"----------\n" +
		"1. WARNING in p\\A.java (at line 18)\n" +
		"	this.box.set(new P());\n" +
		"	             ^^^^^^^\n" +
		"Access to enclosing constructor A.P() is emulated by a synthetic accessor method\n" +
		"----------\n"));
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=209153 - variation
public void test1217() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		p.A myA = new p.A();\n" +
			"		myA.p = myA.box.get(); // [msgSend] generic cast to P -> error\n" +
			"		Object o = myA.box.get(); // ok, since no generic cast actually inserted\n" +
			"		myA.p = myA.getBox().t;// [fieldRef] generic cast to P -> error\n" +
			"		myA.p = myA.box.t;// [qName] generic cast to P -> error\n" +
			"		int pval = myA.box.t.pval;// intermediate access through P already flagged as error\n" +
			"	}\n" +
			"}\n",
			"p/A.java",
			"package p;\n" +
			"public class A {\n" +
			"	public static class Box<T> {\n" +
			"		public T t;\n" +
			"		public void set(T t) { this.t = t; }\n" +
			"		public T get()	{ return this.t; }\n" +
			"	}\n" +
			"	protected class P {\n" +
			"		public int pval;\n" +
			"	}\n" +
			"	public P p;\n" +
			"	public Box<P> box;\n" +
			"	public Box<P> getBox() { return this.box; }\n" +
			"	public A next;\n" +
			"	public A getNext() { return this;} \n" +
			"	public A() {\n" +
			"		this.box = new Box<P>();\n" +
			"		this.box.set(new P());\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	myA.p = myA.box.get(); // [msgSend] generic cast to P -> error\n" +
		"	        ^^^^^^^^^^^^^\n" +
		"The type A.P is not visible\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 6)\n" +
		"	myA.p = myA.getBox().t;// [fieldRef] generic cast to P -> error\n" +
		"	        ^^^^^^^^^^^^^^\n" +
		"The type A.P is not visible\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 7)\n" +
		"	myA.p = myA.box.t;// [qName] generic cast to P -> error\n" +
		"	        ^^^\n" +
		"The type A.P is not visible\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 8)\n" +
		"	int pval = myA.box.t.pval;// intermediate access through P already flagged as error\n" +
		"	           ^^^^^^^^^\n" +
		"The type A.P is not visible\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=209153 - variation
public void test1218() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		p.A myA = new p.A();\n" +
			"		myA.p = myA.box.get(); // [msgSend] generic cast to P -> error\n" +
			"		Object o = myA.box.get(); // ok, since no generic cast actually inserted\n" +
			"		myA.p = myA.getBox().t;// [fieldRef] generic cast to P -> error\n" +
			"		myA.p = myA.box.t;// [qName] generic cast to P -> error\n" +
			"		int pval = myA.box.t.pval;// intermediate access through P already flagged as error\n" +
			"	}\n" +
			"}\n",
			"p/A.java",
			"package p;\n" +
			"public class A {\n" +
			"	public static class Box<T> {\n" +
			"		public T t;\n" +
			"		public void set(T t) { this.t = t; }\n" +
			"		public T get()	{ return this.t; }\n" +
			"	}\n" +
			"	class P {\n" +
			"		public int pval;\n" +
			"	}\n" +
			"	public P p;\n" +
			"	public Box<P> box;\n" +
			"	public Box<P> getBox() { return this.box; }\n" +
			"	public A next;\n" +
			"	public A getNext() { return this;} \n" +
			"	public A() {\n" +
			"		this.box = new Box<P>();\n" +
			"		this.box.set(new P());\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 4)\n" +
		"	myA.p = myA.box.get(); // [msgSend] generic cast to P -> error\n" +
		"	        ^^^^^^^^^^^^^\n" +
		"The type A.P is not visible\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 6)\n" +
		"	myA.p = myA.getBox().t;// [fieldRef] generic cast to P -> error\n" +
		"	        ^^^^^^^^^^^^^^\n" +
		"The type A.P is not visible\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 7)\n" +
		"	myA.p = myA.box.t;// [qName] generic cast to P -> error\n" +
		"	        ^^^\n" +
		"The type A.P is not visible\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 8)\n" +
		"	int pval = myA.box.t.pval;// intermediate access through P already flagged as error\n" +
		"	           ^^^^^^^^^\n" +
		"The type A.P is not visible\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=209779
public void test1219() {
	runConformTest(
		// test directory preparation
		true /* flush output directory */,
		new String[] { /* test files */
			"X.java",
			"import java.util.ArrayList;\n" +
			"import java.util.List;\n" +
			"\n" +
			"public class X {\n" +
			"	public static void main(String[] args) {\n" +
			"		final List<String> stringList = new ArrayList<String>();\n" +
			"		stringList.add(\"test1\");\n" +
			"		stringList.add(\"test2\");\n" +
			"		((List) stringList).add(new Integer(1000));\n" +
			"		try {\n" +
			"			Object o = stringList.get(2);\n" +
			"		} catch (ClassCastException e) {\n" +
			"			System.out.print(\"[ClassCastException1]\");\n" +
			"		}\n" +
			"		try {\n" +
			"			String s = stringList.get(2);\n" +
			"		} catch (ClassCastException e) {\n" +
			"			System.out.print(\"[ClassCastException2]\");\n" +
			"		}		\n" +
			"		try {\n" +
			"			for (Object obj : stringList) {\n" +
			"				System.out.print(obj);\n" +
			"			}\n" +
			"		} catch (ClassCastException e) {\n" +
			"			System.out.print(\"[ClassCastException3]\");\n" +
			"		}		\n" +
			"		try {\n" +
			"			for (String str : stringList) {\n" +
			"				System.out.print(str);\n" +
			"			}\n" +
			"		} catch (ClassCastException e) {\n" +
			"			System.out.print(\"[ClassCastException4]\");\n" +
			"		}\n" +
			"		System.out.println();\n" +
			"	}\n" +
			"}\n"
		},
		// compiler results
		null /* do not check compiler log */,
		// runtime results
		"[ClassCastException2]test1test21000test1test2[ClassCastException4]" /* expected output string */,
		"" /* expected error string */,
		// javac options
		JavacTestOptions.JavacHasABug.JavacBug6500701 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=209152
public void test1220() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.List;\n" +
			"\n" +
			"public class X {\n" +
			"        public static void doIt(List<?> list) {\n" +
			"                list.add(list.remove(0));\n" +
			"        }\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	list.add(list.remove(0));\n" +
		"	     ^^^\n" +
		"The method add(capture#1-of ?) in the type List<capture#1-of ?> is not applicable for the arguments (capture#2-of ?)\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=209071
public void test1221() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"public class X {\n" +
			"	void foo() {\n" +
			"		Set<List> listSet = new HashSet<List>();\n" +
			"		Set<List> otherListSet = new HashSet<List>();\n" +
			"		otherListSet.add((List) listSet);		\n" +
			"	}\n" +
			"	void bar() {\n" +
			"		Set<String> stringSet = new HashSet<String>();\n" +
			"		Set<String> otherStringSet = new HashSet<String>();\n" +
			"		otherStringSet.add((String) stringSet);		\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		new X().foo();\n" +
			"		new X().bar();\n" +
			"	}\n" +
			"}	\n"
		},
		"----------\n" +
		"1. WARNING in X.java (at line 4)\n" +
		"	Set<List> listSet = new HashSet<List>();\n" +
		"	    ^^^^\n" +
		"List is a raw type. References to generic type List<E> should be parameterized\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 4)\n" +
		"	Set<List> listSet = new HashSet<List>();\n" +
		"	                                ^^^^\n" +
		"List is a raw type. References to generic type List<E> should be parameterized\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 5)\n" +
		"	Set<List> otherListSet = new HashSet<List>();\n" +
		"	    ^^^^\n" +
		"List is a raw type. References to generic type List<E> should be parameterized\n" +
		"----------\n" +
		"4. WARNING in X.java (at line 5)\n" +
		"	Set<List> otherListSet = new HashSet<List>();\n" +
		"	                                     ^^^^\n" +
		"List is a raw type. References to generic type List<E> should be parameterized\n" +
		"----------\n" +
		"5. WARNING in X.java (at line 6)\n" +
		"	otherListSet.add((List) listSet);		\n" +
		"	                  ^^^^\n" +
		"List is a raw type. References to generic type List<E> should be parameterized\n" +
		"----------\n" +
		"6. ERROR in X.java (at line 11)\n" +
		"	otherStringSet.add((String) stringSet);		\n" +
		"	                   ^^^^^^^^^^^^^^^^^^\n" +
		"Cannot cast from Set<String> to String\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=207959
public void test1222() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T extends Zork & Runnable> {\n" +
			"  T get() { return null; }\n" +
			"  void foo2(X<T> x2) {\n" +
			"	    Runnable r = x2.get();\n" +
			"	  }  \n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 1)\n" +
		"	public class X<T extends Zork & Runnable> {\n" +
		"	                         ^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=211718
public void test1223() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.Arrays;\n" +
			"import java.util.List;\n" +
			"public class X<E> {\n" +
			"    public static enum IsABug {\n" +
			"        TRUE,\n" +
			"        FALSE;\n" +
			"    }   \n" +
			"    public List<IsABug> getPossibleBugStates() {\n" +
			"    	String s1 = IsABug.values();\n" +
			"    	String s2 = IsABug.valueOf(s1);\n" +
			"        return Arrays.asList(IsABug.values());\n" +
			"    }\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 9)\n" +
		"	String s1 = IsABug.values();\n" +
		"	            ^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from X.IsABug[] to String\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 10)\n" +
		"	String s2 = IsABug.valueOf(s1);\n" +
		"	            ^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from X.IsABug to String\n" +
		"----------\n");
}
public void test1224() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.Collection;\n" +
			"import java.util.Collections;\n" +
			"public class X {\n" +
			"	class Request<R extends Request<R, V>,V> {}\n" +
			"	class RequestMap {\n" +
			"		public <R extends Request<R, W>,W> R intersection (Collection<R> c) {\n" +
			"			return null;\n" +
			"		}\n" +
			"	}\n" +
			"	class DeltaRequest extends Request<DeltaRequest,double[]> {}\n" +
			"	public void test () {\n" +
			"		RequestMap m = new RequestMap ();\n" +
			"		Collection<DeltaRequest> c = Collections.singleton (new DeltaRequest ());\n" +
			"		DeltaRequest o = m.intersection (c);\n" +
			"	}\n" +
			"}\n"
		},
		"");
}
public void test1225() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"import java.util.Collection;\n" +
			"import java.util.List;\n" +
			"public class X {\n" +
			"   static <B> void m(List<? super B> list, Collection<? super B> coll) {\n" +
			"     m(list, coll);\n" +
			"   }\n" +
			"}\n"
		},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_7 /* javac test options */);
}
public void test1226() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" +
			"	class M {\n" +
			"		X<T> foo() { return null; }\n" +
			"	}\n" +
			"	void bar(M m) {\n" +
			"		X<T> xt = m.foo();\n" + // no unchecked warning
			"		Zork z;\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" +
		"1. ERROR in X.java (at line 7)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
public void test1227() {
	if (this.complianceLevel >= ClassFileConstants.JDK1_7) return;
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.Arrays;\n" +
			"public class  X {\n" +
			"	void foo() {\n" +
			"		Arrays.asList(String.class, Integer.class);\n" +
			"	}\n" +
			"	Zork z;\n" +
			"}\n"
		},
		"----------\n" +
		"1. WARNING in X.java (at line 4)\n" +
		"	Arrays.asList(String.class, Integer.class);\n" +
		"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: A generic array of Class<? extends Object&Serializable&"+ intersection("Comparable<?>") +"> is created for a varargs parameter\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 6)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=214972
public void test1228()  throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<U extends Class> {\n" +
			"	public <Y> X(Y b1, U b2) {\n" +
			"	}\n" +
			"	public class Binner {\n" +
			"		public class BinnerInner<I> {\n" +
			"			public <J> BinnerInner<J> $new$() {\n" +
			"				return new BinnerInner<J>();\n" +
			"			}\n" +
			"		}\n" +
			"	}\n" +
			"}\n"
		},
		"");
	// check $new$ method generic signature
	String expectedOutput =
		"  // Method descriptor #22 ()LX$Binner$BinnerInner;\n" +
		"  // Signature: <J:Ljava/lang/Object;>()LX<TU;>.Binner.BinnerInner<TJ;>;\n" +
		"  // Stack: 3, Locals: 1\n" +
		"  public X.Binner.BinnerInner $new$();\n" +
		"     0  new X$Binner$BinnerInner [1]\n" +
		"     3  dup\n" +
		"     4  aload_0 [this]\n" +
		"     5  getfield X$Binner$BinnerInner.this$1 : X.Binner [10]\n" +
		"     8  invokespecial X$Binner$BinnerInner(X$Binner) [25]\n" +
		"    11  areturn\n" +
		"      Line numbers:\n" +
		"        [pc: 0, line: 7]\n" +
		"      Local variable table:\n" +
		"        [pc: 0, pc: 12] local: this index: 0 type: X.Binner.BinnerInner\n" +
		"      Local variable type table:\n" +
		"        [pc: 0, pc: 12] local: this index: 0 type: X<U>.Binner.BinnerInner<I>\n";

	File f = new File(OUTPUT_DIR + File.separator + "X$Binner$BinnerInner.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=214972 - variation
public void test1229() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<U extends Class> {\n" +
			"	public <Y> X(Y b1, U b2) {\n" +
			"	}\n" +
			"	public class Binner {\n" +
			"		public class BinnerInner<I> {\n" +
			"			public <J> BinnerInner<J> $new$() {\n" +
			"				return new BinnerInner<J>();\n" +
			"			}\n" +
			"			X<U> root() {\n" +
			"				return X.this;\n" +
			"			}\n" +
			"		}\n" +
			"	}\n" +
			"}\n",
			"Z.java",
			"public class Z {\n" +
			"	public static void main(String[] args) {\n" +
			"		X<Class>.Binner.BinnerInner<String> binString = new X<Class>(null, null).new Binner().new BinnerInner<String>();\n" +
			"		String s = binString.$new$().root();\n" +
			"	}\n" +
			"}\n"
		},
		"----------\n" +
		"1. WARNING in X.java (at line 1)\n" +
		"	public class X<U extends Class> {\n" +
		"	                         ^^^^^\n" +
		"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 1)\n" +
		"	public class X<U extends Class> {\n" +
		"	                         ^^^^^\n" +
		"The type parameter U should not be bounded by the final type Class. Final types cannot be further extended\n" +
		"----------\n" +
		"----------\n" +
		"1. WARNING in Z.java (at line 3)\n" +
		"	X<Class>.Binner.BinnerInner<String> binString = new X<Class>(null, null).new Binner().new BinnerInner<String>();\n" +
		"	  ^^^^^\n" +
		"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
		"----------\n" +
		"2. WARNING in Z.java (at line 3)\n" +
		"	X<Class>.Binner.BinnerInner<String> binString = new X<Class>(null, null).new Binner().new BinnerInner<String>();\n" +
		"	                                                      ^^^^^\n" +
		"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
		"----------\n" +
		"3. ERROR in Z.java (at line 4)\n" +
		"	String s = binString.$new$().root();\n" +
		"	           ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from X<Class> to String\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=214972 - variation
public void test1230() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<U extends Class> {\n" +
			"	public <Y> X(Y b1, U b2) {\n" +
			"	}\n" +
			"	public class Binner {\n" +
			"		public class BinnerInner<I> {\n" +
			"			public <J> BinnerInner<J> $new$() {\n" +
			"				return new BinnerInner<J>();\n" +
			"			}\n" +
			"			X<U> root() {\n" +
			"				return X.this;\n" +
			"			}\n" +
			"		}\n" +
			"	}\n" +
			"}\n",
		},
		"");
	this.runNegativeTest(
			new String[] {
				"Z.java",
				"public class Z {\n" +
				"	public static void main(String[] args) {\n" +
				"		X<Class>.Binner.BinnerInner<String> binString = new X<Class>(null, null).new Binner().new BinnerInner<String>();\n" +
				"		String s = binString.$new$().root();\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" +
			"1. WARNING in Z.java (at line 3)\n" +
			"	X<Class>.Binner.BinnerInner<String> binString = new X<Class>(null, null).new Binner().new BinnerInner<String>();\n" +
			"	  ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in Z.java (at line 3)\n" +
			"	X<Class>.Binner.BinnerInner<String> binString = new X<Class>(null, null).new Binner().new BinnerInner<String>();\n" +
			"	                                                      ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"3. ERROR in Z.java (at line 4)\n" +
			"	String s = binString.$new$().root();\n" +
			"	           ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from X<Class> to String\n" +
			"----------\n",
			null,
			false,
			null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=214972 - variation
public void test1231() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<U extends Class> {\n" +
			"	public <Y> X(Y b1, U b2) {\n" +
			"	}\n" +
			"	public class Binner {\n" +
			"		public class BinnerInner<I> {\n" +
			"			public <J> BinnerInner<J> $new$() {\n" +
			"				return new BinnerInner<J>();\n" +
			"			}\n" +
			"			X<U> root() {\n" +
			"				return X.this;\n" +
			"			}\n" +
			"		}\n" +
			"	}\n" +
			"}\n",
		},
		"");
	this.runConformTest(
			new String[] {
				"Z.java",
				"public class Z {\n" +
				"	public static void main(String[] args) {\n" +
				"		X<Class>.Binner.BinnerInner<String> binString = new X<Class>(null, null).new Binner().new BinnerInner<String>();\n" +
				"		X<Class>.Binner.BinnerInner<Number> binNumber = binString.$new$();\n" +
				"	}\n" +
				"}\n"
			},
			"",
			null,
			false,
			null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=215843
public void test1232() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void testCovariant(SubInterface sub1, SubInterface sub2) {\n" +
			"		SubInterface sub3 = sub1.and(sub2);\n" +
			"	}\n" +
			"	public interface SuperInterface<E> {\n" +
			"		public Number getNumber();\n" +
			"		public SuperInterface<E> and(SuperInterface<E> a);\n" +
			"	}\n" +
			"	public interface SubInterface extends SuperInterface {\n" +
			"		public Integer getNumber();\n" +
			"		public SubInterface and(SuperInterface s);\n" +
			"	}\n" +
			"}\n",
		},
		"");

}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=215843 - variation
public void test1233() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void testCovariant(SubInterface<String> sub1, SubInterface<String> sub2) {\n" +
			"		SubInterface<String> sub3 = sub1.and(sub2);\n" +
			"	}\n" +
			"	public interface SuperInterface<E> {\n" +
			"		public Number getNumber();\n" +
			"		public SuperInterface<E> and(SuperInterface<E> a);\n" +
			"	}\n" +
			"	public interface SubInterface<F> extends SuperInterface<F> {\n" +
			"		public Integer getNumber();\n" +
			"		public SubInterface<F> and(SuperInterface<F> s);\n" +
			"	}\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=215843 - variation
public void test1234() {
	this.runNegativeTest(
		false /* skipJavac */,
		JavacTestOptions.EclipseHasABug.EclipseBug427719,
		new String[] {
			"X.java",
			"public class X { \n" +
			"	void a3(G x) {} \n" +
			"	<T extends F<X>> void a3(T x) {}\n" +
			"\n" +
			"	public static void ambiguousCases() { \n" +
			"		H<X> hx = null;\n" +
			"		H hraw = null;\n" +
			"		new X().a3(hx);\n" +
			"		new X().a3(hraw);\n" +
			"	} \n" +
			"}\n" +
			"class F<T1> {}  \n" +
			"class G<T2> extends F<T2> {}\n" +
			"class H<T3> extends G<T3> {}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 2)\n" +
		"	void a3(G x) {} \n" +
		"	        ^\n" +
		"G is a raw type. References to generic type G<T2> should be parameterized\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 7)\n" +
		"	H hraw = null;\n" +
		"	^\n" +
		"H is a raw type. References to generic type H<T3> should be parameterized\n" +
		"----------\n" +
		(this.complianceLevel < ClassFileConstants.JDK1_8 ?
		"3. ERROR in X.java (at line 8)\n" +
		"	new X().a3(hx);\n" +
		"	        ^^\n" +
		"The method a3(G) is ambiguous for the type X\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 9)\n" +
		"	new X().a3(hraw);\n" +
		"	        ^^\n" +
		"The method a3(G) is ambiguous for the type X\n" +
		"----------\n"
		: // not ambiguous in 1.8
		""));
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=215843 - variation
public void test1235() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X { \n" +
			"	<T extends G<X>> void a3(T x) {}\n" +
			"	<T extends F<X>> void a3(T x) {}\n" +
			"\n" +
			"	public static void ambiguousCases() { \n" +
			"		H<X> hx = null;\n" +
			"		H hraw = null;\n" +
			"		new X().a3(hx);\n" +
			"		new X().a3(hraw);\n" +
			"	} \n" +
			"}\n" +
			"class F<T1> {}  \n" +
			"class G<T2> extends F<T2> {}\n" +
			"class H<T3> extends G<T3> {}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=215843 - variation
public void test1236() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void testCovariant(SubInterface sub1, SubInterface sub2) {\n" +
			"		SubInterface sub3 = sub1.and(sub2);\n" +
			"	}\n" +
			"	public interface SuperInterface<E> {\n" +
			"		public Number getNumber();\n" +
			"		public SuperInterface<E> and(SuperInterface<E> a);\n" +
			"	}\n" +
			"	public interface SubInterface extends SuperInterface, OtherSubInterface {\n" +
			"		public Integer getNumber();\n" +
			"		public SubInterface and(SuperInterface s);\n" +
			"	}\n" +
			"	public interface OtherSubInterface<U> extends SuperInterface<U> {\n" +
			"		public OtherSubInterface<U> and(SuperInterface<U> a);\n" +
			"	}\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=215843 - variation
public void test1237() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void testCovariant(SubInterface sub1, SubInterface sub2) {\n" +
			"		SubInterface sub3 = sub1.and(sub2);\n" +
			"	}\n" +
			"	public interface SuperInterface<E> {\n" +
			"		public Number getNumber();\n" +
			"		public SuperInterface<E> and(SuperInterface<E> a);\n" +
			"	}\n" +
			"	public interface SubInterface extends SuperInterface, OtherSubInterface {\n" +
			"	}\n" +
			"	public interface OtherSubInterface<U> extends SuperInterface<U> {\n" +
			"		public OtherSubInterface<U> and(SuperInterface<U> a);\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. WARNING in X.java (at line 3)\n" +
		"	SubInterface sub3 = sub1.and(sub2);\n" +
		"	                    ^^^^^^^^^^^^^^\n" +
		"Type safety: The method and(X.SuperInterface) belongs to the raw type X.OtherSubInterface. References to generic type X.OtherSubInterface<U> should be parameterized\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 3)\n" +
		"	SubInterface sub3 = sub1.and(sub2);\n" +
		"	                    ^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from X.OtherSubInterface to X.SubInterface\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 9)\n" +
		"	public interface SubInterface extends SuperInterface, OtherSubInterface {\n" +
		"	                                      ^^^^^^^^^^^^^^\n" +
		"X.SuperInterface is a raw type. References to generic type X.SuperInterface<E> should be parameterized\n" +
		"----------\n" +
		"4. WARNING in X.java (at line 9)\n" +
		"	public interface SubInterface extends SuperInterface, OtherSubInterface {\n" +
		"	                                                      ^^^^^^^^^^^^^^^^^\n" +
		"X.OtherSubInterface is a raw type. References to generic type X.OtherSubInterface<U> should be parameterized\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=215843 - variation
public void test1238() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void testCovariant(SubInterface sub1, SubInterface sub2) {\n" +
			"		SubInterface sub3 = sub1.and(sub2);\n" +
			"	}\n" +
			"	public interface SuperInterface<E> {\n" +
			"		public Number getNumber();\n" +
			"		public SuperInterface<E> and(SuperInterface<E> a);\n" +
			"	}\n" +
			"	public interface SubInterface extends SuperInterface, OtherSubInterface {\n" +
			"	}\n" +
			"	public interface OtherSubInterface extends SuperInterface {\n" +
			"		public OtherSubInterface and(SuperInterface a);\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	SubInterface sub3 = sub1.and(sub2);\n" +
		"	                    ^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from X.OtherSubInterface to X.SubInterface\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 9)\n" +
		"	public interface SubInterface extends SuperInterface, OtherSubInterface {\n" +
		"	                                      ^^^^^^^^^^^^^^\n" +
		"X.SuperInterface is a raw type. References to generic type X.SuperInterface<E> should be parameterized\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 11)\n" +
		"	public interface OtherSubInterface extends SuperInterface {\n" +
		"	                                           ^^^^^^^^^^^^^^\n" +
		"X.SuperInterface is a raw type. References to generic type X.SuperInterface<E> should be parameterized\n" +
		"----------\n" +
		"4. WARNING in X.java (at line 12)\n" +
		"	public OtherSubInterface and(SuperInterface a);\n" +
		"	                             ^^^^^^^^^^^^^^\n" +
		"X.SuperInterface is a raw type. References to generic type X.SuperInterface<E> should be parameterized\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=215843 - variation
public void test1239() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void testCovariant(CombinedSubInterface sub1, SubInterface sub2) {\n" +
			"		SubInterface sub3 = sub1.and(sub2);\n" +
			"	}\n" +
			"	public interface SuperInterface<E> {\n" +
			"		public Number getNumber();\n" +
			"		public SuperInterface<E> and(SuperInterface<E> a);\n" +
			"	}\n" +
			"	public interface SubInterface extends SuperInterface {\n" +
			"		public Integer getNumber();\n" +
			"		public SubInterface and(SuperInterface s);\n" +
			"	}\n" +
			"	public interface CombinedSubInterface extends SubInterface, OtherSubInterface {}\n" +
			"	\n" +
			"	public interface OtherSubInterface extends SuperInterface {\n" +
			"		public OtherSubInterface and(SuperInterface a);\n" +
			"	}\n" +
			"}\n",
		},
		"----------\n" +
		"1. ERROR in X.java (at line 3)\n" +
		"	SubInterface sub3 = sub1.and(sub2);\n" +
		"	                         ^^^\n" +
		"The method and(X.SuperInterface) is ambiguous for the type X.CombinedSubInterface\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 9)\n" +
		"	public interface SubInterface extends SuperInterface {\n" +
		"	                                      ^^^^^^^^^^^^^^\n" +
		"X.SuperInterface is a raw type. References to generic type X.SuperInterface<E> should be parameterized\n" +
		"----------\n" +
		"3. WARNING in X.java (at line 11)\n" +
		"	public SubInterface and(SuperInterface s);\n" +
		"	                        ^^^^^^^^^^^^^^\n" +
		"X.SuperInterface is a raw type. References to generic type X.SuperInterface<E> should be parameterized\n" +
		"----------\n" +
		"4. ERROR in X.java (at line 13)\n" +
		"	public interface CombinedSubInterface extends SubInterface, OtherSubInterface {}\n" +
		"	                 ^^^^^^^^^^^^^^^^^^^^\n" +
		"The return types are incompatible for the inherited methods X.SubInterface.and(X.SuperInterface), X.OtherSubInterface.and(X.SuperInterface)\n" +
		"----------\n" +
		"5. WARNING in X.java (at line 15)\n" +
		"	public interface OtherSubInterface extends SuperInterface {\n" +
		"	                                           ^^^^^^^^^^^^^^\n" +
		"X.SuperInterface is a raw type. References to generic type X.SuperInterface<E> should be parameterized\n" +
		"----------\n" +
		"6. WARNING in X.java (at line 16)\n" +
		"	public OtherSubInterface and(SuperInterface a);\n" +
		"	                             ^^^^^^^^^^^^^^\n" +
		"X.SuperInterface is a raw type. References to generic type X.SuperInterface<E> should be parameterized\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=215843 - variation
public void test1240() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void testCovariant(CombinedSubInterface sub1, SubInterface sub2) {\n" +
			"		SubInterface sub3 = sub1.and(sub2);\n" +
			"	}\n" +
			"	public interface SuperInterface<E> {\n" +
			"		public Number getNumber();\n" +
			"		public SuperInterface<E> and(SuperInterface<E> a);\n" +
			"	}\n" +
			"	public interface SubInterface extends SuperInterface {\n" +
			"		public Integer getNumber();\n" +
			"		public SubInterface and(SuperInterface s);\n" +
			"	}\n" +
			"	public interface OtherSubInterface extends SubInterface {\n" +
			"		public OtherSubInterface and(SuperInterface a);\n" +
			"	}\n" +
			"	public interface CombinedSubInterface extends OtherSubInterface {}\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=215843 - variation
public void test1241() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X {\n" +
			"	public static void testCovariant(CombinedSubInterface sub1, SubInterface sub2) {\n" +
			"		CombinedSubInterface sub3 = sub1.and(sub2);\n" +
			"	}\n" +
			"	public interface SuperInterface<E> {\n" +
			"		public SuperInterface<E> and(SuperInterface<E> a);\n" +
			"	}\n" +
			"	public interface SubInterface extends SuperInterface {\n" +
			"	}\n" +
			"	public interface OtherSubInterface extends SuperInterface {\n" +
			"		public CombinedSubInterface and(SuperInterface a);\n" +
			"	}\n" +
			"	public interface CombinedSubInterface extends SubInterface, OtherSubInterface {}\n" +
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=164665
public void test1242() {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"import java.util.LinkedList;\n" +
			"import java.util.List;\n" +
			"\n" +
			"public class X {\n" +
			"	public void testCase() {\n" +
			"		TypedCollection<SuperTypeAbstractClass> collection = TypedCollectionFactory.createTypedCollection(SubTypeClass.class);\n" +
			"		collection.add(new SubTypeClass());\n" +
			"		List<SuperTypeAbstractClass> list = collection.list();\n" +
			"		assert (list.size() > 0);\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"abstract class SuperTypeAbstractClass {\n" +
			"}\n" +
			"\n" +
			"class SubTypeClass extends SuperTypeAbstractClass {\n" +
			"}\n" +
			"\n" +
			"interface TypedCollection<T> {\n" +
			"	TypedCollection<T> add(T object);\n" +
			"	List<T> list();\n" +
			"}\n" +
			"\n" +
			"class TypedCollectionFactory {\n" +
			"	public static <T, U extends T> TypedCollection<T> createTypedCollection(Class<U> c) {\n" +
			"		return new TypedCollectionImpl<T>();\n" +
			"	}\n" +
			"}\n" +
			"\n" +
			"class TypedCollectionImpl<T> implements TypedCollection<T> {\n" +
			"	private List<T> list = new LinkedList<T>();\n" +
			"	public TypedCollection<T> add(T object) {\n" +
			"		list.add(object);\n" +
			"		return (this);\n" +
			"	}\n" +
			"	public List<T> list() {\n" +
			"		return list;\n" +
			"	}\n" +
			"}\n", // =================
		},
		// javac options
		JavacTestOptions.JavacHasABug.JavacBugFixed_7 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216100
public void test1243() {
	this.runConformTest(
		new String[] {
			"eclipse/modifier/impl/EclipseModifierBug.java",
			"package eclipse.modifier.impl;\n" +
			"import eclipse.modifier.Pool;\n" +
			"public class EclipseModifierBug {\n" +
			"  static class MyEntry extends Pool.AbstractEntry<MyEntry> { }  \n" +
			"  static final Pool<MyEntry> pool=new Pool<MyEntry>() {\n" +
			"    @Override\n" +
			"    protected MyEntry delegate() {\n" +
			"      return new MyEntry();\n" +
			"    }  \n" +
			"  };\n" +
			"  public static void main(String[] args) {\n" +
			"    MyEntry entry=pool.m();  \n" +
			"  }\n" +
			"}", // =================
			"eclipse/modifier/Pool.java",
			"package eclipse.modifier;\n" +
			"public abstract class Pool<E extends Pool.Entry<E>> {\n" +
			"    static abstract class Entry<E extends Entry<E>> {\n" +
			"        E next;\n" +
			"    }\n" +
			"    static public class AbstractEntry<E extends AbstractEntry<E>> extends Entry<E> {\n" +
			"    }\n" +
			"    public E m() {\n" +
			"      return delegate();\n" +
			"    }\n" +
			"    protected abstract E delegate();\n" +
			"  }\n" +
			"\n", // =================
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216100 - variation
public void test1244() {
	runNegativeTest(
		new String[] { /* test files */
			"X.java",
			"public class X {\n" +
			"  static class MyEntry extends Pool.AbstractEntry<MyEntry> { }  \n" +
			"  static final Pool<MyEntry> pool=new Pool<MyEntry>() {\n" +
			"    @Override\n" +
			"    protected MyEntry delegate() {\n" +
			"      return new MyEntry();\n" +
			"    }  \n" +
			"  };\n" +
			"  public static void main(String[] args) {\n" +
			"    MyEntry entry=pool.m();\n" +
			"  }\n" +
			"}\n" +
			"\n" +
			"abstract class Pool<E extends Pool.Entry<E>> {\n" +
			"    private static abstract class Entry<E extends Entry<E>> {\n" +
			"        E next;\n" +
			"    }\n" +
			"    static public class AbstractEntry<E extends AbstractEntry<E>> extends Entry<E> {\n" +
			"    }\n" +
			"    public E m() {\n" +
			"        System.out.println(\"SUCCESS\");\n" +
			"      return delegate();\n" +
			"    }\n" +
			"    protected abstract E delegate();\n" +
			"}\n", // =================
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 14)\n" + 
		"	abstract class Pool<E extends Pool.Entry<E>> {\n" + 
		"	                              ^^^^^^^^^^\n" + 
		"The type Pool.Entry is not visible\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216100 - variation
public void test1245() {
	this.runNegativeTest(
		new String[] {
				"X.java",
				"public class X<T extends Secondary.Private> {\n" +
				"}\n" +
				"class Secondary {\n" +
				"	static private class Private {}\n" +
				"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 1)\n" +
		"	public class X<T extends Secondary.Private> {\n" +
		"	                         ^^^^^^^^^^^^^^^^^\n" +
		"The type Secondary.Private is not visible\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216100 - variation
public void test1246() {
	runNegativeTest(
		new String[] { /* test files */
			"X.java",
			"public class X<T extends X.Private> {\n" +
			"	static private class Private {}\n" +
			"	<U extends X.Private> void foo(U u) {}\n" +
			"}\n", // =================
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 1)\n" + 
		"	public class X<T extends X.Private> {\n" + 
		"	                         ^^^^^^^^^\n" + 
		"The type X.Private is not visible\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216558
public void test1247() {
	String xSource =
				"public class X {\n" +
				"\n" +
				"	public static void test() {\n" +
				"		Foo<?, ?> foo = null;\n" +
				"		eval(foo); // fails\n" +
				"		X.<Foo<?, ?>> eval(foo);\n" +
				"	}\n" +
				"\n" +
				"	public static <T extends Iterable<T>> void eval(T x) {\n" +
				"	}\n" +
				"	public static interface Foo<S, T> extends Iterable<Foo<?, ?>> {\n" +
				"	}\n" +
				"}";
	if (this.complianceLevel < ClassFileConstants.JDK1_8) {
		this.runNegativeTest(
			new String[] {
				"X.java",
				xSource,
			},
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	eval(foo); // fails\n" +
			"	^^^^\n" +
			"Bound mismatch: The generic method eval(T) of type X is not applicable for the arguments (X.Foo<capture#1-of ?,capture#2-of ?>). The inferred type X.Foo<capture#1-of ?,capture#2-of ?> is not a valid substitute for the bounded parameter <T extends Iterable<T>>\n" +
			"----------\n");
	} else {
		runConformTest(new String[] { "X.java", xSource });
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216558 - variation
public void test1248() {
	runConformTest(
 		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"public class X {\n" +
			"\n" +
			"	public static void test() {\n" +
			"		Foo<?, ?> foo = null;\n" +
			"		eval(foo); // fails\n" +
			"		X.<Foo<?, ?>> eval(foo);\n" +
			"	}\n" +
			"\n" +
			"	public static <T extends Iterable<T>> void eval(T x) {\n" +
			"	}\n" +
			"	public static interface Foo<S, T> extends Iterable<Foo<S,T>> {\n" +
			"	}\n" +
			"}", // =================
		},
		// javac options
		JavacTestOptions.EclipseHasABug.EclipseBug216558 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216558 - variation
public void test1249() {
	this.runConformTest(
		new String[] {
				"X.java",
				"public class X {\n" +
				"	public static void test() {\n" +
				"		Foo<?, ?> foo = null;\n" +
				"		eval(foo, foo);\n" +
				"		X.<Foo<?, ?>> eval(foo, foo);\n" +
				"	}\n" +
				"	public static <T extends Iterable<T>> void eval(T t1, T t2) {\n" +
				"	}\n" +
				"	public static interface Foo<S, T> extends Iterable<Foo<?, ?>> {\n" +
				"	}\n" +
				"}", // =================
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216565
public void test1250() {
	this.runConformTest(
		new String[] {
				"X.java",
				"import java.util.List;\n" +
				"public class X {\n" +
				"    static <T> List<T> asList(T[] x) { return null; }\n" +
				"    static interface Foo<T> {\n" +
				"        static interface Sub<T> extends Foo<T> {\n" +
				"            static List<Sub<?>> LIST = asList(ARRAY); \n" +
				"       }\n" +
				"        static Sub<?>[] ARRAY = new Sub[] { };\n" +
				"    }\n" +
				"}", // =================
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216565 - variation
public void test1251() {
	this.runConformTest(
		new String[] {
				"X.java",
				"public class X {\n" +
				"    static <T> T asList(T[] x) { return null; }\n" +
				"    static interface Foo<T> {\n" +
				"        static interface Sub<T> extends Foo<T> {\n" +
				"            static Sub<?> LIST = asList(ARRAY); \n" +
				"       }\n" +
				"        static Sub<?>[] ARRAY = new Sub[] { };\n" +
				"    }\n" +
				"}\n", // =================
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216608
public void test1252() {
	this.runNegativeTest(
		new String[] {
				"X.java",
				"public class X {\n" +
				"	Zork z;\n" +
				"	@SuppressWarnings({\"unchecked\", \"rawtypes\"})\n" +
				"	public B getB() {\n" +
				"		return new B<Object>();\n" +
				"	}\n" +
				"\n" +
				"	@SuppressWarnings(\"unused\")\n" +
				"	public void test() {\n" +
				"		C<String> c = getB().getC();\n" +
				"		String s = getB().toString();\n" +
				"	}\n" +
				"}\n" +
				"class B<S> {\n" +
				"	public C<String> getC() {\n" +
				"		return new C<String>();\n" +
				"	}\n" +
				"}\n" +
				"class C<T> {\n" +
				"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 2)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 10)\n" +
		"	C<String> c = getB().getC();\n" +
		"	              ^^^^^^^^^^^^^\n" +
		"Type safety: The expression of type C needs unchecked conversion to conform to C<String>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216608 - variation
public void test1253() {
	this.runNegativeTest(
		new String[] {
				"X.java",
				"public class X {\n" +
				"	Zork z;\n" +
				"	@SuppressWarnings(\"unchecked\")\n" +
				"	public B<?> getB() {\n" +
				"		return new B<Object>();\n" +
				"	}\n" +
				"\n" +
				"	@SuppressWarnings(\"unused\")\n" +
				"	public void test() {\n" +
				"		C<String> c = getB().getC();\n" +
				"		String s = getB().toString();\n" +
				"	}\n" +
				"}\n" +
				"class B<S> {\n" +
				"	public C<String> getC() {\n" +
				"		return new C<String>();\n" +
				"	}\n" +
				"}\n" +
				"class C<T> {\n" +
				"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 2)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216565 - variation
public void test1254() {
	this.runConformTest(
		new String[] {
				"X.java",
				" import java.util.List;\n" +
				"\n" +
				"public class X {\n" +
				"    static <T> XList<T> asList(T[] x) { return null; }\n" +
				"    static interface Foo<T> {\n" +
				"        static interface Sub<T> extends Foo<T> {\n" +
				"            static XList<Sub<String>> LIST = asList(ARRAY); \n" +
				"       }\n" +
				"        static Sub<String>[] ARRAY = new Sub[] { };\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class XList<T> {\n" +
				"}\n", // =================
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216565 - variation
public void test1255() {
	String xSource =
				" import java.util.List;\n" +
				"\n" +
				"public class X {\n" +
				"    static <T> XList<T> asList(T x) { return null; }\n" +
				"    static interface Foo<T> {\n" +
				"        static interface Sub<T> extends Foo<T> {\n" +
				"            static XList<Sub<?>> LIST = asList(ARRAY); \n" +
				"       }\n" +
				"        @SuppressWarnings(\"rawtypes\")\n" +
				"        static Sub<?> ARRAY = new Sub() { };\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class XList<T> {\n" +
				"}\n";
	if (this.complianceLevel < ClassFileConstants.JDK1_8) {
		this.runNegativeTest(
			new String[] {
				"X.java",
				xSource,
			},
			"----------\n" +
			"1. ERROR in X.java (at line 7)\n" +
			"	static XList<Sub<?>> LIST = asList(ARRAY); \n" +
			"	                            ^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from XList<X.Foo.Sub<capture#1-of ?>> to XList<X.Foo.Sub<?>>\n" +
			"----------\n");
	} else {
		runConformTest(new String[]{ "X.java", xSource });
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216565 - variation
public void test1256() {
	this.runConformTest(
		new String[] {
				"X.java",
				"public class X {\n" +
				"    static <T> XList<T> asList(T[] x) { return null; }\n" +
				"    static interface Foo<T> {\n" +
				"        static interface Sub<T> extends Foo<T> {\n" +
				"            static XList<Sub<? extends Object>> LIST = asList(ARRAY); \n" +
				"       }\n" +
				"        static Sub<?>[] ARRAY = new Sub[] { };\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class XList<T> {\n" +
				"}\n", // =================
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216565 - variation
public void test1257() {
	this.runNegativeTest(
		new String[] {
				"X.java",
				"public class X {\n" +
				"    static <T> XList<T> asList(T[] x) { return null; }\n" +
				"    static interface Foo<T> {\n" +
				"        static interface Sub<T> extends Foo<T> {\n" +
				"            static XList<Sub<? extends Object>> LIST = asList(ARRAY); \n" +
				"       }\n" +
				"        static Sub<? extends Object>[] ARRAY = new Sub[] { };\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class XList<T> {\n" +
				"	Zork z;\n" +
				"}\n", // =================
		},
		"----------\n" +
		"1. WARNING in X.java (at line 7)\n" +
		"	static Sub<? extends Object>[] ARRAY = new Sub[] { };\n" +
		"	                                       ^^^^^^^^^^^^^\n" +
		"Type safety: The expression of type X.Foo.Sub[] needs unchecked conversion to conform to X.Foo.Sub<? extends Object>[]\n" +
		"----------\n" +
		"2. ERROR in X.java (at line 12)\n" +
		"	Zork z;\n" +
		"	^^^^\n" +
		"Zork cannot be resolved to a type\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216565 - variation
public void test1258() {
	this.runConformTest(
		new String[] {
				"X.java",
				"public class X {\n" +
				"    static <T> XList<T> asList(T[] x) { return null; }\n" +
				"    static interface Foo<T> {\n" +
				"        static interface Sub<T> extends Foo<T> {\n" +
				"            static XList<Sub<? extends Number>> LIST = asList(ARRAY); \n" +
				"       }\n" +
				"        static Sub<? extends Number>[] ARRAY = new Sub[] { };\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class XList<T> {\n" +
				"}\n", // =================
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216565 - variation
public void test1259() {
	String xSource =
				"public class X {\n" +
				"    static <T> XList<T> asList(T[] x) { return null; }\n" +
				"    static interface Foo<T> {\n" +
				"        static interface Sub<T> extends Foo<T> {\n" +
				"            static XList<Sub<? extends Number>> LIST = asList(ARRAY); \n" +
				"       }\n" +
				"        @SuppressWarnings(\"rawtypes\")\n" +
				"        static Sub<? extends Integer>[] ARRAY = new Sub[] { };\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class XList<T> {\n" +
				"}\n";
	if (this.complianceLevel < ClassFileConstants.JDK1_8) {
		this.runNegativeTest(
			new String[] {
				"X.java",
				xSource,
			},
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	static XList<Sub<? extends Number>> LIST = asList(ARRAY); \n" +
			"	                                           ^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from XList<X.Foo.Sub<? extends Integer>> to XList<X.Foo.Sub<? extends Number>>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 8)\n" +
			"	static Sub<? extends Integer>[] ARRAY = new Sub[] { };\n" +
			"	                                        ^^^^^^^^^^^^^\n" +
			"Type safety: The expression of type X.Foo.Sub[] needs unchecked conversion to conform to X.Foo.Sub<? extends Integer>[]\n" +
			"----------\n");
	} else {
		runConformTest(new String[]{ "X.java", xSource });
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216565 - variation
public void test1260() {
	this.runConformTest(
		new String[] {
				"X.java",
				"public class X {\n" +
				"    static <T> XList<T> asList(T[] x) { return null; }\n" +
				"    static interface Foo<T> {\n" +
				"        static interface Sub<T> extends Foo<T> {\n" +
				"            static XList<Sub<? super Number>> LIST = asList(ARRAY); \n" +
				"       }\n" +
				"        static Sub<? super Number>[] ARRAY = new Sub[] { };\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class XList<T> {\n" +
				"}\n", // =================
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216565 - variation
public void test1261() {
	String xSource =
				"public class X {\n" +
				"    static <T> XList<T> asList(T[] x) { return null; }\n" +
				"    static interface Foo<T> {\n" +
				"        static interface Sub<T> extends Foo<T> {\n" +
				"            static XList<Sub<?>> LIST = asList(ARRAY); \n" +
				"       }\n" +
				"        static Sub<? super Number>[] ARRAY = new Sub[] { };\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class XList<T> {\n" +
				"}\n";
	if (this.complianceLevel < ClassFileConstants.JDK1_8) {
		this.runNegativeTest(
			new String[] {
				"X.java",
				xSource,
			},
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	static XList<Sub<?>> LIST = asList(ARRAY); \n" +
			"	                            ^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from XList<X.Foo.Sub<? super Number>> to XList<X.Foo.Sub<?>>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 7)\n" +
			"	static Sub<? super Number>[] ARRAY = new Sub[] { };\n" +
			"	                                     ^^^^^^^^^^^^^\n" +
			"Type safety: The expression of type X.Foo.Sub[] needs unchecked conversion to conform to X.Foo.Sub<? super Number>[]\n" +
			"----------\n");
	} else {
		runConformTest(new String[]{ "X.java", xSource });
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216565 - variation
public void test1262() {
	this.runNegativeTest(
		new String[] {
				"X.java",
				"public class X {\n" +
				"    static <T> XList<T> asList(T[] x) { return null; }\n" +
				"    static interface Foo<T> {\n" +
				"        static interface Sub<T> extends Foo<T> {\n" +
				"            static XList<Sub<? super Number>> LIST = asList(ARRAY); \n" +
				"       }\n" +
				"        static Sub<?>[] ARRAY = new Sub[] { };\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class XList<T> {\n" +
				"}\n", // =================
		},
		"----------\n" +
		"1. ERROR in X.java (at line 5)\n" +
		"	static XList<Sub<? super Number>> LIST = asList(ARRAY); \n" +
		"	                                         ^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from XList<X.Foo.Sub<?>> to XList<X.Foo.Sub<? super Number>>\n" +
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216565 - variation
public void test1263() {
	String xSource =
				"public class X {\n" +
				"    static <T> XList<T> asList(T[] x) { return null; }\n" +
				"    static interface Foo<T> {\n" +
				"        static interface Sub<T> extends Foo<T> {\n" +
				"            static XList<Sub<?>> LIST = asList(ARRAY); \n" +
				"       }\n" +
				"        @SuppressWarnings(\"rawtypes\")\n" +
				"        static Sub<? super Object>[] ARRAY = new Sub[] { };\n" +
				"    }\n" +
				"}\n" +
				"\n" +
				"class XList<T> {\n" +
				"}\n";
	if (this.complianceLevel < ClassFileConstants.JDK1_8) {
		this.runNegativeTest(
			new String[] {
				"X.java",
				xSource,
			},
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	static XList<Sub<?>> LIST = asList(ARRAY); \n" +
			"	                            ^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from XList<X.Foo.Sub<? super Object>> to XList<X.Foo.Sub<?>>\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 8)\n" +
			"	static Sub<? super Object>[] ARRAY = new Sub[] { };\n" +
			"	                                     ^^^^^^^^^^^^^\n" +
			"Type safety: The expression of type X.Foo.Sub[] needs unchecked conversion to conform to X.Foo.Sub<? super Object>[]\n" +
			"----------\n");
	} else {
		runConformTest(new String[]{ "X.java", xSource });
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216565 - variation
public void test1264() {
	this.runConformTest(
		new String[] {
				"X.java",
				"import java.util.List;\n" +
				"public class X {\n" +
				"    static <T> List<T> asList(T[] x) { return null; }\n" +
				"    static interface Foo<T> {\n" +
				"        static interface Sub<T> extends Foo<T> {\n" +
				"            static List<X.Foo.Sub<?>> LIST = asList(ARRAY); \n" +
				"       }\n" +
				"        static X.Foo.Sub<?>[] ARRAY = new Sub[] { };\n" +
				"    }\n" +
				"}", // =================
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216565 - variation
public void test1265() {
	this.runConformTest(
			new String[] {
					"X.java",
					"import java.util.List;\n" +
					"public class X {\n" +
					"    static <T> List<T> asList(T[] x) { return null; }\n" +
					"    static interface Foo<T> {\n" +
					"        static interface Sub<T> extends Foo<T> {\n" +
					"            static List<Foo.Sub<?>> LIST = asList(ARRAY); \n" +
					"       }\n" +
					"        static Sub<?>[] ARRAY = new Sub[] { };\n" +
					"    }\n" +
					"}", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216565 - variation
public void test1266() {
	this.runConformTest(
			new String[] {
					"X.java",
					"import java.util.List;\n" +
					"public class X {\n" +
					"    static <T> List<T> asList(T[] x) { return null; }\n" +
					"    static interface Foo<T> {\n" +
					"        static interface Sub<T> extends Foo<T> {\n" +
					"            static List<Sub<?>> LIST = asList(ARRAY); \n" +
					"       }\n" +
					"        static Foo.Sub<?>[] ARRAY = new Sub[] { };\n" +
					"    }\n" +
					"}", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216705
public void test1267() {
	this.runConformTest(
			new String[] {
					"X.java",
					"import java.util.List;\n" +
					"public class X {\n" +
					"	static interface Foo {\n" +
					"	}\n" +
					"	static interface SubFoo extends Foo {\n" +
					"	}\n" +
					"	static abstract class AbstractTest<T extends Foo> {\n" +
					"		protected static class Bar<T extends Foo> {\n" +
					"		}\n" +
					"		protected abstract List<Bar<? extends T>> get();\n" +
					"	}\n" +
					"	static class Test extends AbstractTest<SubFoo> {\n" +
					"		@Override\n" +
					"		protected List<Bar<? extends SubFoo>> get() {\n" +
					"			return null;\n" +
					"		}\n" +
					"	}\n" +
					"}", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216692
public void test1268() {
	this.runConformTest(
			new String[] {
					"pkg1/Foo.java",
					"package pkg1;\n" +
					"import java.util.Map;\n" +
					"public class Foo<T> {\n" +
					"    protected final Map<String, Field> fields = null;\n" +
					"    protected static class Field { }\n" +
					"}\n",
					"pkg2/SubFoo.java",
					"package pkg2;\n" +
					"import pkg1.Foo;\n" +
					"public class SubFoo<T> extends Foo<T> {\n" +
					"    private Field field = null;\n" +
					"    private void test() {\n" +
					"        Field field = fields.get(\"test\");\n" +
					"    }\n" +
					"}\n", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216686
public void test1269() {
	this.runConformTest(
			new String[] {
					"X.java",
					"public class X {\n" +
					"	// some functor and functor instances definitions\n" +
					"	static interface OO<T, E> { \n" +
					"		public T eval(E x);\n" +
					"	}\n" +
					"	static interface TO<T> extends OO<String, T> {\n" +
					"		public String eval(T x);\n" +
					"	}\n" +
					"	static interface TT extends TO<String> {\n" +
					"		public String eval(String x);\n" +
					"	}\n" +
					"	static final TO<Object> FUNC1 = null;\n" +
					"	static final TT FUNC2 = null;\n" +
					"\n" +
					"	// some functor combinators\n" +
					"	static <E> TO<E> combine(final TT x, final TO<? super E> y) { // # 1\n" +
					"		System.out.println(\"#1#\");\n" +
					"		return new TO<E>() { public String eval(E o) { return x.eval(y.eval(o)); } }; \n" +
					"	}\n" +
					"	// body of the test\n" +
					"	static <E> void put(Class<E> type, TO<? super E> func) {\n" +
					"	}\n" +
					"	public static void main(String[] args) {\n" +
					"		put(Integer.class, combine(FUNC2, FUNC1));\n" +
					"	}\n" +
					"}\n", // =================
			},
			"#1#");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216686 - variation
public void test1270() {
	this.runConformTest(
			new String[] {
					"X.java",
					"public class X {\n" +
					"	// some functor and functor instances definitions\n" +
					"	static interface OO<T, E> { \n" +
					"		public T eval(E x);\n" +
					"	}\n" +
					"	static interface TO<T> extends OO<String, T> {\n" +
					"		public String eval(T x);\n" +
					"	}\n" +
					"	static interface TT extends TO<String> {\n" +
					"		public String eval(String x);\n" +
					"	}\n" +
					"	static final TO<Object> FUNC1 = null;\n" +
					"	static final TT FUNC2 = null;\n" +
					"\n" +
					"	// some functor combinators\n" +
					"	static <E, T> TO<T> combine(final TO<? super E> x, final OO<E, T> y) { // # 2\n" +
					"		System.out.println(\"#2#\");\n" +
					"		return new TO<T>() { public String eval(T o) { return x.eval(y.eval(o)); } }; \n" +
					"	}\n" +
					"	// body of the test\n" +
					"	static <E> void put(Class<E> type, TO<? super E> func) {\n" +
					"	}\n" +
					"	public static void main(String[] args) {\n" +
					"		put(Integer.class, combine(FUNC2, FUNC1));\n" +
					"	}\n" +
					"}\n", // =================
			},
			"#2#");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216686 - variation
public void test1271() {
	this.runNegativeTest(
			new String[] {
					"X.java",
					"public class X {\n" +
					"	// some functor and functor instances definitions\n" +
					"	static interface OO<T, E> { \n" +
					"		public T eval(E x);\n" +
					"	}\n" +
					"	static interface TO<T> extends OO<String, T> {\n" +
					"		public String eval(T x);\n" +
					"	}\n" +
					"	static interface TT extends TO<String> {\n" +
					"		public String eval(String x);\n" +
					"	}\n" +
					"	static final TO<Object> FUNC1 = null;\n" +
					"	static final TT FUNC2 = null;\n" +
					"\n" +
					"	// some functor combinators\n" +
					"	static <E, T, V> OO<E, V> combine(final OO<E, ? super T> x, final OO<T, V> y) { // # 3\n" +
					"		System.out.println(\"#3#\");\n" +
					"		return new OO<E, V>() { public E eval(V o) { return x.eval(y.eval(o)); } };\n" +
					"	}\n" +
					"	// body of the test\n" +
					"	static <E> void put(Class<E> type, TO<? super E> func) {\n" +
					"	}\n" +
					"	public static void main(String[] args) {\n" +
					"		put(Integer.class, combine(FUNC2, FUNC1));\n" +
					"	}\n" +
					"}\n", // =================
			},
			this.complianceLevel < ClassFileConstants.JDK1_8 ? 
			"----------\n" +
			"1. ERROR in X.java (at line 24)\n" +
			"	put(Integer.class, combine(FUNC2, FUNC1));\n" +
			"	^^^\n" +
			"The method put(Class<E>, X.TO<? super E>) in the type X is not applicable for the arguments (Class<Integer>, X.OO<String,Object>)\n" +
			"----------\n"
			: // ATM, in 1.8+ we generate an extra error due to inner poly expression resolution after the target type is known.
			"----------\n" + 
			"1. ERROR in X.java (at line 24)\n" + 
			"	put(Integer.class, combine(FUNC2, FUNC1));\n" + 
			"	^^^\n" + 
			"The method put(Class<E>, X.TO<? super E>) in the type X is not applicable for the arguments (Class<Integer>, X.OO<String,Object>)\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 24)\n" + 
			"	put(Integer.class, combine(FUNC2, FUNC1));\n" + 
			"	                   ^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type mismatch: cannot convert from X.OO<String,Object> to X.TO<? super E>\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216686 - variation
public void test1272() {
	this.runConformTest(
			new String[] {
					"X.java",
					"public class X {\n" +
					"	// some functor and functor instances definitions\n" +
					"	static interface OO<T, E> { \n" +
					"		public T eval(E x);\n" +
					"	}\n" +
					"	static interface TO<T> extends OO<String, T> {\n" +
					"		public String eval(T x);\n" +
					"	}\n" +
					"	static interface TT extends TO<String> {\n" +
					"		public String eval(String x);\n" +
					"	}\n" +
					"	static final TO<Object> FUNC1 = null;\n" +
					"	static final TT FUNC2 = null;\n" +
					"\n" +
					"	// some functor combinators\n" +
					"	static <E, T, V> OO<E, V> combine(final OO<E, ? super T> x, final OO<T, V> y) { // # 3\n" +
					"		System.out.print(\"#3#\");\n" +
					"		return new OO<E, V>() { public E eval(V o) { return x.eval(y.eval(o)); } };\n" +
					"	}\n" +
					"	// body of the test\n" +
					"	static <E> void put(Class<E> type, TO<? super E> func) {\n" +
					"	}\n" +
					"	public static void main(String[] args) {\n" +
					"      try {\n" +
					"		   put(Integer.class, (TO<Object>)combine(FUNC2, FUNC1));\n" +
					"      } catch(ClassCastException e) {\n" +
					"		   System.out.println(\"#CLASSCAST#\");\n" +
					"		}\n" +
					"	}\n" +
					"}\n", // =================
			},
			"#3##CLASSCAST#");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216686 - variation
public void test1273() {
	String sourceX =
			"public class X {\n" +
			"	// some functor and functor instances definitions\n" +
			"	static interface OO<T, E> { \n" +
			"		public T eval(E x);\n" +
			"	}\n" +
			"	static interface TO<T> extends OO<String, T> {\n" +
			"		public String eval(T x);\n" +
			"	}\n" +
			"	static interface TT extends TO<String> {\n" +
			"		public String eval(String x);\n" +
			"	}\n" +
			"	static final TO<Object> FUNC1 = null;\n" +
			"	static final TT FUNC2 = null;\n" +
			"\n" +
			"	// some functor combinators\n" +
			"	static <E> TO<E> combine(final TT x, final TO<? super E> y) { // # 1\n" +
			"		System.out.println(\"#1#\");\n" +
			"		return new TO<E>() { public String eval(E o) { return x.eval(y.eval(o)); } }; \n" +
			"	}\n" +
			"	static <E, T> TO<T> combine(final TO<? super E> x, final OO<E, T> y) { // # 2\n" +
			"		System.out.println(\"#2#\");\n" +
			"		return new TO<T>() { public String eval(T o) { return x.eval(y.eval(o)); } }; \n" +
			"	}\n" +
			"	// body of the test\n" +
			"	static <E> void put(Class<E> type, TO<? super E> func) {\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		put(Integer.class, combine(FUNC2, FUNC1));\n" +
			"	}\n" +
			"}\n";
	if (this.complianceLevel < ClassFileConstants.JDK1_8) {
		this.runConformTest(
			new String[] {
				"X.java",
				sourceX,
			},
			"#1#");
	} else {
		runNegativeTest(
			new String[] {
				"X.java",
				sourceX
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 28)\n" + 
			"	put(Integer.class, combine(FUNC2, FUNC1));\n" + 
			"	                   ^^^^^^^\n" + 
			"The method combine(X.TT, X.TO<? super Object>) is ambiguous for the type X\n" + 
			"----------\n" );
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216686 - variation
public void test1274() {
	this.runConformTest(
			new String[] {
					"X.java",
					"public class X {\n" +
					"	// some functor and functor instances definitions\n" +
					"	static interface OO<T, E> { \n" +
					"		public T eval(E x);\n" +
					"	}\n" +
					"	static interface TO<T> extends OO<String, T> {\n" +
					"		public String eval(T x);\n" +
					"	}\n" +
					"	static interface TT extends TO<String> {\n" +
					"		public String eval(String x);\n" +
					"	}\n" +
					"	static final TO<Object> FUNC1 = null;\n" +
					"	static final TT FUNC2 = null;\n" +
					"\n" +
					"	// some functor combinators\n" +
					"	static <E> TO<E> combine(final TT x, final TO<? super E> y) { // # 1\n" +
					"		System.out.println(\"#1#\");\n" +
					"		return new TO<E>() { public String eval(E o) { return x.eval(y.eval(o)); } }; \n" +
					"	}\n" +
					"	static <E, T> TO<T> combine(final TO<? super E> x, final OO<E, T> y) { // # 2\n" +
					"		System.out.println(\"#2#\");\n" +
					"		return new TO<T>() { public String eval(T o) { return x.eval(y.eval(o)); } }; \n" +
					"	}\n" +
					"	// body of the test\n" +
					"	static <E> void put(Class<E> type, TO<? super E> func) {\n" +
					"	}\n" +
					"	public static void main(String[] args) {\n" +
					"		put(Integer.class, X.<Object>combine(FUNC2, FUNC1));\n" +
					"	}\n" +
					"}\n", // =================
			},
			"#1#");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216686 - variation
public void test1275() {
	String[] input = 
			new String[] {
					"X.java",
					"public class X {\n" +
					"	// some functor and functor instances definitions\n" +
					"	static interface OO<T, E> { \n" +
					"		public T eval(E x);\n" +
					"	}\n" +
					"	static interface TO<T> extends OO<String, T> {\n" +
					"		public String eval(T x);\n" +
					"	}\n" +
					"	static interface TT extends TO<String> {\n" +
					"		public String eval(String x);\n" +
					"	}\n" +
					"	static final TO<Object> FUNC1 = null;\n" +
					"	static final TT FUNC2 = null;\n" +
					"\n" +
					"	// some functor combinators\n" +
					"	static <E> TO<E> combine(final TT x, final TO<? super E> y) { // # 1\n" +
					"		System.out.println(\"#1#\");\n" +
					"		return new TO<E>() { public String eval(E o) { return x.eval(y.eval(o)); } }; \n" +
					"	}\n" +
					"	static <E, T, V> OO<E, V> combine(final OO<E, ? super T> x, final OO<T, V> y) { // # 3\n" +
					"		System.out.println(\"#3#\");\n" +
					"		return new OO<E, V>() { public E eval(V o) { return x.eval(y.eval(o)); } };\n" +
					"	}\n" +
					"	// body of the test\n" +
					"	static <E> void put(Class<E> type, TO<? super E> func) {\n" +
					"	}\n" +
					"	public static void main(String[] args) {\n" +
					"		put(Integer.class, combine(FUNC2, FUNC1));\n" +
					"	}\n" +
					"}\n", // =================
			};
	if (this.complianceLevel < ClassFileConstants.JDK1_8) {
		runConformTest(
			input,
			"#1#");
	} else {
		runNegativeTest(
			input,
			"----------\n" + 
			"1. ERROR in X.java (at line 28)\n" + 
			"	put(Integer.class, combine(FUNC2, FUNC1));\n" + 
			"	                   ^^^^^^^\n" + 
			"The method combine(X.TT, X.TO<? super Object>) is ambiguous for the type X\n" + 
			"----------\n");
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216686 - variation
public void test1276() {
	this.runConformTest(
			new String[] {
					"X.java",
					"public class X {\n" +
					"	// some functor and functor instances definitions\n" +
					"	static interface OO<T, E> { \n" +
					"		public T eval(E x);\n" +
					"	}\n" +
					"	static interface TO<T> extends OO<String, T> {\n" +
					"		public String eval(T x);\n" +
					"	}\n" +
					"	static interface TT extends TO<String> {\n" +
					"		public String eval(String x);\n" +
					"	}\n" +
					"	static final TO<Object> FUNC1 = null;\n" +
					"	static final TT FUNC2 = null;\n" +
					"\n" +
					"	// some functor combinators\n" +
					"	static <E> TO<E> combine(final TT x, final TO<? super E> y) { // # 1\n" +
					"		System.out.println(\"#1#\");\n" +
					"		return new TO<E>() { public String eval(E o) { return x.eval(y.eval(o)); } }; \n" +
					"	}\n" +
					"	static <E, T, V> OO<E, V> combine(final OO<E, ? super T> x, final OO<T, V> y) { // # 3\n" +
					"		System.out.println(\"#3#\");\n" +
					"		return new OO<E, V>() { public E eval(V o) { return x.eval(y.eval(o)); } };\n" +
					"	}\n" +
					"	// body of the test\n" +
					"	static <E> void put(Class<E> type, TO<? super E> func) {\n" +
					"	}\n" +
					"	public static void main(String[] args) {\n" +
					"		put(Integer.class, X.<Object>combine(FUNC2, FUNC1));\n" +
					"	}\n" +
					"}\n", // =================
			},
			"#1#");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216686 - variation
public void test1277() {
	this.runConformTest(
			new String[] {
					"X.java",
					"public class X {\n" +
					"	// some functor and functor instances definitions\n" +
					"	static interface OO<T, E> { \n" +
					"		public T eval(E x);\n" +
					"	}\n" +
					"	static interface TO<T> extends OO<String, T> {\n" +
					"		public String eval(T x);\n" +
					"	}\n" +
					"	static interface TT extends TO<String> {\n" +
					"		public String eval(String x);\n" +
					"	}\n" +
					"	static final TO<Object> FUNC1 = null;\n" +
					"	static final TT FUNC2 = null;\n" +
					"\n" +
					"	// some functor combinators\n" +
					"	static <E, T> TO<T> combine(final TO<? super E> x, final OO<E, T> y) { // # 2\n" +
					"		System.out.println(\"#2#\");\n" +
					"		return new TO<T>() { public String eval(T o) { return x.eval(y.eval(o)); } }; \n" +
					"	}\n" +
					"	static <E, T, V> OO<E, V> combine(final OO<E, ? super T> x, final OO<T, V> y) { // # 3\n" +
					"		System.out.println(\"#3#\");\n" +
					"		return new OO<E, V>() { public E eval(V o) { return x.eval(y.eval(o)); } };\n" +
					"	}\n" +
					"	// body of the test\n" +
					"	static <E> void put(Class<E> type, TO<? super E> func) {\n" +
					"	}\n" +
					"	public static void main(String[] args) {\n" +
					"		put(Integer.class, combine(FUNC2, FUNC1));\n" +
					"	}\n" +
					"}\n", // =================
			},
			"#2#");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216686 - variation
public void test1278() {
	String[] input =
			new String[] {
					"X.java",
					"public class X {\n" +
					"	// some functor and functor instances definitions\n" +
					"	static interface OO<T, E> { \n" +
					"		public T eval(E x);\n" +
					"	}\n" +
					"	static interface TO<T> extends OO<String, T> {\n" +
					"		public String eval(T x);\n" +
					"	}\n" +
					"	static interface TT extends TO<String> {\n" +
					"		public String eval(String x);\n" +
					"	}\n" +
					"	static final TO<Object> FUNC1 = null;\n" +
					"	static final TT FUNC2 = null;\n" +
					"\n" +
					"	// some functor combinators\n" +
					"	static <E> TO<E> combine(final TT x, final TO<? super E> y) { // # 1\n" +
					"		System.out.println(\"#1#\");\n" +
					"		return new TO<E>() { public String eval(E o) { return x.eval(y.eval(o)); } }; \n" +
					"	}\n" +
					"	static <E, T> TO<T> combine(final TO<? super E> x, final OO<E, T> y) { // # 2\n" +
					"		System.out.println(\"#2#\");\n" +
					"		return new TO<T>() { public String eval(T o) { return x.eval(y.eval(o)); } }; \n" +
					"	}\n" +
					"	static <E, T, V> OO<E, V> combine(final OO<E, ? super T> x, final OO<T, V> y) { // # 3\n" +
					"		System.out.println(\"#3#\");\n" +
					"		return new OO<E, V>() { public E eval(V o) { return x.eval(y.eval(o)); } };\n" +
					"	}\n" +
					"	// body of the test\n" +
					"	static <E> void put(Class<E> type, TO<? super E> func) {\n" +
					"	}\n" +
					"	public static void main(String[] args) {\n" +
					"		put(Integer.class, combine(FUNC2, FUNC1));\n" +
					"	}\n" +
					"}\n", // =================
			};
	if (this.complianceLevel < ClassFileConstants.JDK1_8) {
		runConformTest(
			input,
			"#1#");
	} else {
		runNegativeTest(
			input,
			"----------\n" + 
			"1. ERROR in X.java (at line 32)\n" + 
			"	put(Integer.class, combine(FUNC2, FUNC1));\n" + 
			"	                   ^^^^^^^\n" + 
			"The method combine(X.TT, X.TO<? super Object>) is ambiguous for the type X\n" + 
			"----------\n");
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216686 - variation
public void test1279() {
	this.runConformTest(
			new String[] {
					"X.java",
					"public class X {\n" +
					"	// some functor and functor instances definitions\n" +
					"	static interface OO<T, E> { \n" +
					"		public T eval(E x);\n" +
					"	}\n" +
					"	static interface TO<T> extends OO<String, T> {\n" +
					"		public String eval(T x);\n" +
					"	}\n" +
					"	static interface TT extends TO<String> {\n" +
					"		public String eval(String x);\n" +
					"	}\n" +
					"	static final TO<Object> FUNC1 = null;\n" +
					"	static final TT FUNC2 = null;\n" +
					"\n" +
					"	// some functor combinators\n" +
					"	static <E> TO<E> combine(final TT x, final TO<? super E> y) { // # 1\n" +
					"		System.out.println(\"#1#\");\n" +
					"		return new TO<E>() { public String eval(E o) { return x.eval(y.eval(o)); } }; \n" +
					"	}\n" +
					"	static <E, T> TO<T> combine(final TO<? super E> x, final OO<E, T> y) { // # 2\n" +
					"		System.out.println(\"#2#\");\n" +
					"		return new TO<T>() { public String eval(T o) { return x.eval(y.eval(o)); } }; \n" +
					"	}\n" +
					"	static <E, T, V> OO<E, V> combine(final OO<E, ? super T> x, final OO<T, V> y) { // # 3\n" +
					"		System.out.println(\"#3#\");\n" +
					"		return new OO<E, V>() { public E eval(V o) { return x.eval(y.eval(o)); } };\n" +
					"	}\n" +
					"	// body of the test\n" +
					"	static <E> void put(Class<E> type, TO<? super E> func) {\n" +
					"	}\n" +
					"	public static void main(String[] args) {\n" +
					"		put(Integer.class, X.<Object>combine(FUNC2, FUNC1));\n" +
					"	}\n" +
					"}\n", // =================
			},
			"#1#");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216686 - variation
public void test1280() {
	this.runConformTest(
			new String[] {
					"X.java",
					"interface OO<T,E> {}\n" +
					"interface TO<T> extends OO<String,T> {}\n" +
					"interface TT extends TO<String> {}\n" +
					"\n" +
					"public class X {\n" +
					"	<E, T> TO<T> combine(final TO<? super E> x, final OO<E, T> y) { return null; }\n" +
					"  void foo(TT tt, TO<? super Object> too) {\n" +
					"     combine(tt, too);\n" +
					"  }\n" +
					"}", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216686 - variation
// FAIL EXTRA ERR, see http://mail.openjdk.java.net/pipermail/lambda-spec-experts/2013-December/000444.html
public void test1281() {
	if (this.complianceLevel >= ClassFileConstants.JDK1_8)
		return;
	this.runConformTest(
			new String[] {
					"X.java",
					"interface OO<T,E> {}\n" +
					"interface TO<T> extends OO<String,T> {}\n" +
					"interface TT extends TO<String> {}\n" +
					"\n" +
					"public class X {\n" +
					"	<E, T> TO<T> combine(final TO<? super E> x, final OO<E, T>[] y) { return null; }\n" +
					"  void foo(TT tt, TO<? super Object>[] too) {\n" +
					"     combine(tt, too);\n" +
					"  }\n" +
					"}", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216686 - variation
public void test1282() {
	this.runNegativeTest(
			new String[] {
					"X.java",
					"public class X {\n" +
					"	static interface OO<T,E> {}\n" +
					"	static interface TO<T> extends OO<String,T> {}\n" +
					"	static interface TT extends TO<String> {}\n" +
					"	\n" +
					"	<E, T> TO<T> combine(TT x, TO<? super E> y) { return null; }\n" +
					"	void foo(TO<? super String> too, OO<String,Object> oo) {\n" +
					"		combine(too, oo);\n" +
					"	}\n" +
					"}", // =================
			},
			"----------\n" +
			"1. ERROR in X.java (at line 8)\n" +
			"	combine(too, oo);\n" +
			"	^^^^^^^\n" +
			"The method combine(X.TT, X.TO<? super E>) in the type X is not applicable for the arguments (X.TO<capture#1-of ? super String>, X.OO<String,Object>)\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216686 - variation
public void test1283() {
	this.runNegativeTest(
			new String[] {
					"X.java",
					"public class X {\n" +
					"	static interface OO<T,E> {}\n" +
					"	static interface TO<T> extends OO<String,T> {}\n" +
					"	static interface TT extends TO<String> {}\n" +
					"	\n" +
					"	<E, T> TO<T> combine(TT[] x, TO<? super E>[] y) { return null; }\n" +
					"	void foo(TO<? super String>[] too, OO<String,Object>[] oo) {\n" +
					"		combine(too, oo);\n" +
					"	}\n" +
					"}", // =================
			},
			"----------\n" +
			"1. ERROR in X.java (at line 8)\n" +
			"	combine(too, oo);\n" +
			"	^^^^^^^\n" +
			"The method combine(X.TT[], X.TO<? super E>[]) in the type X is not applicable for the arguments (X.TO<? super String>[], X.OO<String,Object>[])\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=210425
public void test1284() {
	this.runNegativeTest(
			new String[] {
					"X.java",
					"public class X {\n" +
					"	public static void main(String[] args) {\n" +
					"		Thread th = Thread.currentThread();\n" +
					"		Z<String, Thread> z1 = new Z<String, Thread>(th);\n" +
					"		Z<String, Exception> z2 = new Z<String, Exception>(new Exception());\n" +
					"		Y<String, Thread> y = new Y<String, Thread>() {};\n" +
					"		y.foo(z1).get().getThreadGroup();\n" +
					"		y.foo(z2).get().getThreadGroup(); // heap pollution: we get a CCE because we return a U2\n" +
					"		Zork z;\n" +
					"	}\n" +
					"}\n" +
					"abstract class Y<T, U> {\n" +
					"	I2<T, U> foo(I1<T> i) {\n" +
					"		return (I2<T, U>) i;\n" +
					"	}\n" +
					"}\n" +
					"interface I1<T> {\n" +
					"}\n" +
					"interface I2<T, U> extends I1<T> {\n" +
					"	U get();\n" +
					"}\n" +
					"class Z<V, W> implements I2<V, W> {\n" +
					"	W w;\n" +
					"	Z(W w) {\n" +
					"		this.w = w;\n" +
					"	}\n" +
					"	public W get() {\n" +
					"		return this.w;\n" +
					"	}\n" +
					"}\n", // =================
			},
			"----------\n" +
			"1. ERROR in X.java (at line 9)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 14)\n" +
			"	return (I2<T, U>) i;\n" +
			"	       ^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from I1<T> to I2<T,U>\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=210425 - variation
public void test1285() {
	this.runNegativeTest(
			new String[] {
					"X.java",
					"public class X {\n" +
					"	public static void main(String[] args) {\n" +
					"		Thread th = Thread.currentThread();\n" +
					"		Z<String, Thread> z1 = new Z<String, Thread>(th);\n" +
					"		Z<String, Exception> z2 = new Z<String, Exception>(new Exception());\n" +
					"		Y<String, Thread> y = new Y<String, Thread>() {};\n" +
					"		y.foo(z1).get().getThreadGroup();\n" +
					"		y.foo(z2).get().getThreadGroup();\n" +
					"	}\n" +
					"}\n" +
					"abstract class Y<T, U> {\n" +
					"	I2<T, U> foo(I1<T,U> i) {\n" +
					"		return (I2<T, U>) i;\n" +
					"	}\n" +
					"}\n" +
					"interface I1<T, U> {\n" +
					"}\n" +
					"interface I2<T, U> extends I1<T,U> {\n" +
					"	U get();\n" +
					"}\n" +
					"class Z<V, W> implements I2<V, W> {\n" +
					"	W w;\n" +
					"	Z(W w) {\n" +
					"		this.w = w;\n" +
					"	}\n" +
					"	public W get() {\n" +
					"		return this.w;\n" +
					"	}\n" +
					"}\n", // =================
			},
			"----------\n" +
			"1. ERROR in X.java (at line 8)\n" +
			"	y.foo(z2).get().getThreadGroup();\n" +
			"	  ^^^\n" +
			"The method foo(I1<String,Thread>) in the type Y<String,Thread> is not applicable for the arguments (Z<String,Exception>)\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=210425 - variation
public void test1286() {
	this.runNegativeTest(
			new String[] {
					"X.java",
					"public class X {\n" +
					"	public static void main(String[] args) {\n" +
					"		Thread th = Thread.currentThread();\n" +
					"		Z<String, Thread> z1 = new Z<String, Thread>(th);\n" +
					"		Z<String, Exception> z2 = new Z<String, Exception>(new Exception());\n" +
					"		Y<String, Thread> y = new Y<String, Thread>() {};\n" +
					"		y.foo(z1).get().getThreadGroup();\n" +
					"		y.foo(z2).get().getThreadGroup(); // heap pollution: we get a CCE because we return a U2\n" +
					"		Zork z;\n" +
					"	}\n" +
					"}\n" +
					"abstract class Y<T, U> {\n" +
					"	I2<U> foo(I1 i) {\n" +
					"		return (I2<U>) i;\n" +
					"	}\n" +
					"}\n" +
					"interface I1 {}\n" +
					"interface I2<U> extends I1 {\n" +
					"	U get();\n" +
					"}\n" +
					"class Z<V, W> implements I2<W> {\n" +
					"	W w;\n" +
					"	Z(W w) {\n" +
					"		this.w = w;\n" +
					"	}\n" +
					"	public W get() {\n" +
					"		return this.w;\n" +
					"	}\n" +
					"}\n", // =================
			},
			"----------\n" +
			"1. ERROR in X.java (at line 9)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 14)\n" +
			"	return (I2<U>) i;\n" +
			"	       ^^^^^^^^^\n" +
			"Type safety: Unchecked cast from I1 to I2<U>\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=210425 - variation
public void test1287() {
	this.runNegativeTest(
			new String[] {
					"X.java",
					"public class X {\n" +
					"	public static void main(String[] args) {\n" +
					"		Thread th = Thread.currentThread();\n" +
					"		Z<String, Thread> z1 = new Z<String, Thread>(th);\n" +
					"		Z<String, Exception> z2 = new Z<String, Exception>(new Exception());\n" +
					"		Y<String, Thread> y = new Y<String, Thread>() {};\n" +
					"		y.foo(z1).get().getThreadGroup();\n" +
					"		y.foo(z2).get().getThreadGroup(); // heap pollution: we get a CCE because we return a U2\n" +
					"		Zork z;\n" +
					"	}\n" +
					"}\n" +
					"abstract class Y<T, U> {\n" +
					"	I2<T,U> foo(I1<T,T> i) {\n" +
					"		return (I2<T,U>) i;\n" +
					"	}\n" +
					"}\n" +
					"interface I1<D,E> {}\n" +
					"interface I2<F,G> extends I1<F,F> {\n" +
					"	G get();\n" +
					"}\n" +
					"class Z<V, W> implements I2<V,W> {\n" +
					"	W w;\n" +
					"	Z(W w) {\n" +
					"		this.w = w;\n" +
					"	}\n" +
					"	public W get() {\n" +
					"		return this.w;\n" +
					"	}\n" +
					"}\n", // =================
			},
			"----------\n" +
			"1. ERROR in X.java (at line 9)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 14)\n" +
			"	return (I2<T,U>) i;\n" +
			"	       ^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from I1<T,T> to I2<T,U>\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=210425 - variation
public void test1288() {
	this.runNegativeTest(
			new String[] {
					"X.java",
					"import java.util.Map;\n" +
					"public class X {\n" +
					"	public static void main(String[] args) {\n" +
					"		Thread th = Thread.currentThread();\n" +
					"		Z<String, Thread> z1 = new Z<String, Thread>(th);\n" +
					"		Z<String, Exception> z2 = new Z<String, Exception>(new Exception());\n" +
					"		Y<String, Thread> y = new Y<String, Thread>() {};\n" +
					"		y.foo(z1).get().getThreadGroup();\n" +
					"		y.foo(z2).get().getThreadGroup(); // heap pollution: we get a CCE because we return a U2\n" +
					"		Zork z;\n" +
					"	}\n" +
					"}\n" +
					"abstract class Y<T, U> {\n" +
					"	I2<T,U> foo(I1<Map<T,T>> i) {\n" +
					"		return (I2<T,U>) i;\n" +
					"	}\n" +
					"}\n" +
					"interface I1<D> {}\n" +
					"interface I2<F,G> extends I1<Map<F,F>> {\n" +
					"	G get();\n" +
					"}\n" +
					"class Z<V, W> implements I2<V,W> {\n" +
					"	W w;\n" +
					"	Z(W w) {\n" +
					"		this.w = w;\n" +
					"	}\n" +
					"	public W get() {\n" +
					"		return this.w;\n" +
					"	}\n" +
					"}", // =================
			},
			"----------\n" +
			"1. ERROR in X.java (at line 10)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 15)\n" +
			"	return (I2<T,U>) i;\n" +
			"	       ^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from I1<Map<T,T>> to I2<T,U>\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=210425 - variation
public void test1289() {
	this.runNegativeTest(
			new String[] {
					"X.java",
					"import java.util.Map;\n" +
					"public class X {\n" +
					"	public static void main(String[] args) {\n" +
					"		Thread th = Thread.currentThread();\n" +
					"		Z<String, Thread> z1 = new Z<String, Thread>(th);\n" +
					"		Z<String, Exception> z2 = new Z<String, Exception>(new Exception());\n" +
					"		Y<String, Thread> y = new Y<String, Thread>() {};\n" +
					"		y.foo(z1).get().getThreadGroup();\n" +
					"		y.foo(z2).get().getThreadGroup(); // heap pollution: we get a CCE because we return a U2\n" +
					"		Zork z;\n" +
					"	}\n" +
					"}\n" +
					"abstract class Y<T, U> {\n" +
					"	I2<T,U> foo(I1<Map<T,T>> i) {\n" +
					"		return (I2<T,U>) i;\n" +
					"	}\n" +
					"}\n" +
					"interface I1<D> {}\n" +
					"interface I2<F,G> extends I1<Map<F,G>> {\n" +
					"	G get();\n" +
					"}\n" +
					"class Z<V, W> implements I2<V,W> {\n" +
					"	W w;\n" +
					"	Z(W w) {\n" +
					"		this.w = w;\n" +
					"	}\n" +
					"	public W get() {\n" +
					"		return this.w;\n" +
					"	}\n" +
					"}", // =================
			},
			"----------\n" +
			"1. ERROR in X.java (at line 8)\n" +
			"	y.foo(z1).get().getThreadGroup();\n" +
			"	  ^^^\n" +
			"The method foo(I1<Map<String,String>>) in the type Y<String,Thread> is not applicable for the arguments (Z<String,Thread>)\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 9)\n" +
			"	y.foo(z2).get().getThreadGroup(); // heap pollution: we get a CCE because we return a U2\n" +
			"	  ^^^\n" +
			"The method foo(I1<Map<String,String>>) in the type Y<String,Thread> is not applicable for the arguments (Z<String,Exception>)\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 10)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 15)\n" +
			"	return (I2<T,U>) i;\n" +
			"	       ^^^^^^^^^^^\n" +
			"Cannot cast from I1<Map<T,T>> to I2<T,U>\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=210425 - variation
public void test1290() {
	this.runNegativeTest(
			new String[] {
					"X.java",
					"public class X <T, U> {\n" +
					"  K<T> foo(I<T> i) {\n" +
					"        return (K<T>) i;\n" +
					"  }\n" +
					"  Zork z;\n" +
					"}\n" +
					"interface I<T> {\n" +
					"}\n" +
					"interface J<T, U> extends I<T> {\n" +
					"}\n" +
					"interface K<T> extends J<T, String> {\n" +
					"}", // =================
			},
			"----------\n" +
			"1. ERROR in X.java (at line 5)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=218677
// FAIL ERRMSG
public void test1291() {
	if (this.complianceLevel >= ClassFileConstants.JDK1_8)
		return;
	this.runNegativeTest(
			new String[] {
					"X.java",
					"import java.util.ArrayList;\n" +
					"import java.util.List;\n" +
					"public class X {\n" +
					"    public static <D, E extends D> List<D> moreGeneric(List<E> list) {\n" +
					"        List<D> result = new ArrayList<D>();\n" +
					"        result.addAll( list );\n" +
					"        return result;\n" +
					"    }\n" +
					"    class A {}\n" +
					"    class B extends A {}\n" +
					"    class C extends B {}\n" +
					"    public static void main( String[] args ) {\n" +
					"        List<B> b = new ArrayList<B>();\n" +
					"        List<A> a = moreGeneric(b);\n" +
					"        List<C> c = moreGeneric(b);\n" +
					"    }\n" +
					"}\n", // =================
			},
			"----------\n" +
			"1. ERROR in X.java (at line 15)\n" +
			"	List<C> c = moreGeneric(b);\n" +
			"	            ^^^^^^^^^^^\n" +
			"Bound mismatch: The generic method moreGeneric(List<E>) of type X is not applicable for the arguments (List<X.B>). The inferred type X.B is not a valid substitute for the bounded parameter <E extends D>\n" +
			"----------\n",
			JavacTestOptions.EclipseJustification.EclipseBug218677);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=218677 - variation
// FAIL ERRMSG
public void test1292() {
	if (this.complianceLevel >= ClassFileConstants.JDK1_8)
		return;
	this.runNegativeTest(
			new String[] {
					"X.java",
					"import java.util.ArrayList;\n" +
					"import java.util.List;\n" +
					"public class X {\n" +
					"    public static <D, E extends D> List<E> moreSpecific(List<D> list) {\n" +
					"        List<E> result = new ArrayList<E>();\n" +
					"        result.addAll( (List<?>)list );\n" +
					"        return result;\n" +
					"    }\n" +
					"    class A {}\n" +
					"    class B extends A {}\n" +
					"    class C extends B {}\n" +
					"    public static void main( String[] args ) {\n" +
					"        List<B> b = new ArrayList<B>();\n" +
					"        List<A> a = moreSpecific(b);\n" +
					"        List<C> c = moreSpecific(b);\n" +
					"    }\n" +
					"}\n", // =================
			},
			this.complianceLevel < ClassFileConstants.JDK1_8 ?
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	result.addAll( (List<?>)list );\n" +
			"	       ^^^^^^\n" +
			"The method addAll(Collection<? extends E>) in the type List<E> is not applicable for the arguments (List<capture#1-of ?>)\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 14)\n" +
			"	List<A> a = moreSpecific(b);\n" +
			"	            ^^^^^^^^^^^^\n" +
			"Bound mismatch: The generic method moreSpecific(List<D>) of type X is not applicable for the arguments (List<X.B>). The inferred type X.A is not a valid substitute for the bounded parameter <E extends D>\n" +
			"----------\n" :
				"----------\n" + 
				"1. ERROR in X.java (at line 6)\n" + 
				"	result.addAll( (List<?>)list );\n" + 
				"	       ^^^^^^\n" + 
				"The method addAll(Collection<? extends E>) in the type List<E> is not applicable for the arguments (List<capture#1-of ?>)\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 14)\n" + 
				"	List<A> a = moreSpecific(b);\n" + 
				"	            ^^^^^^^^^^^^^^^\n" + 
				"Type mismatch: cannot convert from List<X.B> to List<X.A>\n" + 
				"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=220111
public void test1293() {
	this.runConformTest(
			new String[] {
					"X.java",
					"public class X<Token, NodeType> {\n" +
					"    class Table {\n" +
					"        State<Token>   s;\n" +
					"        Table() {\n" +
					"            this.s = new State<Token>();\n" +
					"        }\n" +
					"		class State<T> {\n" +
					"		}\n" +
					"    }\n" +
					"}\n", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=220111 - variation
public void test1294() {
	this.runConformTest(
			new String[] {
					"X.java",
					"public class X<Token, NodeType> {\n" +
					"    static class Table {\n" +
					"        State<String>   s;\n" +
					"        Table() {\n" +
					"            this.s = new State<String>();\n" +
					"        }\n" +
					"		class State<T> {\n" +
					"		}\n" +
					"    }\n" +
					"}\n", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=97303 - variation
public void test1295() {
	Map options = getCompilerOptions();
	options.put(JavaCore.COMPILER_PB_UNCHECKED_TYPE_OPERATION, JavaCore.IGNORE);
	this.runNegativeTest(
			new String[] {
					"X.java",
					"class Deejay {\n" +
					"	class Counter<T> {}\n" +
					"\n" +
					"	Deejay.Counter<Song> songCounter = new Deejay.Counter<Song>();\n" +
					"	Deejay.Counter<Genre> genreCounter = new Deejay.Counter<Genre>();\n" +
					"\n" +
					"	java.util.List<Counter<?>> list1 = java.util.Arrays.asList(songCounter, genreCounter);\n" +
					"	java.util.List<Counter<? extends Object>> list2 = java.util.Arrays.asList(songCounter, genreCounter);\n" +
					"	java.util.List<Counter<?>> list3 = java.util.Arrays.<Deejay.Counter<?>>asList(songCounter, genreCounter);\n" +
					"	java.util.List<Counter<?>> list4 = java.util.Arrays.asList(new Deejay.Counter<?>[] {songCounter, genreCounter});\n" +
					"	java.util.List<Counter<? extends String>> list5 = java.util.Arrays.asList(songCounter, genreCounter);\n" +
					"}\n" +
					"class Genre {}\n" +
					"class Song {}\n", // =================
			},
			"----------\n" +
			"1. ERROR in X.java (at line 11)\n" +
			"	java.util.List<Counter<? extends String>> list5 = java.util.Arrays.asList(songCounter, genreCounter);\n" +
			"	                                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from List<Deejay.Counter<? extends Object>> to List<Deejay.Counter<? extends String>>\n" +
			"----------\n",
			null,
			true,
			options);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=220111 - variation
public void test1296() {
	this.runConformTest(
			new String[] {
					"X.java",
					"public class X<Token, NodeType> {\n" +
					"	class Table {\n" +
					"		Table.State<Token> s;\n" +
					"\n" +
					"		Table() {\n" +
					"			this.s = new Table.State<Token>();\n" +
					"		}\n" +
					"\n" +
					"		class State<T> {\n" +
					"		}\n" +
					"	}\n" +
					"}\n", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=220111 - variation
public void test1297() {
	this.runConformTest(
			new String[] {
					"X.java",
					"public class X<Token, NodeType> {\n" +
					"	class Table {\n" +
					"		X<Token, NodeType>.Table.State<Token> s;\n" +
					"\n" +
					"		Table() {\n" +
					"			this.s = new X<Token, NodeType>().new Table().new State<Token>();\n" +
					"		}\n" +
					"\n" +
					"		class State<T> {\n" +
					"		}\n" +
					"	}\n" +
					"}\n", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=220111 - variation
public void test1298() {
	this.runConformTest(
			new String[] {
					"X.java",
					"public class X<Token, NodeType> {\n" +
					"	static class Table {\n" +
					"		X.Table.State<String> s;\n" +
					"\n" +
					"		Table() {\n" +
					"			this.s = new X.Table().new State<String>();\n" +
					"		}\n" +
					"\n" +
					"		class State<T> {\n" +
					"		}\n" +
					"	}\n" +
					"}\n", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=220361
public void test1299() {
	this.runConformTest(
			new String[] {
					"X.java",
					"public class X<U, V> {\n" +
					"	static class Table {\n" +
					"		X.Table.State<String> s;\n" +
					"\n" +
					"		Table() {\n" +
					"			this.s = new X.Table.State<String>();\n" +
					"		}\n" +
					"\n" +
					"		static class State<T> {\n" +
					"		}\n" +
					"	}\n" +
					"}\n", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=220361 - variation
public void test1300() {
	this.runConformTest(
			new String[] {
					"X.java",
					"public class X<U, V> {\n" +
					"	static class Table {\n" +
					"		State<String> s;\n" +
					"\n" +
					"		Table() {\n" +
					"			this.s = new State<String>();\n" +
					"		}\n" +
					"\n" +
					"		static class State<T> {\n" +
					"		}\n" +
					"	}\n" +
					"}\n", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=220361 - variation
public void test1301() {
	this.runConformTest(
			new String[] {
					"X.java",
					"public class X<U, V> {\n" +
					"	static class Table {\n" +
					"		Table.State<String> s;\n" +
					"\n" +
					"		Table() {\n" +
					"			this.s = new Table.State<String>();\n" +
					"		}\n" +
					"\n" +
					"		static class State<T> {\n" +
					"		}\n" +
					"	}\n" +
					"}\n", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=220361 - variation
public void test1302() {
	runConformTest(
		true,
		new String[] {
			"EMap.java",
			"import java.util.ArrayList;\n" +
			"import java.util.Map;\n" +
			"\n" +
			"public abstract class EMap<A, B> implements Map<A, B> {\n" +
			"  public abstract static class Unsettable<K, V> extends EMap<K, V> {\n" +
			"    protected class UnsettableEList<E extends Object & Entry<K, V>> extends EList<E> {\n" +
			"    }\n" +
			"  }\n" +
			"  protected class EList<E extends Object & Entry<A,B>> extends ArrayList<E>{\n" +
			"  }\n" +
			"}\n", // =================
		},
		null,
		"",
		null,
		JavacTestOptions.EclipseHasABug.EclipseBug159851);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=219625
public void test1303() {
	this.runConformTest(
			new String[] {
					"X.java",
					"public class X {\n" +
					"  interface Foo<T> {\n" +
					"    T getValue();\n" +
					"    void doSomething(T o);\n" +
					"  }\n" +
					"  public static abstract class AbstractFoo<T> implements Foo<T> {\n" +
					"    /**\n" +
					"     * If this is removed ConcreteFoo no longer compiles.\n" +
					"     */\n" +
					"    public void doSomething(final String o) {\n" +
					"    }\n" +
					"  }\n" +
					"  public static final class ConcreteFoo extends AbstractFoo<String> {\n" +
					"    public String getValue() {\n" +
					"      return \"I am a string\";\n" +
					"    }\n" +
					"  }\n" +
					"  /**\n" +
					"   * We lose the type infomation here so try but fail to call the doSomething(Object) method.\n" +
					"   */\n" +
					"  private static <T> void feedFoosValueIntoFoo(final Foo<T> foo) {\n" +
					"    foo.doSomething(foo.getValue());\n" +
					"  }\n" +
					"  private static void testTypedString() {\n" +
					"    final ConcreteFoo foo = new ConcreteFoo();\n" +
					"    foo.doSomething(foo.getValue());\n" +
					"  }\n" +
					"  private static void testGenericString() {\n" +
					"    feedFoosValueIntoFoo(new ConcreteFoo());\n" +
					"  }\n" +
					"  public static void main(String[] args) {\n" +
					"    testTypedString();\n" +
					"    testGenericString();\n" +
					"    System.out.println(\"SUCCESS\");\n" +
					"  }\n" +
					"}\n", // =================
			},
			"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=219625 - variation
public void test1304() {
	this.runConformTest(
			new String[] {
					"X.java",
					"interface Foo<T> {\n" +
					"	T get();\n" +
					"	void doSomething(T t);\n" +
					"}\n" +
					"abstract class XSuper implements Foo<String> {\n" +
					"	public void doSomething(String s) { System.out.println(s); }\n" +
					"}\n" +
					"public class X extends XSuper {\n" +
					"	public String get() { return \"SUCCESS\"; }\n" +
					"	static <U> void doIt(Foo<U> f) {\n" +
					"		f.doSomething(f.get());\n" +
					"	}\n" +
					"	public static void main(String[] args) {\n" +
					"		doIt(new X());\n" +
					"	}\n" +
					"}\n", // =================
			},
			"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=223334
public void test1305() {
	this.runConformTest(
			new String[] {
					"bug/ConflictManager.java",// =================
					"package bug;\n" +
					"import java.util.*;\n" +
					"public class ConflictManager<T> {\n" +
					"	public List<Map.Entry<Integer, ? extends Collection<T>>> getConflictsSortedBySize() {\n" +
					"		return null;\n" +
					"	}\n" +
					"}\n",
					"bug/LayoutOrganizable.java",// =================
					"package bug;\n" +
					"public class LayoutOrganizable<T> {\n" +
					"	private T t;\n" +
					"\n" +
					"	public LayoutOrganizable(T t) {\n" +
					"		this.t = t;\n" +
					"\n" +
					"	}\n" +
					"}\n",
					"bug/LayoutOrganizer.java",
					"package bug;\n" +
					"import java.util.*;\n" +
					"public class LayoutOrganizer<T> {\n" +
					"	ConflictManager<LayoutOrganizable<T>> conflictManager = new ConflictManager<LayoutOrganizable<T>>();\n" +
					"	private boolean optimizeEqual() {\n" +
					"		List<Map.Entry<Integer, ? extends Collection<LayoutOrganizable<T>>>> list;\n" +
					"		ListIterator<Map.Entry<Integer, ? extends Collection<LayoutOrganizable<T>>>> i;\n" +
					"		// create sorted list of pairs\n" +
					"		// (#conflicts, list of LayoutOrganizable sharing this #conflicts)\n" +
					"		// Here is the problem...\n" +
					"		list = conflictManager.getConflictsSortedBySize();\n" +
					"		return null == list;\n" +
					"	}\n" +
					"}\n", // =================
			},
			"");
	this.runConformTest(
			new String[] {
					"bug/LayoutOrganizer.java",
					"package bug;\n" +
					"import java.util.*;\n" +
					"public class LayoutOrganizer<T> {\n" +
					"	ConflictManager<LayoutOrganizable<T>> conflictManager = new ConflictManager<LayoutOrganizable<T>>();\n" +
					"	private boolean optimizeEqual() {\n" +
					"		List<Map.Entry<Integer, ? extends Collection<LayoutOrganizable<T>>>> list;\n" +
					"		ListIterator<Map.Entry<Integer, ? extends Collection<LayoutOrganizable<T>>>> i;\n" +
					"		// create sorted list of pairs\n" +
					"		// (#conflicts, list of LayoutOrganizable sharing this #conflicts)\n" +
					"		// Here is the problem...\n" +
					"		list = conflictManager.getConflictsSortedBySize();\n" +
					"		return null == list;\n" +
					"	}\n" +
					"}\n", // =================
			},
			"",
			null,
			false,
			null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=106744 - variation
public void test1306() {
	runNegativeTest(
		// test directory preparation
		new String[] { /* test files */
				"X.java",
				"import java.lang.reflect.Constructor;\n" +
				"import java.lang.annotation.Documented;\n" +
				"import java.util.List;\n" +
				"\n" +
				"public class X {\n" +
				"    Constructor c = null;\n" +
				"    Documented d = c.getAnnotation(Documented.class);\n" +
				"}\n", // =================
		},
		// compiler results
		"----------\n" + /* expected compiler log */
		"1. WARNING in X.java (at line 6)\n" +
		"	Constructor c = null;\n" +
		"	^^^^^^^^^^^\n" +
		"Constructor is a raw type. References to generic type Constructor<T> should be parameterized\n" +
		"----------\n" +
		"2. WARNING in X.java (at line 7)\n" +
		"	Documented d = c.getAnnotation(Documented.class);\n" +
		"	               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type safety: The method getAnnotation(Class) belongs to the raw type Constructor. References to generic type Constructor<T> should be parameterized\n" +
		"----------\n" +
		"3. ERROR in X.java (at line 7)\n" +
		"	Documented d = c.getAnnotation(Documented.class);\n" +
		"	               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
		"Type mismatch: cannot convert from Annotation to Documented\n" +
		"----------\n",
		// javac options
		JavacTestOptions.JavacHasABug.JavacBug6400189 /* javac test options */);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=106744 - variation
public void test1307() {
	this.runNegativeTest(
			new String[] {
					"Y.java",
					"import java.util.List;\n" +
					"public class Y<T> {\n" +
					"	Zork z;\n" +
					"	Y<T> itself() { return this; }\n" +
					"	List<String> list() { return null; }\n" +
					"	Y<String> someY() { return null; }\n" +
					"}\n" +
					"class Z {\n" +
					"	void foo(Y y) {\n" +
					"		Z z = y.itself(); // Y cannot be converted to Z (itself() return type got erased)\n" +
					"		List<String> l = y.list(); // unchecked conversion from List to List<String>\n" +
					"		Y<String> ys = y.someY(); // unchecked conversion from Y to Y<String>\n" +
					"	}\n" +
					"}\n", // =================
			},
			"----------\n" +
			"1. ERROR in Y.java (at line 3)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n" +
			"2. WARNING in Y.java (at line 9)\n" +
			"	void foo(Y y) {\n" +
			"	         ^\n" +
			"Y is a raw type. References to generic type Y<T> should be parameterized\n" +
			"----------\n" +
			"3. ERROR in Y.java (at line 10)\n" +
			"	Z z = y.itself(); // Y cannot be converted to Z (itself() return type got erased)\n" +
			"	      ^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Y to Z\n" +
			"----------\n" +
			"4. WARNING in Y.java (at line 11)\n" +
			"	List<String> l = y.list(); // unchecked conversion from List to List<String>\n" +
			"	                 ^^^^^^^^\n" +
			"Type safety: The expression of type List needs unchecked conversion to conform to List<String>\n" +
			"----------\n" +
			"5. WARNING in Y.java (at line 12)\n" +
			"	Y<String> ys = y.someY(); // unchecked conversion from Y to Y<String>\n" +
			"	               ^^^^^^^^^\n" +
			"Type safety: The expression of type Y needs unchecked conversion to conform to Y<String>\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=106744 - variation
public void test1308() {
	this.runNegativeTest(
			new String[] {
					"Y.java",
					"@interface MyAnnotation {\n" +
					"}\n" +
					"class MyAccessibleObject {\n" +
					"	<T extends java.lang.annotation.Annotation> Object getAnnotation(Class<T> c) {\n" +
					"		return null;\n" +
					"	}\n" +
					"}\n" +
					"class MyConstructor<V> extends MyAccessibleObject {\n" +
					"	<T extends java.lang.annotation.Annotation> T getAnnotation(Class<T> c) {\n" +
					"		return null;\n" +
					"	}\n" +
					"}\n" +
					"class X {\n" +
					"	void bar1(java.lang.reflect.Constructor constr, Class<MyAnnotation> ann) {\n" +
					"		MyAnnotation a = constr.getAnnotation(ann); // 1\n" +
					"	}\n" +
					"	void bar2(MyConstructor constr, Class<MyAnnotation> ann) {\n" +
					"		MyAnnotation a = constr.getAnnotation(ann); // 2\n" +
					"	}\n" +
					"}\n", // =================
			},
			"----------\n" +
			"1. WARNING in Y.java (at line 9)\n" +
			"	<T extends java.lang.annotation.Annotation> T getAnnotation(Class<T> c) {\n" +
			"	                                              ^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"The method getAnnotation(Class<T>) of type MyConstructor<V> should be tagged with @Override since it actually overrides a superclass method\n" +
			"----------\n" +
			"2. WARNING in Y.java (at line 14)\n" +
			"	void bar1(java.lang.reflect.Constructor constr, Class<MyAnnotation> ann) {\n" +
			"	          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Constructor is a raw type. References to generic type Constructor<T> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in Y.java (at line 15)\n" +
			"	MyAnnotation a = constr.getAnnotation(ann); // 1\n" +
			"	                 ^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The method getAnnotation(Class) belongs to the raw type Constructor. References to generic type Constructor<T> should be parameterized\n" +
			"----------\n" +
			"4. ERROR in Y.java (at line 15)\n" +
			"	MyAnnotation a = constr.getAnnotation(ann); // 1\n" +
			"	                 ^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Annotation to MyAnnotation\n" +
			"----------\n" +
			"5. WARNING in Y.java (at line 17)\n" +
			"	void bar2(MyConstructor constr, Class<MyAnnotation> ann) {\n" +
			"	          ^^^^^^^^^^^^^\n" +
			"MyConstructor is a raw type. References to generic type MyConstructor<V> should be parameterized\n" +
			"----------\n" +
			"6. WARNING in Y.java (at line 18)\n" +
			"	MyAnnotation a = constr.getAnnotation(ann); // 2\n" +
			"	                 ^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The method getAnnotation(Class) belongs to the raw type MyConstructor. References to generic type MyConstructor<V> should be parameterized\n" +
			"----------\n" +
			"7. ERROR in Y.java (at line 18)\n" +
			"	MyAnnotation a = constr.getAnnotation(ann); // 2\n" +
			"	                 ^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Annotation to MyAnnotation\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=226145
public void test1309() {
	this.runNegativeTest(
			new String[] {
					"EclipseGenericBug.java",
					"public class EclipseGenericBug {\n" +
					"  static class ParametricClass<T> {\n" +
					"    static interface NonParametricInterface {\n" +
					"      static interface ParametricInterface<S> {\n" +
					"      }\n" +
					"    }\n" +
					"  }\n" +
					"  \n" +
					"  static class ParametricInstance<T> extends ParametricClass<T> {\n" +
					"    NonParametricInterface.ParametricInterface<T> instance = null;\n" +
					"  }\n" +
					"}\n", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=224855
public void test1310() {
	this.runNegativeTest(
			new String[] {
					"X.java",
					"import java.util.Set;\n" +
					"public class X {\n" +
					"	public void testCast(){\n" +
					"		Set<Class> classes = (Set<Class>)getClasses();\n" +
					"	}\n" +
					"	public Set<Class<? extends Object>> getClasses() {\n" +
					"		return null;\n" +
					"	}\n" +
					"}\n", // =================
			},
			"----------\n" +
			"1. WARNING in X.java (at line 4)\n" +
			"	Set<Class> classes = (Set<Class>)getClasses();\n" +
			"	    ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 4)\n" +
			"	Set<Class> classes = (Set<Class>)getClasses();\n" +
			"	                     ^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Cannot cast from Set<Class<? extends Object>> to Set<Class>\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 4)\n" +
			"	Set<Class> classes = (Set<Class>)getClasses();\n" +
			"	                          ^^^^^\n" +
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=209149
public void test1311() {
	String[] test = new String[] {
		"X.java",
		"class X<E, D extends E> {}\n" +
		"class Y<E extends D, D> {}"
	};
	if (this.complianceLevel < ClassFileConstants.JDK1_7) {
		this.runNegativeTest(
			test,
			"----------\n" +
			"1. ERROR in X.java (at line 2)\n" +
			"	class Y<E extends D, D> {}\n" +
			"	        ^\n" +
			"Illegal forward reference to type parameter D\n" +
			"----------\n");
	} else {
		this.runConformTest(test, "");
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=226535
public void test1312() {
	this.runConformTest(
			new String[] {
					"X.java",
					" class Tuple3f<T extends Tuple3f<T>> {\n" +
					"	private float x, y, z;\n" +
					"	float getX() { return this.x; }\n" +
					"	float getY() { return this.y; }\n" +
					"	float getZ() { return this.z; }\n" +
					"	void set(float newX, float newY, float newZ) {\n" +
					"		this.x = newX;\n" +
					"		this.y = newY;\n" +
					"		this.z = newZ;\n" +
					"	}\n" +
					"	public T add(Tuple3f<?> t) {\n" +
					"		this.set(this.getX() + t.getX(), this.getY() + t.getY(), this.getZ() + t.getZ());\n" +
					"		@SuppressWarnings(\"unchecked\")\n" +
					"		T result = (T) this;\n" +
					"		return result;\n" +
					"	}\n" +
					"}\n" +
					"\n" +
					"class Vector3f extends Tuple3f<Vector3f> {\n" +
					"	float magnitude () {\n" +
					"		float x = this.getX(), y = this.getY(), z = this.getZ();\n" +
					"		return (float) Math.sqrt((x*x) + (y*y) + (z*z));\n" +
					"	}\n" +
					"}\n" +
					"\n" +
					"public class X {\n" +
					"	public static void main(String[] args) {\n" +
					"		Vector3f v = new Vector3f();\n" +
					"		float magn = v.add(v).add(v).magnitude();\n" +
					"		System.out.println((int)magn);\n" +
					"	}\n" +
					"}\n", // =================
			},
			"0");
}
public void test1313() {
	this.runNegativeTest(
			new String[] {
					"X.java",
					"import java.util.*;\n" +
					"\n" +
					"public class X {\n" +
					"	public static void main(String[] args) {\n" +
					"		List<?>[] l1 = new List<?>[1];\n" +
					"		List<?>[] l2 = new List<? extends Object>[2];\n" +
					"		List<? extends Object> l3 = new List<?>[3];\n" +
					"	}\n" +
					"}\n", // =================
			},
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	List<?>[] l2 = new List<? extends Object>[2];\n" +
			"	               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Cannot create a generic array of List<? extends Object>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 7)\n" +
			"	List<? extends Object> l3 = new List<?>[3];\n" +
			"	                            ^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from List<?>[] to List<? extends Object>\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=230070
public void test1314() {
	this.runNegativeTest(
			new String[] {
					"X.java",
					"class B {\n" +
					"}\n" +
					"class Y<K> {\n" +
					"	Y(K k) {\n" +
					"		System.out.println(k);\n" +
					"	}\n" +
					"}\n" +
					"public class X<K> {\n" +
					"	static final B b = new B();\n" +
					"	Object foo(K toKey) {\n" +
					"		if (false) return new Y(b);//1\n" +
					"		if (false) return new Y((K) b);//2\n" +
					"		return new Y((K) (Object) b);//3\n" +
					"	}\n" +
					"	Object bar(K toKey) {\n" +
					"		if (false) return new Y<K>(b);//4\n" +
					"		if (false) return new Y<K>((K) b);//5\n" +
					"		return new Y<K>((K) (Object) b);//6\n" +
					"	}	\n" +
					"}\n", // =================
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 11)\n" + 
			"	if (false) return new Y(b);//1\n" + 
			"	           ^^^^^^^^^^^^^^^^\n" + 
			"Dead code\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 11)\n" + 
			"	if (false) return new Y(b);//1\n" + 
			"	                  ^^^^^^^^\n" + 
			"Type safety: The constructor Y(Object) belongs to the raw type Y. References to generic type Y<K> should be parameterized\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 11)\n" + 
			"	if (false) return new Y(b);//1\n" + 
			"	                      ^\n" + 
			"Y is a raw type. References to generic type Y<K> should be parameterized\n" + 
			"----------\n" + 
			"4. WARNING in X.java (at line 12)\n" + 
			"	if (false) return new Y((K) b);//2\n" + 
			"	           ^^^^^^^^^^^^^^^^^^^^\n" + 
			"Dead code\n" + 
			"----------\n" + 
			"5. WARNING in X.java (at line 12)\n" + 
			"	if (false) return new Y((K) b);//2\n" + 
			"	                  ^^^^^^^^^^^^\n" + 
			"Type safety: The constructor Y(Object) belongs to the raw type Y. References to generic type Y<K> should be parameterized\n" + 
			"----------\n" + 
			"6. WARNING in X.java (at line 12)\n" + 
			"	if (false) return new Y((K) b);//2\n" + 
			"	                      ^\n" + 
			"Y is a raw type. References to generic type Y<K> should be parameterized\n" + 
			"----------\n" + 
			"7. WARNING in X.java (at line 12)\n" + 
			"	if (false) return new Y((K) b);//2\n" + 
			"	                        ^^^^^\n" + 
			"Type safety: Unchecked cast from B to K\n" + 
			"----------\n" + 
			"8. WARNING in X.java (at line 12)\n" + 
			"	if (false) return new Y((K) b);//2\n" + 
			"	                        ^^^^^\n" + 
			"Unnecessary cast from B to K\n" + 
			"----------\n" + 
			"9. WARNING in X.java (at line 13)\n" + 
			"	return new Y((K) (Object) b);//3\n" + 
			"	       ^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: The constructor Y(Object) belongs to the raw type Y. References to generic type Y<K> should be parameterized\n" + 
			"----------\n" + 
			"10. WARNING in X.java (at line 13)\n" + 
			"	return new Y((K) (Object) b);//3\n" + 
			"	           ^\n" + 
			"Y is a raw type. References to generic type Y<K> should be parameterized\n" + 
			"----------\n" + 
			"11. WARNING in X.java (at line 13)\n" + 
			"	return new Y((K) (Object) b);//3\n" + 
			"	             ^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked cast from Object to K\n" + 
			"----------\n" + 
			"12. WARNING in X.java (at line 13)\n" + 
			"	return new Y((K) (Object) b);//3\n" + 
			"	             ^^^^^^^^^^^^^^\n" + 
			"Unnecessary cast from Object to K\n" + 
			"----------\n" + 
			"13. WARNING in X.java (at line 13)\n" + 
			"	return new Y((K) (Object) b);//3\n" + 
			"	                 ^^^^^^^^^^\n" + 
			"Unnecessary cast from B to Object\n" + 
			"----------\n" + 
			"14. ERROR in X.java (at line 16)\n" + 
			"	if (false) return new Y<K>(b);//4\n" + 
			"	                  ^^^^^^^^^^^\n" + 
			"The constructor Y<K>(B) is undefined\n" + 
			"----------\n" + 
			"15. WARNING in X.java (at line 17)\n" + 
			"	if (false) return new Y<K>((K) b);//5\n" + 
			"	                           ^^^^^\n" + 
			"Type safety: Unchecked cast from B to K\n" + 
			"----------\n" + 
			"16. WARNING in X.java (at line 18)\n" + 
			"	return new Y<K>((K) (Object) b);//6\n" + 
			"	                ^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked cast from Object to K\n" + 
			"----------\n" + 
			"17. WARNING in X.java (at line 18)\n" + 
			"	return new Y<K>((K) (Object) b);//6\n" + 
			"	                    ^^^^^^^^^^\n" + 
			"Unnecessary cast from B to Object\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=228291
public void test1315() {
	this.runNegativeTest(
			new String[] {
					"X.java",
					"import java.util.*;\n" +
					"\n" +
					"public class X<T> extends Vector<Collection<T>> {\n" +
					"	private static final long serialVersionUID = 1L;\n" +
					"	public Vector<T> cast(List<T> in) {\n" +
					"		return (Vector<T>) in;\n" +
					"	}\n" +
					"	public X<T> castSilly(Vector<Collection<T>> in) {\n" +
					"		return (X<T>) in;\n" +
					"	}\n" +
					"	public static void main(String[] args) {\n" +
					"		Zork z;\n" +
					"	}\n" +
					"}\n", // =================
			},
			"----------\n" +
			"1. ERROR in X.java (at line 12)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=230466
public void test1316() {
	this.runConformTest(
			new String[] {
					"e/AbstractClass.java", // =================
					"package e;\n" +
					"public abstract class AbstractClass<E> {\n" +
					"        protected abstract void method1();\n" +
					"}\n",
					"q/AbstractTest.java", // =================
					"package q;\n" +
					"import java.util.Map;\n" +
					"import e.AbstractClass;\n" +
					"public abstract class AbstractTest<T> {\n" +
					"        protected class InnerClass extends AbstractClass<InnerClass>{\n" +
					"                public void innerMethod() {\n" +
					"                        System.out.println(\"innerMethod\");\n" +
					"                }\n" +
					"                @Override\n" +
					"                protected void method1() {\n" +
					"                        System.out.println(\"method1\");\n" +
					"                }\n" +
					"        }\n" +
					"        protected Map<String, InnerClass> records;\n" +
					"        public abstract void method(); \n" +
					"}\n",
					"w/Test.java", // =================
					"package w;\n" +
					"import q.AbstractTest;\n" +
					"public class Test extends AbstractTest<Test> {\n" +
					"        @Override\n" +
					"        public void method() {\n" +
					"            // Error here\n" +
					"                InnerClass inner = records.get(\"1\");\n" +
					"        }\n" +
					"}\n", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=229928
public void test1317() {
	this.runNegativeTest(
			new String[] {
					"X.java", // =================
					"public class X {\n" +
					"        void foo(String name, String value) {}\n" +
					"        <T extends M> void foo(String name, T value) {}\n" +
					"\n" +
					"        void foo2(String name, String value) {}\n" +
					"        <T extends N<T>> void foo2(String name, T value) {}\n" +
					"\n" +
					"        <T extends N<T>> T foo3(String name, T value) {}\n" +
					"}\n" +
					"class M {}\n" +
					"class N<T> {}\n" +
					"\n" +
					"class Test {\n" +
					"        void test() {\n" +
					"                new X().foo(\"HI\", null); // correctly report error\n" +
					"                new X().foo2(\"HI\", null); // miss ambiguous error\n" +
					"                \n" +
					"                Thread t1 = foo3(\"HI\", null);\n" +
					"                Thread t2 = (Thread)foo3(\"HI\", null);\n" +
					"        }\n" +
					"}\n", // =================
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 8)\n" + 
			"	<T extends N<T>> T foo3(String name, T value) {}\n" + 
			"	                   ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"This method must return a result of type T\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 15)\n" + 
			"	new X().foo(\"HI\", null); // correctly report error\n" + 
			"	        ^^^\n" + 
			"The method foo(String, String) is ambiguous for the type X\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 16)\n" + 
			"	new X().foo2(\"HI\", null); // miss ambiguous error\n" + 
			"	        ^^^^\n" + 
			"The method foo2(String, String) is ambiguous for the type X\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 18)\n" + 
			"	Thread t1 = foo3(\"HI\", null);\n" + 
			"	            ^^^^\n" + 
			"The method foo3(String, null) is undefined for the type Test\n" + 
			"----------\n" + 
			"5. ERROR in X.java (at line 19)\n" + 
			"	Thread t2 = (Thread)foo3(\"HI\", null);\n" + 
			"	                    ^^^^\n" + 
			"The method foo3(String, null) is undefined for the type Test\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=229928 - variation
public void test1318() {
	this.runNegativeTest(
			new String[] {
					"X.java", // =================
					"public class X {\n" +
					"        <T extends N<T>> void foo2(String name, T value) {}\n" +
					"}\n" +
					"class N<T> {}\n" +
					"\n" +
					"class Test {\n" +
					"        void test() {\n" +
					"                new X().foo2(\"HI\", null);\n" +
					"                new X().<N<?>>foo2(\"HI\", null);\n" +
					"                new X().<N<? extends N<?>>>foo2(\"HI\", null);\n" +
					"        }\n" +
					"}\n", // =================
			},
			"----------\n" +
			"1. ERROR in X.java (at line 9)\n" +
			"	new X().<N<?>>foo2(\"HI\", null);\n" +
			"	              ^^^^\n" +
			"Bound mismatch: The generic method foo2(String, T) of type X is not applicable for the arguments (String, null). The inferred type N<?> is not a valid substitute for the bounded parameter <T extends N<T>>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 10)\n" +
			"	new X().<N<? extends N<?>>>foo2(\"HI\", null);\n" +
			"	                           ^^^^\n" +
			"Bound mismatch: The generic method foo2(String, T) of type X is not applicable for the arguments (String, null). The inferred type N<? extends N<?>> is not a valid substitute for the bounded parameter <T extends N<T>>\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=229928 - variation
public void test1319() {
	this.runConformTest(
			new String[] {
					"X.java", // =================
					"import java.util.List;\n" +
					"public class X {\n" +
					"        <T extends List<U>, U extends List<W>, W extends List<T>> void foo2(String name, U u, T t, W w) {}\n" +
					"}\n" +
					"\n" +
					"class Test {\n" +
					"        void test() {\n" +
					"                new X().foo2(\"HI\", null, null, null);\n" +
					"        }\n" +
					"}\n", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=229928 - variation
public void test1320() {
	this.runConformTest(
			new String[] {
					"X.java", // =================
					"import java.util.List;\n" +
					"public class X {\n" +
					"        <T extends List<U>, U extends List<W>, W extends List<U>> void foo2(String name, U u, T t, W w) {}\n" +
					"}\n" +
					"\n" +
					"class Test {\n" +
					"        void test() {\n" +
					"                new X().foo2(\"HI\", null, null, null);\n" +
					"        }\n" +
					"}\n", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=229928 - variation
public void test1321() {
	this.runConformTest(
			new String[] {
					"X.java", // =================
					"import java.util.List;\n" +
					"public class X {\n" +
					"        <T, U extends List<T>, W extends List<U>> void foo2(String name, U u, T t, W w) {}\n" +
					"}\n" +
					"\n" +
					"class Test {\n" +
					"        void test() {\n" +
					"                new X().foo2(\"HI\", null, null, null);\n" +
					"        }\n" +
					"}\n", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=231094
public void test1322() {
	this.runNegativeTest(
			new String[] {
					"X.java", // =================
					"public class X {\n" +
					"	public static void main(String[] args) {\n" +
					"		X x = new X();\n" +
					"\n" +
					"		/** OK: Bob.class is correct. No idea about the Thingy */\n" +
					"		x.doStuff(Bob.class, new Thingy());\n" +
					"\n" +
					"		/**\n" +
					"		 * This line will fail when compiled with the Java 5 SDK: Test.java:25:\n" +
					"		 * <T>doStuff(java.lang.Class<T>,Thingy<T>) in Test cannot be applied to\n" +
					"		 * (java.lang.Class<Bill>,Thingy) test.doStuff(Bill.class, new\n" +
					"		 * Thingy()); ^ Note: Test.java uses unchecked or unsafe operations.\n" +
					"		 * Note: Recompile with -Xlint:unchecked for details. 1 error\n" +
					"		 */\n" +
					"		x.doStuff(Jim.class, new Thingy());\n" +
					"	}\n" +
					"	<T extends Bob> void doStuff(Class<T> klass, Thingy<T> thingy) {\n" +
					"	}\n" +
					"}\n" +
					"class Jim {}\n" +
					"class Bob {}\n" +
					"class Bob2 extends Bob {}\n" +
					"class Thingy<T extends Bob> {}\n", // =================
			},
			this.complianceLevel < ClassFileConstants.JDK1_8 ?
			"----------\n" + 
			"1. WARNING in X.java (at line 6)\n" + 
			"	x.doStuff(Bob.class, new Thingy());\n" + 
			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation doStuff(Class<Bob>, Thingy) of the generic method doStuff(Class<T>, Thingy<T>) of type X\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 6)\n" + 
			"	x.doStuff(Bob.class, new Thingy());\n" + 
			"	                     ^^^^^^^^^^^^\n" + 
			"Type safety: The expression of type Thingy needs unchecked conversion to conform to Thingy<Bob>\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 6)\n" + 
			"	x.doStuff(Bob.class, new Thingy());\n" + 
			"	                         ^^^^^^\n" + 
			"Thingy is a raw type. References to generic type Thingy<T> should be parameterized\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 15)\n" + 
			"	x.doStuff(Jim.class, new Thingy());\n" + 
			"	  ^^^^^^^\n" + 
			"Bound mismatch: The generic method doStuff(Class<T>, Thingy<T>) of type X is not applicable for the arguments (Class<Jim>, Thingy). The inferred type Jim is not a valid substitute for the bounded parameter <T extends Bob>\n" + 
			"----------\n" + 
			"5. WARNING in X.java (at line 15)\n" + 
			"	x.doStuff(Jim.class, new Thingy());\n" + 
			"	                         ^^^^^^\n" + 
			"Thingy is a raw type. References to generic type Thingy<T> should be parameterized\n" + 
			"----------\n" :
				"----------\n" + 
				"1. WARNING in X.java (at line 6)\n" + 
				"	x.doStuff(Bob.class, new Thingy());\n" + 
				"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Type safety: Unchecked invocation doStuff(Class<Bob>, Thingy) of the generic method doStuff(Class<T>, Thingy<T>) of type X\n" + 
				"----------\n" + 
				"2. WARNING in X.java (at line 6)\n" + 
				"	x.doStuff(Bob.class, new Thingy());\n" + 
				"	                     ^^^^^^^^^^^^\n" + 
				"Type safety: The expression of type Thingy needs unchecked conversion to conform to Thingy<Bob>\n" + 
				"----------\n" + 
				"3. WARNING in X.java (at line 6)\n" + 
				"	x.doStuff(Bob.class, new Thingy());\n" + 
				"	                         ^^^^^^\n" + 
				"Thingy is a raw type. References to generic type Thingy<T> should be parameterized\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 15)\n" + 
				"	x.doStuff(Jim.class, new Thingy());\n" + 
				"	  ^^^^^^^\n" + 
				"The method doStuff(Class<T>, Thingy<T>) in the type X is not applicable for the arguments (Class<Jim>, Thingy)\n" + 
				"----------\n" + 
				"5. WARNING in X.java (at line 15)\n" + 
				"	x.doStuff(Jim.class, new Thingy());\n" + 
				"	                         ^^^^^^\n" + 
				"Thingy is a raw type. References to generic type Thingy<T> should be parameterized\n" + 
				"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=231094 - variation
// FAIL ERRMSG and MISSING WARNINGS(?)
public void test1323() {
	if (this.complianceLevel >= ClassFileConstants.JDK1_8)
		return;
	this.runNegativeTest(
			new String[] {
					"X.java", // =================
					"public class X {\n" +
					"	public static void main(String[] args) {\n" +
					"		X x = new X();\n" +
					"		x.doStuff2(Jim.class, new Thingy());\n" +
					"		String s = x.doStuff2(Bob2.class, new Thingy());\n" +
					"	}\n" +
					"	<T extends Bob, U extends Bob> T doStuff2(Class<T> klass, Thingy<U> thingy) { return null; }\n" +
					"}\n" +
					"class Jim {}\n" +
					"class Bob {}\n" +
					"class Bob2 extends Bob {}\n" +
					"class Thingy<T extends Bob> {}\n", // =================
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 4)\n" + 
			"	x.doStuff2(Jim.class, new Thingy());\n" + 
			"	  ^^^^^^^^\n" + 
			"Bound mismatch: The generic method doStuff2(Class<T>, Thingy<U>) of type X is not applicable for the arguments (Class<Jim>, Thingy). The inferred type Jim is not a valid substitute for the bounded parameter <T extends Bob>\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 4)\n" + 
			"	x.doStuff2(Jim.class, new Thingy());\n" + 
			"	                          ^^^^^^\n" + 
			"Thingy is a raw type. References to generic type Thingy<T> should be parameterized\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 5)\n" + 
			"	String s = x.doStuff2(Bob2.class, new Thingy());\n" + 
			"	           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation doStuff2(Class<Bob2>, Thingy) of the generic method doStuff2(Class<T>, Thingy<U>) of type X\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 5)\n" + 
			"	String s = x.doStuff2(Bob2.class, new Thingy());\n" + 
			"	           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type mismatch: cannot convert from Bob2 to String\n" + 
			"----------\n" + 
			"5. WARNING in X.java (at line 5)\n" + 
			"	String s = x.doStuff2(Bob2.class, new Thingy());\n" + 
			"	                                  ^^^^^^^^^^^^\n" + 
			"Type safety: The expression of type Thingy needs unchecked conversion to conform to Thingy<Bob>\n" + 
			"----------\n" + 
			"6. WARNING in X.java (at line 5)\n" + 
			"	String s = x.doStuff2(Bob2.class, new Thingy());\n" + 
			"	                                      ^^^^^^\n" + 
			"Thingy is a raw type. References to generic type Thingy<T> should be parameterized\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=231094 - variation
public void test1324() {
	this.runNegativeTest(
			new String[] {
					"X.java", // =================
					"public class X {\n" +
					"	public static void main(String[] args) {\n" +
					"		X x = new X();\n" +
					"\n" +
					"		/** OK: Bob.class is correct. No idea about the Thingy */\n" +
					"		x.doStuff(Bob.class, new Thingy());\n" +
					"		x.doStuff(Bob.class, new Thingy<Bob>()); // second invocation is NOT unchecked\n" +
					"		Zork z;\n" +
					"	}\n" +
					"	<T extends Bob> T doStuff(Class<T> klass, Thingy<T> thingy) { return null; }\n" +
					"}\n" +
					"class Jim {}\n" +
					"class Bob {}\n" +
					"class Thingy<T extends Bob> {}\n", // =================
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 6)\n" + 
			"	x.doStuff(Bob.class, new Thingy());\n" + 
			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation doStuff(Class<Bob>, Thingy) of the generic method doStuff(Class<T>, Thingy<T>) of type X\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 6)\n" + 
			"	x.doStuff(Bob.class, new Thingy());\n" + 
			"	                     ^^^^^^^^^^^^\n" + 
			"Type safety: The expression of type Thingy needs unchecked conversion to conform to Thingy<Bob>\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 6)\n" + 
			"	x.doStuff(Bob.class, new Thingy());\n" + 
			"	                         ^^^^^^\n" + 
			"Thingy is a raw type. References to generic type Thingy<T> should be parameterized\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 8)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=231094 - variation
public void test1325() {
	this.runNegativeTest(
			new String[] {
					"X.java", // =================
					"public class X<E> {\n" +
					"	<T,U> U foo(X<T> xt) {\n" +
					"		return null;\n" +
					"	}\n" +
					"	void bar(X x) {\n" +
					"		X<String> xs2 = foo(x);\n" +
					"	}\n" +
					"}\n", // =================
			},
			(this.complianceLevel < ClassFileConstants.JDK1_8
			?
			"----------\n" + 
			"1. WARNING in X.java (at line 5)\n" + 
			"	void bar(X x) {\n" + 
			"	         ^\n" + 
			"X is a raw type. References to generic type X<E> should be parameterized\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 6)\n" + 
			"	X<String> xs2 = foo(x);\n" + 
			"	                ^^^^^^\n" + 
			"Type safety: Unchecked invocation foo(X) of the generic method foo(X<T>) of type X<E>\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 6)\n" + 
			"	X<String> xs2 = foo(x);\n" + 
			"	                ^^^^^^\n" + 
			"Type safety: The expression of type X needs unchecked conversion to conform to X<String>\n" + 
			"----------\n" + 
			"4. WARNING in X.java (at line 6)\n" + 
			"	X<String> xs2 = foo(x);\n" + 
			"	                    ^\n" + 
			"Type safety: The expression of type X needs unchecked conversion to conform to X<Object>\n" + 
			"----------\n"
			: // 1.8 is stricter:
			"----------\n" + 
			"1. WARNING in X.java (at line 5)\n" + 
			"	void bar(X x) {\n" + 
			"	         ^\n" + 
			"X is a raw type. References to generic type X<E> should be parameterized\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 6)\n" + 
			"	X<String> xs2 = foo(x);\n" + 
			"	                ^^^^^^\n" + 
			"Type mismatch: cannot convert from Object to X<String>\n" + 
			"----------\n"));
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=231094 - variation
public void test1326() {
	this.runNegativeTest(
			new String[] {
					"X.java", // =================
					"public class X<E> {\n" +
					"	<T extends Thread,U> X<T> foo(X<T> xt, X<U> xt2) {\n" +
					"		return null;\n" +
					"	}\n" +
					"	X<E> identity() {\n" +
					"		return this;\n" +
					"	}\n" +
					"	void bar(X x, X<String> xs) {\n" +
					"		X<String> xs2 = foo(xs, x).identity();\n" +
					"	}\n" +
					"}\n", // =================
			},
			this.complianceLevel < ClassFileConstants.JDK1_8 ?
			"----------\n" +
			"1. WARNING in X.java (at line 8)\n" +
			"	void bar(X x, X<String> xs) {\n" +
			"	         ^\n" +
			"X is a raw type. References to generic type X<E> should be parameterized\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 9)\n" +
			"	X<String> xs2 = foo(xs, x).identity();\n" +
			"	                ^^^\n" +
			"Bound mismatch: The generic method foo(X<T>, X<U>) of type X<E> is not applicable for the arguments (X<String>, X). The inferred type String is not a valid substitute for the bounded parameter <T extends Thread>\n" +
			"----------\n" :
				"----------\n" + 
				"1. WARNING in X.java (at line 8)\n" + 
				"	void bar(X x, X<String> xs) {\n" + 
				"	         ^\n" + 
				"X is a raw type. References to generic type X<E> should be parameterized\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 9)\n" + 
				"	X<String> xs2 = foo(xs, x).identity();\n" + 
				"	                ^^^\n" + 
				"The method foo(X<T>, X<U>) in the type X<E> is not applicable for the arguments (X<String>, X)\n" + 
				"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=231094 - variation
public void test1327() {
	this.runNegativeTest(
			new String[] {
					"X.java", // =================
					"public class X<E> {\n" +
					"	<T,U> X<Object> foo(X<T> xt, X<U> xt2) {\n" +
					"		return null;\n" +
					"	}\n" +
					"	X<E> identity() {\n" +
					"		return this;\n" +
					"	}\n" +
					"	void bar(X x, X<String> xs) {\n" +
					"		X<String> xs2 = foo(x, xs).identity();\n" +
					"	}\n" +
					"}\n", // =================
			},
			"----------\n" +
			"1. WARNING in X.java (at line 8)\n" +
			"	void bar(X x, X<String> xs) {\n" +
			"	         ^\n" +
			"X is a raw type. References to generic type X<E> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 9)\n" +
			"	X<String> xs2 = foo(x, xs).identity();\n" +
			"	                ^^^^^^^^^^\n" +
			"Type safety: Unchecked invocation foo(X, X<String>) of the generic method foo(X<T>, X<U>) of type X<E>\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 9)\n" +
			"	X<String> xs2 = foo(x, xs).identity();\n" +
			"	                ^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: The expression of type X needs unchecked conversion to conform to X<String>\n" +
			"----------\n" +
			"4. WARNING in X.java (at line 9)\n" +
			"	X<String> xs2 = foo(x, xs).identity();\n" +
			"	                    ^\n" +
			"Type safety: The expression of type X needs unchecked conversion to conform to X<Object>\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=231094 - variation
public void test1328() {
	this.runNegativeTest(
			new String[] {
					"X.java", // =================
					"import java.util.List;\n" +
					"\n" +
					"public class X {\n" +
					"	\n" +
					"	void bar(List<B> lb, List<C> lc) {\n" +
					"		String s = foo(lb, lc);\n" +
					"	}\n" +
					"	<U extends A> U foo(List<? extends U> u, List<? extends U> v) { return null; }\n" +
					"}\n" +
					"class A {}\n" +
					"class B extends A {}\n" +
					"class C extends A {}\n", // =================
			},
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	String s = foo(lb, lc);\n" +
			"	           ^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from A to String\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=232174
public void test1329() {
	this.runConformTest(
			new String[] {
					"com/b/p1/A.java", // =================
					"package com.b.p1;\n" +
					"public class A<K> {\n" +
					"    protected final class Inner {}\n" +
					"}\n",
					"com/b/p1/ADerivedSamePkg.java", // =================
					"package com.b.p1;\n" +
					"import java.util.Map;\n" +
					"public class ADerivedSamePkg extends A<Object> {\n" +
					"    protected void someMethod() {\n" +
					"        Map.Entry<String, Inner> some = null;\n" +
					"        Inner x = some.getValue();\n" +
					"    }\n" +
					"}\n",
					"com/b/p2/ADerivedDifferentPkg.java", // =================
					"package com.b.p2;\n" +
					"import java.util.Map;\n" +
					"import com.b.p1.A;\n" +
					"public class ADerivedDifferentPkg extends A<Object> {\n" +
					"    protected void someMethod()     {\n" +
					"        Map.Entry<String, Inner> some = null;\n" +
					"        Inner x = some.getValue(); // <-- error in this line\n" +
					"    }\n" +
					"}\n", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=231861
public void test1330() {
	this.runConformTest(
			new String[] {
				"p/BaseValue.java", // =================
				"package p;\n" +
				"interface Value<B> {}\n" +
				"public class BaseValue<B> implements Value<B> {}\n",
				"p/Model.java", // =================
				"package p;\n" +
				"public class Model {\n" +
				"  public java.util.Map<String, Value> map = new java.util.LinkedHashMap<String,Value>();\n" +
				"}\n", // =================
			},
			"");
	this.runConformTest(
			new String[] {
				"p2/Person.java", // =================
				"package p2;\n" +
				"public class Person extends p.Model {\n" +
				"        void test() {\n" +
				"                this.map.put(\"name\", new p.BaseValue<String>());\n" +
				"        }\n" +
				"}\n", // =================
			},
			"",
			null,
			false,
			null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=231861 - variation
public void test1331() {
	this.runConformTest(
			new String[] {
				"p/BaseValue.java", // =================
				"package p;\n" +
				"interface Value<B> {}\n" +
				"public class BaseValue<B> implements Value<B> {}\n",
				"p/Model.java", // =================
				"package p;\n" +
				"public class Model {\n" +
				"  public java.util.Map<String, Value> map = new java.util.LinkedHashMap<String,Value>();\n" +
				"}\n",
				"p2/Person.java", // =================
				"package p2;\n" +
				"public class Person extends p.Model {\n" +
				"        void test() {\n" +
				"                this.map.put(\"name\", new p.BaseValue<String>());\n" +
				"        }\n" +
				"}\n", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=232487
public void test1332() throws Exception {
	runConformTest(
		// test directory preparation
		new String[] { /* test files */
			"X.java",
			"import java.util.*;\n" +
			"\n" +
			"public class X implements Runnable {\n" +
			"	public void run() {/**/}\n" +
			"	void foo() {\n" +
			"		  List<X> runnables = new ArrayList<X>();\n" +
			"		  for (Runnable r : runnables) {\n" +
			"			  r.run();\n" +
			"		  }\n" +
			"		  Object o = runnables.get(0);\n" +
			"		  Runnable r = runnables.get(1);\n" +
			"	}\n" +
			"} \n",
		},
		// runtime results
		"" /* expected output string */);
	String expectedOutput =
		"  // Method descriptor #8 ()V\n" +
		"  // Stack: 2, Locals: 4\n" +
		"  void foo();\n" +
		"     0  new java.util.ArrayList [18]\n" +
		"     3  dup\n" +
		"     4  invokespecial java.util.ArrayList() [20]\n" +
		"     7  astore_1 [runnables]\n" +
		"     8  aload_1 [runnables]\n" +
		"     9  invokeinterface java.util.List.iterator() : java.util.Iterator [21] [nargs: 1]\n" +
		"    14  astore_3\n" +
		"    15  goto 34\n" +
		"    18  aload_3\n" +
		"    19  invokeinterface java.util.Iterator.next() : java.lang.Object [27] [nargs: 1]\n" +
		"    24  checkcast java.lang.Runnable [5]\n" +
		"    27  astore_2 [r]\n" +
		"    28  aload_2 [r]\n" +
		"    29  invokeinterface java.lang.Runnable.run() : void [33] [nargs: 1]\n" +
		"    34  aload_3\n" +
		"    35  invokeinterface java.util.Iterator.hasNext() : boolean [35] [nargs: 1]\n" +
		"    40  ifne 18\n" +
		"    43  aload_1 [runnables]\n" +
		"    44  iconst_0\n" +
		"    45  invokeinterface java.util.List.get(int) : java.lang.Object [39] [nargs: 2]\n" +
		"    50  astore_2 [o]\n" +
		"    51  aload_1 [runnables]\n" +
		"    52  iconst_1\n" +
		"    53  invokeinterface java.util.List.get(int) : java.lang.Object [39] [nargs: 2]\n" +
		"    58  checkcast java.lang.Runnable [5]\n" +
		"    61  astore_3 [r]\n" +
		"    62  return\n" +
		"      Line numbers:\n" +
		"        [pc: 0, line: 6]\n" +
		"        [pc: 8, line: 7]\n" +
		"        [pc: 28, line: 8]\n" +
		"        [pc: 34, line: 7]\n" +
		"        [pc: 43, line: 10]\n" +
		"        [pc: 51, line: 11]\n" +
		"        [pc: 62, line: 12]\n" +
		"      Local variable table:\n" +
		"        [pc: 0, pc: 63] local: this index: 0 type: X\n" +
		"        [pc: 8, pc: 63] local: runnables index: 1 type: java.util.List\n" +
		"        [pc: 28, pc: 34] local: r index: 2 type: java.lang.Runnable\n" +
		"        [pc: 51, pc: 63] local: o index: 2 type: java.lang.Object\n" +
		"        [pc: 62, pc: 63] local: r index: 3 type: java.lang.Runnable\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=225737
public void test1333() {
	this.runConformTest(
			new String[] {
				"X.java", // =================
				"import java.util.ArrayList;\n" +
				"import java.util.List;\n" +
				"public class X extends AbstractProject<X, Object> {\n" +
				"	public void testBug() {\n" +
				"		// javac compiles the following line without complaining\n" +
				"		BuildStepDescriptor.filter(BuildStep.PUBLISHERS, getClass());\n" +
				"	}\n" +
				"	\n" +
				"	public static void main(String[] args) {\n" +
				"		new X().testBug();\n" +
				"	}\n" +
				"}\n" +
				"interface BuildStep {\n" +
				"	public static final PublisherList PUBLISHERS = new PublisherList();\n" +
				"}\n" +
				"\n" +
				"@SuppressWarnings(\"serial\")\n" +
				"class PublisherList extends ArrayList<Descriptor<Publisher>> {\n" +
				"}\n" +
				"abstract class Publisher implements BuildStep, Describable<Publisher> {\n" +
				"}\n" +
				"interface Describable<T extends Describable<T>> {\n" +
				"}\n" +
				"abstract class Descriptor<T extends Describable<T>> {\n" +
				"}\n" +
				"abstract class BuildStepDescriptor<T extends BuildStep & Describable<T>> extends Descriptor<T> {\n" +
				"	\n" +
				"	public static <T extends BuildStep & Describable<T>> List<Descriptor<T>> filter(\n" +
				"			List<Descriptor<T>> base,\n" +
				"			Class<? extends AbstractProject<?, ?>> type) {\n" +
				"		return null;\n" +
				"	}\n" +
				"}\n" +
				"abstract class AbstractProject<P extends AbstractProject<P, R>, R> {\n" +
				"}\n", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=225737 - variation
public void test1334() {
	this.runConformTest(
			new String[] {
				"X.java", // =================
				"public class X extends AbstractProject<X, Object> {\n" +
				"	public void testBug() {\n" +
				"		filter(getClass());//1\n" +
				"		filter(this.getClass());//2\n" +
				"		filter(X.class);//3\n" +
				"	}\n" +
				"	public static void filter(Class<? extends AbstractProject<?, ?>> type) {\n" +
				"	}\n" +
				"}\n" +
				"abstract class AbstractProject<P extends AbstractProject<P, R>, R> {\n" +
				"}\n", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=233800
public void test1335() {
	this.runNegativeTest(
			new String[] {
				"X.java", // =================
				"public class X<T> {\n" +
				"	public void doesNotCompile(SomeInterface i) {\n" +
				"		T t = ((SomeDerivedInterface<T>) i).getItem();\n" +
				"	}\n" +
				"	static interface SomeInterface {\n" +
				"	}\n" +
				"	static interface SomeDerivedInterface<T> extends SomeInterface {\n" +
				"		T getItem();\n" +
				"	}\n" +
				"	Zork z;\n" +
				"}\n", // =================
			},
			"----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	T t = ((SomeDerivedInterface<T>) i).getItem();\n" +
			"	      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from X.SomeInterface to X.SomeDerivedInterface<T>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 10)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=233800 - variation
public void test1336() {
	this.runNegativeTest(
			new String[] {
				"X.java", // =================
				"public class X {\n" +
				"	void foo(Other2<?>.Member2<?> om2) {\n" +
				"		Other<String>.Member m = (Other<String>.Member) om2;\n" +
				"	}\n" +
				"}\n" +
				"class Other<T> {\n" +
				"	class Member {}\n" +
				"}\n" +
				"class Other2<T> extends Other<T> {\n" +
				"	class Member2<U> extends Other<U>.Member {\n" +
				"	}\n" +
				"}\n", // =================
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 3)\n" + 
			"	Other<String>.Member m = (Other<String>.Member) om2;\n" + 
			"	                         ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked cast from Other2<?>.Member2<capture#1-of ?> to Other<String>.Member\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=233800 - variation
public void test1337() {
	this.runNegativeTest(
			new String[] {
				"X.java", // =================
				"public class X {\n" +
				"	void foo(Other2.Member2<?> om2) {\n" +
				"		Other<String>.Member m = (Other<String>.Member) om2;\n" +
				"	}\n" +
				"}\n" +
				"class Other<T> {\n" +
				"	class Member {}\n" +
				"}\n" +
				"class Other2 extends Other<X> {\n" +
				"	class Member2<U> extends Other<U>.Member {\n" +
				"	}\n" +
				"}\n", // =================
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 3)\n" + 
			"	Other<String>.Member m = (Other<String>.Member) om2;\n" + 
			"	                         ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked cast from Other2.Member2<capture#1-of ?> to Other<String>.Member\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=234619
public void test1338() {
	this.runNegativeTest(
			new String[] {
				"X.java", // =================
				"public class X {\n" +
				"        void m(Object someObject, Integer intObject) {\n" +
				"                Exception class1 = someObject.getClass();\n" +
				"                Exception class2 = intObject.getClass();\n" +
				"        }\n" +
				"}\n", // =================
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	Exception class1 = someObject.getClass();\n" +
			"	                   ^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Class<capture#1-of ? extends Object> to Exception\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 4)\n" +
			"	Exception class2 = intObject.getClass();\n" +
			"	                   ^^^^^^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Class<capture#2-of ? extends Integer> to Exception\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=234619 - variation
public void test1339() {
	this.runNegativeTest(
			new String[] {
				"java/lang/Object.java", // =================
				"package java.lang;\n" +
				"\n" +
				"public class Object {\n" +
				"	void foo() {\n" +
				"		Exception e1 = getClass();\n" +
				"		Exception e2 = this.getClass();\n" +
				"	}\n" +
				"	public Class<?> getClass() { return null; }\n" +
				"}\n", // =================
			},
			"----------\n" +
			"1. ERROR in java\\lang\\Object.java (at line 5)\n" +
			"	Exception e1 = getClass();\n" +
			"	               ^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Class<capture#1-of ? extends Object> to Exception\n" +
			"----------\n" +
			"2. ERROR in java\\lang\\Object.java (at line 6)\n" +
			"	Exception e2 = this.getClass();\n" +
			"	               ^^^^^^^^^^^^^^^\n" +
			"Type mismatch: cannot convert from Class<capture#2-of ? extends Object> to Exception\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=235460
public void test1340() {
	this.runConformTest(
			new String[] {
				"Derived_A.java", // =================
				"import java.util.Map;\n" +
				"import java.util.HashMap;\n" +
				"class Base_A {}\n" +
				"public class Derived_A extends Base_A {\n" +
				"	public Map<Object, Base_B> getMap() {\n" +
				"		return new HashMap<Object, Base_B>();\n" +
				"	}\n" +
				"}\n", // =================
				"Derived_B.java", // =================
				"class Base_B<T> {\n" +
				"}\n" +
				"public class Derived_B extends Base_B<Object> {\n" +
				"}\n", // =================
			},
			"");
	this.runConformTest(
			new String[] {
				"InternalCompilerError_Main.java", // =================
				"public class InternalCompilerError_Main {\n" +
				"	public static void main(String args[]) {\n" +
				"		Derived_A dummy = new Derived_A();\n" +
				"		Derived_B propPrice = (Derived_B)dummy.getMap().get(null);		\n" +
				"	}\n" +
				"}\n", // =================
			},
			"",
			null,
			false,
			null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=235837
public void test1341() {
	Map options = getCompilerOptions();
	options.put(JavaCore.COMPILER_PB_UNCHECKED_TYPE_OPERATION, JavaCore.IGNORE);
	this.runNegativeTest(
			new String[] {
				"X.java", // =================
				"import java.util.*;\n" +
				"public class X {\n" +
				"  void bar() {\n" +
				"    Integer i = 0;\n" +
				"    Double d = 0.0;\n" +
				"    foo((Collection<Number>) Arrays.asList(i, d));\n" +
				"  }\n" +
				"  void foo(Collection<Number> c) {}\n" +
				"}\n", // =================
			},
			"----------\n" +
			"1. ERROR in X.java (at line 6)\n" +
			"	foo((Collection<Number>) Arrays.asList(i, d));\n" +
			"	    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Cannot cast from List<"+intersection("Number","Comparable<?>")+"> to Collection<Number>\n" +
			"----------\n",
			null,
			true,
			options);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=235921 - variation
public void test1342() throws Exception {
	this.runConformTest(
			new String[] {
				"X.java", // =================
				"import java.util.*;\n" +
				"interface Adapter<T> {\n" +
				"  interface Setter<V> {}\n" +
				"  public <V> Setter<V> makeSetter();\n" +
				"}\n" +
				"\n" +
				"public class X<T> implements Adapter<T> {\n" +
				"  public <V> X.Setter<V> makeSetter() {\n" +
				"    return new X.Setter<V>() {};\n" +
				"  }\n" +
				"  void foo() {\n" +
				"	  List<Adapter.Setter<T>> l = new ArrayList<X.Setter<T>>();\n" +
				"  }\n" +
				"}\n", // =================
			},
			"");
	// check X$1
	String expectedOutput =
		"// Signature: Ljava/lang/Object;LAdapter$Setter<TV;>;\n" +
		"class X$1 implements Adapter$Setter {\n";

	File f = new File(OUTPUT_DIR + File.separator + "X$1.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);
	}

	// check X
	expectedOutput =
		"  // Signature: <V:Ljava/lang/Object;>()LAdapter$Setter<TV;>;\n" +
		"  // Stack: 3, Locals: 1\n" +
		"  public Adapter.Setter makeSetter();\n";

	f = new File(OUTPUT_DIR + File.separator + "X.class");
	classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
	disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
	result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
	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=235921 - variation
public void test1343() throws Exception {
	this.runConformTest(
			new String[] {
				"X.java", // =================
				"import java.util.*;\n" +
				"class Adapter<T> {\n" +
				"  class Setter<V> {}\n" +
				"  public <V> Setter<V> makeSetter() { return null; }\n" +
				"}\n" +
				"\n" +
				"public class X<T> extends Adapter<T> {\n" +
				"  public <V> X<T>.Setter<V> makeSetter() {\n" +
				"    return new X<T>().new Setter<V>() {};\n" +
				"  }\n" +
				"  void foo() {\n" +
				"	  List<Adapter<T>.Setter<T>> l = new ArrayList<X<T>.Setter<T>>();\n" +
				"  }\n" +
				"}\n", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=235921 - variation
public void test1344() throws Exception {
	this.runNegativeTest(
			new String[] {
				"X.java", // =================
				"import java.util.*;\n" +
				"class Adapter<T> {\n" +
				"  class Setter<V> {}\n" +
				"  public <V> Setter<V> makeSetter() { return null; }\n" +
				"}\n" +
				"\n" +
				"public class X<T> extends Adapter {\n" +
				"  public <V> X.Setter makeSetter() {\n" +
				"    return new X().new Setter() {};\n" +
				"  }\n" +
				"  void foo() {\n" +
				"	  List<Adapter.Setter> l = new ArrayList<X.Setter>();\n" +
				"  }\n" +
				"}\n", // =================
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 7)\n" + 
			"	public class X<T> extends Adapter {\n" + 
			"	                          ^^^^^^^\n" + 
			"Adapter is a raw type. References to generic type Adapter<T> should be parameterized\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 8)\n" + 
			"	public <V> X.Setter makeSetter() {\n" + 
			"	           ^^^^^^^^\n" + 
			"Adapter.Setter is a raw type. References to generic type Adapter<T>.Setter<V> should be parameterized\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 8)\n" + 
			"	public <V> X.Setter makeSetter() {\n" + 
			"	                    ^^^^^^^^^^^^\n" + 
			"Name clash: The method makeSetter() of type X<T> has the same erasure as makeSetter() of type Adapter but does not override it\n" + 
			"----------\n" + 
			"4. WARNING in X.java (at line 9)\n" + 
			"	return new X().new Setter() {};\n" + 
			"	           ^\n" + 
			"X is a raw type. References to generic type X<T> should be parameterized\n" + 
			"----------\n" + 
			"5. WARNING in X.java (at line 9)\n" + 
			"	return new X().new Setter() {};\n" + 
			"	                   ^^^^^^\n" + 
			"Adapter.Setter is a raw type. References to generic type Adapter<T>.Setter<V> should be parameterized\n" + 
			"----------\n" + 
			"6. WARNING in X.java (at line 12)\n" + 
			"	List<Adapter.Setter> l = new ArrayList<X.Setter>();\n" + 
			"	     ^^^^^^^^^^^^^^\n" + 
			"Adapter.Setter is a raw type. References to generic type Adapter<T>.Setter<V> should be parameterized\n" + 
			"----------\n" + 
			"7. WARNING in X.java (at line 12)\n" + 
			"	List<Adapter.Setter> l = new ArrayList<X.Setter>();\n" + 
			"	                                       ^^^^^^^^\n" + 
			"Adapter.Setter is a raw type. References to generic type Adapter<T>.Setter<V> should be parameterized\n" + 
			"----------\n"
		);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=235921 - variation
public void test1345() throws Exception {
	this.runNegativeTest(
			new String[] {
				"X.java", // =================
				"import java.util.*;\n" +
				"class Adapter<T> {\n" +
				"  class Setter<V> {}\n" +
				"  public <V> Setter<V> makeSetter() { return null; }\n" +
				"}\n" +
				"\n" +
				"public class X<T> extends Adapter {\n" +
				"  public <V> X.Setter makeSetter() {\n" +
				"    return (String) new X().new Setter() {};\n" +
				"  }\n" +
				"  void foo() {\n" +
				"          List<Adapter.Setter> l = new ArrayList<X.Setter>();\n" +
				"  }\n" +
				"}\n", // =================
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 7)\n" + 
			"	public class X<T> extends Adapter {\n" + 
			"	                          ^^^^^^^\n" + 
			"Adapter is a raw type. References to generic type Adapter<T> should be parameterized\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 8)\n" + 
			"	public <V> X.Setter makeSetter() {\n" + 
			"	           ^^^^^^^^\n" + 
			"Adapter.Setter is a raw type. References to generic type Adapter<T>.Setter<V> should be parameterized\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 8)\n" + 
			"	public <V> X.Setter makeSetter() {\n" + 
			"	                    ^^^^^^^^^^^^\n" + 
			"Name clash: The method makeSetter() of type X<T> has the same erasure as makeSetter() of type Adapter but does not override it\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 9)\n" + 
			"	return (String) new X().new Setter() {};\n" + 
			"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Cannot cast from new Adapter.Setter(){} to String\n" + 
			"----------\n" + 
			"5. ERROR in X.java (at line 9)\n" + 
			"	return (String) new X().new Setter() {};\n" + 
			"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type mismatch: cannot convert from String to Adapter.Setter\n" + 
			"----------\n" + 
			"6. WARNING in X.java (at line 9)\n" + 
			"	return (String) new X().new Setter() {};\n" + 
			"	                    ^\n" + 
			"X is a raw type. References to generic type X<T> should be parameterized\n" + 
			"----------\n" + 
			"7. WARNING in X.java (at line 9)\n" + 
			"	return (String) new X().new Setter() {};\n" + 
			"	                            ^^^^^^\n" + 
			"Adapter.Setter is a raw type. References to generic type Adapter<T>.Setter<V> should be parameterized\n" + 
			"----------\n" + 
			"8. WARNING in X.java (at line 12)\n" + 
			"	List<Adapter.Setter> l = new ArrayList<X.Setter>();\n" + 
			"	     ^^^^^^^^^^^^^^\n" + 
			"Adapter.Setter is a raw type. References to generic type Adapter<T>.Setter<V> should be parameterized\n" + 
			"----------\n" + 
			"9. WARNING in X.java (at line 12)\n" + 
			"	List<Adapter.Setter> l = new ArrayList<X.Setter>();\n" + 
			"	                                       ^^^^^^^^\n" + 
			"Adapter.Setter is a raw type. References to generic type Adapter<T>.Setter<V> should be parameterized\n" + 
			"----------\n"
		);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=235921 - variation
public void test1346() throws Exception {
	this.runNegativeTest(
			new String[] {
				"X.java", // =================
				"import java.util.*;\n" +
				"class Adapter<T> {\n" +
				"  class Setter<V> {}\n" +
				"}\n" +
				"\n" +
				"public class X<T> extends Adapter {\n" +
				"  public <V> Adapter.Setter makeSetter() {\n" +
				"    return (X.Setter) \"a\";\n" +
				"  }\n" +
				"}\n", // =================
			},
			"----------\n" +
			"1. WARNING in X.java (at line 6)\n" +
			"	public class X<T> extends Adapter {\n" +
			"	                          ^^^^^^^\n" +
			"Adapter is a raw type. References to generic type Adapter<T> should be parameterized\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 7)\n" +
			"	public <V> Adapter.Setter makeSetter() {\n" +
			"	           ^^^^^^^^^^^^^^\n" +
			"Adapter.Setter is a raw type. References to generic type Adapter<T>.Setter<V> should be parameterized\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 8)\n" +
			"	return (X.Setter) \"a\";\n" +
			"	       ^^^^^^^^^^^^^^\n" +
			"Cannot cast from String to Adapter.Setter\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=236220
public void test1347() throws Exception {
	this.runNegativeTest(
			new String[] {
				"DeprecatedType.java", // =================
				"class Base {\n" +
				"	class Member<U> {\n" +
				"   }\n" +
				"}\n" +
				"\n" +
				"@Deprecated\n" +
				"public class DeprecatedType<T> extends Base {\n" +
				"}\n",
				"X.java", // =================
				"public class X {\n" +
				"  DeprecatedType.Member m1; // DeprecatedType and Member are raw + indirect access to Member\n" +
				"  DeprecatedType.Member<String> m2; // DeprecatedType is raw + indirect access to Member\n" +
				"  Zork z;\n" +
				"}\n", // =================
			},
			"----------\n" +
			"1. WARNING in X.java (at line 2)\n" +
			"	DeprecatedType.Member m1; // DeprecatedType and Member are raw + indirect access to Member\n" +
			"	^^^^^^^^^^^^^^\n" +
			"The type DeprecatedType<T> is deprecated\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 2)\n" +
			"	DeprecatedType.Member m1; // DeprecatedType and Member are raw + indirect access to Member\n" +
			"	^^^^^^^^^^^^^^^^^^^^^\n" +
			"Base.Member is a raw type. References to generic type Base.Member<U> should be parameterized\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 3)\n" +
			"	DeprecatedType.Member<String> m2; // DeprecatedType is raw + indirect access to Member\n" +
			"	^^^^^^^^^^^^^^\n" +
			"The type DeprecatedType is deprecated\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 4)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=174282 - variation
public void test1348() {
	this.runNegativeTest(
			new String[] {
				"X.java", // =================
				"abstract class AbstractOBOverlaySettings extends AbstractOverlaySettings implements RefSymbolTypeSettings {/*empty*/}\n" +
				"abstract class AbstractOverlaySettings implements SymbolTypeSettings {/*empty*/}\n" +
				"interface DAFDataController<V> {/*empty*/}\n" +
				"interface ReferenceableData {/*empty*/}\n" +
				"enum SymbolTypes {/*empty*/}\n" +
				"interface SymbolTypeSettings {/*empty*/}\n" +
				"interface AllOverlaySettingsController {/*empty*/}\n" +
				"interface DAFDataWithRefController<V extends ReferenceableData> extends DAFDataController<V> {/*empty*/}\n" +
				"class OBAreaOverlaySettings extends AbstractOBOverlaySettings {/*empty*/}\n" +
				"interface RefSymbolTypeSettings extends SymbolTypeSettings, ReferenceableData {/*empty*/}\n" +
				"public class X {\n" +
				"    public X() {\n" +
				"        DAFDataController<? extends SymbolTypeSettings> controller00 = null;\n" +
				"        DAFDataWithRefController<OBAreaOverlaySettings> controller01 = \n" +
				"            (DAFDataWithRefController<OBAreaOverlaySettings>) controller00;\n" +
				"    }\n" +
				"    Zork z;\n" +
				"}\n", // =================
			},
			"----------\n" +
			"1. WARNING in X.java (at line 15)\n" +
			"	(DAFDataWithRefController<OBAreaOverlaySettings>) controller00;\n" +
			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
			"Type safety: Unchecked cast from DAFDataController<capture#1-of ? extends SymbolTypeSettings> to DAFDataWithRefController<OBAreaOverlaySettings>\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 17)\n" +
			"	Zork z;\n" +
			"	^^^^\n" +
			"Zork cannot be resolved to a type\n" +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=236707
public void test1349() {
	this.runNegativeTest(
			new String[] {
				"Scratch.java", // =================
				"public class Scratch {\n" +
				"        private Y rawObject = new Y();\n" +
				"        public void caller() {\n" +
				"                method(new X<Y<Z>>(), rawObject); // compile error in javac, unchecked conversion in Eclipse\n" +
				"                this.<Y<Z>>method(new X<Y<Z>>(), rawObject); // unchecked warning in both\n" +
				"        }\n" +
				"        public <T> void method(X<T> x, T t) {}\n" +
				"}\n" +
				"class X<S> {}\n" +
				"class Y<S> {}\n" +
				"class Z { Zork z; }\n", // =================
			},
			"----------\n" + 
			"1. WARNING in Scratch.java (at line 2)\n" + 
			"	private Y rawObject = new Y();\n" + 
			"	        ^\n" + 
			"Y is a raw type. References to generic type Y<S> should be parameterized\n" + 
			"----------\n" + 
			"2. WARNING in Scratch.java (at line 2)\n" + 
			"	private Y rawObject = new Y();\n" + 
			"	                          ^\n" + 
			"Y is a raw type. References to generic type Y<S> should be parameterized\n" + 
			"----------\n" + 
			"3. WARNING in Scratch.java (at line 4)\n" + 
			"	method(new X<Y<Z>>(), rawObject); // compile error in javac, unchecked conversion in Eclipse\n" + 
			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation method(X<Y<Z>>, Y) of the generic method method(X<T>, T) of type Scratch\n" + 
			"----------\n" + 
			"4. WARNING in Scratch.java (at line 4)\n" + 
			"	method(new X<Y<Z>>(), rawObject); // compile error in javac, unchecked conversion in Eclipse\n" + 
			"	                      ^^^^^^^^^\n" + 
			"Type safety: The expression of type Y needs unchecked conversion to conform to Y<Z>\n" + 
			"----------\n" + 
			"5. WARNING in Scratch.java (at line 5)\n" + 
			"	this.<Y<Z>>method(new X<Y<Z>>(), rawObject); // unchecked warning in both\n" + 
			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation method(X<Y<Z>>, Y) of the generic method method(X<T>, T) of type Scratch\n" + 
			"----------\n" + 
			"6. WARNING in Scratch.java (at line 5)\n" + 
			"	this.<Y<Z>>method(new X<Y<Z>>(), rawObject); // unchecked warning in both\n" + 
			"	                                 ^^^^^^^^^\n" + 
			"Type safety: The expression of type Y needs unchecked conversion to conform to Y<Z>\n" + 
			"----------\n" + 
			"7. ERROR in Scratch.java (at line 11)\n" + 
			"	class Z { Zork z; }\n" + 
			"	          ^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=238484
public void test1350() {
	this.runConformTest(
			new String[] {
				"X.java", // =================
				"import java.io.IOException;\n" + 
				"\n" + 
				"interface TreeVisitor<T, U> {\n" + 
				"	public T visit(U location);\n" + 
				"}\n" + 
				"\n" + 
				"interface TreeVisitable<U> {\n" + 
				"	public <T> T visit(TreeVisitor<T, U> visitor) throws IOException;\n" + 
				"}\n" + 
				"\n" + 
				"abstract class Param implements TreeVisitable<Param> {\n" + 
				"	public final Param lookforParam(final String name) {\n" + 
				"		TreeVisitor<Param, Param> visitor = new TreeVisitor<Param, Param>() {\n" + 
				"			public Param visit(Param location) {\n" + 
				"				return null;\n" + 
				"			}\n" + 
				"		};\n" + 
				"		return visit(visitor);\n" + 
				"	}\n" + 
				"\n" + 
				"	public abstract <T> T visit(TreeVisitor<T, Param> visitor);\n" + 
				"}\n" + 
				"\n" + 
				"class StructParam extends Param {\n" + 
				"	public <T> T visit(TreeVisitor<T, Param> visitor) {\n" + 
				"		return null;\n" + 
				"	}\n" + 
				"}\n" + 
				"\n" + 
				"public class X {\n" + 
				"	public static void main(String[] args) {\n" + 
				"		StructParam p = new StructParam();\n" + 
				"		p.lookforParam(\"abc\");\n" + 
				"		System.out.println(\"done\");\n" + 
				"	}\n" + 
				"}\n", // =================
			},
			"done");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=238484 - variation
public void test1351() {
	this.runConformTest(
			new String[] {
				"X.java", // =================
				"import java.io.IOException;\n" + 
				"\n" + 
				"interface IFoo {\n" + 
				"	<T> T foo(T t) throws IOException;\n" + 
				"}\n" + 
				"interface JFoo {\n" + 
				"	<T> T foo(T t) throws Exception;\n" + 
				"}\n" + 
				"abstract class Foo implements IFoo, JFoo {}\n" + 
				"\n" + 
				"public class X {\n" + 
				"	public static void main(String[] args) {\n" + 
				"		Foo f = createFoo();\n" + 
				"		try {\n" + 
				"			f.foo(null);\n" + 
				"		} catch(IOException e) {\n" + 
				"		}\n" + 
				"		System.out.println(\"done\");\n" + 
				"	}\n" + 
				"	static Foo createFoo() {\n" + 
				"		return new Foo() {\n" + 
				"			public <T> T foo(T t) {\n" + 
				"				return t;\n" + 
				"			}\n" + 
				"		};\n" + 
				"	}\n" + 
				"}\n", // =================
			},
			"done");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=238484 - variation
public void test1352() {
	this.runConformTest(
			new String[] {
				"X.java", // =================
				"import java.io.IOException;\n" + 
				"\n" + 
				"interface IFoo<U> {\n" + 
				"	<T> T foo(T t) throws IOException;\n" + 
				"}\n" + 
				"interface JFoo<U> {\n" + 
				"	<T> T foo(T t) throws Exception;\n" + 
				"}\n" + 
				"abstract class Foo implements IFoo<String>, JFoo<String> {}\n" + 
				"\n" + 
				"public class X {\n" + 
				"	public static void main(String[] args) {\n" + 
				"		Foo f = createFoo();\n" + 
				"		try {\n" + 
				"			f.foo(null);\n" + 
				"		} catch(IOException e) {\n" + 
				"		}\n" + 
				"		System.out.println(\"done\"); //dd\n" + 
				"	}\n" + 
				"	static Foo createFoo() {\n" + 
				"		return new Foo() {\n" + 
				"			public <T> T foo(T t) {\n" + 
				"				return t;\n" + 
				"			}\n" + 
				"		};\n" + 
				"	}\n" + 
				"}\n", // =================
			},
			"done");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=238484 - variation
public void test1353() {
	this.runNegativeTest(
			new String[] {
				"X.java", // =================
				"import java.io.IOException;\n" + 
				"\n" + 
				"interface IFoo<U> {\n" + 
				"	<T> T foo(T t) throws IOException;\n" + 
				"}\n" + 
				"interface JFoo<U> {\n" + 
				"	<T> T foo(T t);\n" + 
				"}\n" + 
				"abstract class Foo implements IFoo<String>, JFoo<String> {}\n" + 
				"\n" + 
				"public class X {\n" + 
				"	public static void main(String[] args) {\n" + 
				"		Foo f = createFoo();\n" + 
				"		try {\n" + 
				"			f.foo(null);\n" + 
				"		} catch(IOException e) {\n" + 
				"		}\n" + 
				"		System.out.println(\"done\"); //dd\n" + 
				"	}\n" + 
				"	static Foo createFoo() {\n" + 
				"		return new Foo() {\n" + 
				"			public <T> T foo(T t) {\n" + 
				"				return t;\n" + 
				"			}\n" + 
				"		};\n" + 
				"	}\n" + 
				"}\n", // =================
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 16)\n" + 
			"	} catch(IOException e) {\n" + 
			"	        ^^^^^^^^^^^\n" + 
			"Unreachable catch block for IOException. This exception is never thrown from the try statement body\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=237912
public void test1354() {
	this.runConformTest(
			new String[] {
				"X.java", // =================
				"interface Operation<In> extends CheckedOperation<In, RuntimeException> {\n" + 
				"  void op(In o);\n" + 
				"}\n" + 
				"\n" + 
				"interface CheckedOperation<In, E extends Exception> {\n" + 
				"  void op(In o) throws E;\n" + 
				"}\n" + 
				"\n" + 
				"class ToUpper implements Operation<String> {\n" + 
				"  public void op(String o) {\n" + 
				"    System.out.print(\"[\"+o.toUpperCase()+\"]\");\n" + 
				"  }\n" + 
				"}\n" + 
				"\n" + 
				"public class X {\n" + 
				"  public static void main(String[] args) {\n" + 
				"    new ToUpper().op(\"hello world 1\"); // Works\n" + 
				"    Operation<String> t = new ToUpper();\n" + 
				"    t.op(\"hello world 2\"); // Doesn\'t work: Exception in thread \"main\" java.lang.NoSuchMethodError: Operation.op(Ljava/lang/String;)V\n" + 
				"  }\n" + 
				"}\n", // =================
			},
			"[HELLO WORLD 1][HELLO WORLD 2]");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=237912 - variation
public void test1355() {
	this.runConformTest(
			new String[] {
				"X.java", // =================
				"interface Operation<In> extends CheckedOperation<In, RuntimeException> {\n" + 
				"  void op(In o) throws RuntimeException;\n" + 
				"}\n" + 
				"\n" + 
				"interface CheckedOperation<In, E extends Exception> {\n" + 
				"  void op(In o) throws E;\n" + 
				"}\n" + 
				"\n" + 
				"class ToUpper implements Operation<String> {\n" + 
				"  public void op(String o) {\n" + 
				"    System.out.print(\"[\"+o.toUpperCase()+\"]\");\n" + 
				"  }\n" + 
				"}\n" + 
				"\n" + 
				"public class X {\n" + 
				"  public static void main(String[] args) {\n" + 
				"    new ToUpper().op(\"hello world 1\"); // Works\n" + 
				"    Operation<String> t = new ToUpper();\n" + 
				"    t.op(\"hello world 2\"); // Doesn\'t work: Exception in thread \"main\" java.lang.NoSuchMethodError: Operation.op(Ljava/lang/String;)V\n" + 
				"  }\n" + 
				"}\n", // =================
			},
			"[HELLO WORLD 1][HELLO WORLD 2]");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=237912 - variation
public void test1356() {
	this.runConformTest(
			new String[] {
				"X.java", // =================
				"class Activator {\n" + 
				"}\n" + 
				"interface Child<T> extends Parent<T> {\n" + 
				"	Activator get(T value);\n" + 
				"}\n" + 
				"interface Parent<T> {\n" + 
				"	Activator get(T value) throws RuntimeException;\n" + 
				"}\n" + 
				"public class X {\n" + 
				"	static class Impl<T> implements Child<T> {\n" + 
				"		public Activator get(T value) {\n" + 
				"			System.out.println(\"done\");\n" + 
				"			return null;\n" + 
				"		}\n" + 
				"	}\n" + 
				"	public static void main(String[] args) {\n" + 
				"		Child<Boolean> c = new Impl<Boolean>();\n" + 
				"		try {\n" + 
				"			c.get(true);\n" + 
				"		} catch (Throwable t) {			\n" + 
				"			t.printStackTrace();\n" + 
				"		}\n" + 
				"	}\n" + 
				"}\n", // =================
			},
			"done");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=185422
public void test1357() {
	this.runNegativeTest(
			new String[] {
				"X.java", // =================
				"import java.util.*;\n" + 
				"@interface Ann { Class<?> value(); }\n" + 
				"\n" + 
				"/**\n" + 
				" * @see Private - Private is not visible here\n" + 
				" */\n" + 
				"@Ann(X.Private.class) // Private is not visible here\n" + 
				"public abstract class X implements Map<X.Private,Secondary.SecondaryPrivate> {\n" + 
				"	/**\n" + 
				" * @see Private - Private is visible here\n" + 
				"	 */\n" + 
				"	private static interface Private {}\n" + 
				"	Private field;\n" + 
				"}\n" + 
				"class Secondary {\n" + 
				"	private static interface SecondaryPrivate {}\n" + 
				"}\n", // =================
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 8)\n" + 
			"	public abstract class X implements Map<X.Private,Secondary.SecondaryPrivate> {\n" + 
			"	                                       ^^^^^^^^^\n" + 
			"The type X.Private is not visible\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 8)\n" + 
			"	public abstract class X implements Map<X.Private,Secondary.SecondaryPrivate> {\n" + 
			"	                                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"The type Secondary.SecondaryPrivate is not visible\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=185422 - variation
public void test1358() {
	this.runNegativeTest(
			new String[] {
				"X.java", // =================
				"import java.util.List;\n" + 
				"public abstract class X implements List<X.Inter.Private> {\n" + 
				"	/**\n" + 
				"	 * @see Inter.Private - Private is visible here\n" + 
				"	 */\n" + 
				"	class Inter {\n" + 
				"		private class Private {}\n" + 
				"	}\n" + 
				"	Inter.Private field;\n" + 
				"}\n", // =================
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 2)\n" + 
			"	public abstract class X implements List<X.Inter.Private> {\n" + 
			"	                                        ^^^^^^^^^^^^^^^\n" + 
			"The type X.Inter.Private is not visible\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=185422 - variation
public void test1359() {
	this.runConformTest(
			new String[] {
				"X.java", // =================
				"public class X<T> {\n" + 
				"	class M1 <U>{\n" + 
				"		private class Private<U> {\n" + 
				"		}\n" + 
				"	}\n" + 
				"	void foo() {\n" + 
				"		M1<String>.Private<?> p;\n" + 
				"	}\n" + 
				"}\n", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=239118
public void test1360() {
	this.runConformTest(
			new String[] {
				"X.java", // =================
				"public class X {\n" + 
				"    public static <T> T getValue(final Object bean, final String property) {\n" + 
				"        return (T)new Object();\n" + 
				"    }\n" + 
				"    public void testGenerics() {\n" + 
				"        int value = getValue(new Object(), \"\");\n" + 
				"    }\n" + 
				"}\n", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=239118 - variation
public void test1361() {
	this.runConformTest(
			new String[] {
				"X.java", // =================
				"public class X {\n" + 
				"    public static <T> T getValue(T t) {\n" + 
				"        return t;\n" + 
				"    }\n" + 
				"    public void testGenerics() {\n" + 
				"        int value = getValue(0);\n" + 
				"    }\n" + 
				"}\n", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=239118 - variation
public void test1362() {
	this.runConformTest(
			new String[] {
				"X.java", // =================
				"public class X {\n" + 
				"    public static <T> T getValue(T t1, T t2) {\n" + 
				"        return t1;\n" + 
				"    }\n" + 
				"    public void testGenerics() {\n" + 
				"        getValue(0, this);\n" + 
				"    }\n" + 
				"}\n", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=239118 - variation
public void test1363() {
	this.runNegativeTest(
			new String[] {
				"X.java", // =================
				"public class X {\n" + 
				"    public static <T> T getValue(T t1, T t2) {\n" + 
				"        return t1;\n" + 
				"    }\n" + 
				"\n" + 
				"    public void testGenerics(Comparable<String> s) {\n" + 
				"        int i = getValue(0, s);\n" + 
				"    }\n" + 
				"}\n", // =================
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 7)\n" + 
			"	int i = getValue(0, s);\n" + 
			"	        ^^^^^^^^^^^^^^\n" + 
			"Type mismatch: cannot convert from Comparable<capture#1-of ? extends "+intersection("Object","Comparable<?>","Serializable")+"> to int\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=239225
public void test1364() {
	this.runNegativeTest(
			new String[] {
				"Status.java", // =================
				"import java.util.HashMap;\n" + 
				"import java.util.Map;\n" + 
				"\n" + 
				"public enum Status {\n" + 
				"	GOOD((byte) 0x00), BAD((byte) 0x02);\n" + 
				"\n" + 
				"	private static Map<Byte, Status> mapping;\n" + 
				"\n" + 
				"	private Status(final byte newValue) {\n" + 
				"\n" + 
				"		if (Status.mapping == null) {\n" + 
				"			Status.mapping = new HashMap<Byte, Status>();\n" + 
				"		}\n" + 
				"\n" + 
				"		Status.mapping.put(newValue, this);\n" + 
				"	}\n" + 
				"}\n", // =================
			},
			"----------\n" + 
			"1. ERROR in Status.java (at line 11)\n" + 
			"	if (Status.mapping == null) {\n" + 
			"	           ^^^^^^^\n" + 
			"Cannot refer to the static enum field Status.mapping within an initializer\n" + 
			"----------\n" + 
			"2. ERROR in Status.java (at line 12)\n" + 
			"	Status.mapping = new HashMap<Byte, Status>();\n" + 
			"	       ^^^^^^^\n" + 
			"Cannot refer to the static enum field Status.mapping within an initializer\n" + 
			"----------\n" + 
			"3. ERROR in Status.java (at line 15)\n" + 
			"	Status.mapping.put(newValue, this);\n" + 
			"	       ^^^^^^^\n" + 
			"Cannot refer to the static enum field Status.mapping within an initializer\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=239203
public void test1365() {
	this.runConformTest(
			new String[] {
				"C.java", // =================
				"class A<I extends B> {\n" + 
				"}\n" + 
				"\n" + 
				"class B {\n" + 
				"}\n" + 
				"\n" + 
				"public class C {\n" + 
				"	<U extends B, V extends A<U>> A<U> foo(Class<V> clazz) {\n" + 
				"		A<U> ret = bar(\"bla\");\n" + 
				"		return ret;\n" + 
				"	}\n" + 
				"\n" + 
				"	<U extends B, V extends A<U>> A<U> bar(String clazzName) {\n" + 
				"		return null;\n" + 
				"	}\n" + 
				"}\n", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=239758
public void test1366() {
	this.runConformTest(
			new String[] {
				"X.java", // =================
				"import java.io.IOException;\n" + 
				"\n" + 
				"interface IServiceAction<Response, Request, Fault extends Exception> {\n" + 
				"	Response execute(Request parameter) throws Fault;\n" + 
				"}\n" + 
				"\n" + 
				"interface IServiceOperation<Response, Request, Fault extends Exception> extends IServiceAction<Response, Request, Fault> {\n" + 
				"	Response execute(Request parameter) throws Fault;\n" + 
				"}\n" + 
				"\n" + 
				"public class X {\n" + 
				"	public String execute(String parameter) throws IOException {\n" + 
				"		return serviceOperation.execute(parameter);\n" + 
				"	}\n" + 
				"\n" + 
				"	private final IServiceOperation<String, String, IOException> serviceOperation = null;\n" + 
				"}\n", // =================
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=239439
public void test1367() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"public class X {\n" +
				"	private static Map<String, String> var;\n" +
				"	static {\n" +
				"		var= new HashMap<String, String>();\n" +
				"	}\n" +
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 2)\n" + 
			"	private static Map<String, String> var;\n" + 
			"	               ^^^\n" + 
			"Map cannot be resolved to a type\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 4)\n" + 
			"	var= new HashMap<String, String>();\n" + 
			"	^^^\n" + 
			"Map cannot be resolved to a type\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 4)\n" + 
			"	var= new HashMap<String, String>();\n" + 
			"	         ^^^^^^^\n" + 
			"HashMap cannot be resolved to a type\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=244164
public void test1368() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"import java.util.HashMap;\n" + 
				"import java.util.Map;\n" + 
				"public class X {\n" + 
				"	private static Map<String, Zork> map = new HashMap<String, X>();\n" + 
				"	public static X foo(String s) {\n" + 
				"		return map.get(s);\n" + 
				"	}\n" + 
				"}",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 4)\n" + 
			"	private static Map<String, Zork> map = new HashMap<String, X>();\n" + 
			"	                           ^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 6)\n" + 
			"	return map.get(s);\n" + 
			"	       ^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=244164
public void test1369() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"class X {\n" + 
				"	A<E> a; // E is undefined on purpose\n" + 
				"	X() { a = new A<E>(); } // causes Missing code implementation\n" + 
				"}",
				"A.java",
				"class A<E> {}",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 2)\n" + 
			"	A<E> a; // E is undefined on purpose\n" + 
			"	  ^\n" + 
			"E cannot be resolved to a type\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 3)\n" + 
			"	X() { a = new A<E>(); } // causes Missing code implementation\n" + 
			"	      ^\n" + 
			"E cannot be resolved to a type\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 3)\n" + 
			"	X() { a = new A<E>(); } // causes Missing code implementation\n" + 
			"	                ^\n" + 
			"E cannot be resolved to a type\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=242448
public void test1370() {
	this.runConformTest(
			new String[] {
				"restricted/NonPublicInterface.java", //-----------------------------------------------------------------------
				"package restricted;\n" + 
				"interface NonPublicInterface {}\n",
				"restricted/NonPublicInterfaceImplementor.java", //-----------------------------------------------------------------------
				"package restricted;\n" + 
				"public class NonPublicInterfaceImplementor<E> implements NonPublicInterface {\n" + 
				"    public NonPublicInterfaceImplementor<E> selfCall() {\n" + 
				"        return this;\n" + 
				"    }\n" + 
				"}\n", 
				"restricted/UnuseableOutsideRestrictedWithECJ.java", //-----------------------------------------------------------------------
				"package restricted;\n" + 
				"public class UnuseableOutsideRestrictedWithECJ {\n" + 
				"    public void ecjDoesNotLikeGenericizedParameter(NonPublicInterface notVisible) { }\n" + 
				"}\n",
				"usesrestricted/CannotCompileInEcj.java", //-----------------------------------------------------------------------
				"package usesrestricted;\n" + 
				"import restricted.UnuseableOutsideRestrictedWithECJ;\n" + 
				"import restricted.NonPublicInterfaceImplementor;\n" + 
				"public class CannotCompileInEcj {\n" + 
				"    public static void main(String[] args) {\n" + 
				"        new UnuseableOutsideRestrictedWithECJ().ecjDoesNotLikeGenericizedParameter(new NonPublicInterfaceImplementor().selfCall());\n" + 
				"    }\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=242448 - variation
public void test1371() {
	this.runConformTest(
			new String[] {
				"restricted/NonPublicInterface.java", //-----------------------------------------------------------------------
				"package restricted;\n" + 
				"interface NonPublicInterface {}\n",
				"restricted/NonPublicInterfaceImplementor.java", //-----------------------------------------------------------------------
				"package restricted;\n" + 
				"public class NonPublicInterfaceImplementor<E extends NonPublicInterface> implements NonPublicInterface {\n" + 
				"    public E selfCall() {\n" + 
				"        return null;\n" + 
				"    }\n" + 
				"}\n", 
				"restricted/UnuseableOutsideRestrictedWithECJ.java", //-----------------------------------------------------------------------
				"package restricted;\n" + 
				"public class UnuseableOutsideRestrictedWithECJ {\n" + 
				"    public void ecjDoesNotLikeGenericizedParameter(NonPublicInterface notVisible) { }\n" + 
				"}\n",
				"usesrestricted/CannotCompileInEcj.java", //-----------------------------------------------------------------------
				"package usesrestricted;\n" + 
				"import restricted.UnuseableOutsideRestrictedWithECJ;\n" + 
				"import restricted.NonPublicInterfaceImplementor;\n" + 
				"public class CannotCompileInEcj {\n" + 
				"    public static void main(String[] args) {\n" + 
				"        new UnuseableOutsideRestrictedWithECJ().ecjDoesNotLikeGenericizedParameter(new NonPublicInterfaceImplementor().selfCall());\n" + 
				"    }\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=242448 - variation
public void test1372() {
	this.runConformTest(
			new String[] {
				"restricted/NonPublicInterface.java", //-----------------------------------------------------------------------
				"package restricted;\n" + 
				"interface NonPublicInterface {}\n",
				"restricted/NonPublicInterfaceImplementor.java", //-----------------------------------------------------------------------
				"package restricted;\n" + 
				"public class NonPublicInterfaceImplementor<E extends NonPublicInterfaceImplementor> implements NonPublicInterface {\n" + 
				"    public E selfCall() {\n" + 
				"        return null;\n" + 
				"    }\n" + 
				"}\n", 
				"restricted/UnuseableOutsideRestrictedWithECJ.java", //-----------------------------------------------------------------------
				"package restricted;\n" + 
				"public class UnuseableOutsideRestrictedWithECJ {\n" + 
				"    public void ecjDoesNotLikeGenericizedParameter(NonPublicInterface notVisible) { }\n" + 
				"}\n",
				"usesrestricted/CannotCompileInEcj.java", //-----------------------------------------------------------------------
				"package usesrestricted;\n" + 
				"import restricted.UnuseableOutsideRestrictedWithECJ;\n" + 
				"import restricted.NonPublicInterfaceImplementor;\n" + 
				"public class CannotCompileInEcj {\n" + 
				"    public static void main(String[] args) {\n" + 
				"        new UnuseableOutsideRestrictedWithECJ().ecjDoesNotLikeGenericizedParameter(new NonPublicInterfaceImplementor().selfCall());\n" + 
				"    }\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=242448 - variation
public void test1373() {
	this.runConformTest(
			new String[] {
				"restricted/NonPublicInterface.java", //-----------------------------------------------------------------------
				"package restricted;\n" + 
				"interface NonPublicInterface {}\n",
				"restricted/NonPublicInterfaceImplementor.java", //-----------------------------------------------------------------------
				"package restricted;\n" + 
				"public class NonPublicInterfaceImplementor<E> implements NonPublicInterface {\n" + 
				"    public NonPublicInterfaceImplementor<E> next;\n" + 
				"}\n", 
				"restricted/UnuseableOutsideRestrictedWithECJ.java", //-----------------------------------------------------------------------
				"package restricted;\n" + 
				"public class UnuseableOutsideRestrictedWithECJ {\n" + 
				"    public void ecjDoesNotLikeGenericizedParameter(NonPublicInterface notVisible) { }\n" + 
				"}\n",
				"usesrestricted/CannotCompileInEcj.java", //-----------------------------------------------------------------------
				"package usesrestricted;\n" + 
				"import restricted.UnuseableOutsideRestrictedWithECJ;\n" + 
				"import restricted.NonPublicInterfaceImplementor;\n" + 
				"public class CannotCompileInEcj {\n" + 
				"    public static void main(String[] args) {\n" + 
				"        new UnuseableOutsideRestrictedWithECJ().ecjDoesNotLikeGenericizedParameter(new NonPublicInterfaceImplementor().next);\n" + 
				"    }\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=242448 - variation
public void test1374() {
	this.runConformTest(
			new String[] {
				"restricted/NonPublicInterface.java", //-----------------------------------------------------------------------
				"package restricted;\n" + 
				"interface NonPublicInterface {}\n",
				"restricted/NonPublicInterfaceImplementor.java", //-----------------------------------------------------------------------
				"package restricted;\n" + 
				"public class NonPublicInterfaceImplementor<E> implements NonPublicInterface {\n" + 
				"    public NonPublicInterfaceImplementor<E> next;\n" + 
				"}\n", 
				"restricted/UnuseableOutsideRestrictedWithECJ.java", //-----------------------------------------------------------------------
				"package restricted;\n" + 
				"public class UnuseableOutsideRestrictedWithECJ {\n" + 
				"    public void ecjDoesNotLikeGenericizedParameter(NonPublicInterface notVisible) { }\n" + 
				"}\n",
				"usesrestricted/CannotCompileInEcj.java", //-----------------------------------------------------------------------
				"package usesrestricted;\n" + 
				"import restricted.UnuseableOutsideRestrictedWithECJ;\n" + 
				"import restricted.NonPublicInterfaceImplementor;\n" + 
				"public class CannotCompileInEcj {\n" + 
				"    public static void main(String[] args) {\n" + 
				"        NonPublicInterfaceImplementor impl = new NonPublicInterfaceImplementor();\n" +		
				"        new UnuseableOutsideRestrictedWithECJ().ecjDoesNotLikeGenericizedParameter(impl.next);\n" + 
				"    }\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=242448 - variation
public void test1375() {
	this.runConformTest(
			new String[] {
				"restricted/NonPublicInterface.java", //-----------------------------------------------------------------------
				"package restricted;\n" + 
				"interface NonPublicInterface {}\n",
				"restricted/NonPublicInterfaceImplementor.java", //-----------------------------------------------------------------------
				"package restricted;\n" + 
				"public class NonPublicInterfaceImplementor<E> implements NonPublicInterface {\n" + 
				"    public NonPublicInterfaceImplementor<E> next;\n" + 
				"}\n", 
				"restricted/UnuseableOutsideRestrictedWithECJ.java", //-----------------------------------------------------------------------
				"package restricted;\n" + 
				"public class UnuseableOutsideRestrictedWithECJ {\n" + 
				"    public void ecjDoesNotLikeGenericizedParameter(NonPublicInterface notVisible) { }\n" + 
				"}\n",
				"usesrestricted/CannotCompileInEcj.java", //-----------------------------------------------------------------------
				"package usesrestricted;\n" + 
				"import restricted.UnuseableOutsideRestrictedWithECJ;\n" + 
				"import restricted.NonPublicInterfaceImplementor;\n" + 
				"public class CannotCompileInEcj {\n" + 
				"    public static void main(String[] args) {\n" + 
				"        NonPublicInterfaceImplementor impl = new NonPublicInterfaceImplementor();\n" +		
				"        new UnuseableOutsideRestrictedWithECJ().ecjDoesNotLikeGenericizedParameter(impl.next.next);\n" + 
				"    }\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=242448 - variation
public void test1376() {
	this.runConformTest(
			new String[] {
				"restricted/NonPublicInterface.java", //-----------------------------------------------------------------------
				"package restricted;\n" + 
				"interface NonPublicInterface {}\n",
				"restricted/NonPublicInterfaceImplementor.java", //-----------------------------------------------------------------------
				"package restricted;\n" + 
				"public class NonPublicInterfaceImplementor<E> implements NonPublicInterface {}\n",
				"restricted/UnuseableOutsideRestrictedWithECJ.java", //-----------------------------------------------------------------------
				"package restricted;\n" + 
				"public class UnuseableOutsideRestrictedWithECJ {\n" + 
				"    public void ecjDoesNotLikeGenericizedParameter(NonPublicInterface notVisible) { }\n" + 
				"}\n",
				"usesrestricted/CannotCompileInEcj.java", //-----------------------------------------------------------------------
				"package usesrestricted;\n" + 
				"import restricted.UnuseableOutsideRestrictedWithECJ;\n" + 
				"import restricted.NonPublicInterfaceImplementor;\n" + 
				"public class CannotCompileInEcj<E> {\n" + 
				"    public NonPublicInterfaceImplementor<E> next;\n" + 
				"    public void foo() {\n" + 
				"        new UnuseableOutsideRestrictedWithECJ().ecjDoesNotLikeGenericizedParameter(next);\n" + 
				"    }\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=245453
public void test1377() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"import java.rmi.RemoteException;\n" + 
				"public class X {\n" + 
				"        private static <T extends Exception> T foo() throws T {\n" + 
				"                throw (T) new InterruptedException();\n" + 
				"        }\n" + 
				"        private static void foo2() {\n" + 
				"                try {\n" + 
				"                        RemoteException ex = foo();\n" + 
				"                } catch (RemoteException e) {\n" + 
				"                        e.printStackTrace();\n" + 
				"                }\n" + 
				"        }\n" + 
				"        public static void main( String[] args) {\n" + 
			"               foo2();\n" + 
				"			Zork z;\n" +
				"        }\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 4)\n" + 
			"	throw (T) new InterruptedException();\n" + 
			"	      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked cast from InterruptedException to T\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 15)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=241502
public void test1378() {
	this.runConformTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"//the remote-usable interface\n" + 
				"class RemoteException extends Throwable {}\n" + 
				"	\n" + 
				"interface RemoteStore {\n" + 
				"    public abstract <P> P get(Class<P> c) throws RemoteException;\n" + 
				"}\n" + 
				"\n" + 
				"//the interface for local use\n" + 
				"interface Store extends RemoteStore{\n" + 
				"    public <P> P get(Class<P> c) ;\n" + 
				"}\n" + 
				"\n" + 
				"//the implementation\n" + 
				"class StoreImpl implements Store {\n" + 
				"    public <P> P get(Class<P> c) {\n" + 
				"        System.out.print(\"[get]\");\n" + 
				"        return null;\n" + 
				"    }\n" + 
				"}\n" + 
				"\n" + 
				"class Persistent {\n" + 
				"}\n" + 
				"\n" + 
				"public class X {\n" + 
				"public static void main(String[] args) {\n" + 
				"    try {\n" + 
				"        RemoteStore t = new StoreImpl();\n" + 
				"        t.get(Object.class); //works\n" + 
				"        t.get(Persistent.class); //works\n" + 
				"    } catch (RemoteException e) {\n" + 
				"        e.printStackTrace();\n" + 
				"    }\n" + 
				"    Store t = new StoreImpl();\n" + 
				"    t.get(Object.class); //works\n" + 
				"    t.get(Persistent.class); //NoSuchMethodError\n" + 
				"} \n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"[get][get][get][get]");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=245453 - variation
public void test1379() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"import java.rmi.RemoteException;\n" + 
				"public class X{\n" + 
				"        private static <T extends Exception> T foo() {\n" + 
				"                return (T)new InterruptedException();\n" + 
				"        }\n" + 
				"        public static void main( String[] args) {\n" + 
				"            RemoteException ex = foo();\n" + 
				"			 Zork z;\n" +
				"        }\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 4)\n" + 
			"	return (T)new InterruptedException();\n" + 
			"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked cast from InterruptedException to T\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 8)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=174447
public void test1380() {
	this.runConformTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"public class X {\n" + 
				"    public static <E extends Enum<E>> void f() {\n" + 
				"    }\n" + 
				"    public static void main(String[] args) {\n" + 
				"      f();\n" + 
				"    }\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=247953
// FIXME javac8 rejects (why?)
public void test1381()  throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<T extends AA & p.IB> {\n" + 
			"	T t;\n" + 
			"	void foo() {\n" + 
			"		this.t.baz();\n" + 
			"	}\n" + 
			"	public static void main(String[] args) {\n" + 
			"		X<CC> xcc = new X<CC>();\n" + 
			"		xcc.t = new CC();\n" + 
			"		xcc.foo();\n" + 
			"	}\n" + 
			"}\n" + 
			"class AA {\n" + 
			"	void bar() {}\n" + 
			"}\n" + 
			"class CC extends AA implements p.IB {\n" + 
			"	public void baz() {\n" + 
			"		System.out.println(\"done\");\n" + 
			"	}\n" + 
			"}\n",
			"p/IB.java", // =====================
			"package p;\n" +
			"interface IA {\n" + // non visible
			"	void baz();\n" + 
			"}\n" + 
			"public interface IB extends IA {\n" + 
			"}\n",
		},
		"done");
	// check #baz() invocation declaring class is IB
	String expectedOutput =
		"  // Method descriptor #10 ()V\n" + 
		"  // Stack: 1, Locals: 1\n" + 
		"  void foo();\n" + 
		"     0  aload_0 [this]\n" + 
		"     1  getfield X.t : AA [21]\n" + 
		"     4  checkcast p.IB [23]\n" + 
		"     7  invokeinterface p.IB.baz() : void [25] [nargs: 1]\n" + 
		"    12  return\n" + 
		"      Line numbers:\n" + 
		"        [pc: 0, line: 4]\n" + 
		"        [pc: 12, line: 5]\n" + 
		"      Local variable table:\n" + 
		"        [pc: 0, pc: 13] local: this index: 0 type: X\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=247953 - variation
public void test1382()  throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" + 
			"	T get() { return null; }\n" + 
			"	\n" + 
			"	void foo() {\n" + 
			"		X<BB> xbb = new X<BB>();\n" + 
			"		xbb.get().bar();\n" + 
			"	}\n" + 
			"}\n" + 
			"class AA {\n" + 
			"	void bar() {}\n" + 
			"}\n" + 
			"class BB extends AA {}\n"
		},
		"");
	// check #bar() invocation declaring class is BB
	String expectedOutput =
		"  // Method descriptor #6 ()V\n" + 
		"  // Stack: 2, Locals: 2\n" + 
		"  void foo();\n" + 
		"     0  new X [1]\n" + 
		"     3  dup\n" + 
		"     4  invokespecial X() [21]\n" + 
		"     7  astore_1 [xbb]\n" + 
		"     8  aload_1 [xbb]\n" + 
		"     9  invokevirtual X.get() : java.lang.Object [22]\n" + 
		"    12  checkcast BB [24]\n" + 
		"    15  invokevirtual BB.bar() : void [26]\n" + 
		"    18  return\n" + 
		"      Line numbers:\n" + 
		"        [pc: 0, line: 5]\n" + 
		"        [pc: 8, line: 6]\n" + 
		"        [pc: 18, line: 7]\n" + 
		"      Local variable table:\n" + 
		"        [pc: 0, pc: 19] local: this index: 0 type: X\n" + 
		"        [pc: 8, pc: 19] local: xbb index: 1 type: X\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=247953 - variation
public void test1383()  throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" + 
			"	T get() { return null; }\n" + 
			"	\n" + 
			"	void foo() {\n" + 
			"		X<BB> xbb = new X<BB>();\n" + 
			"		int j = xbb.get().bar;\n" + 
			"	}\n" + 
			"}\n" + 
			"class AA {\n" + 
			"	int bar;\n" + 
			"}\n" + 
			"class BB extends AA {}\n"
		},
		"");
	// check #bar field read declaring class is BB
	String expectedOutput =
		"  // Method descriptor #6 ()V\n" + 
		"  // Stack: 2, Locals: 3\n" + 
		"  void foo();\n" + 
		"     0  new X [1]\n" + 
		"     3  dup\n" + 
		"     4  invokespecial X() [21]\n" + 
		"     7  astore_1 [xbb]\n" + 
		"     8  aload_1 [xbb]\n" + 
		"     9  invokevirtual X.get() : java.lang.Object [22]\n" + 
		"    12  checkcast BB [24]\n" + 
		"    15  getfield BB.bar : int [26]\n" + 
		"    18  istore_2 [j]\n" + 
		"    19  return\n" + 
		"      Line numbers:\n" + 
		"        [pc: 0, line: 5]\n" + 
		"        [pc: 8, line: 6]\n" + 
		"        [pc: 19, line: 7]\n" + 
		"      Local variable table:\n" + 
		"        [pc: 0, pc: 20] local: this index: 0 type: X\n" + 
		"        [pc: 8, pc: 20] local: xbb index: 1 type: X\n" + 
		"        [pc: 19, pc: 20] local: j index: 2 type: int\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=247953 - variation
public void test1384()  throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" + 
			"	T get() { return null; }\n" + 
			"	\n" + 
			"	void foo() {\n" + 
			"		X<BB> xbb = new X<BB>();\n" + 
			"		xbb.get().bar = 12;\n" + 
			"	}\n" + 
			"}\n" + 
			"class AA {\n" + 
			"	int bar;\n" + 
			"}\n" + 
			"class BB extends AA {}\n"
		},
		"");
	// check #bar field store declaring class is BB
	String expectedOutput =
		"  // Method descriptor #6 ()V\n" + 
		"  // Stack: 2, Locals: 2\n" + 
		"  void foo();\n" + 
		"     0  new X [1]\n" + 
		"     3  dup\n" + 
		"     4  invokespecial X() [21]\n" + 
		"     7  astore_1 [xbb]\n" + 
		"     8  aload_1 [xbb]\n" + 
		"     9  invokevirtual X.get() : java.lang.Object [22]\n" + 
		"    12  checkcast BB [24]\n" + 
		"    15  bipush 12\n" + 
		"    17  putfield BB.bar : int [26]\n" + 
		"    20  return\n" + 
		"      Line numbers:\n" + 
		"        [pc: 0, line: 5]\n" + 
		"        [pc: 8, line: 6]\n" + 
		"        [pc: 20, line: 7]\n" + 
		"      Local variable table:\n" + 
		"        [pc: 0, pc: 21] local: this index: 0 type: X\n" + 
		"        [pc: 8, pc: 21] local: xbb index: 1 type: X\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=247953 - variation
public void test1385()  throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<T extends AA & IB> {\n" + 
			"	T get() { return null; }\n" + 
			"	\n" + 
			"	void foo(X<T> xt) {\n" + 
			"		xt.get().baz();\n" + 
			"	}\n" + 
			"}\n" + 
			"class AA {\n" + 
			"	void bar() {}\n" + 
			"}\n" + 
			"interface IA {\n" + 
			"	void baz();\n" + 
			"}\n" + 
			"interface IB extends IA {\n" + 
			"}\n"
		},
		"");
	// check #baz() invocation declaring class is not IA
	String expectedOutput =
		"  // Method descriptor #21 (LX;)V\n" + 
		"  // Signature: (LX<TT;>;)V\n" + 
		"  // Stack: 1, Locals: 2\n" + 
		"  void foo(X xt);\n" + 
		"     0  aload_1 [xt]\n" + 
		"     1  invokevirtual X.get() : AA [23]\n" + 
		"     4  checkcast IB [25]\n" + 
		"     7  invokeinterface IB.baz() : void [27] [nargs: 1]\n" + 
		"    12  return\n" + 
		"      Line numbers:\n" + 
		"        [pc: 0, line: 5]\n" + 
		"        [pc: 12, line: 6]\n" + 
		"      Local variable table:\n" + 
		"        [pc: 0, pc: 13] local: this index: 0 type: X\n" + 
		"        [pc: 0, pc: 13] local: xt index: 1 type: X\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=247953 - variation
//FIXME javac8 rejects (why?)
public void test1386()  throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<T extends AA & p.IB> {\n" + 
			"	T get() { return null; }\n" + 
			"	\n" + 
			"	void foo(X<T> xt) {\n" + 
			"		xt.get().baz();\n" + 
			"	}\n" + 
			"}\n" + 
			"class AA {\n" + 
			"	void bar() {}\n" + 
			"}\n",
			"p/IB.java", // =====================
			"package p;\n" +
			"interface IA {\n" + 
			"	void baz();\n" + 
			"}\n" + 
			"public interface IB extends IA {\n" + 
			"}\n",
		},
		"");
	// check #baz() invocation declaring class is not IA
	String expectedOutput =
		"  // Method descriptor #21 (LX;)V\n" + 
		"  // Signature: (LX<TT;>;)V\n" + 
		"  // Stack: 1, Locals: 2\n" + 
		"  void foo(X xt);\n" + 
		"     0  aload_1 [xt]\n" + 
		"     1  invokevirtual X.get() : AA [23]\n" + 
		"     4  checkcast p.IB [25]\n" + 
		"     7  invokeinterface p.IB.baz() : void [27] [nargs: 1]\n" + 
		"    12  return\n" + 
		"      Line numbers:\n" + 
		"        [pc: 0, line: 5]\n" + 
		"        [pc: 12, line: 6]\n" + 
		"      Local variable table:\n" + 
		"        [pc: 0, pc: 13] local: this index: 0 type: X\n" + 
		"        [pc: 0, pc: 13] local: xt index: 1 type: X\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=247953 - variation
//FIXME javac8 rejects (why?)
public void test1387()  throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<T extends AA & p.IB> {\n" + 
			"	T t;\n" + 
			"	void foo() {\n" + 
			"		System.out.println(this.t.baz);\n" + 
			"	}\n" + 
			"	public static void main(String[] args) {\n" + 
			"		X<CC> xcc = new X<CC>();\n" + 
			"		xcc.t = new CC();\n" + 
			"		xcc.foo();\n" + 
			"	}\n" + 
			"}\n" + 
			"class AA {\n" + 
			"	void bar() {}\n" + 
			"}\n" + 
			"class CC extends AA implements p.IB {\n" + 
			"}\n",
			"p/IB.java", // =====================
			"package p;\n" +
			"interface IA {\n" + 
			"	Object baz = \"done\";\n" +
			"}\n" + 
			"public interface IB extends IA {\n" + 
			"}\n",
		},
		"done");
	// check #baz declaring class is not IA
	String expectedOutput =
		"  // Method descriptor #10 ()V\n" + 
		"  // Stack: 2, Locals: 1\n" + 
		"  void foo();\n" + 
		"     0  getstatic java.lang.System.out : java.io.PrintStream [21]\n" + 
		"     3  aload_0 [this]\n" + 
		"     4  getfield X.t : AA [27]\n" + 
		"     7  checkcast p.IB [29]\n" + 
		"    10  pop\n" + 
		"    11  getstatic p.IB.baz : java.lang.Object [31]\n" + 
		"    14  invokevirtual java.io.PrintStream.println(java.lang.Object) : void [35]\n" + 
		"    17  return\n" + 
		"      Line numbers:\n" + 
		"        [pc: 0, line: 4]\n" + 
		"        [pc: 17, line: 5]\n" + 
		"      Local variable table:\n" + 
		"        [pc: 0, pc: 18] local: this index: 0 type: X\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=247953 - variation
//FIXME javac8 rejects (why?)
public void test1388()  throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<T extends AA & p.IB> {\n" + 
			"	T t;\n" + 
			"	void foo() {\n" + 
			"		System.out.println(t.baz);\n" + 
			"	}\n" + 
			"	public static void main(String[] args) {\n" + 
			"		X<CC> xcc = new X<CC>();\n" + 
			"		xcc.t = new CC();\n" + 
			"		xcc.foo();\n" + 
			"	}\n" + 
			"}\n" + 
			"class AA {\n" + 
			"	void bar() {}\n" + 
			"}\n" + 
			"class CC extends AA implements p.IB {\n" + 
			"}\n",
			"p/IB.java", // =====================
			"package p;\n" +
			"interface IA {\n" + 
			"	Object baz = \"done\";\n" +
			"}\n" + 
			"public interface IB extends IA {\n" + 
			"}\n",
		},
		"done");
	// check #baz declaring class is not IA
	String expectedOutput =
		"  // Method descriptor #10 ()V\n" + 
		"  // Stack: 2, Locals: 1\n" + 
		"  void foo();\n" + 
		"     0  getstatic java.lang.System.out : java.io.PrintStream [21]\n" + 
		"     3  aload_0 [this]\n" + 
		"     4  getfield X.t : AA [27]\n" + 
		"     7  checkcast p.IB [29]\n" + 
		"    10  pop\n" + 
		"    11  getstatic p.IB.baz : java.lang.Object [31]\n" + 
		"    14  invokevirtual java.io.PrintStream.println(java.lang.Object) : void [35]\n" + 
		"    17  return\n" + 
		"      Line numbers:\n" + 
		"        [pc: 0, line: 4]\n" + 
		"        [pc: 17, line: 5]\n" + 
		"      Local variable table:\n" + 
		"        [pc: 0, pc: 18] local: this index: 0 type: X\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=247953 - variation
public void test1389()  throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X extends AA implements p.IB {\n" + 
			"	void foo() {\n" + 
			"		System.out.println(baz);\n" + 
			"	}\n" + 
			"	public static void main(String[] args) {\n" + 
			"		new X().foo();\n" + 
			"	}\n" + 
			"}\n" + 
			"class AA {\n" + 
			"	void bar() {}\n" + 
			"}\n",
			"p/IB.java", // =====================
			"package p;\n" +
			"interface IA {\n" + 
			"	Object baz = \"done\";\n" +
			"}\n" + 
			"public interface IB extends IA {\n" + 
			"}\n",
		},
		"done");
	// check #baz declaring class is not IA
	String expectedOutput =
		"  // Method descriptor #8 ()V\n" + 
		"  // Stack: 2, Locals: 1\n" + 
		"  void foo();\n" + 
		"     0  getstatic java.lang.System.out : java.io.PrintStream [17]\n" + 
		"     3  getstatic X.baz : java.lang.Object [23]\n" + 
		"     6  invokevirtual java.io.PrintStream.println(java.lang.Object) : void [27]\n" + 
		"     9  return\n" + 
		"      Line numbers:\n" + 
		"        [pc: 0, line: 3]\n" + 
		"        [pc: 9, line: 4]\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 test1390()  throws Exception {
	this.runNegativeTest(
		new String[] {
			"X.java", //=================================
			"public class X<T extends SubX1<SubX2<T>>> {\n" + 
			"	T sx1() { return null; }\n" + 
			"	void foo(X<T> x0) {\n" + 
			"		x0.sx1().sx2().t().getClass();\n" + 
			"	}\n" + 
			"}\n" + 
			"interface X1<T extends SubX2<T>> {\n" + 
			"	T sx2();\n" + 
			"}\n" + 
			"abstract class SubX1<T extends SubX2<T>> implements X1<T> {\n" + 
			"}\n" + 
			"interface X2<T> {\n" + 
			"	T t();\n" + 
			"}\n" + 
			"abstract class SubX2<T> implements X2<T> {\n" + 
			"}\n",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 1)\n" + 
		"	public class X<T extends SubX1<SubX2<T>>> {\n" + 
		"	                               ^^^^^\n" + 
		"Bound mismatch: The type SubX2<T> is not a valid substitute for the bounded parameter <T extends SubX2<T>> of the type SubX1<T>\n" + 
		"----------\n");
}
public void test1391()  throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<T extends SubX2<T>> {\n" + 
			"	T sx1() { return null; }\n" + 
			"	void foo(X<T> x0) {\n" + 
			"		x0.sx1().sx2().t().getClass();\n" + 
			"	}\n" + 
			"}\n" + 
			"interface X1<T extends SubX2<T>> {\n" + 
			"	T sx2();\n" + 
			"}\n" + 
			"abstract class SubX1<T extends SubX2<T>> implements X1<T> {\n" + 
			"}\n" + 
			"interface X2<T> {\n" + 
			"	T t();\n" + 
			"}\n" + 
			"abstract class SubX2<T extends SubX2<T>> implements X1<T>, X2<T> {\n" + 
			"}\n",
		},
		"");
	String expectedOutput =
		"  // Method descriptor #21 (LX;)V\n" + 
		"  // Signature: (LX<TT;>;)V\n" + 
		"  // Stack: 1, Locals: 2\n" + 
		"  void foo(X x0);\n" + 
		"     0  aload_1 [x0]\n" + 
		"     1  invokevirtual X.sx1() : SubX2 [23]\n" + 
		"     4  invokevirtual SubX2.sx2() : SubX2 [25]\n" + 
		"     7  invokevirtual SubX2.t() : java.lang.Object [30]\n" + 
		"    10  checkcast SubX2 [26]\n" + 
		"    13  invokevirtual java.lang.Object.getClass() : java.lang.Class [34]\n" + 
		"    16  pop\n" + 
		"    17  return\n" + 
		"      Line numbers:\n" + 
		"        [pc: 0, line: 4]\n" + 
		"        [pc: 17, line: 5]\n" + 
		"      Local variable table:\n" + 
		"        [pc: 0, pc: 18] local: this index: 0 type: X\n" + 
		"        [pc: 0, pc: 18] local: x0 index: 1 type: X\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 test1392()  throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<T extends SubX2<T>> {\n" + 
			"	T sx1;\n" + 
			"	void foo(X<T> x0) {\n" + 
			"		x0.sx1.sx2.t.getClass();\n" + 
			"	}\n" + 
			"}\n" + 
			"class X1<T extends SubX2<T>> {\n" + 
			"	T sx2;\n" + 
			"}\n" + 
			"abstract class SubX1<T extends SubX2<T>> extends X1<T> {\n" + 
			"}\n" + 
			"class X2<T extends SubX2<T>> extends X1<T>{\n" + 
			"	T t;\n" + 
			"}\n" + 
			"abstract class SubX2<T extends SubX2<T>> extends X2<T> {\n" + 
			"}\n",
		},
		"");
	String expectedOutput =
		"  // Method descriptor #21 (LX;)V\n" + 
		"  // Signature: (LX<TT;>;)V\n" + 
		"  // Stack: 1, Locals: 2\n" + 
		"  void foo(X x0);\n" + 
		"     0  aload_1 [x0]\n" + 
		"     1  getfield X.sx1 : SubX2 [23]\n" + 
		"     4  getfield SubX2.sx2 : SubX2 [25]\n" + 
		"     7  getfield SubX2.t : SubX2 [30]\n" + 
		"    10  invokevirtual java.lang.Object.getClass() : java.lang.Class [33]\n" + 
		"    13  pop\n" + 
		"    14  return\n" + 
		"      Line numbers:\n" + 
		"        [pc: 0, line: 4]\n" + 
		"        [pc: 14, line: 5]\n" + 
		"      Local variable table:\n" + 
		"        [pc: 0, pc: 15] local: this index: 0 type: X\n" + 
		"        [pc: 0, pc: 15] local: x0 index: 1 type: X\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 test1393()  throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<T extends SubX2<T>> {\n" + 
			"	T sx1;\n" + 
			"	void foo(X<T> x0) {\n" + 
			"		x0.sx1.sx2.t.getClass();\n" + 
			"	}\n" + 
			"}\n" + 
			"interface X1<T extends X2<T>> {\n" + 
			"}\n" + 
			"abstract class SubX1<T extends X2<T>> implements X1<T> {\n" + 
			"	T sx2;\n" + 
			"}\n" + 
			"interface X2<T extends X2<T>> extends X1<T>{\n" + 
			"}\n" + 
			"abstract class SubX2<T extends X2<T>> extends SubX1<T> implements X2<T> {\n" + 
			"	T t;\n" + 
			"}\n",
		},
		"");
	String expectedOutput =
		"  // Method descriptor #21 (LX;)V\n" + 
		"  // Signature: (LX<TT;>;)V\n" + 
		"  // Stack: 1, Locals: 2\n" + 
		"  void foo(X x0);\n" + 
		"     0  aload_1 [x0]\n" + 
		"     1  getfield X.sx1 : SubX2 [23]\n" + 
		"     4  getfield SubX2.sx2 : X2 [25]\n" + 
		"     7  checkcast SubX2 [26]\n" + 
		"    10  getfield SubX2.t : X2 [31]\n" + 
		"    13  checkcast SubX2 [26]\n" + 
		"    16  invokevirtual java.lang.Object.getClass() : java.lang.Class [34]\n" + 
		"    19  pop\n" + 
		"    20  return\n" + 
		"      Line numbers:\n" + 
		"        [pc: 0, line: 4]\n" + 
		"        [pc: 20, line: 5]\n" + 
		"      Local variable table:\n" + 
		"        [pc: 0, pc: 21] local: this index: 0 type: X\n" + 
		"        [pc: 0, pc: 21] local: x0 index: 1 type: X\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 test1394()  throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<T extends SubX2<T>> {\n" + 
			"	T sx1(){return null;}\n" + 
			"	void foo(X<T> x0) {\n" + 
			"		x0.sx1().sx2().t().getClass();\n" + 
			"	}\n" + 
			"}\n" + 
			"interface X1<T extends X2<T>> {\n" + 
			"}\n" + 
			"abstract class SubX1<T extends X2<T>> implements X1<T> {\n" + 
			"	T sx2(){return null;}\n" + 
			"}\n" + 
			"interface X2<T extends X2<T>> extends X1<T>{\n" + 
			"}\n" + 
			"abstract class SubX2<T extends X2<T>> extends SubX1<T> implements X2<T> {\n" + 
			"	T t(){return null;}\n" + 
			"}\n",
		},
		"");
	String expectedOutput =
		"  // Method descriptor #21 (LX;)V\n" + 
		"  // Signature: (LX<TT;>;)V\n" + 
		"  // Stack: 1, Locals: 2\n" + 
		"  void foo(X x0);\n" + 
		"     0  aload_1 [x0]\n" + 
		"     1  invokevirtual X.sx1() : SubX2 [23]\n" + 
		"     4  invokevirtual SubX2.sx2() : X2 [25]\n" + 
		"     7  checkcast SubX2 [26]\n" + 
		"    10  invokevirtual SubX2.t() : X2 [31]\n" + 
		"    13  checkcast SubX2 [26]\n" + 
		"    16  invokevirtual java.lang.Object.getClass() : java.lang.Class [34]\n" + 
		"    19  pop\n" + 
		"    20  return\n" + 
		"      Line numbers:\n" + 
		"        [pc: 0, line: 4]\n" + 
		"        [pc: 20, line: 5]\n" + 
		"      Local variable table:\n" + 
		"        [pc: 0, pc: 21] local: this index: 0 type: X\n" + 
		"        [pc: 0, pc: 21] local: x0 index: 1 type: X\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 test1395()  throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<T extends SubX2<T>> {\n" + 
			"	T sx1(){return null;}\n" + 
			"	void foo() {\n" + 
			"		this.sx1().sx2().t().getClass();\n" + 
			"	}\n" + 
			"}\n" + 
			"interface X1<T extends X2<T>> {\n" + 
			"}\n" + 
			"abstract class SubX1<T extends X2<T>> implements X1<T> {\n" + 
			"	T sx2(){return null;}\n" + 
			"}\n" + 
			"interface X2<T extends X2<T>> extends X1<T>{\n" + 
			"}\n" + 
			"abstract class SubX2<T extends X2<T>> extends SubX1<T> implements X2<T> {\n" + 
			"	T t(){return null;}\n" + 
			"}\n",
		},
		"");
	String expectedOutput =
		"  // Method descriptor #6 ()V\n" + 
		"  // Stack: 1, Locals: 1\n" + 
		"  void foo();\n" + 
		"     0  aload_0 [this]\n" + 
		"     1  invokevirtual X.sx1() : SubX2 [21]\n" + 
		"     4  invokevirtual SubX2.sx2() : X2 [23]\n" + 
		"     7  checkcast SubX2 [24]\n" + 
		"    10  invokevirtual SubX2.t() : X2 [29]\n" + 
		"    13  checkcast SubX2 [24]\n" + 
		"    16  invokevirtual java.lang.Object.getClass() : java.lang.Class [32]\n" + 
		"    19  pop\n" + 
		"    20  return\n" + 
		"      Line numbers:\n" + 
		"        [pc: 0, line: 4]\n" + 
		"        [pc: 20, line: 5]\n" + 
		"      Local variable table:\n" + 
		"        [pc: 0, pc: 21] local: this index: 0 type: X\n" + 
		"      Local variable type table:\n" + 
		"        [pc: 0, pc: 21] local: this index: 0 type: X<T>\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 test1396()  throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<T extends SubX2<T>> {\n" + 
			"	T sx1;\n" + 
			"	void foo(T t) {\n" + 
			"		t.sx2.t.getClass();\n" + 
			"	}\n" + 
			"}\n" + 
			"interface X1<T extends X2<T>> {\n" + 
			"}\n" + 
			"abstract class SubX1<T extends X2<T>> implements X1<T> {\n" + 
			"	T sx2;\n" + 
			"}\n" + 
			"interface X2<T extends X2<T>> extends X1<T>{\n" + 
			"}\n" + 
			"abstract class SubX2<T extends X2<T>> extends SubX1<T> implements X2<T> {\n" + 
			"	T t;\n" + 
			"}\n",
		},
		"");
	String expectedOutput =
		"  // Method descriptor #21 (LSubX2;)V\n" + 
		"  // Signature: (TT;)V\n" + 
		"  // Stack: 1, Locals: 2\n" + 
		"  void foo(SubX2 t);\n" + 
		"     0  aload_1 [t]\n" + 
		"     1  getfield SubX2.sx2 : X2 [23]\n" + 
		"     4  checkcast SubX2 [24]\n" + 
		"     7  getfield SubX2.t : X2 [29]\n" + 
		"    10  checkcast SubX2 [24]\n" + 
		"    13  invokevirtual java.lang.Object.getClass() : java.lang.Class [32]\n" + 
		"    16  pop\n" + 
		"    17  return\n" + 
		"      Line numbers:\n" + 
		"        [pc: 0, line: 4]\n" + 
		"        [pc: 17, line: 5]\n" + 
		"      Local variable table:\n" + 
		"        [pc: 0, pc: 18] local: this index: 0 type: X\n" + 
		"        [pc: 0, pc: 18] local: t index: 1 type: SubX2\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=172672
public void _test1397()  throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"class A { }\n" + 
			"class B<T> { }\n" + 
			"class C<U> extends B<B<? super C<C<U>>>> {\n" + 
			"	B<? super C<A>> foo(C<A> c) { return c; }\n" + 
			"}\n",
		},
		"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=252120
public void test1398()  throws Exception {
	this.runNegativeTest(
		new String[] {
			"A.java",
			"public class A<T> {\n" + 
			"  void f() {\n" + 
			"    boolean b=null instanceof A; \n" + 
			"	 Zork z;\n" +
			"  }\n" + 
			"}\n",
		},
		"----------\n" + 
		"1. ERROR in A.java (at line 4)\n" + 
		"	Zork z;\n" + 
		"	^^^^\n" + 
		"Zork cannot be resolved to a type\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=252120 - variation
public void test1399()  throws Exception {
	this.runNegativeTest(
		new String[] {
			"A.java",
			"public class A<T> {\n" + 
			"  void f() {\n" + 
			"    boolean b=null instanceof A<?>; \n" + 
			"	 Zork z;\n" +
			"  }\n" + 
			"}\n",
		},
		"----------\n" + 
		"1. ERROR in A.java (at line 4)\n" + 
		"	Zork z;\n" + 
		"	^^^^\n" + 
		"Zork cannot be resolved to a type\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=252120 - variation
public void test1400()  throws Exception {
	this.runNegativeTest(
		new String[] {
			"A.java",
			"public class A<T> {\n" + 
			"  void f() {\n" + 
			"    Object o = (A)this; \n" + 
			"	 Zork z;\n" +
			"  }\n" + 
			"}\n",
		},
		"----------\n" + 
		"1. WARNING in A.java (at line 3)\n" + 
		"	Object o = (A)this; \n" + 
		"	           ^^^^^^^\n" + 
		"Unnecessary cast from A<T> to A\n" + 
		"----------\n" + 
		"2. WARNING in A.java (at line 3)\n" + 
		"	Object o = (A)this; \n" + 
		"	            ^\n" + 
		"A is a raw type. References to generic type A<T> should be parameterized\n" + 
		"----------\n" + 
		"3. ERROR in A.java (at line 4)\n" + 
		"	Zork z;\n" + 
		"	^^^^\n" + 
		"Zork cannot be resolved to a type\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=252120 - variation
public void test1401()  throws Exception {
	this.runNegativeTest(
		new String[] {
			"A.java",
			"public class A<T> {\n" + 
			"  void f() {\n" + 
			"    Object o = (A<?>)this; \n" + 
			"	 Zork z;\n" +
			"  }\n" + 
			"}\n",
		},
		"----------\n" + 
		"1. WARNING in A.java (at line 3)\n" + 
		"	Object o = (A<?>)this; \n" + 
		"	           ^^^^^^^^^^\n" + 
		"Unnecessary cast from A<T> to A<?>\n" + 
		"----------\n" + 
		"2. ERROR in A.java (at line 4)\n" + 
		"	Zork z;\n" + 
		"	^^^^\n" + 
		"Zork cannot be resolved to a type\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=252120 - variation
public void test1402()  throws Exception {
	this.runNegativeTest(
		new String[] {
			"A.java",
			"public class A<T> {\n" + 
			"  void f() {\n" + 
			"    Class<?> c = A.class; \n" + 
			"	 Zork z;\n" +
			"  }\n" + 
			"}\n",
		},
		"----------\n" + 
		"1. ERROR in A.java (at line 4)\n" + 
		"	Zork z;\n" + 
		"	^^^^\n" + 
		"Zork cannot be resolved to a type\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=252120 - variation
public void test1403()  throws Exception {
	this.runNegativeTest(
		new String[] {
			"A.java",
			"public class A<T> {\n" + 
			"  void f() {\n" + 
			"    Class<?> c = A<?>.class; \n" + 
			"	 Zork z;\n" +
			"  }\n" + 
			"}\n",
		},
		"----------\n" + 
		"1. ERROR in A.java (at line 3)\n" + 
		"	Class<?> c = A<?>.class; \n" + 
//{ObjectTeams: we specifically have a rule that allows A<@t>.class
/* orig:
		"	           ^\n" + 
		"Syntax error on token \"=\", ( expected after this token\n" + 
		"----------\n" + 
		"2. ERROR in A.java (at line 3)\n" + 
		"	Class<?> c = A<?>.class; \n" + 
		"	              ^^^\n" + 
  :giro */
		"	               ^\n" + 
		"Syntax error on token \"?\", invalid typeAnchor\n" + 
// SH}
		"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=242159
// SHOULD FAIL AT 1.8 (RET): Type mismatch: cannot convert from X<Comparable<Comparable<T>>> to X
public void test1404()  throws Exception {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<A> {\n" + 
			"	A get() { return null; }\n" + 
			"	<B extends Comparable<B>> X<B> bar() {\n" + 
			"		return null;\n" + 
			"	}\n" + 
			"	void foo() {\n" + 
			"		bar(); // 0 rejected\n" + 
			"		X raw = bar(); // 1 accepted\n" + 
			"		X<?> wild = bar(); // 2 rejected\n" + 
			"	}\n" + 
			"}\n",
		});
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=240807
public void test1405()  throws Exception {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" + 
			"public class X {\n" + 
			"    X(List rawList, List<?> unboundList) {\n" + 
			"            Throwable t0 = (Throwable) Collections.emptyList();\n" + 
			"            Throwable t1 = (Throwable) rawList;\n" + 
			"            Throwable t2 = (Throwable) unboundList;\n" + 
			"            Map m0 = (Map) Collections.emptyList();\n" + 
			"            Map m1 = (Map) rawList;\n" + 
			"            Map m2 = (Map) unboundList;\n" + 
			"            Zork z;\n" + 
			"    }\n" + 
			"}\n",
		},
		"----------\n" + 
		"1. WARNING in X.java (at line 3)\n" + 
		"	X(List rawList, List<?> unboundList) {\n" + 
		"	  ^^^^\n" + 
		"List is a raw type. References to generic type List<E> should be parameterized\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 7)\n" + 
		"	Map m0 = (Map) Collections.emptyList();\n" + 
		"	^^^\n" + 
		"Map is a raw type. References to generic type Map<K,V> should be parameterized\n" + 
		"----------\n" + 
		"3. WARNING in X.java (at line 7)\n" + 
		"	Map m0 = (Map) Collections.emptyList();\n" + 
		"	          ^^^\n" + 
		"Map is a raw type. References to generic type Map<K,V> should be parameterized\n" + 
		"----------\n" + 
		"4. WARNING in X.java (at line 8)\n" + 
		"	Map m1 = (Map) rawList;\n" + 
		"	^^^\n" + 
		"Map is a raw type. References to generic type Map<K,V> should be parameterized\n" + 
		"----------\n" + 
		"5. WARNING in X.java (at line 8)\n" + 
		"	Map m1 = (Map) rawList;\n" + 
		"	          ^^^\n" + 
		"Map is a raw type. References to generic type Map<K,V> should be parameterized\n" + 
		"----------\n" + 
		"6. WARNING in X.java (at line 9)\n" + 
		"	Map m2 = (Map) unboundList;\n" + 
		"	^^^\n" + 
		"Map is a raw type. References to generic type Map<K,V> should be parameterized\n" + 
		"----------\n" + 
		"7. WARNING in X.java (at line 9)\n" + 
		"	Map m2 = (Map) unboundList;\n" + 
		"	          ^^^\n" + 
		"Map is a raw type. References to generic type Map<K,V> should be parameterized\n" + 
		"----------\n" + 
		"8. ERROR in X.java (at line 10)\n" + 
		"	Zork z;\n" + 
		"	^^^^\n" + 
		"Zork cannot be resolved to a type\n" + 
		"----------\n");
}
public void test1406() {
	this.runNegativeTest(
			new String[] {
				"GenericTest.java", //-----------------------------------------------------------------------
				"import java.util.*;\n" + 
				"\n" + 
				"public class GenericTest {\n" + 
				"    public static void test() {\n" + 
				"        Set testList = GenericTest.method1(new Class[] { ArrayList.class });\n" + 
				"    }\n" + 
				" \n" + 
				"    public static <I> I method1(Class<List>[] params) {\n" + 
				"        return null;\n" + 
				"    }\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			this.complianceLevel < ClassFileConstants.JDK1_8 ?
			"----------\n" + 
			"1. WARNING in GenericTest.java (at line 5)\n" + 
			"	Set testList = GenericTest.method1(new Class[] { ArrayList.class });\n" + 
			"	^^^\n" + 
			"Set is a raw type. References to generic type Set<E> should be parameterized\n" + 
			"----------\n" + 
			"2. WARNING in GenericTest.java (at line 5)\n" + 
			"	Set testList = GenericTest.method1(new Class[] { ArrayList.class });\n" + 
			"	               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation method1(Class[]) of the generic method method1(Class<List>[]) of type GenericTest\n" + 
			"----------\n" +
			"3. WARNING in GenericTest.java (at line 5)\n" + 
			"	Set testList = GenericTest.method1(new Class[] { ArrayList.class });\n" + 
			"	                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: The expression of type Class[] needs unchecked conversion to conform to Class<List>[]\n" + 
			"----------\n" + 
			"4. WARNING in GenericTest.java (at line 8)\n" + 
			"	public static <I> I method1(Class<List>[] params) {\n" + 
			"	                                  ^^^^\n" + 
			"List is a raw type. References to generic type List<E> should be parameterized\n" + 
			"----------\n" :
				"----------\n" + 
				"1. WARNING in GenericTest.java (at line 5)\n" + 
				"	Set testList = GenericTest.method1(new Class[] { ArrayList.class });\n" + 
				"	^^^\n" + 
				"Set is a raw type. References to generic type Set<E> should be parameterized\n" + 
				"----------\n" + 
				"2. ERROR in GenericTest.java (at line 5)\n" + 
				"	Set testList = GenericTest.method1(new Class[] { ArrayList.class });\n" + 
				"	               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Type mismatch: cannot convert from Object to Set\n" + 
				"----------\n" +
				"3. WARNING in GenericTest.java (at line 8)\n" + 
				"	public static <I> I method1(Class<List>[] params) {\n" + 
				"	                                  ^^^^\n" + 
				"List is a raw type. References to generic type List<E> should be parameterized\n" + 
				"----------\n");
}
public void test1407() {
	this.runNegativeTest(
			new String[] {
				"Foo.java", //-----------------------------------------------------------------------
				"public class Foo {\n" + 
				"	public static <I> I m1(Class<Foo> c) { return null; }\n" + 
				"	void bar() {\n" + 
				"		Foo l1 = m1((Class)Foo.class);\n" + 
				"	}\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			this.complianceLevel < ClassFileConstants.JDK1_8 ?
			"----------\n" + 
			"1. WARNING in Foo.java (at line 4)\n" + 
			"	Foo l1 = m1((Class)Foo.class);\n" + 
			"	         ^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation m1(Class) of the generic method m1(Class<Foo>) of type Foo\n" + 
			"----------\n" + 
			"2. WARNING in Foo.java (at line 4)\n" + 
			"	Foo l1 = m1((Class)Foo.class);\n" + 
			"	            ^^^^^^^^^^^^^^^^\n" + 
			"Type safety: The expression of type Class needs unchecked conversion to conform to Class<Foo>\n" + 
			"----------\n" + 
			"3. WARNING in Foo.java (at line 4)\n" + 
			"	Foo l1 = m1((Class)Foo.class);\n" + 
			"	             ^^^^^\n" + 
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" + 
			"----------\n" : 
				"----------\n" + 
				"1. WARNING in Foo.java (at line 4)\n" + 
				"	Foo l1 = m1((Class)Foo.class);\n" + 
				"	             ^^^^^\n" + 
				"Class is a raw type. References to generic type Class<T> should be parameterized\n" + 
				"----------\n" + 
				"2. ERROR in Foo.java (at line 4)\n" + 
				"	Foo l1 = m1((Class)Foo.class);\n" + 
				"	         ^^^^^^^^^^^^^^^^^^^^\n" + 
				"Type mismatch: cannot convert from Object to Foo\n" + 
				"----------\n");
}
public void test1408() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"import java.util.*;\n" + 
				"public class X {\n" + 
				"	void foo(Collection<? extends X> i) {\n" + 
				"		Zork z = (List<? extends X>) i;\n" + 
				"	}\n" + 
				"	void bar(List<? extends X> i) {\n" + 
				"		Zork z = (ArrayList<? extends X>) i;\n" + 
				"	}	\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 4)\n" + 
			"	Zork z = (List<? extends X>) i;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 7)\n" + 
			"	Zork z = (ArrayList<? extends X>) i;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
}
public void test1409() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"import java.util.*;\n" + 
				"public class X {\n" + 
				"	void foo(List<X> lx, List<?> lw) {\n" + 
				"		LinkedList<Object> lo = (LinkedList<Object>) lx;\n" + 
				"		LinkedList<String> ls = (LinkedList<String>) lw;\n" + 
				"	}\n" + 
				"	void bar(List<X> lx, List<Integer> li) {\n" + 
				"		LinkedList<? extends Object> lo = (LinkedList<? extends Object>) lx;\n" + 
				"		LinkedList<? extends Number> ln = (LinkedList<? extends Number>) li;		\n" + 
				"	}\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 4)\n" + 
			"	LinkedList<Object> lo = (LinkedList<Object>) lx;\n" + 
			"	                        ^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Cannot cast from List<X> to LinkedList<Object>\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 5)\n" + 
			"	LinkedList<String> ls = (LinkedList<String>) lw;\n" + 
			"	                        ^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked cast from List<capture#1-of ?> to LinkedList<String>\n" + 
			"----------\n");
}
public void test1410() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"interface I<T> {}\n" + 
				"class Y<T> implements I<T> {}\n" + 
				"public class X {\n" + 
				"	I<Short>[] x = null;\n" + 
				"	Y<? extends Number>[] y1 = (Y<? extends Number>[]) x;\n" + 
				"	Y<? extends Number> y2 = (Y<? extends Number>) x[0];\n" + 
				"	Y<? extends X>[] y3 = (Y<? extends X>[]) x;\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 7)\n" + 
			"	Y<? extends X>[] y3 = (Y<? extends X>[]) x;\n" + 
			"	                      ^^^^^^^^^^^^^^^^^^^^\n" + 
			"Cannot cast from I<Short>[] to Y<? extends X>[]\n" + 
			"----------\n");
}
public void test1411() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"public class X<T> {\n" + 
				"	static class Child extends X<Object> {	}\n" + 
				"	static <U> X<U> create() {\n" + 
				"		Child child = new Child();\n" + 
				"		child.set(new Object());\n" + 
				"		return (X<U>) child;\n" + 
				"	}\n" + 
				"	public static void main(String[] args) {\n" + 
				"		X<Number> c = create();\n" + 
				"		Number n = c.get();\n" + 
				"	}\n" + 
				"	T t;\n" + 
				"	void set(T t) {\n" + 
				"		this.t = t;\n" + 
				"	}\n" + 
				"	T get() {\n" + 
				"		return t;\n" + 
				"	}\n" + 
				"	static X<Object> willWarn = new X<Object>();\n" + 
				"	static <U> X<U> raisesTheWarning() {\n" + 
				"		return (X<U>) willWarn;\n" + 
				"	}\n" + 
				"	Zork z;\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 6)\n" + 
			"	return (X<U>) child;\n" + 
			"	       ^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked cast from X.Child to X<U>\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 21)\n" + 
			"	return (X<U>) willWarn;\n" + 
			"	       ^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked cast from X<Object> to X<U>\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 23)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
}
public void test1412() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"import java.util.List;\n" + 
				"class A<T> {\n" + 
				"	List<String> foo() {\n" + 
				"		return null;\n" + 
				"	}\n" + 
				"}\n" + 
				"class B<U> {\n" + 
				"	A a1 = new A<U>();\n" + 
				"	A<?> a2 = new A<U>();\n" + 
				"}\n" + 
				"class X {\n" + 
				"	void bar() {\n" + 
				"		B<X> bx = new B<X>();\n" + 
				"		List<String> s1 = bx.a1.foo();\n" + 
				"		List<String> s2 = bx.a2.foo();\n" + 
				"		Zork z;\n" + 
				"	}\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 8)\n" + 
			"	A a1 = new A<U>();\n" + 
			"	^\n" + 
			"A is a raw type. References to generic type A<T> should be parameterized\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 14)\n" + 
			"	List<String> s1 = bx.a1.foo();\n" + 
			"	                  ^^^^^^^^^^^\n" + 
			"Type safety: The expression of type List needs unchecked conversion to conform to List<String>\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 16)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
}
public void test1413() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"import java.util.*;\n" + 
				"public class X  {\n" + 
				"	HashMap <String, ArrayList> m = new HashMap<String, ArrayList>();\n" + 
				"	ArrayList <X> ax = m.get(\"\");\n" + 
				"	Zork z;\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 3)\n" + 
			"	HashMap <String, ArrayList> m = new HashMap<String, ArrayList>();\n" + 
			"	                 ^^^^^^^^^\n" + 
			"ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 3)\n" + 
			"	HashMap <String, ArrayList> m = new HashMap<String, ArrayList>();\n" + 
			"	                                                    ^^^^^^^^^\n" + 
			"ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 4)\n" + 
			"	ArrayList <X> ax = m.get(\"\");\n" + 
			"	                   ^^^^^^^^^\n" + 
			"Type safety: The expression of type ArrayList needs unchecked conversion to conform to ArrayList<X>\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 5)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
}
public void test1414() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"interface A<T> {}\n" + 
				"class B<T> {}\n" + 
				"public class X {\n" + 
				"        A<?> a = null;\n" + 
				"        B y = (B)a;\n" + 
				"        Zork z;\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 5)\n" + 
			"	B y = (B)a;\n" + 
			"	^\n" + 
			"B is a raw type. References to generic type B<T> should be parameterized\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 5)\n" + 
			"	B y = (B)a;\n" + 
			"	       ^\n" + 
			"B is a raw type. References to generic type B<T> should be parameterized\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 6)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
}
public void test1415() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"public class X {\n" + 
				"    <T, U extends T, V extends T> T foo(boolean b, U u, V v) {\n" + 
				"        return b ? (T) u: v;\n" + 
				"    }\n" + 
				"    Zork z;\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 5)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
}
public void test1416() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"interface A {}\n" + 
				"interface B<RELATED extends A> extends A {}\n" + 
				"interface C<RELATED extends A, SOURCE  extends RELATED> extends B<RELATED> {}\n" + 
				"interface D<RELATED extends A, SOURCE  extends B<?>> extends C<RELATED, SOURCE> {}\n" + 
				"interface E<RELATED extends B<?>, SOURCE  extends RELATED> extends C<RELATED, SOURCE> {}\n" + 
				"public class X {\n" + 
				"	C<B<?>,C<?,?>> ok;\n" + 
				"	C<C<?,?>,B<?>> wrong;\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 4)\n" + 
			"	interface D<RELATED extends A, SOURCE  extends B<?>> extends C<RELATED, SOURCE> {}\n" + 
			"	                                                                        ^^^^^^\n" + 
			"Bound mismatch: The type SOURCE is not a valid substitute for the bounded parameter <SOURCE extends RELATED> of the type C<RELATED,SOURCE>\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 8)\n" + 
			"	C<C<?,?>,B<?>> wrong;\n" + 
			"	         ^\n" + 
			"Bound mismatch: The type B<?> is not a valid substitute for the bounded parameter <SOURCE extends RELATED> of the type C<RELATED,SOURCE>\n" + 
			"----------\n");
}
public void test1417() {
	this.runConformTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"class XSuper {\n" + 
				"    protected void bar() {}\n" + 
				"}\n" + 
				"interface I {\n" + 
				"    void baz();\n" + 
				"}\n" + 
				"public class X extends XSuper implements I{\n" + 
				"    public void baz() {}\n" + 
				"    public static void main(String argv[]) {\n" + 
				"        testMethod(new X());\n" + 
				"        System.out.println(\"SUCCESS\");\n" + 
				"    }\n" + 
				"    static <T extends XSuper & I, U extends T> void testMethod(U u) {\n" + 
				"        u.baz();\n" + 
				"        u.bar();\n" + 
				"    }\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=257434
public void test1418() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"class Box<U extends Box<?, ?>, V extends U> {\n" + 
				"	V value;\n" + 
				"	Box<U, V> next;\n" + 
				"	Box(V value) {\n" + 
				"		this.value = value;\n" + 
				"	}\n" + 
				"	Box() {}\n" + 
				"}\n" + 
				"class A extends Box<A, A> {}\n" + 
				"class B extends Box<B, B> {}\n" + 
				"public class X {\n" + 
				"	public static void main(String[] args) {\n" + 
				"		Box<Box<A, A>, Box<A, A>> a = new Box<Box<A, A>, Box<A, A>>(new Box<A, A>(new A()));\n" + 
				"		Box<?, ?> b = a;\n" + 
				"		b.value.next = new Box<B, B>(new B());\n" + 
				"		A c = a.value.next.value;\n" + 
				"		String s = b.value;\n" + 
				"		b.value.next.next = new Box<B, B>(new B());\n" + 
				"	}\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 15)\n" + 
			"	b.value.next = new Box<B, B>(new B());\n" + 
			"	               ^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type mismatch: cannot convert from Box<B,B> to Box<capture#3-of ?,capture#4-of ?>\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 17)\n" + 
			"	String s = b.value;\n" + 
			"	           ^^^^^^^\n" + 
			"Type mismatch: cannot convert from capture#6-of ? to String\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 18)\n" + 
			"	b.value.next.next = new Box<B, B>(new B());\n" + 
			"	                    ^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type mismatch: cannot convert from Box<B,B> to Box<capture#9-of ?,capture#10-of ?>\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=257434 - variation
public void test1419() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"class Box<U extends Box<?, ?>, V extends U> {\n" + 
				"	private V value;\n" + 
				"	Box<U, V> next;\n" + 
				"	Box(V value) {\n" + 
				"		this.value = value;\n" + 
				"	}\n" + 
				"	Box() {}\n" + 
				"	V getValue() { return this.value; }\n" + 
				"}\n" + 
				"class A extends Box<A, A> {}\n" + 
				"class B extends Box<B, B> {}\n" + 
				"public class X {\n" + 
				"	public static void main(String[] args) {\n" + 
				"		Box<Box<A, A>, Box<A, A>> a = new Box<Box<A, A>, Box<A, A>>(new Box<A, A>(new A()));\n" + 
				"		Box<?, ?> b = a;\n" + 
				"		b.getValue().next = new Box<B, B>(new B());\n" + 
				"		A c = a.getValue().next.getValue();\n" + 
				"		String s = b.getValue();\n" + 
				"		b.getValue().next.next = new Box<B, B>(new B());\n" + 
				"	}\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 16)\n" + 
			"	b.getValue().next = new Box<B, B>(new B());\n" + 
			"	                    ^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type mismatch: cannot convert from Box<B,B> to Box<capture#3-of ?,capture#4-of ?>\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 18)\n" + 
			"	String s = b.getValue();\n" + 
			"	           ^^^^^^^^^^^^\n" + 
			"Type mismatch: cannot convert from capture#6-of ? to String\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 19)\n" + 
			"	b.getValue().next.next = new Box<B, B>(new B());\n" + 
			"	                         ^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type mismatch: cannot convert from Box<B,B> to Box<capture#9-of ?,capture#10-of ?>\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=257434 - variation
public void test1420() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"class Box<U extends Box<?, ?>, V extends U> {\n" + 
				"	V value;\n" + 
				"	Box<U, V> next(V v) { return new Box<U,V>(v); }\n" + 
				"	Box(V value) {\n" + 
				"		this.value = value;\n" + 
				"	}\n" + 
				"	Box() {/**/}\n" + 
				"}\n" + 
				"class A extends Box<A, A> {/**/}\n" + 
				"class B extends Box<B, B> {/**/}\n" + 
				"public class X {\n" + 
				"	public static void main(String[] args) {\n" + 
				"		Box<Box<A, A>, Box<A, A>> a = new Box<Box<A, A>, Box<A, A>>(new Box<A, A>(new A()));\n" + 
				"		Box<?, ?> b = a;\n" + 
				"		b.value.next(new Box<B, B>(new B()));\n" + 
				"		b.value.next(b.value);\n" + 
				"	}\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 15)\n" + 
			"	b.value.next(new Box<B, B>(new B()));\n" + 
			"	        ^^^^\n" + 
			"The method next(capture#4-of ?) in the type Box<capture#3-of ?,capture#4-of ?> is not applicable for the arguments (Box<B,B>)\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 16)\n" + 
			"	b.value.next(b.value);\n" + 
			"	        ^^^^\n" + 
			"The method next(capture#10-of ?) in the type Box<capture#9-of ?,capture#10-of ?> is not applicable for the arguments (capture#8-of ?)\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=257849
// FIXME javac8 doesn't find the error
public void test1421() {
	this.runNegativeTest(
			false /* skipJavac */,
			this.complianceLevel < ClassFileConstants.JDK1_8 ? 
			null : JavacTestOptions.Excuse.JavacCompilesIncorrectSource,
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"public class X {\n" + 
				"	public interface ID {	};\n" + 
				"	public abstract class DomainObject<T extends ID> {};\n" + 
				"	public interface DAO<T extends DomainObject<ID>> {	};\n" + 
				"	public abstract class HibernateDAOBase<DomainObject> implements DAO<DomainObject<ID>> {};\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 5)\n" + 
			"	public abstract class HibernateDAOBase<DomainObject> implements DAO<DomainObject<ID>> {};\n" + 
			"	                                       ^^^^^^^^^^^^\n" + 
			"The type parameter DomainObject is hiding the type X.DomainObject<T>\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 5)\n" + 
			"	public abstract class HibernateDAOBase<DomainObject> implements DAO<DomainObject<ID>> {};\n" + 
			"	                                                                    ^^^^^^^^^^^^\n" + 
			"The type DomainObject is not generic; it cannot be parameterized with arguments <X.ID>\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=257849 - variation
public void test1422() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"public class X {\n" + 
				"	public interface ID {	};\n" + 
				"	public abstract class DomainObject<T extends ID> {};\n" + 
				"	public interface DAO<T extends DomainObject<ID>> {	};\n" + 
				"	public abstract class HibernateDAOBase<DomainObject> implements DAO<DomainObject<ID>.Zork> {};\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 5)\n" + 
			"	public abstract class HibernateDAOBase<DomainObject> implements DAO<DomainObject<ID>.Zork> {};\n" + 
			"	                                       ^^^^^^^^^^^^\n" + 
			"The type parameter DomainObject is hiding the type X.DomainObject<T>\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 5)\n" + 
			"	public abstract class HibernateDAOBase<DomainObject> implements DAO<DomainObject<ID>.Zork> {};\n" + 
			"	                                                                    ^^^^^^^^^^^^\n" + 
			"The type DomainObject is not generic; it cannot be parameterized with arguments <X.ID>\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=257849
public void test1423() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"public class X {\n" + 
				"	public interface ID {	};\n" + 
				"	public abstract class DomainObject<T extends ID> {};\n" + 
				"	public interface DAO<T extends DomainObject<ID>> {	};\n" + 
				"	public abstract class HibernateDAOBase<DomainObject> implements DAO<DomainObject<? extends Zork>> {};\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 5)\n" + 
			"	public abstract class HibernateDAOBase<DomainObject> implements DAO<DomainObject<? extends Zork>> {};\n" + 
			"	                                       ^^^^^^^^^^^^\n" + 
			"The type parameter DomainObject is hiding the type X.DomainObject<T>\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 5)\n" + 
			"	public abstract class HibernateDAOBase<DomainObject> implements DAO<DomainObject<? extends Zork>> {};\n" + 
			"	                                                                    ^^^^^^^^^^^^\n" + 
			"The type DomainObject is not generic; it cannot be parameterized with arguments <? extends Zork>\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 5)\n" + 
			"	public abstract class HibernateDAOBase<DomainObject> implements DAO<DomainObject<? extends Zork>> {};\n" + 
			"	                                                                                           ^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=257849 - variation
public void test1424() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"public class X {\n" + 
				"	public interface ID {	};\n" + 
				"	public abstract class DomainObject<T extends ID> {};\n" + 
				"	public interface DAO<T extends DomainObject<ID>> {	};\n" + 
				"	public abstract class HibernateDAOBase<DomainObject> implements DAO<DomainObject<? extends Zork>.Zork> {};\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 5)\n" + 
			"	public abstract class HibernateDAOBase<DomainObject> implements DAO<DomainObject<? extends Zork>.Zork> {};\n" + 
			"	                                       ^^^^^^^^^^^^\n" + 
			"The type parameter DomainObject is hiding the type X.DomainObject<T>\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 5)\n" + 
			"	public abstract class HibernateDAOBase<DomainObject> implements DAO<DomainObject<? extends Zork>.Zork> {};\n" + 
			"	                                                                    ^^^^^^^^^^^^\n" + 
			"The type DomainObject is not generic; it cannot be parameterized with arguments <? extends Zork>\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 5)\n" + 
			"	public abstract class HibernateDAOBase<DomainObject> implements DAO<DomainObject<? extends Zork>.Zork> {};\n" + 
			"	                                                                                           ^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=206123
public void test1425() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"public class X {\n" + 
				"	void test() {\n" + 
				"		B b = new C();\n" + 
				"		Class<? extends B> cb = C.class;\n" + 
				"		\n" + 
				"		YYY<C> y = new XXX();\n" + 
				"		Class<? extends YYY<C>> cy = XXX.class;\n" + 
				"		\n" + 
				"		YYY<? extends B> yb = new XXX();\n" + 
				"		Class<? extends YYY<? extends B>> ybc = XXX.class;\n" + 
				"		\n" + 
				"		Class<? extends YYY> ybb = yb.getClass();\n" + 
				"		Class<? extends YYY<?>> ybb2 = yb.getClass();\n" + 
				"		Class<? extends YYY<? extends B>> ybb3 = yb.getClass();\n" + 
				"	}\n" + 
				"}\n" + 
				"class Obj {}\n" + 
				"class B extends Obj {}\n" + 
				"class C extends B {}\n" + 
				"class ZZZ<T extends Obj> {}\n" + 
				"class YYY<T extends B> extends ZZZ<T> {}\n" + 
				"class XXX extends YYY<C> {}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 12)\n" + 
			"	Class<? extends YYY> ybb = yb.getClass();\n" + 
			"	                ^^^\n" + 
			"YYY is a raw type. References to generic type YYY<T> should be parameterized\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 13)\n" + 
			"	Class<? extends YYY<?>> ybb2 = yb.getClass();\n" + 
			"	                               ^^^^^^^^^^^^^\n" + 
			"Type mismatch: cannot convert from Class<capture#4-of ? extends YYY> to Class<? extends YYY<?>>\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 14)\n" + 
			"	Class<? extends YYY<? extends B>> ybb3 = yb.getClass();\n" + 
			"	                                         ^^^^^^^^^^^^^\n" + 
			"Type mismatch: cannot convert from Class<capture#6-of ? extends YYY> to Class<? extends YYY<? extends B>>\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=258039
public void test1426() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"import java.util.*;\n" + 
				"public class X {\n" + 
				"	boolean foo() {\n" + 
				"		return null instanceof List<Object>;\n" + 
				"	}\n" + 
				"	<T extends List<Object>> boolean foo2() {\n" + 
				"		return null instanceof T;\n" + 
				"	}\n" + 
				"	boolean foo3() {\n" + 
				"		return null instanceof Map<Object,String>;\n" + 
				"	}\n" + 
				"	<T extends Map<Object,String>> boolean foo4() {\n" + 
				"		return null instanceof T;\n" + 
				"	}\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 4)\n" + 
			"	return null instanceof List<Object>;\n" + 
			"	       ^^^^^^^^^^^^^^^^^^^^\n" + 
			"Cannot perform instanceof check against parameterized type List<Object>. Use the form List<?> instead since further generic type information will be erased at runtime\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 7)\n" + 
			"	return null instanceof T;\n" + 
			"	       ^^^^^^^^^^^^^^^^^\n" + 
			"Cannot perform instanceof check against type parameter T. Use its erasure List<?> instead since further generic type information will be erased at runtime\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 10)\n" + 
			"	return null instanceof Map<Object,String>;\n" + 
			"	       ^^^^^^^^^^^^^^^^^^^\n" + 
			"Cannot perform instanceof check against parameterized type Map<Object,String>. Use the form Map<?,?> instead since further generic type information will be erased at runtime\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 13)\n" + 
			"	return null instanceof T;\n" + 
			"	       ^^^^^^^^^^^^^^^^^\n" + 
			"Cannot perform instanceof check against type parameter T. Use its erasure Map<?,?> instead since further generic type information will be erased at runtime\n" + 
			"----------\n");
}
public void test1427() {
	String xSource =
			"import java.util.List;\n" + 
			"public class X {\n" + 
			"    public <T> List<T> nil() { return null; }\n" + 
			"    public <T> T getHead(List<T> x) { return null; }\n" + 
			"    X() {\n" + 
			"	   String s = getHead(nil());\n" + 
			"    }\n" + 
			"}\n";
	if (this.complianceLevel < ClassFileConstants.JDK1_8) {
		this.runNegativeTest(
				new String[] {
					"X.java",
					xSource
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 6)\n" + 
				"	String s = getHead(nil());\n" + 
				"	           ^^^^^^^^^^^^^^\n" + 
				"Type mismatch: cannot convert from Object to String\n" + 
				"----------\n");
	} else {
		runConformTest(
			new String[] {
				"X.java",
				xSource
			});
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=239203
public void test1428() {
	this.runConformTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"class A<I extends B> {}\n" + 
				"class B {}\n" + 
				"public class X {\n" + 
				"	public <I extends B, C extends A<I>> A<I> foo(Class<C> clazz) {\n" + 
				"		A<I> ret = bar(\"bla\");\n" + 
				"		return ret;\n" + 
				"	}\n" + 
				"	public <I extends B, C extends A<I>> A<I> bar(String clazzName) {\n" + 
				"		return null;\n" + 
				"	}\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=258798
public void test1429() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"class Foo<T> {}\n" + 
				"public class X {\n" + 
				"	public void test() {\n" + 
				"		Integer i = m(new Foo<Foo<Integer>>(), new Foo());\n" + 
				"	}\n" + 
				"	public <T> T m(Foo<T> x, T t) {\n" + 
				"		return t;\n" + 
				"	}\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			this.complianceLevel < ClassFileConstants.JDK1_8 ?
			"----------\n" + 
			"1. WARNING in X.java (at line 4)\n" + 
			"	Integer i = m(new Foo<Foo<Integer>>(), new Foo());\n" + 
			"	            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation m(Foo<Foo<Integer>>, Foo) of the generic method m(Foo<T>, T) of type X\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 4)\n" + 
			"	Integer i = m(new Foo<Foo<Integer>>(), new Foo());\n" + 
			"	            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type mismatch: cannot convert from Foo to Integer\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 4)\n" + 
			"	Integer i = m(new Foo<Foo<Integer>>(), new Foo());\n" + 
			"	                                       ^^^^^^^^^\n" + 
			"Type safety: The expression of type Foo needs unchecked conversion to conform to Foo<Integer>\n" + 
			"----------\n" + 
			"4. WARNING in X.java (at line 4)\n" + 
			"	Integer i = m(new Foo<Foo<Integer>>(), new Foo());\n" + 
			"	                                           ^^^\n" + 
			"Foo is a raw type. References to generic type Foo<T> should be parameterized\n" + 
			"----------\n" :
				"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	Integer i = m(new Foo<Foo<Integer>>(), new Foo());\n" + 
				"	            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Type mismatch: cannot convert from Foo to Integer\n" + 
				"----------\n" + 
				"2. WARNING in X.java (at line 4)\n" + 
				"	Integer i = m(new Foo<Foo<Integer>>(), new Foo());\n" + 
				"	                                           ^^^\n" + 
				"Foo is a raw type. References to generic type Foo<T> should be parameterized\n" + 
				"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=258798 - variation
public void test1430() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"class Foo<T> {}\n" + 
				"public class X {\n" + 
				"        public void test() {\n" + 
				"                m(new Foo<Foo<Integer>>(), new Foo());\n" + 
				"        }\n" + 
				"        public <T> void m(Foo<T> x, T t) {}\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 4)\n" + 
			"	m(new Foo<Foo<Integer>>(), new Foo());\n" + 
			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation m(Foo<Foo<Integer>>, Foo) of the generic method m(Foo<T>, T) of type X\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 4)\n" + 
			"	m(new Foo<Foo<Integer>>(), new Foo());\n" + 
			"	                           ^^^^^^^^^\n" + 
			"Type safety: The expression of type Foo needs unchecked conversion to conform to Foo<Integer>\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 4)\n" + 
			"	m(new Foo<Foo<Integer>>(), new Foo());\n" + 
			"	                               ^^^\n" + 
			"Foo is a raw type. References to generic type Foo<T> should be parameterized\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=258039
public void test1431()  throws Exception {
	this.runNegativeTest(
		new String[] {
			"X.java", //=================================
			"public class X {\n" + 
			"	void foo() {\n" + 
			"		class M<T extends Number> {}\n" + 
			"		class N extends M<String> {}\n" + 
			"		class O implements I<String>, I<Number> {}\n" + 
			"	}\n" + 
			"	class MM<T extends Number> {}\n" + 
			"	class NN extends MM<String> {}\n" + 
			"	class OO implements I<String>, I<Number> {}\n" + 
			"}\n" +
			"interface I<T> {}"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 4)\n" + 
		"	class N extends M<String> {}\n" + 
		"	                  ^^^^^^\n" + 
		"Bound mismatch: The type String is not a valid substitute for the bounded parameter <T extends Number> of the type M<T>\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 5)\n" + 
		"	class O implements I<String>, I<Number> {}\n" + 
		"	      ^\n" + 
		"The interface I cannot be implemented more than once with different arguments: I<Number> and I<String>\n" + 
		"----------\n" + 
		"3. ERROR in X.java (at line 8)\n" + 
		"	class NN extends MM<String> {}\n" + 
		"	                    ^^^^^^\n" + 
		"Bound mismatch: The type String is not a valid substitute for the bounded parameter <T extends Number> of the type X.MM<T>\n" + 
		"----------\n" + 
		"4. ERROR in X.java (at line 9)\n" + 
		"	class OO implements I<String>, I<Number> {}\n" + 
		"	      ^^\n" + 
		"The interface I cannot be implemented more than once with different arguments: I<Number> and I<String>\n" + 
		"----------\n"
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=258798 - variation
public void test1432() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"class Foo<T> {\n" + 
				"	T bar(Foo<T> ft, T t) {\n" + 
				"		return t;\n" + 
				"	}\n" + 
				"}\n" + 
				"public class X {\n" + 
				"	public void test() {\n" + 
				"		Foo<Foo<Integer>> ffi = new Foo<Foo<Integer>>();\n" + 
				"		Integer j = ffi.bar(ffi, new Foo());\n" + 
				"	}\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 9)\n" + 
			"	Integer j = ffi.bar(ffi, new Foo());\n" + 
			"	            ^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			(this.complianceLevel < ClassFileConstants.JDK1_8
			? "Type mismatch: cannot convert from Foo<Integer> to Integer\n"
			: "Type mismatch: cannot convert from Foo to Integer\n") +
			"----------\n" + 
			"2. WARNING in X.java (at line 9)\n" + 
			"	Integer j = ffi.bar(ffi, new Foo());\n" + 
			"	                         ^^^^^^^^^\n" + 
			"Type safety: The expression of type Foo needs unchecked conversion to conform to Foo<Integer>\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 9)\n" + 
			"	Integer j = ffi.bar(ffi, new Foo());\n" + 
			"	                             ^^^\n" + 
			"Foo is a raw type. References to generic type Foo<T> should be parameterized\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=258798 - variation
public void test1433() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"import java.util.*;\n" + 
				"public class X<T> {\n" + 
				"	Zork z;\n" +
				"	<U> void foo(X<U> xu) {}\n" + 
				"	void bar(X x) {\n" + 
				"		foo(x);\n" + 
				"	}\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 3)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 5)\n" + 
			"	void bar(X x) {\n" + 
			"	         ^\n" + 
			"X is a raw type. References to generic type X<T> should be parameterized\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 6)\n" + 
			"	foo(x);\n" + 
			"	^^^^^^\n" + 
			"Type safety: Unchecked invocation foo(X) of the generic method foo(X<U>) of type X<T>\n" + 
			"----------\n" + 
			"4. WARNING in X.java (at line 6)\n" + 
			"	foo(x);\n" + 
			"	    ^\n" + 
			"Type safety: The expression of type X needs unchecked conversion to conform to X<Object>\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=258798 - variation
public void test1434() {
	this.runNegativeTest(
			new String[] {
				"Foo.java", //-----------------------------------------------------------------------
				"public class Foo {\n" + 
				"	public static <I> I m2(Class<I> c) { return null; }	\n" + 
				"	void bar() {\n" + 
				"		Foo l2 = m2((Class)Foo.class);\n" + 
				"	}\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			(this.complianceLevel < ClassFileConstants.JDK1_8 ?
			"----------\n" + 
			"1. WARNING in Foo.java (at line 4)\n" + 
			"	Foo l2 = m2((Class)Foo.class);\n" + 
			"	         ^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation m2(Class) of the generic method m2(Class<I>) of type Foo\n" + 
			"----------\n" + 
			"2. WARNING in Foo.java (at line 4)\n" + 
			"	Foo l2 = m2((Class)Foo.class);\n" + 
			"	            ^^^^^^^^^^^^^^^^\n" + 
			"Type safety: The expression of type Class needs unchecked conversion to conform to Class<Foo>\n" + 
			"----------\n" + 
			"3. WARNING in Foo.java (at line 4)\n" + 
			"	Foo l2 = m2((Class)Foo.class);\n" + 
			"	            ^^^^^^^^^^^^^^^^\n" + 
			"Unnecessary cast from Class<Foo> to Class\n" + 
			"----------\n" + 
			"4. WARNING in Foo.java (at line 4)\n" + 
			"	Foo l2 = m2((Class)Foo.class);\n" + 
			"	             ^^^^^\n" + 
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" + 
			"----------\n"
			: // 1.8 is stricter:
			"----------\n" + 
			"1. ERROR in Foo.java (at line 4)\n" + 
			"	Foo l2 = m2((Class)Foo.class);\n" + 
			"	         ^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type mismatch: cannot convert from Object to Foo\n" + 
			"----------\n" + 
			"2. WARNING in Foo.java (at line 4)\n" + 
			"	Foo l2 = m2((Class)Foo.class);\n" + 
			"	             ^^^^^\n" + 
			"Class is a raw type. References to generic type Class<T> should be parameterized\n" + 
			"----------\n"));
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=258798 - variation
public void test1435() {
	String xSource =
				"public class X {\n" + 
				"	<T extends Comparable<T>>	T min(T x, T y) { return x; }\n" + 
				"	\n" + 
				"	void foo(Foo f, Bar b) {\n" + 
				"		min(f, f);\n" + 
				"		min(b, b);\n" + 
				"	}\n" + 
				"}\n" + 
				"abstract class Foo implements Comparable<Foo> {\n" + 
				"}\n" + 
				"abstract class Bar extends Foo {}\n";
	if (this.complianceLevel < ClassFileConstants.JDK1_8) {
		this.runNegativeTest(
				new String[] {
					"X.java",
					xSource,
				},
				"----------\n" +
				"1. ERROR in X.java (at line 6)\n" +
				"	min(b, b);\n" +
				"	^^^\n" +
				"Bound mismatch: The generic method min(T, T) of type X is not applicable for the arguments (Bar, Bar). The inferred type Bar is not a valid substitute for the bounded parameter <T extends Comparable<T>>\n" +
				"----------\n");
	} else {
		runConformTest(new String[]{ "X.java", xSource });
	}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=258798 - variation
public void test1436() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"import java.util.*;\n" + 
				"public class X {\n" + 
				"	<U extends List<?>, T extends Throwable> void foo(List<U> lu, T t) throws T {\n" + 
				"		if (lu.isEmpty()) throw t;\n" + 
				"	}\n" + 
				"	void bar(List l, IllegalArgumentException iae) {\n" + 
				"		try {\n" + 
				"			foo(l, iae);\n" + 
				"		} catch (IllegalArgumentException e) {\n" + 
				"		}\n" + 
				"	}\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 6)\n" + 
			"	void bar(List l, IllegalArgumentException iae) {\n" + 
			"	         ^^^^\n" + 
			"List is a raw type. References to generic type List<E> should be parameterized\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 8)\n" + 
			"	foo(l, iae);\n" + 
			"	^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation foo(List, IllegalArgumentException) of the generic method foo(List<U>, T) of type X\n" + 
			"----------\n" +
			(this.complianceLevel < ClassFileConstants.JDK1_8
			?
				"3. WARNING in X.java (at line 8)\n" + 
				"	foo(l, iae);\n" + 
				"	    ^\n" + 
				"Type safety: The expression of type List needs unchecked conversion to conform to List<List<?>>\n"
			:
				"3. ERROR in X.java (at line 8)\n" + 
				"	foo(l, iae);\n" + 
				"	^^^^^^^^^^^\n" + 
				"Unhandled exception type Throwable\n" + // new error since 1.8 (bug 473657)
				"----------\n" + 
				"4. WARNING in X.java (at line 8)\n" + 
				"	foo(l, iae);\n" + 
				"	    ^\n" + 
				"Type safety: The expression of type List needs unchecked conversion to conform to List<List<?>>\n"				
			) +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=258798 - variation
public void test1437() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"import java.util.*;\n" + 
				"public class X {\n" + 
				"	<U extends List<?>, T extends Throwable> X(List<U> lu, T t) throws T {\n" + 
				"		if (lu.isEmpty()) throw t;\n" + 
				"	}\n" + 
				"	void bar(List l, IllegalArgumentException iae) {\n" + 
				"		try {\n" + 
				"			new X(l, iae);\n" + 
				"		} catch (IllegalArgumentException e) {\n" + 
				"		}\n" + 
				"	}\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 6)\n" + 
			"	void bar(List l, IllegalArgumentException iae) {\n" + 
			"	         ^^^^\n" + 
			"List is a raw type. References to generic type List<E> should be parameterized\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 8)\n" + 
			"	new X(l, iae);\n" + 
			"	^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation X(List, IllegalArgumentException) of the generic constructor X(List<U>, T) of type X\n" + 
			"----------\n" +
			(this.complianceLevel < ClassFileConstants.JDK1_8
			?
				"3. WARNING in X.java (at line 8)\n" + 
				"	new X(l, iae);\n" + 
				"	      ^\n" + 
				"Type safety: The expression of type List needs unchecked conversion to conform to List<List<?>>\n"
			:
				"3. ERROR in X.java (at line 8)\n" + 
				"	new X(l, iae);\n" + 
				"	^^^^^^^^^^^^^\n" + 
				"Unhandled exception type Throwable\n" + // new error since 1.8 (bug 473657)
				"----------\n" + 
				"4. WARNING in X.java (at line 8)\n" + 
				"	new X(l, iae);\n" + 
				"	      ^\n" + 
				"Type safety: The expression of type List needs unchecked conversion to conform to List<List<?>>\n"				
			) +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=258798 - variation
public void test1438() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"import java.util.*;\n" + 
				"public class X {\n" + 
				"	<U extends List<?>, T extends Throwable> X(List<U> lu, T t) throws T {\n" + 
				"		if (lu.isEmpty()) throw t;\n" + 
				"	}\n" + 
				"	void bar(List l, IllegalArgumentException iae) {\n" + 
				"		try {\n" + 
				"			new X(l, iae){};\n" + 
				"		} catch (IllegalArgumentException e) {\n" + 
				"		}\n" + 
				"	}\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 6)\n" + 
			"	void bar(List l, IllegalArgumentException iae) {\n" + 
			"	         ^^^^\n" + 
			"List is a raw type. References to generic type List<E> should be parameterized\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 8)\n" + 
			"	new X(l, iae){};\n" + 
			"	^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation X(List, IllegalArgumentException) of the generic constructor X(List<U>, T) of type X\n" + 
			"----------\n" +
			(this.complianceLevel < ClassFileConstants.JDK1_8
			?
				"3. WARNING in X.java (at line 8)\n" + 
				"	new X(l, iae){};\n" + 
				"	      ^\n" + 
				"Type safety: The expression of type List needs unchecked conversion to conform to List<List<?>>\n"
			:
				"3. ERROR in X.java (at line 8)\n" + 
				"	new X(l, iae){};\n" + 
				"	^^^^^^^^^^^^^^^\n" + 
				"Unhandled exception type Throwable\n" + // new error since 1.8 (bug 473657)
				"----------\n" + 
				"4. WARNING in X.java (at line 8)\n" + 
				"	new X(l, iae){};\n" + 
				"	      ^\n" + 
				"Type safety: The expression of type List needs unchecked conversion to conform to List<List<?>>\n"				
			) +
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=258798 - variation
public void test1439() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"import java.util.*;\n" + 
				"public class X {\n" + 
				"	<U extends List<?>, T extends Throwable> X(List<U> lu, T t) throws T {\n" + 
				"		if (lu.isEmpty()) throw t;\n" + 
				"	}\n" + 
				"	X() { \n" + 
				"		this((List) null, null);\n" + 
				"	}\n" + 
				"}\n" + 
				"class Y extends X {\n" + 
				"	<U extends List<?>, T extends Throwable> Y(List<U> lu, T t) {\n" + 
				"		super((List)lu, t);\n" + 
				"	}\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 7)\n" + 
			"	this((List) null, null);\n" + 
			"	^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation X(List, null) of the generic constructor X(List<U>, T) of type X\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 7)\n" + 
			"	this((List) null, null);\n" + 
			"	^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Unhandled exception type Throwable\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 7)\n" + 
			"	this((List) null, null);\n" + 
			"	     ^^^^^^^^^^^\n" + 
			"Type safety: The expression of type List needs unchecked conversion to conform to List<List<?>>\n" + 
			"----------\n" + 
			"4. WARNING in X.java (at line 7)\n" + 
			"	this((List) null, null);\n" + 
			"	      ^^^^\n" + 
			"List is a raw type. References to generic type List<E> should be parameterized\n" + 
			"----------\n" + 
			"5. WARNING in X.java (at line 12)\n" + 
			"	super((List)lu, t);\n" + 
			"	^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation X(List, T) of the generic constructor X(List<U>, T) of type X\n" + 
			"----------\n" + 
			"6. ERROR in X.java (at line 12)\n" + 
			"	super((List)lu, t);\n" + 
			"	^^^^^^^^^^^^^^^^^^^\n" + 
			"Unhandled exception type Throwable\n" + 
			"----------\n" + 
			"7. WARNING in X.java (at line 12)\n" + 
			"	super((List)lu, t);\n" + 
			"	      ^^^^^^^^\n" + 
			"Type safety: The expression of type List needs unchecked conversion to conform to List<List<?>>\n" + 
			"----------\n" + 
			"8. WARNING in X.java (at line 12)\n" + 
			"	super((List)lu, t);\n" + 
			"	       ^^^^\n" + 
			"List is a raw type. References to generic type List<E> should be parameterized\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=260567
public void test1440() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"import java.util.*;\n" + 
				"interface GenricInterface<T> {}\n" + 
				"class NewMapType<U, V, R extends GenricInterface<U>> extends HashMap<R<U>, V> {}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 3)\n" + 
			"	class NewMapType<U, V, R extends GenricInterface<U>> extends HashMap<R<U>, V> {}\n" + 
			"	                                                                     ^\n" + 
			"The type R is not generic; it cannot be parameterized with arguments <U>\n" + 
			"----------\n");
}
public void test1441() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"public class X<T> {\n" + 
				"	void bar(T t) {}\n" + 
				"	void foo(X<? extends String> x1, X<? extends Integer> x2) {\n" + 
				"		(x1 != null ? x1 : x2).bar(new Object());\n" + 
				"	}\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 4)\n" + 
			"	(x1 != null ? x1 : x2).bar(new Object());\n" + 
			"	                       ^^^\n" + 
			"The method bar(capture#4-of ? extends "+intersection("Object","Serializable","Comparable<? extends "+intersection("Object","Serializable","Comparable<?>")+">")+") in the type X<capture#4-of ? extends "+intersection("Object","Serializable","Comparable<? extends "+intersection("Object","Serializable","Comparable<?>")+">")+"> is not applicable for the arguments (Object)\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=221253
public void test1442() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"public class X<T extends Comparable<T>> {\n" + 
				"        T[] array;\n" + 
				"\n" + 
				"        @Override public boolean equals(Object o) {\n" + 
				"                X<Comparable<T>> x;\n" + 
				"                if (array.length == ((X<Comparable<T>>) o).array.length) {\n" + 
				"                        return true;\n" + 
				"                }\n" + 
				"                return false;\n" + 
				"        }\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 5)\n" + 
			"	X<Comparable<T>> x;\n" + 
			"	  ^^^^^^^^^^\n" + 
			"Bound mismatch: The type Comparable<T> is not a valid substitute for the bounded parameter <T extends Comparable<T>> of the type X<T>\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 6)\n" + 
			"	if (array.length == ((X<Comparable<T>>) o).array.length) {\n" + 
			"	                    ^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked cast from Object to X<Comparable<T>>\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 6)\n" + 
			"	if (array.length == ((X<Comparable<T>>) o).array.length) {\n" + 
			"	                        ^^^^^^^^^^\n" + 
			"Bound mismatch: The type Comparable<T> is not a valid substitute for the bounded parameter <T extends Comparable<T>> of the type X<T>\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=254627
public void test1443() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"import java.util.List;\n" + 
				"public class X {\n" + 
				"  private static class C {}\n" + 
				"  private static class B<T extends C> {}\n" + 
				"  private static class A<T extends B<? extends C>> {}\n" + 
				"  void bar (List<A> a) {\n" + 
				"    baz((List)a);\n" + 
				"    // Neither of these two following statements compile under javac\n" + 
				"    buz(a);\n" + 
				"    buz((List)a);\n" + 
				"    // Side note: the following statement is correctly identified as an error\n" + 
				"    // by Eclipse, but it does not suggest casting as a Quick Fix.\n" + 
				"    baz(a);\n" + 
				"  }\n" + 
				"  <R extends C, T extends B<R>> void baz(List<A<T>> a) {}\n" + 
				"  <R extends C, T extends B<R>> void buz(List a) {}\n" + 
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 6)\n" + 
			"	void bar (List<A> a) {\n" + 
			"	               ^\n" + 
			"X.A is a raw type. References to generic type X.A<T> should be parameterized\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 7)\n" + 
			"	baz((List)a);\n" + 
			"	^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation baz(List) of the generic method baz(List<X.A<T>>) of type X\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 7)\n" + 
			"	baz((List)a);\n" + 
			"	    ^^^^^^^\n" + 
			"Type safety: The expression of type List needs unchecked conversion to conform to List<X.A<X.B<X.C>>>\n" + 
			"----------\n" + 
			"4. WARNING in X.java (at line 7)\n" + 
			"	baz((List)a);\n" + 
			"	     ^^^^\n" + 
			"List is a raw type. References to generic type List<E> should be parameterized\n" + 
			"----------\n" + 
			"5. WARNING in X.java (at line 10)\n" + 
			"	buz((List)a);\n" + 
			"	     ^^^^\n" + 
			"List is a raw type. References to generic type List<E> should be parameterized\n" + 
			"----------\n" + 
			"6. ERROR in X.java (at line 13)\n" + 
			"	baz(a);\n" + 
			"	^^^\n" + 
			"The method baz(List<X.A<T>>) in the type X is not applicable for the arguments (List<X.A>)\n" + 
			"----------\n" + 
			"7. WARNING in X.java (at line 16)\n" + 
			"	<R extends C, T extends B<R>> void buz(List a) {}\n" + 
			"	                                       ^^^^\n" + 
			"List is a raw type. References to generic type List<E> should be parameterized\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=263215
public void test1444() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"import java.util.ArrayList;\n" + 
				"import java.util.Iterator;\n" + 
				"import java.util.List;\n" + 
				"\n" + 
				"public class X {\n" + 
				"	@SuppressWarnings(\"all\") public static <T> T[] asArray(Iterator<? extends T> it, Class<T> clazz) {\n" + 
				"		List<T> lst = new ArrayList<T>();\n" + 
				"		while (it.hasNext()) {\n" + 
				"			lst.add(it.next());\n" + 
				"		}\n" + 
				"		return lst.toArray((T[]) java.lang.reflect.Array.newInstance(clazz, lst.size()));\n" + 
				"	}\n" + 
				"	public void test() {\n" + 
				"		String[] asString = null;\n" + 
				"		// eclipse 3.5M4 this worked in build I20090129-1200 it doesnt anymore\n" + 
				"		asString = X.<String> asArray(getIterator(), String.class);\n" + 
				"		// now i have to do this:\n" + 
				"		Iterator<String> iterator = getIterator();\n" + 
				"		asString = X.<String> asArray(iterator, String.class);\n" + 
				"		// this also works except if i have remove unnecessary cast enabled then\n" + 
				"		// the cast is removed and i get a compile error\n" + 
				"		asString = X.<String> asArray((Iterator<String>) getIterator(), String.class);\n" + 
				"	}\n" + 
				"	@SuppressWarnings(\"all\") public Iterator getIterator() {\n" + 
				"		return new Iterator() {\n" + 
				"			public void remove() {\n" + 
				"			}\n" + 
				"			public Object next() {\n" + 
				"				return null;\n" + 
				"			}\n" + 
				"			public boolean hasNext() {\n" + 
				"				return false;\n" + 
				"			}\n" + 
				"		};\n" + 
				"	}\n" + 
				"	Zork z;\n" +
				"}\n",//-----------------------------------------------------------------------
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 16)\n" + 
			"	asString = X.<String> asArray(getIterator(), String.class);\n" + 
			"	           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation asArray(Iterator, Class<String>) of the generic method asArray(Iterator<? extends T>, Class<T>) of type X\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 16)\n" + 
			"	asString = X.<String> asArray(getIterator(), String.class);\n" + 
			"	                              ^^^^^^^^^^^^^\n" + 
			"Type safety: The expression of type Iterator needs unchecked conversion to conform to Iterator<? extends String>\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 18)\n" + 
			"	Iterator<String> iterator = getIterator();\n" + 
			"	                            ^^^^^^^^^^^^^\n" + 
			"Type safety: The expression of type Iterator needs unchecked conversion to conform to Iterator<String>\n" + 
			"----------\n" + 
			"4. WARNING in X.java (at line 22)\n" + 
			"	asString = X.<String> asArray((Iterator<String>) getIterator(), String.class);\n" + 
			"	                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked cast from Iterator to Iterator<String>\n" + 
			"----------\n" + 
			(this.complianceLevel < ClassFileConstants.JDK1_8 ?
			"5. WARNING in X.java (at line 22)\n" + 
			"	asString = X.<String> asArray((Iterator<String>) getIterator(), String.class);\n" + 
			"	                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Unnecessary cast from Iterator to Iterator<String>\n" + 
			"----------\n" + 
			"6. ERROR in X.java (at line 36)\n"
			: // secondary error no longer reported at 1.8+
			"5. ERROR in X.java (at line 36)\n"
			) +
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=263215 - variation
public void test1445() {
	this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"import java.io.IOException;\n" + 
				"import java.util.List;\n" + 
				"\n" + 
				"public class X {\n" + 
				"	<T extends Throwable> X(List<T> lt) throws T { }\n" + 
				"	<T extends Throwable> List<T> foo(List<T> t) throws T { return t; }\n" + 
				"\n" + 
				"	static void bar(List l) {\n" + 
				"		new X(l).foo(l);\n" + 
				"	}\n" + 
				"	static void baz(List l) throws IOException {\n" + 
				"		new <IOException> X(l). <IOException> foo(l);\n" + 
				"	}\n" + 
				"	\n" + 
				"	X(List l, long l2) throws IOException {\n" + 
				"		<IOException> this(l);\n" + 
				"	}\n" + 
				"\n" + 
				"	static void baz2(List l) throws IOException {\n" + 
				"		new <IOException> X(l){}. <IOException> foo(l);\n" + 
				"	}\n" + 
				"\n" + 
				"}\n",
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 8)\n" + 
			"	static void bar(List l) {\n" + 
			"	                ^^^^\n" + 
			"List is a raw type. References to generic type List<E> should be parameterized\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 9)\n" + 
			"	new X(l).foo(l);\n" + 
			"	^^^^^^^^\n" + 
			"Type safety: Unchecked invocation X(List) of the generic constructor X(List<T>) of type X\n" + 
			"----------\n" + 
			"3. WARNING in X.java (at line 9)\n" + 
			"	new X(l).foo(l);\n" + 
			"	^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation foo(List) of the generic method foo(List<T>) of type X\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 9)\n" + 
			"	new X(l).foo(l);\n" + 
			"	^^^^^^^^\n" + 
			"Unhandled exception type Throwable\n" + 
			"----------\n" + 
			"5. ERROR in X.java (at line 9)\n" + 
			"	new X(l).foo(l);\n" + 
			"	^^^^^^^^^^^^^^^\n" + 
			"Unhandled exception type Throwable\n" + 
			"----------\n" + 
			"6. WARNING in X.java (at line 9)\n" + 
			"	new X(l).foo(l);\n" + 
			"	      ^\n" + 
			(this.complianceLevel < ClassFileConstants.JDK1_8
			? "Type safety: The expression of type List needs unchecked conversion to conform to List<Throwable>\n"
			: "Type safety: The expression of type List needs unchecked conversion to conform to List<RuntimeException>\n" ) +
			"----------\n" + 
			"7. WARNING in X.java (at line 9)\n" + 
			"	new X(l).foo(l);\n" + 
			"	             ^\n" + 
			(this.complianceLevel < ClassFileConstants.JDK1_8
			? "Type safety: The expression of type List needs unchecked conversion to conform to List<Throwable>\n"
			: "Type safety: The expression of type List needs unchecked conversion to conform to List<RuntimeException>\n" ) +
			"----------\n" + 
			"8. WARNING in X.java (at line 11)\n" + 
			"	static void baz(List l) throws IOException {\n" + 
			"	                ^^^^\n" + 
			"List is a raw type. References to generic type List<E> should be parameterized\n" + 
			"----------\n" + 
			"9. WARNING in X.java (at line 12)\n" + 
			"	new <IOException> X(l). <IOException> foo(l);\n" + 
			"	^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation X(List) of the generic constructor X(List<T>) of type X\n" + 
			"----------\n" + 
			"10. WARNING in X.java (at line 12)\n" + 
			"	new <IOException> X(l). <IOException> foo(l);\n" + 
			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation foo(List) of the generic method foo(List<T>) of type X\n" + 
			"----------\n" + 
			"11. WARNING in X.java (at line 12)\n" + 
			"	new <IOException> X(l). <IOException> foo(l);\n" + 
			"	                    ^\n" + 
			"Type safety: The expression of type List needs unchecked conversion to conform to List<IOException>\n" + 
			"----------\n" + 
			"12. WARNING in X.java (at line 12)\n" + 
			"	new <IOException> X(l). <IOException> foo(l);\n" + 
			"	                                          ^\n" + 
			"Type safety: The expression of type List needs unchecked conversion to conform to List<IOException>\n" + 
			"----------\n" + 
			"13. WARNING in X.java (at line 15)\n" + 
			"	X(List l, long l2) throws IOException {\n" + 
			"	  ^^^^\n" + 
			"List is a raw type. References to generic type List<E> should be parameterized\n" + 
			"----------\n" + 
			"14. WARNING in X.java (at line 16)\n" + 
			"	<IOException> this(l);\n" + 
			"	              ^^^^^^^^\n" + 
			"Type safety: Unchecked invocation X(List) of the generic constructor X(List<T>) of type X\n" + 
			"----------\n" + 
			"15. WARNING in X.java (at line 16)\n" + 
			"	<IOException> this(l);\n" + 
			"	                   ^\n" + 
			"Type safety: The expression of type List needs unchecked conversion to conform to List<IOException>\n" + 
			"----------\n" + 
			"16. WARNING in X.java (at line 19)\n" + 
			"	static void baz2(List l) throws IOException {\n" + 
			"	                 ^^^^\n" + 
			"List is a raw type. References to generic type List<E> should be parameterized\n" + 
			"----------\n" + 
			"17. WARNING in X.java (at line 20)\n" + 
			"	new <IOException> X(l){}. <IOException> foo(l);\n" + 
			"	^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation X(List) of the generic constructor X(List<T>) of type X\n" + 
			"----------\n" + 
			"18. WARNING in X.java (at line 20)\n" + 
			"	new <IOException> X(l){}. <IOException> foo(l);\n" + 
			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Type safety: Unchecked invocation foo(List) of the generic method foo(List<T>) of type X\n" + 
			"----------\n" + 
			"19. WARNING in X.java (at line 20)\n" + 
			"	new <IOException> X(l){}. <IOException> foo(l);\n" + 
			"	                    ^\n" + 
			"Type safety: The expression of type List needs unchecked conversion to conform to List<IOException>\n" + 
			"----------\n" + 
			"20. WARNING in X.java (at line 20)\n" + 
			"	new <IOException> X(l){}. <IOException> foo(l);\n" + 
			"	                                            ^\n" + 
			"Type safety: The expression of type List needs unchecked conversion to conform to List<IOException>\n" + 
			"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=202393
public void test1446() {
     this.runConformTest(
             new String[] {
                     "Bug202393.java",
                     "public class Bug202393 {\n" + 
                     "   static <T> T id(T in) { return in; }\n" +
                     "   public static void main(String[] args) {\n" +
                     "      try {" +
                     "         bad();" +
                     "      } catch (Throwable t) {\n" +
                     "         System.out.print(\"CAUGHT\");\n" +
                     "      }\n" +
                     "   }\n" +
                     "   static void bad() throws Throwable {\n" +
                     "      throw id(new Exception());\n" +
                     "   }\n" +
                     "}\n"},
             "CAUGHT"
     );
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=263633
public void test1447() {
    this.runConformTest(
            new String[] {
                    "X.java",
        			"public abstract class X implements Visitable {\n" + 
        			"	public <T, U extends Visitor<T>> T accept(U v) {\n" + 
        			"		return null;\n" + 
        			"	}\n" + 
        			"	public <T, U extends Visitor<T>> T accept2(U v) {\n" + 
        			"		if (v == null)\n" + 
        			"			return this.accept(v);\n" + 
        			"		else \n" + 
        			"			return this.<T, U> accept(v);\n" + 
        			"	}\n" + 
        			"}\n" + 
        			"interface Visitable {\n" + 
        			"	<T, U extends Visitor<T>> T accept(U v);\n" + 
        			"}\n" + 
        			"interface Visitor<T> {\n" + 
        			"}\n",
       		},
            ""
    );
}

//https://bugs.eclipse.org/bugs/show_bug.cgi?id=263633 - variation
public void test1448() {
    this.runConformTest(
            new String[] {
                    "X.java",
        			"public abstract class X implements Visitable {\n" + 
        			"	public <T, U extends Visitor> T accept(U v) {\n" + 
        			"		return null;\n" + 
        			"	}\n" + 
        			"	public <T, U extends Visitor> T accept2(U v) {\n" + 
        			"		if (v == null)\n" + 
        			"			return this.accept(v);\n" + 
        			"		else \n" + 
        			"			return this.<T, U> accept(v);\n" + 
        			"	}\n" + 
        			"}\n" + 
        			"interface Visitable {\n" + 
        			"	<T, U extends Visitor> T accept(U v);\n" + 
        			"}\n" + 
        			"interface Visitor{\n" + 
        			"}\n",
       		},
            ""
    );
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=263633 - variation
public void test1449() {
     this.runConformTest(
             new String[] {
                     "X.java",
         			"interface Visitor<T, C, O, P, EL, PM, S, COA, SSA, CT> {\n" + 
        			"}\n" + 
        			"public class X<U> {\n" + 
        			"	public <T, U extends Visitor<T, ?, ?, ?, ?, ?, ?, ?, ?, ?>> T accept(U v) {\n" + 
        			"		throw new UnsupportedOperationException();\n" + 
        			"	}\n" + 
        			"}\n" + 
        			"class Y<V> extends X<V> {\n" + 
        			"	public <T, U extends Visitor<T, ?, ?, ?, ?, ?, ?, ?, ?, ?>> T accept(U v) {\n" + 
        			"		if (v == null)\n" + 
        			"			return super.accept(v);\n" + 
        			"		else\n" + 
        			"			return super.<T, U> accept(v);\n" + 
        			"	}\n" + 
        			"}\n",
        		},
             ""
     );
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=159851
public void test1450() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.*;\n" +
			"class A {}\n" +
			"class B<T extends A> {}\n" +
			"class X<T extends ArrayList<B<Integer>>> extends TreeMap<Integer, B<String>> {}\n" +
			"\n" +
			"class D<T> {}\n" +
			"class E<T extends Number> {}\n" +
			"class Y<T> extends E<D<T>> {}",
		},
		"----------\n" + 
		"1. WARNING in X.java (at line 4)\n" + 
		"	class X<T extends ArrayList<B<Integer>>> extends TreeMap<Integer, B<String>> {}\n" + 
		"	      ^\n" + 
		"The serializable class X does not declare a static final serialVersionUID field of type long\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 4)\n" + 
		"	class X<T extends ArrayList<B<Integer>>> extends TreeMap<Integer, B<String>> {}\n" + 
		"	                              ^^^^^^^\n" + 
		"Bound mismatch: The type Integer is not a valid substitute for the bounded parameter <T extends A> of the type B<T>\n" + 
		"----------\n" + 
		"3. ERROR in X.java (at line 4)\n" + 
		"	class X<T extends ArrayList<B<Integer>>> extends TreeMap<Integer, B<String>> {}\n" + 
		"	                                                                    ^^^^^^\n" + 
		"Bound mismatch: The type String is not a valid substitute for the bounded parameter <T extends A> of the type B<T>\n" + 
		"----------\n" + 
		"4. ERROR in X.java (at line 8)\n" + 
		"	class Y<T> extends E<D<T>> {}\n" + 
		"	                     ^\n" + 
		"Bound mismatch: The type D<T> is not a valid substitute for the bounded parameter <T extends Number> of the type E<T>\n" + 
		"----------\n"
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=159851
public void test1451() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"class A<T> {}\n" +
			"class B<T2 extends Number> {}\n" +
			"class C<T3, T4> {}\n" +
			"class X<T1, T2> extends C<A<A<B<T1>>>, A<B<T2>>> {}\n" +
			"class Y<T> extends A<A<B<T>>> {}\n" +
			"class Z<T> extends C<B<T>, A<B<T>>> {}",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 4)\n" + 
		"	class X<T1, T2> extends C<A<A<B<T1>>>, A<B<T2>>> {}\n" + 
		"	                                ^^\n" + 
		"Bound mismatch: The type T1 is not a valid substitute for the bounded parameter <T2 extends Number> of the type B<T2>\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 4)\n" + 
		"	class X<T1, T2> extends C<A<A<B<T1>>>, A<B<T2>>> {}\n" + 
		"	                                           ^^\n" + 
		"Bound mismatch: The type T2 is not a valid substitute for the bounded parameter <T2 extends Number> of the type B<T2>\n" + 
		"----------\n" + 
		"3. ERROR in X.java (at line 5)\n" + 
		"	class Y<T> extends A<A<B<T>>> {}\n" + 
		"	                         ^\n" + 
		"Bound mismatch: The type T is not a valid substitute for the bounded parameter <T2 extends Number> of the type B<T2>\n" + 
		"----------\n" + 
		"4. ERROR in X.java (at line 6)\n" + 
		"	class Z<T> extends C<B<T>, A<B<T>>> {}\n" + 
		"	                       ^\n" + 
		"Bound mismatch: The type T is not a valid substitute for the bounded parameter <T2 extends Number> of the type B<T2>\n" + 
		"----------\n" + 
		"5. ERROR in X.java (at line 6)\n" + 
		"	class Z<T> extends C<B<T>, A<B<T>>> {}\n" + 
		"	                               ^\n" + 
		"Bound mismatch: The type T is not a valid substitute for the bounded parameter <T2 extends Number> of the type B<T2>\n" + 
		"----------\n"
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=273751
public void test1452() {
	this.runNegativeTest(
		new String[] {
			"A.java",
			"class A<T> {}\n" +
			"class B extends A<B.Secret> {\n" +
			"	private class Secret {};\n" +
			"	B.Secret s;\n" +
			"	A<B.Secret> a;\n" +
			"}\n" +
			"class C extends B.Secret {}\n" +
			"class D {\n" +
			"	class M { private class Secret {}; }\n" +
			"	class N extends A<M.Secret> {}\n" +
			"}\n" +
			"class E {\n" +
			"	class M extends A<M.Secret> {\n" +
			"	  private class Secret {};\n" +
			"	}\n" +
			"}"
		},
		"----------\n" + 
		"1. ERROR in A.java (at line 2)\n" + 
		"	class B extends A<B.Secret> {\n" + 
		"	                  ^^^^^^^^\n" + 
		"The type B.Secret is not visible\n" + 
		"----------\n" + 
		"2. ERROR in A.java (at line 7)\n" + 
		"	class C extends B.Secret {}\n" + 
		"	                ^^^^^^^^\n" + 
		"The type B.Secret is not visible\n" + 
		"----------\n"
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=278305
public void test1453() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"class X {\n" +
			"	I<?> i = new I<?>() {};\n" +
			"}\n" +
			"class Y implements I<?> {}\n" +
			"interface I<T> {}"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 2)\n" + 
		"	I<?> i = new I<?>() {};\n" + 
		"	             ^\n" + 
		"The type new I(){} cannot extend or implement I<?>. A supertype may not specify any wildcard\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 4)\n" + 
		"	class Y implements I<?> {}\n" + 
		"	                   ^\n" + 
		"The type Y cannot extend or implement I<?>. A supertype may not specify any wildcard\n" + 
		"----------\n"
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=289538
public void test1454() {
	this.runConformTest(
		new String[] {
			"X.java",
			"public class X<T> {\n" +
			"	Node first;\n" +
			"	public void add(T e) {\n" +
			"		first = new Node(e);\n" +
			"		System.out.print(true);\n" +
			"	}\n" +
			"	private class Node {\n" +
			"		private Node next;\n" +
			"		private Node(T d) {}\n" +
			"		private Node(T d, Node n) { next = n; }\n" +
			"	}\n" +
			"	public static void main(String[] args) {\n" +
			"		X<String> x = new X<String>();\n" +
			"		x.add(\"\");\n" +
			"	}\n" +
			"}"
		},
   		"true"
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=287607
public void test1455() {
	this.runNegativeTest(
		new String[] {
			"Outer.java",
			"public class Outer<E> {\n" +
			"  Inner inner;\n" +
			"  class Inner {\n" +
			"    E e;\n" +
			"    E getOtherElement(Object other) {\n" +
			"      if (!(other instanceof Outer<?>.Inner))\n" +
			"       throw new IllegalArgumentException(String.valueOf(other));\n" +
			"      Inner that = (Inner) other;\n" +
			"      return that.e;\n" +
			"    }\n" +
			"  }\n" +
			"  public static void main(String[] args) {\n" +
			"    Outer<String> s = new Outer<String>();\n" +
			"    s.inner = s.new Inner();\n" +
 			"   s.inner.e = \"hello\";\n" +
 			"   Outer<Integer> i = new Outer<Integer>();\n" +
 			"   i.inner = i.new Inner();\n" +
 			"   i.inner.e = 1234;\n" +
 			"   s.inner.getOtherElement(i.inner);\n" +
 			" }\n" +
			"}"
		},
		"----------\n" + 
		"1. WARNING in Outer.java (at line 8)\n" + 
		"	Inner that = (Inner) other;\n" + 
		"	             ^^^^^^^^^^^^^\n" + 
		"Type safety: Unchecked cast from Object to Outer<E>.Inner\n" + 
		"----------\n"
	);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=292428
public void test1456() {
	this.runConformTest(
		new String[] {
			"X.java",
			"import java.util.ArrayList;\n" + 
			"\n" + 
			"public class X<K,V> {\n" + 
			"	interface E<V> {}\n" + 
			"	class S implements E<V> {\n" + 
			"		V value;\n" + 
			"	}\n" + 
			"	class M implements E<V>  {\n" + 
			"		ArrayList<V> list = new ArrayList<V>();\n" + 
			"		M(E<V> se) {\n" + 
			"			list.add(((S)se).value);\n" + 
			"		}\n" + 
			"	}\n" + 
			"}"
		},
		""
	);
}
// Test to verify that partial types in a parameterized qualified reference are
// demarcated correctly while annotating an arity problem in case of wrong number of arguments.
// Related to https://bugs.eclipse.org/bugs/show_bug.cgi?id=292510
public void test1457() {
	this.runNegativeTest(
		new String[] {
			"test/X.java",
			"package test;\n" +
				"// Valid Parameterized Type Declaration\n" +
				"public class X<A1, A2> {\n" +
				"	public class Y<A3,A4,A5> {\n" +
				"		public class Z<A6> {\n" +
				"		}\n" +
				"	}\n" +
				"}\n" +
				"// Invalid Valid Type Syntax (too many parameters)\n" +
				"class Y {\n" +
				"	X<String, Number>.Y<String,Integer>.Z<String> x;\n" +
				"}\n"
		},
		"----------\n" +
		"1. ERROR in test\\X.java (at line 11)\n" +
		"	X<String, Number>.Y<String,Integer>.Z<String> x;\n" +
		"	^^^^^^^^^^^^^^^^^^^\n" +
		"Incorrect number of arguments for type X<String,Number>.Y; it cannot be parameterized with arguments <String, Integer>\n" +
		"----------\n"
	);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=285002 (visibility error for package private method)
public void test1458() {
	this.runNegativeTest(
			new String[] {
					"CompilerBug.java",
					"@SuppressWarnings(\"deprecation\")\n" +
					"public class CompilerBug {\n" +
					"	public <T> T newInstance( Class<T> c ) throws InstantiationException, IllegalAccessException {\n" +
					"	      return c.newInstance();\n" +
					"		   }\n" +
					"		   protected void protectedMethod() {}\n" +
					"		   void packagePrivateMethod() {}\n" +
					"		   private void privateMethod() {}\n" +
					"		   private int privateInt = 0;\n" +
					"		   int packagePrivateInt = 0;\n" +
					"		   protected int protectedInt = 0;\n" +
					"		   private void isThisBuggy() throws InstantiationException, IllegalAccessException {\n" +
					"		      CompilerBug c = getClass().newInstance();\n" +
					"		      c.privateMethod();\n" +
					"		      c.packagePrivateMethod();\n" +
					"		      c.protectedMethod();\n" +
					"		      getClass().newInstance().packagePrivateMethod();\n" +
					"		      getClass().newInstance().privateMethod();\n" +
					"		      getClass().newInstance().protectedMethod();\n" +
					"		      getClass().newInstance().privateInt = 10;\n" +
					"		      getClass().newInstance().packagePrivateInt = 10;\n" +
					"		      getClass().newInstance().protectedInt = 10;\n" +
					"             Zork z;\n" +
					"		   }\n" +
					"	}\n",
			},
			this.complianceLevel <= ClassFileConstants.JDK1_6 ?
			"----------\n" + 
			"1. ERROR in CompilerBug.java (at line 23)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n" :
				
			// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=334622
			"----------\n" + 
			"1. ERROR in CompilerBug.java (at line 18)\n" + 
			"	getClass().newInstance().privateMethod();\n" + 
			"	                         ^^^^^^^^^^^^^\n" + 
			"The method privateMethod() from the type CompilerBug is not visible\n" + 
			"----------\n" + 
			"2. ERROR in CompilerBug.java (at line 20)\n" + 
			"	getClass().newInstance().privateInt = 10;\n" + 
			"	                         ^^^^^^^^^^\n" + 
			"The field CompilerBug.privateInt is not visible\n" + 
			"----------\n" + 
			"3. ERROR in CompilerBug.java (at line 23)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n"
			);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=295698
public void test1459() {
	this.runConformTest(
		new String[] {
			"B.java",
			"import java.util.Collection;\n" + 
			"public class B extends X<Collection<?>> {\n" + 
			"	public B(Collection<X<?>> c, I i) {\n" + 
			"		super(c, i);\n" + 
			"	}\n" + 
			"}",
			"I.java",
			"public interface I<T>{}",
			"X.java",
			"public class X<T> {\n" + 
			"	public <V extends T> X(V v, I<T> i, Object... o) {}\n" + 
			"}"
		},
		""); // no specific success output string
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=277643
// SHOULD FAIL AT 1.8 (18.2.3): The method get(Class<W>, T) in the type Test is not applicable for the arguments (Class<Test.W_Description>, Object)
// FIXME: javac rejects (correctly? how?), see http://mail.openjdk.java.net/pipermail/lambda-spec-experts/2013-December/000443.html
public void test277643() {
	this.runNegativeTest(
		false /* skipJavac */,
		this.complianceLevel < ClassFileConstants.JDK1_8 ? null :
		JavacTestOptions.EclipseHasABug.EclipseBug428061,
		new String[] {
	    "Test.java",
	    "public class Test {\n" +
	    "public final void addShortDescription(Object object, StringBuffer buf) {\n" +
	    "	try {\n" +
	    "		W_Description wdescription = get(W_Description.class, object);\n" +
	    "	} catch (Exception e) {\n" +
	    "	}\n" +
	    "}\n" +
	    "public abstract class W_Description<WRAPPED> extends WrapperLogic<WRAPPED> {}\n" +
	    "public <T, W extends WrapperLogic<? super T>> W get(Class<W> wrapperClass, T entity) {\n" +
	    "	return getLogicFactory().get(wrapperClass, entity);\n" +
	    "}\n" +
	    "private LogicFactory logicFactory;\n" +
	    "public final LogicFactory getLogicFactory() {\n" +
	    "	return logicFactory;\n" +
	    "}\n" +
	    "public interface LogicFactory {\n" +
	    "	<LOGIC extends Logic> LOGIC get(Class<LOGIC> logicClass);\n" +
	    "	<WRAPPED, WRAPPER_LOGIC extends WrapperLogic<? super WRAPPED>> WRAPPER_LOGIC get(Class<WRAPPER_LOGIC> wrapperLogicClass, WRAPPED entityToWrap);\n" +
	    "}\n" +
	    "public abstract class WrapperLogic<WRAPPED> extends AbstractLogic implements Wrapper<WRAPPED> {}\n" +
	    "public abstract class AbstractLogic {}\n" +
	    "public interface Wrapper<WRAPPED> {\n" +
	    "	WRAPPED getWrapped();\n" +
	    "}\n" +
	    "public abstract class Logic extends AbstractLogic {}\n" +
	    "}"
		},
		"----------\n" + 
		"1. WARNING in Test.java (at line 4)\n" + 
		"	W_Description wdescription = get(W_Description.class, object);\n" + 
		"	^^^^^^^^^^^^^\n" + 
		"Test.W_Description is a raw type. References to generic type Test.W_Description<WRAPPED> should be parameterized\n" + 
		"----------\n" + 
		"2. WARNING in Test.java (at line 4)\n" + 
		"	W_Description wdescription = get(W_Description.class, object);\n" + 
		"	                             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: Unchecked invocation get(Class<Test.W_Description>, Object) of the generic method get(Class<W>, T) of type Test\n" + 
		"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=280054
// SHOULD FAIL AT 1.8 (18.2.3): The method get(Class<V>, Class<S>) in the type X.L is not applicable for the arguments (Class<V>, Class<X.B>)
public void test280054() {
	this.runNegativeTest(
		new String[] {
	    "X.java",
	    "public class X {\n" +
	    "static class A<V> {\n" +
	    "L l;\n" +
	    "public Class<V> vtype() {\n" +
	    "   return null;\n" +
	    "}\n" +
	    "public A<V> method1() {\n" +
	    "   return l.get(vtype(), B.class);\n" +
	    "}\n" +
	    "}\n" +
	    "static class L {\n" +
	    "public <V,S extends A<V>> S get(Class<V> vtype, Class<S> stype) {\n" +
	    "   return null;\n" +
	    "}\n" +
	    "}\n" +
	    "static class B<V> extends A<V> {\n" +
	    "public B<V> method2() {\n" +
	    "   return l.get(vtype(), B.class);\n" +
	    "}\n" +
	    "}\n" +
	    "}\n"
		},
		"----------\n" + 
		"1. WARNING in X.java (at line 8)\n" + 
		"	return l.get(vtype(), B.class);\n" + 
		"	       ^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: Unchecked invocation get(Class<V>, Class<X.B>) of the generic method get(Class<V>, Class<S>) of type X.L\n" + 
		"----------\n" + 
		"2. WARNING in X.java (at line 8)\n" + 
		"	return l.get(vtype(), B.class);\n" + 
		"	       ^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: The expression of type X.B needs unchecked conversion to conform to X.A<V>\n" + 
		"----------\n" + 
		"3. WARNING in X.java (at line 18)\n" + 
		"	return l.get(vtype(), B.class);\n" + 
		"	       ^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: Unchecked invocation get(Class<V>, Class<X.B>) of the generic method get(Class<V>, Class<S>) of type X.L\n" + 
		"----------\n" + 
		"4. WARNING in X.java (at line 18)\n" + 
		"	return l.get(vtype(), B.class);\n" + 
		"	       ^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: The expression of type X.B needs unchecked conversion to conform to X.B<V>\n" + 
		"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=283306
// SHOULD FAIL AT 1.8 (18.2.3): The method get(Class<V>, Class<S>) in the type X.L is not applicable for the arguments (Class<V>, Class<X.B>)
// FIXME: javac rejects (correctly? how?), see http://mail.openjdk.java.net/pipermail/lambda-spec-experts/2013-December/000443.html
public void test283306() {
	this.runNegativeTest(
		false /* skipJavac */,
		this.complianceLevel < ClassFileConstants.JDK1_8 ? null :
		JavacTestOptions.EclipseHasABug.EclipseBug428061,
		new String[] {
	    "Test.java",
	    "public class Test {\n" +
	    "    public WWorkflow<? extends Workflow> getMainWorkflow(){\n" +
	    "        return get(WWorkflow.class, null);\n" +
	    "    }\n" +
	    "    public <T, W extends WrapperLogic<? super T>> W get(Class<W> wrapperClass, T entity) {\n" +
	    "        return null;\n" +
	    "    }\n" +
	    "}\n" +
	    "class Workflow {}\n" +
	    "class WWorkflow<T extends Workflow> extends WrapperLogic<T> {}\n" +
	    "abstract class WrapperLogic<WRAPPED> {}\n"
		},
		"----------\n" + 
		"1. WARNING in Test.java (at line 3)\n" + 
		"	return get(WWorkflow.class, null);\n" + 
		"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: Unchecked invocation get(Class<WWorkflow>, null) of the generic method get(Class<W>, T) of type Test\n" + 
		"----------\n" + 
		"2. WARNING in Test.java (at line 3)\n" + 
		"	return get(WWorkflow.class, null);\n" + 
		"	       ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: The expression of type WWorkflow needs unchecked conversion to conform to WWorkflow<? extends Workflow>\n" + 
		"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=294724
// Test extracted from bug submission code by kabir.khan@jboss.com (Kabir Khan)
// SHOULD FAIL AT 1.8 (18.2.3): The method cloneCollection(T, Class<? extends T>, Class<U>) in the type SimpleExample is not applicable for the arguments (Set<SimpleExample.Data>, Class<HashSet>, Class<SimpleExample.Data>)
public void test294724() {
	this.runNegativeTest(
		new String[] {
	    "SimpleExample.java",
	    "import java.util.Collection;\n" +
	    "import java.util.HashSet;\n" +
	    "import java.util.Set;\n" +
	    "public class SimpleExample {\n" +
	    "  Set<Data> data;\n" +
	    "  public void setData(Set<Data> data) {\n" +
	    "     this.data = data;\n" +
	    "  }\n" +
	    "  public void copy(SimpleExample clone) {\n" +
	    "     clone.setData(cloneCollection(data, HashSet.class, Data.class));\n" +
	    "  }\n" +
	    "	public static <U extends Interface, T extends Collection<U>> T cloneCollection(T collection, Class<? extends T> expectedClass, Class<U> componentType) {\n" +
	    "   	return null;\n" +
	    "   }\n" +
	    "  private interface Interface {}\n" +
	    "  private class Data implements Interface {}\n" +
	    "}"
	    },
		"----------\n" + 
		"1. WARNING in SimpleExample.java (at line 10)\n" + 
		"	clone.setData(cloneCollection(data, HashSet.class, Data.class));\n" + 
		"	              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: Unchecked invocation cloneCollection(Set<SimpleExample.Data>, Class<HashSet>, Class<SimpleExample.Data>) of the generic method cloneCollection(T, Class<? extends T>, Class<U>) of type SimpleExample\n" + 
		"----------\n" + 
		"2. WARNING in SimpleExample.java (at line 10)\n" + 
		"	clone.setData(cloneCollection(data, HashSet.class, Data.class));\n" + 
		"	              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: The expression of type Set needs unchecked conversion to conform to Set<SimpleExample.Data>\n" + 
		"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=268798
// SHOULD FAIL AT 1.8 (18.2.3): The method min(Collection<? extends T>) in the type Collections is not applicable for the arguments (List<GenericDemo.A>)
public void test268798() {
	this.runNegativeTest(
		new String[] {
	    "GenericDemo.java",
	    "import java.util.Collections;\n" +
	    "import java.util.List;\n" +
	    "public class GenericDemo {\n" +
	    "  static class A implements Comparable {\n" +
	    "    public int compareTo(Object o) {\n" +
	    "      return 0;\n" +
	    "    }\n" +
	    "  }\n" +
	    "  void someCode(List<A> list) {\n" +
	    "    A min = Collections.min(list); \n" +
	    "  }\n" +
	    "}\n"
	    },
		"----------\n" + 
		"1. WARNING in GenericDemo.java (at line 4)\n" + 
		"	static class A implements Comparable {\n" + 
		"	                          ^^^^^^^^^^\n" + 
		"Comparable is a raw type. References to generic type Comparable<T> should be parameterized\n" + 
		"----------\n" + 
		"2. WARNING in GenericDemo.java (at line 10)\n" + 
		"	A min = Collections.min(list); \n" + 
		"	        ^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: Unchecked invocation min(List<GenericDemo.A>) of the generic method min(Collection<? extends T>) of type Collections\n" + 
		"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=268798
// SHOULD FAIL AT 1.8 (18.2.3): Type mismatch: cannot convert from Bug268798.SomeInterface<? super Bug268798.SomeInterface<T>> to Bug268798.A
public void test268798a() {
	this.runNegativeTest(
		new String[] {
	    "Bug268798.java",
	    "public class Bug268798 {\n" +
	    "  interface SomeInterface<T> {\n" +
	    "  }\n" +
	    "  class A implements SomeInterface {\n" +
	    "  }\n" +
	    "  <T extends SomeInterface<? super T>> T someMethod() {\n" +
	    "    return null;\n" +
	    "  }\n" +
	    "  void someCode() {\n" +
	    "    A a = someMethod();\n" +
	    "  }\n" +
	    "}\n"
	    },
		"----------\n" + 
		"1. WARNING in Bug268798.java (at line 4)\n" + 
		"	class A implements SomeInterface {\n" + 
		"	                   ^^^^^^^^^^^^^\n" + 
		"Bug268798.SomeInterface is a raw type. References to generic type Bug268798.SomeInterface<T> should be parameterized\n" + 
		"----------\n" + 
		"2. WARNING in Bug268798.java (at line 10)\n" + 
		"	A a = someMethod();\n" + 
		"	      ^^^^^^^^^^^^\n" + 
		"Type safety: Unchecked invocation someMethod() of the generic method someMethod() of type Bug268798\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=307885
public void test1460() {
	this.runNegativeTest(
		new String[] {
			"Test.java",
			"class Test<A> {\n" + 
			"    interface MyInt<K> {\n" + 
			"        K getKey();\n" + 
			"    }\n" + 
			"    class MyEntry implements MyInt<A> {\n" + 
			"        public A getKey() { return null; }\n" + 
			"        @Override\n" + 
			"        public boolean equals(Object o) {\n" + 
			"            if(!(o instanceof MyEntry))\n" + 
			"                return false;\n" + 
			"            return true;\n" + 
			"        }\n" + 
			"    }\n" + 
			"}"
		},
		"----------\n" + 
		"1. ERROR in Test.java (at line 9)\n" + 
		"	if(!(o instanceof MyEntry))\n" + 
		"	    ^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Cannot perform instanceof check against parameterized type Test<A>.MyEntry. Use the form Test.MyEntry instead since further generic type information will be erased at runtime\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=306464
public void test1461() {
	this.runNegativeTest(
		new String[] {
			"JoinImpl.java",
			"import javax.persistence.criteria.Expression;\n" + 
			"import javax.persistence.criteria.Fetch;\n" + 
			"import javax.persistence.criteria.From;\n" + 
			"import javax.persistence.criteria.Join;\n" + 
			"import javax.persistence.criteria.JoinType;\n" + 
			"import javax.persistence.criteria.Path;\n" + 
			"import javax.persistence.metamodel.Attribute;\n" + 
			"import javax.persistence.metamodel.Bindable;\n" + 
			"import javax.persistence.metamodel.ManagedType;\n" + 
			"import javax.persistence.metamodel.Metamodel;\n" + 
			"public class JoinImpl<Z, X> extends FromImpl<Z, X> implements Join<Z, X>, Fetch<Z, X> {\n" + 
			"}",
			"FromImpl.java",
			"import java.util.ArrayList;\n" + 
			"import java.util.HashSet;\n" + 
			"import java.util.List;\n" + 
			"import java.util.Set;\n" + 
			"import java.util.Stack;\n" + 
			"\n" + 
			"import javax.persistence.criteria.CollectionJoin;\n" + 
			"import javax.persistence.criteria.Expression;\n" + 
			"import javax.persistence.criteria.Fetch;\n" + 
			"import javax.persistence.criteria.From;\n" + 
			"import javax.persistence.criteria.Join;\n" + 
			"import javax.persistence.criteria.JoinType;\n" + 
			"import javax.persistence.criteria.ListJoin;\n" + 
			"import javax.persistence.criteria.MapJoin;\n" + 
			"import javax.persistence.criteria.Path;\n" + 
			"import javax.persistence.criteria.SetJoin;\n" + 
			"import javax.persistence.metamodel.Attribute;\n" + 
			"import javax.persistence.metamodel.Bindable;\n" + 
			"import javax.persistence.metamodel.CollectionAttribute;\n" + 
			"import javax.persistence.metamodel.ListAttribute;\n" + 
			"import javax.persistence.metamodel.ManagedType;\n" + 
			"import javax.persistence.metamodel.MapAttribute;\n" + 
			"import javax.persistence.metamodel.Metamodel;\n" + 
			"import javax.persistence.metamodel.PluralAttribute;\n" + 
			"import javax.persistence.metamodel.SingularAttribute;\n" + 
			"import javax.persistence.metamodel.Attribute.PersistentAttributeType;\n" + 
			"import javax.persistence.metamodel.PluralAttribute.CollectionType;\n" + 
			"import javax.persistence.metamodel.Type.PersistenceType;\n" + 
			"\n" + 
			"import org.eclipse.persistence.internal.helper.ClassConstants;\n" + 
			"import org.eclipse.persistence.internal.localization.ExceptionLocalization;\n" + 
			"\n" + 
			"public class FromImpl<Z, X>  extends PathImpl<X> implements javax.persistence.criteria.From<Z, X> {\n" + 
			"\n" + 
			"    protected Set<Join<X, ?>> joins;\n" + 
			"    \n" + 
			"    public Set<Join<X, ?>> getJoins() {\n" + 
			"        return joins;\n" + 
			"    }\n" + 
			"\n" + 
			"    public void findJoins(AbstractQueryImpl query){\n" + 
			"        Stack stack = new Stack();\n" + 
			"        stack.push(this);\n" + 
			"        while(!stack.isEmpty()){\n" + 
			"            FromImpl currentJoin = (FromImpl) stack.pop();\n" + 
			"            stack.addAll(currentJoin.getJoins());\n" + 
			"            if (currentJoin.isLeaf){\n" + 
			"                    query.addJoin(currentJoin);\n" + 
			"                }\n" + 
			"        }\n" + 
			"    }\n" + 
			"}"
		},
		"----------\n" + 
		"1. ERROR in JoinImpl.java (at line 1)\n" + 
		"	import javax.persistence.criteria.Expression;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"2. ERROR in JoinImpl.java (at line 2)\n" + 
		"	import javax.persistence.criteria.Fetch;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"3. ERROR in JoinImpl.java (at line 3)\n" + 
		"	import javax.persistence.criteria.From;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"4. ERROR in JoinImpl.java (at line 4)\n" + 
		"	import javax.persistence.criteria.Join;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"5. ERROR in JoinImpl.java (at line 5)\n" + 
		"	import javax.persistence.criteria.JoinType;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"6. ERROR in JoinImpl.java (at line 6)\n" + 
		"	import javax.persistence.criteria.Path;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"7. ERROR in JoinImpl.java (at line 7)\n" + 
		"	import javax.persistence.metamodel.Attribute;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"8. ERROR in JoinImpl.java (at line 8)\n" + 
		"	import javax.persistence.metamodel.Bindable;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"9. ERROR in JoinImpl.java (at line 9)\n" + 
		"	import javax.persistence.metamodel.ManagedType;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"10. ERROR in JoinImpl.java (at line 10)\n" + 
		"	import javax.persistence.metamodel.Metamodel;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"11. ERROR in JoinImpl.java (at line 11)\n" + 
		"	public class JoinImpl<Z, X> extends FromImpl<Z, X> implements Join<Z, X>, Fetch<Z, X> {\n" + 
		"	                                                              ^^^^\n" + 
		"Join cannot be resolved to a type\n" + 
		"----------\n" + 
		"12. ERROR in JoinImpl.java (at line 11)\n" + 
		"	public class JoinImpl<Z, X> extends FromImpl<Z, X> implements Join<Z, X>, Fetch<Z, X> {\n" + 
		"	                                                                          ^^^^^\n" + 
		"Fetch cannot be resolved to a type\n" + 
		"----------\n" + 
		"----------\n" + 
		"1. ERROR in FromImpl.java (at line 7)\n" + 
		"	import javax.persistence.criteria.CollectionJoin;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"2. ERROR in FromImpl.java (at line 8)\n" + 
		"	import javax.persistence.criteria.Expression;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"3. ERROR in FromImpl.java (at line 9)\n" + 
		"	import javax.persistence.criteria.Fetch;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"4. ERROR in FromImpl.java (at line 10)\n" + 
		"	import javax.persistence.criteria.From;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"5. ERROR in FromImpl.java (at line 11)\n" + 
		"	import javax.persistence.criteria.Join;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"6. ERROR in FromImpl.java (at line 12)\n" + 
		"	import javax.persistence.criteria.JoinType;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"7. ERROR in FromImpl.java (at line 13)\n" + 
		"	import javax.persistence.criteria.ListJoin;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"8. ERROR in FromImpl.java (at line 14)\n" + 
		"	import javax.persistence.criteria.MapJoin;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"9. ERROR in FromImpl.java (at line 15)\n" + 
		"	import javax.persistence.criteria.Path;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"10. ERROR in FromImpl.java (at line 16)\n" + 
		"	import javax.persistence.criteria.SetJoin;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"11. ERROR in FromImpl.java (at line 17)\n" + 
		"	import javax.persistence.metamodel.Attribute;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"12. ERROR in FromImpl.java (at line 18)\n" + 
		"	import javax.persistence.metamodel.Bindable;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"13. ERROR in FromImpl.java (at line 19)\n" + 
		"	import javax.persistence.metamodel.CollectionAttribute;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"14. ERROR in FromImpl.java (at line 20)\n" + 
		"	import javax.persistence.metamodel.ListAttribute;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"15. ERROR in FromImpl.java (at line 21)\n" + 
		"	import javax.persistence.metamodel.ManagedType;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"16. ERROR in FromImpl.java (at line 22)\n" + 
		"	import javax.persistence.metamodel.MapAttribute;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"17. ERROR in FromImpl.java (at line 23)\n" + 
		"	import javax.persistence.metamodel.Metamodel;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"18. ERROR in FromImpl.java (at line 24)\n" + 
		"	import javax.persistence.metamodel.PluralAttribute;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"19. ERROR in FromImpl.java (at line 25)\n" + 
		"	import javax.persistence.metamodel.SingularAttribute;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"20. ERROR in FromImpl.java (at line 26)\n" + 
		"	import javax.persistence.metamodel.Attribute.PersistentAttributeType;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"21. ERROR in FromImpl.java (at line 27)\n" + 
		"	import javax.persistence.metamodel.PluralAttribute.CollectionType;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"22. ERROR in FromImpl.java (at line 28)\n" + 
		"	import javax.persistence.metamodel.Type.PersistenceType;\n" + 
		"	       ^^^^^^^^^^^^^^^^^\n" + 
		"The import javax.persistence cannot be resolved\n" + 
		"----------\n" + 
		"23. ERROR in FromImpl.java (at line 30)\n" + 
		"	import org.eclipse.persistence.internal.helper.ClassConstants;\n" + 
		"	       ^^^^^^^^^^^\n" + 
		"The import org.eclipse cannot be resolved\n" + 
		"----------\n" + 
		"24. ERROR in FromImpl.java (at line 31)\n" + 
		"	import org.eclipse.persistence.internal.localization.ExceptionLocalization;\n" + 
		"	       ^^^^^^^^^^^\n" + 
		"The import org.eclipse cannot be resolved\n" + 
		"----------\n" + 
		"25. ERROR in FromImpl.java (at line 33)\n" + 
		"	public class FromImpl<Z, X>  extends PathImpl<X> implements javax.persistence.criteria.From<Z, X> {\n" + 
		"	                                     ^^^^^^^^\n" + 
		"PathImpl cannot be resolved to a type\n" + 
		"----------\n" + 
		"26. ERROR in FromImpl.java (at line 33)\n" + 
		"	public class FromImpl<Z, X>  extends PathImpl<X> implements javax.persistence.criteria.From<Z, X> {\n" + 
		"	                                                            ^^^^^^^^^^^^^^^^^\n" + 
		"javax.persistence cannot be resolved to a type\n" + 
		"----------\n" + 
		"27. ERROR in FromImpl.java (at line 35)\n" + 
		"	protected Set<Join<X, ?>> joins;\n" + 
		"	              ^^^^\n" + 
		"Join cannot be resolved to a type\n" + 
		"----------\n" + 
		"28. ERROR in FromImpl.java (at line 37)\n" + 
		"	public Set<Join<X, ?>> getJoins() {\n" + 
		"	           ^^^^\n" + 
		"Join cannot be resolved to a type\n" + 
		"----------\n" + 
		"29. ERROR in FromImpl.java (at line 38)\n" + 
		"	return joins;\n" + 
		"	       ^^^^^\n" + 
		"Join cannot be resolved to a type\n" + 
		"----------\n" + 
		"30. ERROR in FromImpl.java (at line 41)\n" + 
		"	public void findJoins(AbstractQueryImpl query){\n" + 
		"	                      ^^^^^^^^^^^^^^^^^\n" + 
		"AbstractQueryImpl cannot be resolved to a type\n" + 
		"----------\n" + 
		"31. WARNING in FromImpl.java (at line 42)\n" + 
		"	Stack stack = new Stack();\n" + 
		"	^^^^^\n" + 
		"Stack is a raw type. References to generic type Stack<E> should be parameterized\n" + 
		"----------\n" + 
		"32. WARNING in FromImpl.java (at line 42)\n" + 
		"	Stack stack = new Stack();\n" + 
		"	                  ^^^^^\n" + 
		"Stack is a raw type. References to generic type Stack<E> should be parameterized\n" + 
		"----------\n" + 
		"33. WARNING in FromImpl.java (at line 43)\n" + 
		"	stack.push(this);\n" + 
		"	^^^^^^^^^^^^^^^^\n" + 
		"Type safety: The method push(Object) belongs to the raw type Stack. References to generic type Stack<E> should be parameterized\n" + 
		"----------\n" + 
		"34. WARNING in FromImpl.java (at line 45)\n" + 
		"	FromImpl currentJoin = (FromImpl) stack.pop();\n" + 
		"	^^^^^^^^\n" + 
		"FromImpl is a raw type. References to generic type FromImpl<Z,X> should be parameterized\n" + 
		"----------\n" + 
		"35. WARNING in FromImpl.java (at line 45)\n" + 
		"	FromImpl currentJoin = (FromImpl) stack.pop();\n" + 
		"	                        ^^^^^^^^\n" + 
		"FromImpl is a raw type. References to generic type FromImpl<Z,X> should be parameterized\n" + 
		"----------\n" + 
		"36. WARNING in FromImpl.java (at line 46)\n" + 
		"	stack.addAll(currentJoin.getJoins());\n" + 
		"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
		"Type safety: The method addAll(Collection) belongs to the raw type Vector. References to generic type Vector<E> should be parameterized\n" + 
		"----------\n" + 
		"37. ERROR in FromImpl.java (at line 47)\n" + 
		"	if (currentJoin.isLeaf){\n" + 
		"	                ^^^^^^\n" + 
		"isLeaf cannot be resolved or is not a field\n" + 
		"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=316889
public void test1462() {
	this.runNegativeTest(
		new String[] {
			"AnotherClass.java",
			"public class AnotherClass<I extends IRecursiveInterface<? super I>> {}\n" +  
			"class ImplementingClass implements IRecursiveInterface<IReferencedInterface>, IReferencedInterface {\n" +
			"    private AnotherClass<IReferencedInterface> m_var;\n" +
			"    public void setAnother(final AnotherClass<? extends IReferencedInterface> a) {\n" +
			"	    m_var = a;\n" +
			"    }\n" +
			"}\n" +
			"interface IRecursiveInterface<I extends IRecursiveInterface<? super I>> {\n" +
			"	void setAnother(final AnotherClass<? extends I> a);\n" +
			"}\n" +
			"interface IReferencedInterface extends IRecursiveInterface<IReferencedInterface> {}\n"
		},
		"----------\n" + 
		"1. ERROR in AnotherClass.java (at line 5)\n" + 
		"	m_var = a;\n" + 
		"	        ^\n" + 
		"Type mismatch: cannot convert from AnotherClass<capture#1-of ? extends IReferencedInterface> to AnotherClass<IReferencedInterface>\n" + 
		"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=314556
public void test1463() {
	this.runNegativeTest(
		new String[] {
			"BaseType.java",
            "public interface BaseType {\n" +
            "	   BaseType clone() throws CloneNotSupportedException;\n" +
            "}\n" +
            "interface SubType<T extends BaseType & java.io.Closeable> extends BaseType {\n" +
            "}\n"
		},
		"----------\n" + 
		"1. ERROR in BaseType.java (at line 4)\n" + 
		"	interface SubType<T extends BaseType & java.io.Closeable> extends BaseType {\n" + 
		"	                  ^\n" + 
		"The inherited method Object.clone() cannot hide the public abstract method in BaseType\n" + 
		"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=319603
public void test1464() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"import java.util.Collection;\n" +
			"import java.util.Set;\n" +
			"\n" +
			"public class X {\n" +
			"\n" +
			"	public <T> Collection<T> m(Collection<T> a) {\n" +
			"		return null;\n" +
			"	}\n" +
			"	public <T> Set<T> m(Set<T> a) {\n" +
			"			return m(a); \n" +
			"	}\n" +
			"   Zork z;\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 12)\n" + 
		"	Zork z;\n" + 
		"	^^^^\n" + 
		"Zork cannot be resolved to a type\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=320275
public void _test1465() {
	this.runConformTest(
			new String[] {
				"AbstractSubClass.java",
				"public abstract class AbstractSubClass extends AbstractClass {}",
			},
			new String[] {
					"AbstractClass.java",
					"public abstract class AbstractClass implements BaseInterface {}",
					"AbstractSubClass.java",
					"public abstract class AbstractSubClass extends AbstractClass {}",
					"BaseInterface.java",
					"public interface BaseInterface extends GenericInterface<ConcreteClass> {}",
					"ConcreteClass.java",
					"public class ConcreteClass extends AbstractSubClass {}",
					"GenericInterface.java",
					"public interface GenericInterface<T> {}",
			},
			"");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=320463
public void test1466() {
	this.runNegativeTest(
		new String[] {
			"Outer.java",
			"public class Outer<T> {\n"+
			"    class Cell {\n"+
			"        final T value;\n"+
			"        Cell(T value) {\n"+
			"            this.value = value;\n"+
			"        }\n"+
			"    }\n"+
			"    Class<Outer<T>.Cell> cellClass = Cell.class;\n"+
			"    {\n"+
			"    	this.cellClass = Cell.class;\n"+
			"    	this.cellClass = Outer.Cell.class;\n"+
			"    }\n"+
			"    public static void main(String[] args) {\n"+
			"        Outer<Integer>.Cell intCell = new Outer<Integer>().new Cell(314);\n"+
			"        Outer<String>.Cell strCell = new Outer<String>().cellClass.cast(intCell);\n"+
			"        String val = strCell.value; // ClassCastException\n"+
			"        System.out.println(val);\n"+
			"    }\n"+
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in Outer.java (at line 8)\n" + 
		"	Class<Outer<T>.Cell> cellClass = Cell.class;\n" + 
		"	                                 ^^^^^^^^^^\n" + 
		"Type mismatch: cannot convert from Class<Outer.Cell> to Class<Outer<T>.Cell>\n" + 
		"----------\n" + 
		"2. ERROR in Outer.java (at line 10)\n" + 
		"	this.cellClass = Cell.class;\n" + 
		"	                 ^^^^^^^^^^\n" + 
		"Type mismatch: cannot convert from Class<Outer.Cell> to Class<Outer<T>.Cell>\n" + 
		"----------\n" + 
		"3. ERROR in Outer.java (at line 11)\n" + 
		"	this.cellClass = Outer.Cell.class;\n" + 
		"	                 ^^^^^^^^^^^^^^^^\n" + 
		"Type mismatch: cannot convert from Class<Outer.Cell> to Class<Outer<T>.Cell>\n" + 
		"----------\n");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=312076
public void test1467() {
	this.runNegativeTest(
		new String[] {
			"X.java",
			"public class X<T>  { \n" +
			"    public abstract static class Base<S extends Base<S>> {\n" +
			"        public Base(Class<S> sClass) {\n" +
			"            Class<S> theClass = sClass;\n" +
			"            System.out.println(theClass);\n" +
			"            System.out.println(sClass);\n" +
			"        }\n" +
			"    }\n" +
			"    public class Arr extends Base<Arr> {\n" +
			"        public Arr() { \n" +
			"            super(Arr.class);\n" +
			"            System.out.println(Arr.class);\n" +
			"        }\n" +
			"    }\n" +
			"    public static void main(String[] args) {\n" +
			"        X<Integer> x = new X<Integer>();\n" +
			"        X<Integer>.Arr a = x.new Arr();\n" +
			"        System.out.println(a);\n" +
			"    }\n" +
			"}\n"
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 11)\n" + 
		"	super(Arr.class);\n" + 
		"	^^^^^^^^^^^^^^^^^\n" + 
		"The constructor X.Base<X<T>.Arr>(Class<X.Arr>) is undefined\n" + 
		"----------\n");
}
public void testBug401783() {
	if (this.complianceLevel >= ClassFileConstants.JDK1_8)
		runConformTest(
			new String[] {
				"X.java",
				"import java.util.*;\n" +
				"public class X {\n" +
				"	void foo() {\n" +
				"		Iterable<Iterable<Integer>> iterables = Arrays.asList(Arrays.asList(1,2,3,4),Arrays.asList(5,6,7));\n" +
				"	}\n" +
				"}\n"
			});
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=433989
public void testBug433989() {
	this.runConformTest(
		new String[] {
			"A.java",
			"class A<V> {\n" + 
			"    public static class Container {\n" + 
			"        public static class In<T> {\n" + 
			"            public static class Inner<U> {}\n" + 
			"        }\n" + 
			"        public static <X> void doit() {\n" + 
			"            new In.Inner<X>();\n" + 
			"        }\n" + 
			"    }\n" + 
			"}\n"
		});
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=433989
public void testBug433989a() {
	this.runNegativeTest(
		new String[] {
			"A.java",
			"class A<V> {\n" + 
			"	public static class Nested {\n" + 
			"		public class In<U> {\n" + 
			"			public class Inner<V> {}\n" + 
			"		}\n" + 
			"		public <X> void create() {\n" + 
			"			new In.Inner<X>();\n" + 
			"		}\n" + 
			"	}\n" + 
			"}"
		},
		"----------\n" + 
		"1. ERROR in A.java (at line 7)\n" + 
		"	new In.Inner<X>();\n" + 
		"	    ^^^^^^^^\n" + 
		"The member type A.Nested.In.Inner<X> must be qualified with a parameterized type, since it is not static\n" + 
		"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=433989
public void testBug433989b() {
	this.runNegativeTest(
		new String[] {
			"A.java",
			"class A<V> {\n" + 
			"	public class Nested {\n" + 
			"		public class In<U> {\n" + 
			"			public class Inner<W> {}\n" + 
			"		}\n" + 
			"		public <X> void create() {\n" + 
			"			new In.Inner<X>();\n" + 
			"		}\n" + 
			"	}\n" + 
			"}"
		},
		"----------\n" + 
		"1. ERROR in A.java (at line 7)\n" + 
		"	new In.Inner<X>();\n" + 
		"	    ^^\n" + 
		"The member type A<V>.Nested.In must be parameterized, since it is qualified with a parameterized type\n" + 
		"----------\n");
}

//https://bugs.eclipse.org/bugs/show_bug.cgi?id=469201
public void testBug469201_A(){
	this.runConformTest(
		new String[]{
			"T2.java",
			"import java.util.*;\n" + 
					"\n" + 
					"class Bar {  }\n" + 
					"\n" + 
					"class FooPrime extends Bar {\n" + 
					"      void bar(Bar bar) { }\n" + 
					"}\n" + 
					"\n" + 
					"class Foo extends FooPrime { }\n" + 
					"\n" + 
					"public class T2 {\n" + 
					"\n" + 
					"	public static void someMethod(List<? extends Foo> foos ) {\n" + 
					"		Bar bar = new Bar(); \n" + 
					"		foos.get(0).bar(bar);\n" + 
					"	}\n" + 
					"  public static void main(String... args) {\n" + 
					"      List<Foo> foos = new ArrayList<Foo>();\n" + 
					"      foos.add(new Foo());\n" + 
					"      someMethod(foos);\n" + 
					"  }\n" + 
					"}"
		});
}

public void testBug469201_B(){
	this.runNegativeTest(
		new String[]{
				"A.java",
				"package bug469201.p1;\n" + 
				"public class A {\n" + 
				"	void bar(Bar bar) { }\n" + 
				"}\n" + 
				"class Bar {}\n", 
				"D.java",
				"package bug469201.p1;\n" +
				"import java.util.ArrayList;\n" +
				"import java.util.List;\n" +
				"import bug469201.p2.B;\n" + 
				"public class D{\n" + 
				"	public static void main(String... args) {\n" + 
				"	      List<? extends B> foos = new ArrayList<B>();\n" + 
				"	      Bar bar = new Bar();\n" + 
				"	      foos.get(0).bar(bar);\n" + 
				"	}\n" + 
				"}",
				"B.java",
				"package bug469201.p2;\n" + 
				"import bug469201.p1.A;\n" + 
				"public class B extends A {}\n"
		},
		"----------\n" + 
		"1. ERROR in D.java (at line 9)\n" + 
		"	foos.get(0).bar(bar);\n" + 
		"	            ^^^\n" + 
		"The method bar(Bar) from the type A is not visible\n" + 
		"----------\n");
		}
public void testBug460491() {
	if (this.complianceLevel >= ClassFileConstants.JDK1_7) {
		Map customOptions = getCompilerOptions();
		customOptions.put(CompilerOptions.OPTION_ReportRedundantSpecificationOfTypeArguments, CompilerOptions.WARNING);
		this.runConformTest(
			new String[] {
				"A.java",
				"class A {\n" +
				"	private static final B.C c = new B.D<Void>();\n" +
				"}",
				"B.java",
				"class B<T> {\n" +
				"	public interface C {}\n" +
				"	public static class D<R> implements C {}\n" +
				"}"
			},
			customOptions);
	}
}
public void testBug492450_comment0() {
	if (this.complianceLevel >= ClassFileConstants.JDK1_6) {
		runConformTest(
			new String[] {
				"DocumentObject.java",
				"\n" + 
				"import java.util.ArrayList;\n" + 
				"\n" + 
				"interface IDocumentElementNode {\n" + 
				"	public ArrayList<?> getChildNodesList();\n" + 
				"}\n" + 
				"\n" + 
				"abstract class DocumentElementNode implements IDocumentElementNode {\n" + 
				"	@Override\n" + 
				"	public ArrayList<IDocumentElementNode> getChildNodesList() {\n" + 
				"		return null;\n" + 
				"	}\n" + 
				"}\n" + 
				"\n" + 
				"interface IDocumentObject extends IDocumentElementNode {\n" + 
				"	public ArrayList<?> getChildNodesList(Class<?>[] classes, boolean match);\n" + 
				"}\n" + 
				"\n" + 
				"public abstract class DocumentObject extends DocumentElementNode implements IDocumentObject {\n" + 
				"	@Override\n" + 
				"	public ArrayList<IDocumentElementNode> getChildNodesList(Class<?>[] classes, boolean match) {\n" + 
				"		return null;\n" + 
				"	}\n" + 
				"}\n"
			});
	}
}
public void testBug532653() {
	if (this.complianceLevel >= ClassFileConstants.JDK1_6) {
		runConformTest(
			new String[] {
				"Builder.java",
				"public interface Builder<T> {\n" + 
				"	T build();\n" + 
				"}\n", 
				"ConcreteBuilder.java",
				"public class ConcreteBuilder<B extends ConcreteBuilder<B>> implements Builder<String> {\n" + 
				"	private String s = \"\";\n" + 
				"	protected B b;\n" + 
				"	@Override\n" + 
				"	public String build() {\n" + 
				"		return s;\n" + 
				"	}\n" + 
				"	public B append(String s) {\n" + 
				"		this.s += s;\n" + 
				"		return b;\n" + 
				"	}\n" + 
				"	public static ConcreteBuilder<?> create() {\n" + 
				"		class ConcreteStringBuilder extends ConcreteBuilder<ConcreteStringBuilder> {\n" + 
				"			public ConcreteStringBuilder() {\n" + 
				"				b = this;\n" + 
				"			}\n" + 
				"		}\n" + 
				"		return new ConcreteStringBuilder();\n" + 
				"	}\n" + 
				"}",
				"ConcreteSubBuilder.java",
				"public class ConcreteSubBuilder<B extends ConcreteSubBuilder<B>> extends ConcreteBuilder<B>{\n" + 
				"	public B appendTwice(String s) {\n" + 
				"		return super.append(s).append(s);\n" + 
				"	}\n" + 
				"	public static ConcreteSubBuilder<?> create() {\n" + 
				"		class ConcreteSubStringBuilder extends ConcreteSubBuilder<ConcreteSubStringBuilder> {\n" + 
				"			public ConcreteSubStringBuilder() {\n" + 
				"				b = this;\n" + 
				"			}\n" + 
				"		}\n" + 
				"		return new ConcreteSubStringBuilder();\n" + 
				"	}\n" + 
				"}\n"
			});
	}
}
public void testBug541772() {
	runConformTest(
		new String[] {
			"bug541772Runtime/GeneratedMessage.java",
			"package bug541772Runtime;\n" +
			"\n" +
			"public class GeneratedMessage {\n" +
			"    public class Builder<T> {\n" +
			"    }\n" +
			"}\n" +
			"",
		},
		"",
		getCompilerOptions()
	);
	
	runConformTest(
	new String[] {
		"token/Token.java",
		"package token;\n" +
		"\n" +
		"public class Token {\n" +
		"  \n" +
		"  public Token() {\n" +
		"  }\n" +
		"\n" +
		"  public Token(TokenProto tokenPB) {\n" +
		"      tokenPB.hashCode();\n" +
		"  }\n" +
		"  public Token(String x) {\n" +
		"      x.hashCode();\n" +
		"  }\n" +
		"}\n" +
		"",
		"token/TokenProto.java",
		"package token;\n" +
		"\n" +
		"import bug541772Runtime.GeneratedMessage;\n" +
		"\n" +
		"public class TokenProto {\n" +
		"\n" +
		"    public TokenProto(GeneratedMessage.Builder<?> builder) {\n" +
		"        builder.hashCode();\n" +
		"    }\n" +
		"}\n" +
		"",
	},
	"",
	null /*classLibraries*/,
	false /*shouldFlushOutputDirectory*/,
	null /*vmArguments*/,
	getCompilerOptions(),
	null /*customRequestor*/);

	Util.flushDirectoryContent(new File(OUTPUT_DIR + File.separator + "bug541772Runtime"));

	runConformTest(
	new String[] {
		"pkg/Example.java",
		"package pkg;\n" +
		"\n" +
		"import token.Token;\n" +
		"\n" +
		"public abstract class Example {\n" +
		"	public static void setConnectorInfo() {\n" +
		"		new Token(\"\");\n" +
		"	}\n" +
		"}\n" +
		"",
	},
	"",
	null /*classLibraries*/,
	false /*shouldFlushOutputDirectory*/,
	null /*vmArguments*/,
	getCompilerOptions(),
	null /*customRequestor*/);
}
public void testBug541772_typeannotations() {
	if (this.complianceLevel < ClassFileConstants.JDK1_8) {
		return;
	}
	runConformTest(
		new String[] {
			"bug541772Runtime/GeneratedMessage.java",
			"package bug541772Runtime;\n" +
			"\n" +
			"public class GeneratedMessage {\n" +
			"    public class Builder<T> {\n" +
			"    }\n" +
			"}\n" +
			"",
		},
		"",
		getCompilerOptions()
	);
	
	runConformTest(
	new String[] {
		"token/Ann.java",
		"package token;\n" +
		"import java.lang.annotation.*;\n" +
		"@Target(ElementType.TYPE_USE)\n" +
		"@Retention(RetentionPolicy.CLASS)\n" +
		"@interface Ann {}\n",
		"token/Token.java",
		"package token;\n" +
		"\n" +
		"public class Token {\n" +
		"  \n" +
		"  public Token() {\n" +
		"  }\n" +
		"\n" +
		"  public Token(TokenProto tokenPB) {\n" +
		"      tokenPB.hashCode();\n" +
		"  }\n" +
		"  public Token(String x) {\n" +
		"      x.hashCode();\n" +
		"  }\n" +
		"}\n" +
		"",
		"token/TokenProto.java",
		"package token;\n" +
		"\n" +
		"import bug541772Runtime.GeneratedMessage;\n" +
		"\n" +
		"public class TokenProto {\n" +
		"\n" +
		"    public TokenProto(GeneratedMessage.@Ann Builder<?> builder) {\n" +
		"        builder.hashCode();\n" +
		"    }\n" +
		"}\n" +
		"",
	},
	"",
	null /*classLibraries*/,
	false /*shouldFlushOutputDirectory*/,
	null /*vmArguments*/,
	getCompilerOptions(),
	null /*customRequestor*/);

	Util.flushDirectoryContent(new File(OUTPUT_DIR + File.separator + "bug541772Runtime"));

	Map compilerOptions = getCompilerOptions();
	compilerOptions.put(JavaCore.COMPILER_ANNOTATION_NULL_ANALYSIS, JavaCore.ENABLED);
	runConformTest(
	new String[] {
		"pkg/Example.java",
		"package pkg;\n" +
		"\n" +
		"import token.Token;\n" +
		"\n" +
		"public abstract class Example {\n" +
		"	public static void setConnectorInfo() {\n" +
		"		new Token(\"\");\n" +
		"	}\n" +
		"}\n" +
		"",
	},
	"",
	null /*classLibraries*/,
	false /*shouldFlushOutputDirectory*/,
	null /*vmArguments*/,
	compilerOptions,
	null /*customRequestor*/);
}
/**
 * This test targets the optimization for parameterized dependencies in {@code BoundSet.combineSameSameWithProperType(...)}.
 */
public void testBug543480BasedOnTest2FromComment4ToSameSameOptimization() {
	if (this.complianceLevel >= ClassFileConstants.JDK1_8) {
		final List<Duration> durationsFor2TypeParameters = compileTimesAfterWarmup(() -> runConformTest(
			new String[] {
				"Test2_2.java",
				"public class Test2_2 {\n" + 
				"	void test() {\n" + 
				"		m(s(\n" + 
				"			f(1),\n" + 
				"			f(2)\n" + 
				"		));\n" + 
				"	}\n" + 
				"\n" + 
				"	static <R> R m(S<R> s) { return null; }\n" + 
				"    static <T> F<T> f(T t) { return null; }\n" + 
				"	static <T1> S<R1<T1>> s(F<T1> t1) { return null; }\n" + 
				"	static <T1, T2> S<R2<T1, T2>> s(F<T1> t1, F<T2> t2) { return null; }\n" + 
				"}\n" + 
				"interface F<T> {}\n" + 
				"interface S<R> {}\n" + 
				"interface R1<T1> {}\n" + 
				"interface R2<T1, T2> {}\n"
			}));
		final List<Duration> durationsFor11TypeParameters = compileTimesAfterWarmup(() -> runConformTest(
				new String[] {
					"Test2_11.java",
					"public class Test2_11 {\n" + 
					"	void test() {\n" + 
					"		m(s(\n" + 
					"			f(1),\n" + 
					"			f(2),\n" + 
					"			f(3),\n" + 
					"			f(4),\n" + 
					"			f(5),\n" + 
					"			f(6),\n" + 
					"			f(7),\n" + 
					"			f(8),\n" + 
					"			f(9),\n" + 
					"			f(10),\n" + 
					"			f(11)\n" + 
					"		));\n" + 
					"	}\n" + 
					"\n" + 
					"	static <R> R m(S<R> s) { return null; }\n" + 
					"   static <T> F<T> f(T t) { return null; }\n" + 
					"	static <T1> S<R1<T1>> s(F<T1> t1) { return null; }\n" + 
					"	static <T1, T2> S<R2<T1, T2>> s(F<T1> t1, F<T2> t2) { return null; }\n" + 
					"	static <T1, T2, T3> S<R3<T1, T2, T3>> s(F<T1> t1, F<T2> t2, F<T3> t3) { return null; }\n" + 
					"	static <T1, T2, T3, T4> S<R4<T1, T2, T3, T4>> s(F<T1> t1, F<T2> t2, F<T3> t3, F<T4> t4) { return null; }\n" + 
					"	static <T1, T2, T3, T4, T5> S<R5<T1, T2, T3, T4, T5>> s(F<T1> t1, F<T2> t2, F<T3> t3, F<T4> t4, F<T5> t5) { return null; }\n" + 
					"	static <T1, T2, T3, T4, T5, T6> S<R6<T1, T2, T3, T4, T5, T6>> s(F<T1> t1, F<T2> t2, F<T3> t3, F<T4> t4, F<T5> t5, F<T6> t6) { return null; }\n" + 
					"	static <T1, T2, T3, T4, T5, T6, T7> S<R7<T1, T2, T3, T4, T5, T6, T7>> s(F<T1> t1, F<T2> t2, F<T3> t3, F<T4> t4, F<T5> t5, F<T6> t6, F<T7> t7) { return null; }\n" + 
					"	static <T1, T2, T3, T4, T5, T6, T7, T8> S<R8<T1, T2, T3, T4, T5, T6, T7, T8>> s(F<T1> t1, F<T2> t2, F<T3> t3, F<T4> t4, F<T5> t5, F<T6> t6, F<T7> t7, F<T8> t8) { return null; }\n" + 
					"	static <T1, T2, T3, T4, T5, T6, T7, T8, T9> S<R9<T1, T2, T3, T4, T5, T6, T7, T8, T9>> s(F<T1> t1, F<T2> t2, F<T3> t3, F<T4> t4, F<T5> t5, F<T6> t6, F<T7> t7, F<T8> t8, F<T9> t9) { return null; }\n" + 
					"   static <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> S<R10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>> s(F<T1> t1, F<T2> t2, F<T3> t3, F<T4> t4, F<T5> t5, F<T6> t6, F<T7> t7, F<T8> t8, F<T9> t9, F<T10> t10) { return null; }\n" +
					"   static <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> S<R11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>> s(F<T1> t1, F<T2> t2, F<T3> t3, F<T4> t4, F<T5> t5, F<T6> t6, F<T7> t7, F<T8> t8, F<T9> t9, F<T10> t10, F<T11> t11) { return null; }\n" +
					"}\n" + 
					"interface F<T> {}\n" + 
					"interface S<R> {}\n" + 
					"interface R1<T1> {}\n" + 
					"interface R2<T1, T2> {}\n" +
					"interface R3<T1, T2, T3> {}\n" + 
					"interface R4<T1, T2, T3, T4> {}\n" + 
					"interface R5<T1, T2, T3, T4, T5> {}\n" + 
					"interface R6<T1, T2, T3, T4, T5, T6> {}\n" + 
					"interface R7<T1, T2, T3, T4, T5, T6, T7> {}\n" + 
					"interface R8<T1, T2, T3, T4, T5, T6, T7, T8> {}\n" + 
					"interface R9<T1, T2, T3, T4, T5, T6, T7, T8, T9> {}\n" + 
					"interface R10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> {}\n" +
					"interface R11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> {}\n"
				}));
		// Time complexity should grow roughly linearly, not O(2^n)
		// To make the test robust, it tests for the same order of magnitude only, i.e. factor 10.
		assertCompileTimes(durationsFor2TypeParameters, 10, durationsFor11TypeParameters);
	}
}
/**
 * This test targets the optimization for parameterized dependencies in {@code BoundSet.combineSameSubSuperWithProperType(...)}.
 */
public void testBug543480WithSameSubSuperOptimization() {
	if (this.complianceLevel >= ClassFileConstants.JDK1_8) {
		final List<Duration> durationsFor2TypeParameters = compileTimesAfterWarmup(() -> runConformTest(
			new String[] {
					"WithParameterizedDependencies_2.java",
					"abstract class WithParameterizedDependencies_2 {\n" + 
					"    <T1, T2> \n" +
					"           Type1<T1, T2>\n" +
					"           s1(Type1<T1, T2> t) {\n" +
					// This line causes the optimization in BoundSet.combineSameSubSuperWithProperType(...) to be effective.
					"        return s2(new Type1<>(t));\n" + 
					"    }\n" + 
					"    abstract <E> E s2(E e);\n" +
					"}\n" +
					"class Type1<T1, T2> {\n" +
					"    Type1(final Type1<T1, T2> l) {}" +
					"}\n"
			}));
		final List<Duration> durationsFor12TypeParameters = compileTimesAfterWarmup(() -> runConformTest(
				new String[] {
					"WithParameterizedDependencies_12.java",
					"abstract class WithParameterizedDependencies_12 {\n" + 
					"    <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> \n" +
					"           Type1<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>\n" +
					"           s1(Type1<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> t) {\n" +
					// This line causes the optimization in BoundSet.combineSameSubSuperWithProperType(...) to be effective.
					"        return s2(new Type1<>(t));\n" + 
					"    }\n" + 
					"    abstract <E> E s2(E e);\n" +
					"}\n" +
					"class Type1<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> {\n" +
					"    Type1(final Type1<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> l) {}" +
					"}\n"
				}));
		// Time complexity should grow roughly linearly, not O(2^n).
		// To make the test robust, it tests for the same order of magnitude only, i.e. factor 10.
		assertCompileTimes(durationsFor2TypeParameters, 10, durationsFor12TypeParameters);
	}
}
/**
 * An earlier version of the fix for bug 543480 causes a NullPointerException when compiling this code.
 */
public void testBug543480WithoutNullPointerExceptionDuringBytecodeGeneration() {
	if (this.complianceLevel >= ClassFileConstants.JDK1_8) {
		runConformTest(
			new String[] {
				"Test.java",
				"import java.util.function.BiConsumer;\n" + 
				"\n" + 
				"public class Test {\n" + 
				"	\n" + 
				"	interface I0<T extends I0<T>> {}\n" + 
				"\n" + 
				"	class Type<T extends I0<T>, D> {\n" + 
				"		// TODO: The problem might be that BiConsumer is not declared in the same file?\n" + 
				"		public Type(final BiConsumer<T, D> b) { }\n" + 
				"	}\n" + 
				"\n" + 
				"	public void foo() {\n" + 
				"		new Type<>((unused0, unused1) -> {});\n" + 
				"	}\n" + 
				"}"
			});
	}
}

protected void assertCompileTimes(final List<Duration> shortTimes, final double factor, final List<Duration> longTimes) {
	final double shortTimesAverage = averageExcludingBoundaries(shortTimes);
	final double longTimesAverage = averageExcludingBoundaries(longTimes);
	final String message = "Potential fluctuation of a performance test: average long compile time "
			+ longTimesAverage + "ms should be less than " + factor + "x the average short compile time " + shortTimesAverage +"ms\n"
			+ "long compile times: "+longTimes+"\n"
			+ "short compile times: "+shortTimes;
	assertTrue(message,longTimesAverage < factor*shortTimesAverage);
	System.out.println(message);
}

protected double averageExcludingBoundaries(final List<Duration> durations) {
	return durations.stream()
			.filter(duration -> !duration.isExcluded)
			.mapToLong(duration -> duration.durationMs)
			.average().orElse(-1);
}

protected List<Duration> compileTimesAfterWarmup(final Runnable compileTask) {
	// warm up
	duration(compileTask);
	runGarbageCollection();
	// draw samples, exclude boundaries i.e. exclude potential outliers
	final int numberOfSamples = 10;
	final int boundarySize = 2;
	return IntStream.rangeClosed(1, numberOfSamples)
			.mapToObj(duration(compileTask))
			.sorted()
			.peek(markExcludedBoundaries(boundarySize, numberOfSamples))
			.collect(toList());
}

protected static IntFunction<Duration> duration(final Runnable runnable) {
	return index -> {
		final long startMs = System.currentTimeMillis();
		runnable.run();
		final long endMs = System.currentTimeMillis();
		final long duration = endMs-startMs;
		return new Duration(index, duration);
	};
}

protected static Consumer<Duration> markExcludedBoundaries(final int boundarySize, final int numberOfSamples) {
	final AtomicInteger seenSamples = new AtomicInteger(0);
	return duration -> {
		final int indexFromBottom = seenSamples.get();
		final int indexFromTop = abs(seenSamples.get() - numberOfSamples);
		if(indexFromBottom < boundarySize) {
			// a sample within the lower boundary
			duration.isExcluded = true;
		} else if(indexFromTop <= boundarySize) {
			// a sample within the upper boundary
			duration.isExcluded = true;
		}
		seenSamples.incrementAndGet();
	};
}

protected static class Duration implements Comparable<Duration> {
	protected final int index;
	protected final long durationMs;
	protected boolean isExcluded = false;
	
	public Duration(final int index, final long durationMs) {
		this.index = index;
		this.durationMs = durationMs;
	}

	@Override
	public int compareTo(Duration other) {
		return (int)(this.durationMs - other.durationMs);
	}

	@Override
	public String toString() {
		return "#"+index + " " + durationMs + "ms" + (isExcluded?" (excluded)":"");
	}
}

}

