/*******************************************************************************
 * Copyright (c) 2011, 2017 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jdt.core.tests.compiler.regression;

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

import org.eclipse.jdt.core.util.ClassFileBytesDisassembler;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;

import junit.framework.Test;

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

	static { 
//		TESTS_NUMBERS = new int [] { 35 };
//		TESTS_NAMES = new String [] { "test0390882b" };
	}
	public static Class testClass() {
		return NegativeTypeAnnotationTest.class;
	}
	public static Test suite() {
		return buildMinimalComplianceTestSuite(testClass(), F_1_8);
	}
	public NegativeTypeAnnotationTest(String testName){
		super(testName);
	}
	public void test001() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X extends @Marker2 Object {}",
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 1)\n" + 
				"	public class X extends @Marker2 Object {}\n" + 
				"	                        ^^^^^^^\n" + 
				"Marker2 cannot be resolved to a type\n" + 
				"----------\n");
	}
	public void test002() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"import java.io.Serializable;\n" +
					"public class X implements @Marker2 Serializable {\n" +
					"	private static final long serialVersionUID = 1L;\n" +
					"}",
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 2)\n" + 
				"	public class X implements @Marker2 Serializable {\n" + 
				"	                           ^^^^^^^\n" + 
				"Marker2 cannot be resolved to a type\n" + 
				"----------\n");
	}
	public void test003() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X extends @Marker Object {}",
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 1)\n" + 
				"	public class X extends @Marker Object {}\n" + 
				"	                        ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n");
	}
	public void test004() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X<@Marker T> {}",
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 1)\n" + 
				"	public class X<@Marker T> {}\n" + 
				"	                ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n");
	}
	public void test005() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X<@Marker T> {}",
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 1)\n" + 
				"	public class X<@Marker T> {}\n" + 
				"	                ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n");
	}
	public void test006() throws Exception {
		this.runNegativeTest(
			new String[] {
				"Y.java",
				"class Y {}\n",
				"X.java",
				"public class X extends @A(id=\"Hello, World!\") @B @C('(') Y {\n" + 
				"}",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 1)\n" + 
		"	public class X extends @A(id=\"Hello, World!\") @B @C(\'(\') Y {\n" + 
		"	                        ^\n" + 
		"A cannot be resolved to a type\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 1)\n" + 
		"	public class X extends @A(id=\"Hello, World!\") @B @C(\'(\') Y {\n" + 
		"	                                               ^\n" + 
		"B cannot be resolved to a type\n" + 
		"----------\n" + 
		"3. ERROR in X.java (at line 1)\n" + 
		"	public class X extends @A(id=\"Hello, World!\") @B @C(\'(\') Y {\n" + 
		"	                                                  ^\n" + 
		"C cannot be resolved to a type\n" + 
		"----------\n");
	}
	public void test007() throws Exception {
		this.runNegativeTest(
			new String[] {
				"I.java",
				"interface I {}\n",
				"J.java",
				"interface J {}\n",
				"X.java",
				"public class X implements @A(id=\"Hello, World!\") I, @B @C('(') J {}",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 1)\n" + 
		"	public class X implements @A(id=\"Hello, World!\") I, @B @C(\'(\') J {}\n" + 
		"	                           ^\n" + 
		"A cannot be resolved to a type\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 1)\n" + 
		"	public class X implements @A(id=\"Hello, World!\") I, @B @C(\'(\') J {}\n" + 
		"	                                                     ^\n" + 
		"B cannot be resolved to a type\n" + 
		"----------\n" + 
		"3. ERROR in X.java (at line 1)\n" + 
		"	public class X implements @A(id=\"Hello, World!\") I, @B @C(\'(\') J {}\n" + 
		"	                                                        ^\n" + 
		"C cannot be resolved to a type\n" + 
		"----------\n");
	}
	public void test010() throws Exception {
		this.runNegativeTest(
			new String[] {
				"Y.java",
				"class Y<T> {}\n",
				"X.java",
				"public class X extends @A(\"Hello, World!\") Y<@B @C('(') String> {\n" + 
				"}",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 1)\n" + 
		"	public class X extends @A(\"Hello, World!\") Y<@B @C(\'(\') String> {\n" + 
		"	                        ^\n" + 
		"A cannot be resolved to a type\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 1)\n" + 
		"	public class X extends @A(\"Hello, World!\") Y<@B @C(\'(\') String> {\n" + 
		"	                                              ^\n" + 
		"B cannot be resolved to a type\n" + 
		"----------\n" + 
		"3. ERROR in X.java (at line 1)\n" + 
		"	public class X extends @A(\"Hello, World!\") Y<@B @C(\'(\') String> {\n" + 
		"	                                                 ^\n" + 
		"C cannot be resolved to a type\n" + 
		"----------\n");
	}
	public void test011() throws Exception {
		this.runNegativeTest(
			new String[] {
				"I.java",
				"interface I<T> {}\n",
				"J.java",
				"interface J<T> {}\n",
				"X.java",
				"public class X implements I<@A(\"Hello, World!\") String>,  @B J<@C('(') Integer> {}",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 1)\n" + 
		"	public class X implements I<@A(\"Hello, World!\") String>,  @B J<@C(\'(\') Integer> {}\n" + 
		"	                             ^\n" + 
		"A cannot be resolved to a type\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 1)\n" + 
		"	public class X implements I<@A(\"Hello, World!\") String>,  @B J<@C(\'(\') Integer> {}\n" + 
		"	                                                           ^\n" + 
		"B cannot be resolved to a type\n" + 
		"----------\n" + 
		"3. ERROR in X.java (at line 1)\n" + 
		"	public class X implements I<@A(\"Hello, World!\") String>,  @B J<@C(\'(\') Integer> {}\n" + 
		"	                                                                ^\n" + 
		"C cannot be resolved to a type\n" + 
		"----------\n");
	}
	// throws
	public void test012() throws Exception {
		this.runNegativeTest(
			new String[] {
				"E.java",
				"class E extends RuntimeException {\n" +
				"	private static final long serialVersionUID = 1L;\n" +
				"}\n",
				"E1.java",
				"class E1 extends RuntimeException {\n" +
				"	private static final long serialVersionUID = 1L;\n" +
				"}\n",
				"E2.java",
				"class E2 extends RuntimeException {\n" +
				"	private static final long serialVersionUID = 1L;\n" +
				"}\n",
				"X.java",
				"public class X {\n" +
				"	void foo() throws @A(\"Hello, World!\") E, E1, @B @C('(') E2 {}\n" +
				"}",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 2)\n" + 
		"	void foo() throws @A(\"Hello, World!\") E, E1, @B @C(\'(\') E2 {}\n" + 
		"	                   ^\n" + 
		"A cannot be resolved to a type\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 2)\n" + 
		"	void foo() throws @A(\"Hello, World!\") E, E1, @B @C(\'(\') E2 {}\n" + 
		"	                                              ^\n" + 
		"B cannot be resolved to a type\n" + 
		"----------\n" + 
		"3. ERROR in X.java (at line 2)\n" + 
		"	void foo() throws @A(\"Hello, World!\") E, E1, @B @C(\'(\') E2 {}\n" + 
		"	                                                 ^\n" + 
		"C cannot be resolved to a type\n" + 
		"----------\n");
	}
	// method receiver
	public void test013() throws Exception {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
				"	void foo(@B(3) X this) {}\n" + 
				"}",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 2)\n" + 
		"	void foo(@B(3) X this) {}\n" + 
		"	          ^\n" + 
		"B cannot be resolved to a type\n" + 
		"----------\n");
	}
	// method return type
	public void test014() throws Exception {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
				"	@B(3) int foo() {\n" +
				"		return 1;\n" +
				"	}\n" + 
				"}",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 2)\n" + 
		"	@B(3) int foo() {\n" + 
		"	 ^\n" + 
		"B cannot be resolved to a type\n" + 
		"----------\n");
	}
	// field type
	public void test015() throws Exception {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
				"	@B(3) int field;\n" +
				"}",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 2)\n" + 
		"	@B(3) int field;\n" + 
		"	 ^\n" + 
		"B cannot be resolved to a type\n" + 
		"----------\n");
	}
	// method parameter
	public void test016() throws Exception {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
				"	int foo(@B(3) String s) {\n" +
				"		return s.length();\n" +
				"	}\n" + 
				"}",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 2)\n" + 
		"	int foo(@B(3) String s) {\n" + 
		"	         ^\n" + 
		"B cannot be resolved to a type\n" + 
		"----------\n");
	}
	// method parameter generic or array
	public void test017() throws Exception {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
				"	int foo(String @B(3) [] s) {\n" +
				"		return s.length;\n" +
				"	}\n" + 
				"}",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 2)\n" + 
		"	int foo(String @B(3) [] s) {\n" + 
		"	                ^\n" + 
		"B cannot be resolved to a type\n" + 
		"----------\n");
	}
	// field type generic or array
	public void test018() throws Exception {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
				"	int @B(3) [] field;\n" +
				"}",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 2)\n" + 
		"	int @B(3) [] field;\n" + 
		"	     ^\n" + 
		"B cannot be resolved to a type\n" + 
		"----------\n");
	}
	// class type parameter
	public void test019() throws Exception {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X<@A @B(3) T> {}",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 1)\n" + 
		"	public class X<@A @B(3) T> {}\n" + 
		"	                ^\n" + 
		"A cannot be resolved to a type\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 1)\n" + 
		"	public class X<@A @B(3) T> {}\n" + 
		"	                   ^\n" + 
		"B cannot be resolved to a type\n" + 
		"----------\n");
	}
	// method type parameter
	public void test020() throws Exception {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
				"	<@A @B(3) T> void foo(T t) {}\n" + 
				"}",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 2)\n" + 
		"	<@A @B(3) T> void foo(T t) {}\n" + 
		"	  ^\n" + 
		"A cannot be resolved to a type\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 2)\n" + 
		"	<@A @B(3) T> void foo(T t) {}\n" + 
		"	     ^\n" + 
		"B cannot be resolved to a type\n" + 
		"----------\n");
	}
	// class type parameter bound
	public void test021() throws Exception {
		this.runNegativeTest(
			new String[] {
				"Z.java",
				"public class Z {}",
				"X.java",
				"public class X<T extends @A Z & @B(3) Cloneable> {}",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 1)\n" + 
		"	public class X<T extends @A Z & @B(3) Cloneable> {}\n" + 
		"	                          ^\n" + 
		"A cannot be resolved to a type\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 1)\n" + 
		"	public class X<T extends @A Z & @B(3) Cloneable> {}\n" + 
		"	                                 ^\n" + 
		"B cannot be resolved to a type\n" + 
		"----------\n");
	}
	// class type parameter bound generic or array
	public void test022() throws Exception {
		this.runNegativeTest(
			new String[] {
				"Y.java",
				"public class Y<T> {}",
				"X.java",
				"public class X<T extends Y<@A String @C[][]@B[]> & @B(3) Cloneable> {}",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 1)\n" + 
		"	public class X<T extends Y<@A String @C[][]@B[]> & @B(3) Cloneable> {}\n" + 
		"	                            ^\n" + 
		"A cannot be resolved to a type\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 1)\n" + 
		"	public class X<T extends Y<@A String @C[][]@B[]> & @B(3) Cloneable> {}\n" + 
		"	                                      ^\n" + 
		"C cannot be resolved to a type\n" + 
		"----------\n" + 
		"3. ERROR in X.java (at line 1)\n" + 
		"	public class X<T extends Y<@A String @C[][]@B[]> & @B(3) Cloneable> {}\n" + 
		"	                                            ^\n" + 
		"B cannot be resolved to a type\n" + 
		"----------\n" + 
		"4. ERROR in X.java (at line 1)\n" + 
		"	public class X<T extends Y<@A String @C[][]@B[]> & @B(3) Cloneable> {}\n" + 
		"	                                                    ^\n" + 
		"B cannot be resolved to a type\n" + 
		"----------\n");
	}
	// method type parameter bound
	public void test023() throws Exception {
		this.runNegativeTest(
			new String[] {
				"Z.java",
				"public class Z {}",
				"X.java",
				"public class X {\n" +
				"	<T extends @A Z & @B(3) Cloneable> void foo(T t) {}\n" +
				"}",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 2)\n" + 
		"	<T extends @A Z & @B(3) Cloneable> void foo(T t) {}\n" + 
		"	            ^\n" + 
		"A cannot be resolved to a type\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 2)\n" + 
		"	<T extends @A Z & @B(3) Cloneable> void foo(T t) {}\n" + 
		"	                   ^\n" + 
		"B cannot be resolved to a type\n" + 
		"----------\n");
	}
	// class type parameter bound generic or array
	public void test024() throws Exception {
		this.runNegativeTest(
			new String[] {
				"Z.java",
				"public class Z {}",
				"Y.java",
				"public class Y<T> {}",
				"X.java",
				"public class X {\n" +
				"	<T extends Y<@A Z @C[][]@B[]> & @B(3) Cloneable> void foo(T t) {}\n" +
				"}",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 2)\n" + 
		"	<T extends Y<@A Z @C[][]@B[]> & @B(3) Cloneable> void foo(T t) {}\n" + 
		"	              ^\n" + 
		"A cannot be resolved to a type\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 2)\n" + 
		"	<T extends Y<@A Z @C[][]@B[]> & @B(3) Cloneable> void foo(T t) {}\n" + 
		"	                   ^\n" + 
		"C cannot be resolved to a type\n" + 
		"----------\n" + 
		"3. ERROR in X.java (at line 2)\n" + 
		"	<T extends Y<@A Z @C[][]@B[]> & @B(3) Cloneable> void foo(T t) {}\n" + 
		"	                         ^\n" + 
		"B cannot be resolved to a type\n" + 
		"----------\n" + 
		"4. ERROR in X.java (at line 2)\n" + 
		"	<T extends Y<@A Z @C[][]@B[]> & @B(3) Cloneable> void foo(T t) {}\n" + 
		"	                                 ^\n" + 
		"B cannot be resolved to a type\n" + 
		"----------\n");
	}
	// local variable + generic or array
	public void test025() throws Exception {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
				"	void foo(String s) {\n" + 
				"		@C int i;\n" + 
				"		@A String [] @B(3)[] tab = new String[][] {};\n" + 
				"		if (tab != null) {\n" + 
				"			i = 0;\n" + 
				"			System.out.println(i + tab.length);\n" + 
				"		} else {\n" + 
				"			System.out.println(tab.length);\n" + 
				"		}\n" + 
				"		i = 4;\n" + 
				"		System.out.println(-i + tab.length);\n" + 
				"	}\n" + 
				"}",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 3)\n" + 
		"	@C int i;\n" + 
		"	 ^\n" + 
		"C cannot be resolved to a type\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 4)\n" + 
		"	@A String [] @B(3)[] tab = new String[][] {};\n" + 
		"	 ^\n" + 
		"A cannot be resolved to a type\n" + 
		"----------\n" + 
		"3. ERROR in X.java (at line 4)\n" + 
		"	@A String [] @B(3)[] tab = new String[][] {};\n" + 
		"	              ^\n" + 
		"B cannot be resolved to a type\n" + 
		"----------\n");
	}
	// type argument constructor call
	public void test026() throws Exception {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
				"	<T> X(T t) {\n" + 
				"	}\n" + 
				"	public Object foo() {\n" + 
				"		X x = new <@A @B(1) String>X(null);\n" + 
				"		return x;\n" + 
				"	}\n" + 
				"}",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 5)\n" + 
		"	X x = new <@A @B(1) String>X(null);\n" + 
		"	            ^\n" + 
		"A cannot be resolved to a type\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 5)\n" + 
		"	X x = new <@A @B(1) String>X(null);\n" + 
		"	               ^\n" + 
		"B cannot be resolved to a type\n" + 
		"----------\n");
	}
	// type argument constructor call generic or array
	public void test027() throws Exception {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" + 
				"	<T> X(T t) {\n" + 
				"	}\n" + 
				"	public Object foo() {\n" + 
				"		X x = new <@A @B(1) String>X(null);\n" + 
				"		return x;\n" + 
				"	}\n" + 
				"}",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 5)\n" + 
		"	X x = new <@A @B(1) String>X(null);\n" + 
		"	            ^\n" + 
		"A cannot be resolved to a type\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 5)\n" + 
		"	X x = new <@A @B(1) String>X(null);\n" + 
		"	               ^\n" + 
		"B cannot be resolved to a type\n" + 
		"----------\n");
	}
	// type argument method call and generic or array
	public void test028() throws Exception {
		this.runNegativeTest(
			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.<@A @B(1) String[], @C('-') X>foo(new String[]{\"SUCCESS\"}, null)[0]);\n" +
				"	}\n" +
				"}\n",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 7)\n" + 
		"	System.out.println(X.<@A @B(1) String[], @C(\'-\') X>foo(new String[]{\"SUCCESS\"}, null)[0]);\n" + 
		"	                       ^\n" + 
		"A cannot be resolved to a type\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 7)\n" + 
		"	System.out.println(X.<@A @B(1) String[], @C(\'-\') X>foo(new String[]{\"SUCCESS\"}, null)[0]);\n" + 
		"	                          ^\n" + 
		"B cannot be resolved to a type\n" + 
		"----------\n" + 
		"3. ERROR in X.java (at line 7)\n" + 
		"	System.out.println(X.<@A @B(1) String[], @C(\'-\') X>foo(new String[]{\"SUCCESS\"}, null)[0]);\n" + 
		"	                                          ^\n" + 
		"C cannot be resolved to a type\n" + 
		"----------\n");
	}
	public void test029() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X extends @Marker2 Object {}",
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 1)\n" + 
				"	public class X extends @Marker2 Object {}\n" + 
				"	                        ^^^^^^^\n" + 
				"Marker2 cannot be resolved to a type\n" + 
				"----------\n");
	}
	public void test030() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"import java.io.Serializable;\n" +
					"public class X implements @Marker2 Serializable {\n" +
					"	private static final long serialVersionUID = 1L;\n" +
					"}",
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 2)\n" + 
				"	public class X implements @Marker2 Serializable {\n" + 
				"	                           ^^^^^^^\n" + 
				"Marker2 cannot be resolved to a type\n" + 
				"----------\n");
	}
	public void test031() throws Exception {
		this.runNegativeTest(
				new String[] {
					"Marker.java",
					"import java.lang.annotation.Target;\n" + 
					"import static java.lang.annotation.ElementType.*;\n" + 
					"@Target(TYPE)\n" + 
					"@interface Marker {}",
					"X.java",
					"public class X<@Marker T> {}",

					"java/lang/annotation/ElementType.java",
					"package java.lang.annotation;\n" +
					"public enum ElementType {\n" +
					"    TYPE,\n" +
					"    FIELD,\n" +
					"    METHOD,\n" +
					"    PARAMETER,\n" +
					"    CONSTRUCTOR,\n" +
					"    LOCAL_VARIABLE,\n" +
					"    ANNOTATION_TYPE,\n" +
					"    PACKAGE,\n" +
					"    TYPE_PARAMETER,\n" +
					"    TYPE_USE\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 1)\n" + 
				"	public class X<@Marker T> {}\n" + 
				"	               ^^^^^^^\n" + 
				"The annotation @Marker is disallowed for this location\n" + 
				"----------\n");
	}
	public void test032() throws Exception {
		this.runNegativeTest(
				new String[] {
					"Marker.java",
					"@interface Marker {}",
					"X.java",
					"public class X<@Marker T> {}",
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 1)\n" + 
				"	public class X<@Marker T> {}\n" + 
				"	               ^^^^^^^\n" + 
				"Annotation types that do not specify explicit target element types cannot be applied here\n" + 
				"----------\n");
	}
	public void test033() throws Exception {
		this.runNegativeTest(
				new String[] {
					"Marker.java",
					"@interface Marker {}",
					"Y.java",
					"public class Y {}",
					"X.java",
					"public class X extends @Marker Y {}",
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 1)\n" + 
				"	public class X extends @Marker Y {}\n" + 
				"	                       ^^^^^^^\n" + 
				"Annotation types that do not specify explicit target element types cannot be applied here\n" + 
				"----------\n");
	}
	// check locations
	public void test034() throws Exception {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.Map;\n" +
				"import java.util.List;\n" +
				"public class X {\n" + 
				"	@H String @E[] @F[] @G[] field;\n" + 
				"	@A Map<@B String, @C List<@D Object>> field2;\n" + 
				"	@A Map<@B String, @H String @E[] @F[] @G[]> field3;\n" + 
				"}",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 4)\n" + 
		"	@H String @E[] @F[] @G[] field;\n" + 
		"	 ^\n" + 
		"H cannot be resolved to a type\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 4)\n" + 
		"	@H String @E[] @F[] @G[] field;\n" + 
		"	           ^\n" + 
		"E cannot be resolved to a type\n" + 
		"----------\n" + 
		"3. ERROR in X.java (at line 4)\n" + 
		"	@H String @E[] @F[] @G[] field;\n" + 
		"	                ^\n" + 
		"F cannot be resolved to a type\n" + 
		"----------\n" + 
		"4. ERROR in X.java (at line 4)\n" + 
		"	@H String @E[] @F[] @G[] field;\n" + 
		"	                     ^\n" + 
		"G cannot be resolved to a type\n" + 
		"----------\n" + 
		"5. ERROR in X.java (at line 5)\n" + 
		"	@A Map<@B String, @C List<@D Object>> field2;\n" + 
		"	 ^\n" + 
		"A cannot be resolved to a type\n" + 
		"----------\n" + 
		"6. ERROR in X.java (at line 5)\n" + 
		"	@A Map<@B String, @C List<@D Object>> field2;\n" + 
		"	        ^\n" + 
		"B cannot be resolved to a type\n" + 
		"----------\n" + 
		"7. ERROR in X.java (at line 5)\n" + 
		"	@A Map<@B String, @C List<@D Object>> field2;\n" + 
		"	                   ^\n" + 
		"C cannot be resolved to a type\n" + 
		"----------\n" + 
		"8. ERROR in X.java (at line 5)\n" + 
		"	@A Map<@B String, @C List<@D Object>> field2;\n" + 
		"	                           ^\n" + 
		"D cannot be resolved to a type\n" + 
		"----------\n" + 
		"9. ERROR in X.java (at line 6)\n" + 
		"	@A Map<@B String, @H String @E[] @F[] @G[]> field3;\n" + 
		"	 ^\n" + 
		"A cannot be resolved to a type\n" + 
		"----------\n" + 
		"10. ERROR in X.java (at line 6)\n" + 
		"	@A Map<@B String, @H String @E[] @F[] @G[]> field3;\n" + 
		"	        ^\n" + 
		"B cannot be resolved to a type\n" + 
		"----------\n" + 
		"11. ERROR in X.java (at line 6)\n" + 
		"	@A Map<@B String, @H String @E[] @F[] @G[]> field3;\n" + 
		"	                   ^\n" + 
		"H cannot be resolved to a type\n" + 
		"----------\n" + 
		"12. ERROR in X.java (at line 6)\n" + 
		"	@A Map<@B String, @H String @E[] @F[] @G[]> field3;\n" + 
		"	                             ^\n" + 
		"E cannot be resolved to a type\n" + 
		"----------\n" + 
		"13. ERROR in X.java (at line 6)\n" + 
		"	@A Map<@B String, @H String @E[] @F[] @G[]> field3;\n" + 
		"	                                  ^\n" + 
		"F cannot be resolved to a type\n" + 
		"----------\n" + 
		"14. ERROR in X.java (at line 6)\n" + 
		"	@A Map<@B String, @H String @E[] @F[] @G[]> field3;\n" + 
		"	                                       ^\n" + 
		"G cannot be resolved to a type\n" + 
		"----------\n");
	}
	// check locations
	public void test035() throws Exception {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import java.util.Map;\n" +
				"import java.util.List;\n" +
				"public class X {\n" + 
				"	@H java.lang.String @E[] @F[] @G[] field;\n" + 
				"}",
		},
		"----------\n" + 
		"1. ERROR in X.java (at line 4)\n" + 
		"	@H java.lang.String @E[] @F[] @G[] field;\n" + 
		"	 ^\n" + 
		"H cannot be resolved to a type\n" + 
		"----------\n" + 
		"2. ERROR in X.java (at line 4)\n" + 
		"	@H java.lang.String @E[] @F[] @G[] field;\n" + 
		"	                     ^\n" + 
		"E cannot be resolved to a type\n" + 
		"----------\n" + 
		"3. ERROR in X.java (at line 4)\n" + 
		"	@H java.lang.String @E[] @F[] @G[] field;\n" + 
		"	                          ^\n" + 
		"F cannot be resolved to a type\n" + 
		"----------\n" + 
		"4. ERROR in X.java (at line 4)\n" + 
		"	@H java.lang.String @E[] @F[] @G[] field;\n" + 
		"	                               ^\n" + 
		"G cannot be resolved to a type\n" + 
		"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383884 -- Compiler tolerates illegal dimension annotation in class literal expressions
	public void test036() throws Exception {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"  public static void main(String[] args) {\n" +
				"    System.out.println(int @NonEmpty [] [] @NonEmpty @Empty [] [] @NonEmpty[].class); // illegal!\n" +
				"    System.out.println(X @NonEmpty [] [] @NonEmpty @Empty [] [] @NonEmpty[].class); // illegal!\n" +
				"    System.out.println(int [] [] [] [] [].class);\n" +
				"    System.out.println(X [] [] [] [] [].class);\n" +
				"  }\n" +
				"}\n" +
				"@interface Empty {\n" +
				"}\n" +
				"@interface NonEmpty {\n" +
				"}\n",
		},
			"----------\n" + 
			"1. ERROR in X.java (at line 3)\n" + 
			"	System.out.println(int @NonEmpty [] [] @NonEmpty @Empty [] [] @NonEmpty[].class); // illegal!\n" + 
			"	                       ^^^^^^^^^\n" + 
			"Syntax error, type annotations are illegal here\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 3)\n" + 
			"	System.out.println(int @NonEmpty [] [] @NonEmpty @Empty [] [] @NonEmpty[].class); // illegal!\n" + 
			"	                                       ^^^^^^^^^^^^^^^^\n" + 
			"Syntax error, type annotations are illegal here\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 3)\n" + 
			"	System.out.println(int @NonEmpty [] [] @NonEmpty @Empty [] [] @NonEmpty[].class); // illegal!\n" + 
			"	                                                              ^^^^^^^^^\n" + 
			"Syntax error, type annotations are illegal here\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 4)\n" + 
			"	System.out.println(X @NonEmpty [] [] @NonEmpty @Empty [] [] @NonEmpty[].class); // illegal!\n" + 
			"	                     ^^^^^^^^^\n" + 
			"Syntax error, type annotations are illegal here\n" + 
			"----------\n" + 
			"5. ERROR in X.java (at line 4)\n" + 
			"	System.out.println(X @NonEmpty [] [] @NonEmpty @Empty [] [] @NonEmpty[].class); // illegal!\n" + 
			"	                                     ^^^^^^^^^^^^^^^^\n" + 
			"Syntax error, type annotations are illegal here\n" + 
			"----------\n" + 
			"6. ERROR in X.java (at line 4)\n" + 
			"	System.out.println(X @NonEmpty [] [] @NonEmpty @Empty [] [] @NonEmpty[].class); // illegal!\n" + 
			"	                                                            ^^^^^^^^^\n" + 
			"Syntax error, type annotations are illegal here\n" + 
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383950
	// [1.8][compiler] Type annotations must have target type meta annotation TYPE_USE
	public void test037() {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"@interface Marker {}\n" +
					"@Marker	// line 2: Don't complain \n" +
					"public class X<@Marker T>  extends @Marker Object{		// 3: Complain \n" +
					"	public @Marker Object foo(@Marker Object obj) {  // 4: Don't complain on both\n" +
					"		return null;\n" +
					"	}\n" +
					"}\n",
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 3)\n" + 
				"	public class X<@Marker T>  extends @Marker Object{		// 3: Complain \n" + 
				"	               ^^^^^^^\n" + 
				"Annotation types that do not specify explicit target element types cannot be applied here\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 3)\n" + 
				"	public class X<@Marker T>  extends @Marker Object{		// 3: Complain \n" + 
				"	                                   ^^^^^^^\n" + 
				"Annotation types that do not specify explicit target element types cannot be applied here\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383950
	// [1.8][compiler] Type annotations must have target type meta annotation TYPE_USE
	public void test038() {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"import java.lang.annotation.Target;\n" + 
						"import static java.lang.annotation.ElementType.*;\n" + 
						"@Target({PACKAGE, TYPE, METHOD, FIELD, CONSTRUCTOR, PARAMETER, LOCAL_VARIABLE})\n" + 
						"@interface Marker {}\n" +
						"public class X<@Marker T>  extends @Marker Object{		// 3: Complain \n" +
						"}\n",
					},
					"----------\n" + 
					"1. ERROR in X.java (at line 5)\n" + 
					"	public class X<@Marker T>  extends @Marker Object{		// 3: Complain \n" + 
					"	               ^^^^^^^\n" + 
					"The annotation @Marker is disallowed for this location\n" + 
					"----------\n" + 
					"2. ERROR in X.java (at line 5)\n" + 
					"	public class X<@Marker T>  extends @Marker Object{		// 3: Complain \n" + 
					"	                                   ^^^^^^^\n" + 
					"The annotation @Marker is disallowed for this location\n" + 
					"----------\n");
	}
	// JSR 308: "It is not permitted to annotate the type name in an import statement."
	public void test039() {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"import @Marker java.lang.String; // Compilation error \n" +
						"public class X { \n" +
						"}\n" + 
						"@interface Marker {}\n"
					}, 
					"----------\n" + 
					"1. ERROR in X.java (at line 1)\n" + 
					"	import @Marker java.lang.String; // Compilation error \n" + 
					"	       ^^^^^^^\n" + 
					"Syntax error, type annotations are illegal here\n" + 
					"----------\n");
	}
	// Test that type name can't be left out in a cast expression with an annotations 
	public void test040() {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"public class X { \n" +
						"	public void foo(Object myObject) {\n" +
						"		String myString = (@NonNull) myObject;" +
						"	}\n" +
						"}\n" + 
						"@interface NonNull {}\n"
					}, 
					"----------\n" + 
					"1. ERROR in X.java (at line 3)\n" + 
					"	String myString = (@NonNull) myObject;	}\n" + 
					"	                   ^\n" + 
					"Syntax error on token \"@\", delete this token\n" + 
					"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=385111
	// [1.8][compiler] Compiler fails to flag undefined annotation type. 
	public void test0385111() {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"import java.util.ArrayList;\n" +
						"import java.util.List;\n" +
						"public class X {\n" +
						"    public void foo(String fileName) {\n" +
						"        List<String> l = new @MissingTypeNotIgnored ArrayList<String>();\n" +
						"        List<String> l1 = new @MissingTypeIgnored ArrayList<>();\n" +
						"    }\n" +
						"}\n",
					},
					"----------\n" + 
					"1. ERROR in X.java (at line 5)\n" + 
					"	List<String> l = new @MissingTypeNotIgnored ArrayList<String>();\n" + 
					"	                      ^^^^^^^^^^^^^^^^^^^^^\n" + 
					"MissingTypeNotIgnored cannot be resolved to a type\n" + 
					"----------\n" + 
					"2. ERROR in X.java (at line 6)\n" + 
					"	List<String> l1 = new @MissingTypeIgnored ArrayList<>();\n" + 
					"	                       ^^^^^^^^^^^^^^^^^^\n" + 
					"MissingTypeIgnored cannot be resolved to a type\n" + 
					"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=385111
	// Test to exercise assorted cleanup along with bug fix. 
	public void test0385111a() {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"public class X {\n" +
						"    public void foo(String fileName) {\n" +
						"        try (@Annot X x = null; @Annot X x2 = null) {\n"+
						"        } catch (@Annot NullPointerException | @Annot UnsupportedOperationException e) {\n" +
						"        }\n" +
						"    }\n" +
						"}\n",
					},
					"----------\n" + 
					"1. ERROR in X.java (at line 3)\n" + 
					"	try (@Annot X x = null; @Annot X x2 = null) {\n" + 
					"	      ^^^^^\n" + 
					"Annot cannot be resolved to a type\n" + 
					"----------\n" + 
					"2. ERROR in X.java (at line 3)\n" + 
					"	try (@Annot X x = null; @Annot X x2 = null) {\n" + 
					"	            ^\n" + 
					"The resource type X does not implement java.lang.AutoCloseable\n" + 
					"----------\n" + 
					"3. ERROR in X.java (at line 3)\n" + 
					"	try (@Annot X x = null; @Annot X x2 = null) {\n" + 
					"	                         ^^^^^\n" + 
					"Annot cannot be resolved to a type\n" + 
					"----------\n" + 
					"4. ERROR in X.java (at line 3)\n" + 
					"	try (@Annot X x = null; @Annot X x2 = null) {\n" + 
					"	                               ^\n" + 
					"The resource type X does not implement java.lang.AutoCloseable\n" + 
					"----------\n" + 
					"5. ERROR in X.java (at line 4)\n" + 
					"	} catch (@Annot NullPointerException | @Annot UnsupportedOperationException e) {\n" + 
					"	          ^^^^^\n" + 
					"Annot cannot be resolved to a type\n" + 
					"----------\n" + 
					"6. ERROR in X.java (at line 4)\n" + 
					"	} catch (@Annot NullPointerException | @Annot UnsupportedOperationException e) {\n" + 
					"	                                        ^^^^^\n" + 
					"Annot cannot be resolved to a type\n" + 
					"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383913
	public void test0383913() {
		this.runNegativeTest(
				new String[]{
						"X.java",
						"public class X {\n" +
						"	public void foo(Object obj, X this) {}\n" +
						"	public void foo(Object obj1, X this, Object obj2) {}\n" +
						"	public void foo(Object obj, Object obj2, Object obj3, X this) {}\n" +
						"	class Y {\n" +
						"		Y(Object obj, Y Y.this){}\n" +
						"	}\n" +
						"}"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 2)\n" + 
				"	public void foo(Object obj, X this) {}\n" + 
				"	                              ^^^^\n" + 
				"Only the first formal parameter may be declared explicitly as 'this'\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 3)\n" + 
				"	public void foo(Object obj1, X this, Object obj2) {}\n" + 
				"	                               ^^^^\n" + 
				"Only the first formal parameter may be declared explicitly as 'this'\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 4)\n" + 
				"	public void foo(Object obj, Object obj2, Object obj3, X this) {}\n" + 
				"	                                                        ^^^^\n" + 
				"Only the first formal parameter may be declared explicitly as 'this'\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 6)\n" + 
				"	Y(Object obj, Y Y.this){}\n" + 
				"	                  ^^^^\n" + 
				"Only the first formal parameter may be declared explicitly as 'this'\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383913
	public void test0383913b() {
		this.runNegativeTest(
				new String[] {
						"Outer.java",
						"public class Outer {\n" +
						"    Outer(Outer Outer.this) {}\n" +
						"    Outer(Outer this, int i) {}\n" +
						"    class Inner<K,V> {\n" +
						"        class InnerMost<T> {\n" +
						"            InnerMost(Outer.Inner this) {}\n" +
						"            InnerMost(Outer.Inner Outer.Inner.this, int i, float f) {}\n" +
						"            InnerMost(Outer Outer.this, float f) {}\n" +
						"            InnerMost(Outer.Inner<K,V>.InnerMost<T> Outer.Inner.InnerMost.this, Object obj) {}\n" +
						"            InnerMost(Inner<K,V> Outer.Inner.InnerMost.this, int i) {}\n" +
						"            InnerMost(Outer.Inner<K, V> this, float f, int i) {}\n" +
						"            InnerMost(Outer.Inner<K,V> Inner.this, long l) {}\n" +
						"        }\n" +
						"    }\n" +
						"}\n"},
						"----------\n" + 
						"1. ERROR in Outer.java (at line 2)\n" + 
						"	Outer(Outer Outer.this) {}\n" + 
						"	                  ^^^^\n" + 
						"Explicit 'this' parameter is allowed only in instance methods of non-anonymous classes and inner class constructors\n" + 
						"----------\n" + 
						"2. ERROR in Outer.java (at line 3)\n" + 
						"	Outer(Outer this, int i) {}\n" + 
						"	            ^^^^\n" + 
						"Explicit 'this' parameter is allowed only in instance methods of non-anonymous classes and inner class constructors\n" + 
						"----------\n" + 
						"3. WARNING in Outer.java (at line 6)\n" + 
						"	InnerMost(Outer.Inner this) {}\n" + 
						"	          ^^^^^^^^^^^\n" + 
						"Outer.Inner is a raw type. References to generic type Outer.Inner<K,V> should be parameterized\n" + 
						"----------\n" + 
						"4. ERROR in Outer.java (at line 6)\n" + 
						"	InnerMost(Outer.Inner this) {}\n" + 
						"	          ^^^^^^^^^^^\n" + 
						"The declared type of the explicit 'this' parameter is expected to be Outer.Inner<K,V>\n" + 
						"----------\n" + 
						"5. ERROR in Outer.java (at line 6)\n" + 
						"	InnerMost(Outer.Inner this) {}\n" + 
						"	                      ^^^^\n" + 
						"The explicit 'this' parameter is expected to be qualified with Inner\n" + 
						"----------\n" + 
						"6. WARNING in Outer.java (at line 7)\n" + 
						"	InnerMost(Outer.Inner Outer.Inner.this, int i, float f) {}\n" + 
						"	          ^^^^^^^^^^^\n" + 
						"Outer.Inner is a raw type. References to generic type Outer.Inner<K,V> should be parameterized\n" + 
						"----------\n" + 
						"7. ERROR in Outer.java (at line 7)\n" + 
						"	InnerMost(Outer.Inner Outer.Inner.this, int i, float f) {}\n" + 
						"	          ^^^^^^^^^^^\n" + 
						"The declared type of the explicit 'this' parameter is expected to be Outer.Inner<K,V>\n" + 
						"----------\n" + 
						"8. ERROR in Outer.java (at line 7)\n" + 
						"	InnerMost(Outer.Inner Outer.Inner.this, int i, float f) {}\n" + 
						"	                      ^^^^^^^^^^^^^^^^\n" + 
						"The explicit 'this' parameter is expected to be qualified with Inner\n" + 
						"----------\n" + 
						"9. ERROR in Outer.java (at line 8)\n" + 
						"	InnerMost(Outer Outer.this, float f) {}\n" + 
						"	          ^^^^^\n" + 
						"The declared type of the explicit 'this' parameter is expected to be Outer.Inner<K,V>\n" + 
						"----------\n" + 
						"10. ERROR in Outer.java (at line 8)\n" + 
						"	InnerMost(Outer Outer.this, float f) {}\n" + 
						"	                ^^^^^^^^^^\n" + 
						"The explicit 'this' parameter is expected to be qualified with Inner\n" + 
						"----------\n" + 
						"11. ERROR in Outer.java (at line 9)\n" + 
						"	InnerMost(Outer.Inner<K,V>.InnerMost<T> Outer.Inner.InnerMost.this, Object obj) {}\n" + 
						"	          ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
						"The declared type of the explicit 'this' parameter is expected to be Outer.Inner<K,V>\n" + 
						"----------\n" + 
						"12. ERROR in Outer.java (at line 9)\n" + 
						"	InnerMost(Outer.Inner<K,V>.InnerMost<T> Outer.Inner.InnerMost.this, Object obj) {}\n" + 
						"	                                        ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
						"The explicit 'this' parameter is expected to be qualified with Inner\n" + 
						"----------\n" + 
						"13. ERROR in Outer.java (at line 10)\n" + 
						"	InnerMost(Inner<K,V> Outer.Inner.InnerMost.this, int i) {}\n" + 
						"	                     ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
						"The explicit 'this' parameter is expected to be qualified with Inner\n" + 
						"----------\n" + 
						"14. ERROR in Outer.java (at line 11)\n" + 
						"	InnerMost(Outer.Inner<K, V> this, float f, int i) {}\n" + 
						"	                            ^^^^\n" + 
						"The explicit 'this' parameter is expected to be qualified with Inner\n" + 
						"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383913
	public void test0383913c() {
		this.runNegativeTest(
				new String[] {
						"Outer.java",
						"public class Outer {\n" +
						"    class Inner<K,V> {\n" +
						"        class InnerMost<T> {\n" +
						"            public void foo(Outer Outer.this) {}\n" +
						"            public void foo(Inner<K,V> Inner.this, int i) {}\n" +
						"            public void foo(InnerMost this, int i, int j) {}\n" +
						"            public void foo(Inner.InnerMost<T> this, Object obj) {}\n" +
						"            public void foo(InnerMost<T> this, float f) {}\n" +
						"            public void foo(Inner<K,V>.InnerMost<T> this, long l) {}\n" +
						"            public void foo(Outer.Inner<K,V>.InnerMost<T> this, float f, float ff) {}\n" +
						"            public void foo(InnerMost<T> Outer.Inner.InnerMost.this, int i, float f) {}\n" +
						"        }\n" +
						"    }\n" +
						"}\n"},
						"----------\n" + 
						"1. ERROR in Outer.java (at line 4)\n" + 
						"	public void foo(Outer Outer.this) {}\n" + 
						"	                ^^^^^\n" + 
						"The declared type of the explicit 'this' parameter is expected to be Outer.Inner<K,V>.InnerMost<T>\n" + 
						"----------\n" + 
						"2. ERROR in Outer.java (at line 4)\n" + 
						"	public void foo(Outer Outer.this) {}\n" + 
						"	                      ^^^^^^^^^^\n" + 
						"The explicit 'this' parameter for a method cannot have a qualifying name\n" + 
						"----------\n" + 
						"3. ERROR in Outer.java (at line 5)\n" + 
						"	public void foo(Inner<K,V> Inner.this, int i) {}\n" + 
						"	                ^^^^^\n" + 
						"The declared type of the explicit 'this' parameter is expected to be Outer.Inner<K,V>.InnerMost<T>\n" + 
						"----------\n" + 
						"4. ERROR in Outer.java (at line 5)\n" + 
						"	public void foo(Inner<K,V> Inner.this, int i) {}\n" + 
						"	                           ^^^^^^^^^^\n" + 
						"The explicit 'this' parameter for a method cannot have a qualifying name\n" + 
						"----------\n" + 
						"5. WARNING in Outer.java (at line 6)\n" + 
						"	public void foo(InnerMost this, int i, int j) {}\n" + 
						"	                ^^^^^^^^^\n" + 
						"Outer.Inner.InnerMost is a raw type. References to generic type Outer.Inner<K,V>.InnerMost<T> should be parameterized\n" + 
						"----------\n" + 
						"6. ERROR in Outer.java (at line 6)\n" + 
						"	public void foo(InnerMost this, int i, int j) {}\n" + 
						"	                ^^^^^^^^^\n" + 
						"The declared type of the explicit 'this' parameter is expected to be Outer.Inner<K,V>.InnerMost<T>\n" + 
						"----------\n" + 
						"7. ERROR in Outer.java (at line 7)\n" + 
						"	public void foo(Inner.InnerMost<T> this, Object obj) {}\n" + 
						"	                ^^^^^^^^^^^^^^^\n" + 
						"The member type Outer.Inner.InnerMost<T> must be qualified with a parameterized type, since it is not static\n" + 
						"----------\n" + 
						"8. ERROR in Outer.java (at line 7)\n" + 
						"	public void foo(Inner.InnerMost<T> this, Object obj) {}\n" + 
						"	                ^^^^^^^^^^^^^^^\n" + 
						"The declared type of the explicit 'this' parameter is expected to be Outer.Inner<K,V>.InnerMost<T>\n" + 
						"----------\n" +
						"9. ERROR in Outer.java (at line 11)\n" + 
						"	public void foo(InnerMost<T> Outer.Inner.InnerMost.this, int i, float f) {}\n" + 
						"	                             ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
						"The explicit 'this' parameter for a method cannot have a qualifying name\n" + 
						"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383913
	public void test0383913d() {
		this.runNegativeTest(
				new String[] {
						"Outer.java",
						"import java.lang.annotation.Target;\n" + 
						"import static java.lang.annotation.ElementType.*;\n" + 
						"public class Outer {\n" +
						"    class Inner<K,V> {\n" +
						"		public Inner(@Missing Outer Outer.this) {}\n" +
						"        class InnerMost<T> {\n" +
						"            public void bar() {\n" +
						"                new AnonymousInner() {\n" +
						"                    public void foobar(AnonymousInner this) {}\n" +
						"                };\n" +
						"            }\n" +
						"            void bar(int i) {\n" +
						"                class Local {\n" +
						"                    public int hashCode(Local this, int k) { return 0; }\n" +
						"                    public int hashCode(Outer.Local this) { return 0; }\n" +
						"                }\n" +
						"            }\n" +
						"        }\n" +
						"    }\n" +
						"    static class StaticNested {\n" +
						"        public StaticNested(@Marker Outer.StaticNested Outer.StaticNested.this) {}\n" +
						"    }\n" +
						"    public static void foo(@Marker Outer this) {}\n" +
						"    public void foo(@Missing Outer this, int i) {}\n" +
						"}\n" +
						"interface AnonymousInner {\n" +
						"    public void foobar(AnonymousInner this);\n" +
						"}\n" +
						"@Target(TYPE_USE)\n" + 
						"@interface Marker {}",

						"java/lang/annotation/ElementType.java",
						"package java.lang.annotation;\n" +
						"public enum ElementType {\n" +
						"    TYPE,\n" +
						"    FIELD,\n" +
						"    METHOD,\n" +
						"    PARAMETER,\n" +
						"    CONSTRUCTOR,\n" +
						"    LOCAL_VARIABLE,\n" +
						"    ANNOTATION_TYPE,\n" +
						"    PACKAGE,\n" +
						"    TYPE_PARAMETER,\n" +
						"    TYPE_USE\n" +
						"}\n"
					},
							"----------\n" + 
							"1. ERROR in Outer.java (at line 5)\n" + 
							"	public Inner(@Missing Outer Outer.this) {}\n" + 
							"	              ^^^^^^^\n" + 
							"Missing cannot be resolved to a type\n" + 
							"----------\n" + 
							"2. ERROR in Outer.java (at line 9)\n" + 
							"	public void foobar(AnonymousInner this) {}\n" + 
							"	                                  ^^^^\n" + 
							"Explicit \'this\' parameter is allowed only in instance methods of non-anonymous classes and inner class constructors\n" + 
							"----------\n" + 
							"3. ERROR in Outer.java (at line 15)\n" + 
							"	public int hashCode(Outer.Local this) { return 0; }\n" + 
							"	                    ^^^^^^^^^^^\n" + 
							"Outer.Local cannot be resolved to a type\n" + 
							"----------\n" + 
							"4. ERROR in Outer.java (at line 21)\n" + 
							"	public StaticNested(@Marker Outer.StaticNested Outer.StaticNested.this) {}\n" + 
							"	                    ^^^^^^^\n" + 
							"Type annotations are not allowed on type names used to access static members\n" + 
							"----------\n" + 
							"5. ERROR in Outer.java (at line 21)\n" + 
							"	public StaticNested(@Marker Outer.StaticNested Outer.StaticNested.this) {}\n" + 
							"	                                                                  ^^^^\n" + 
							"Explicit \'this\' parameter is allowed only in instance methods of non-anonymous classes and inner class constructors\n" + 
							"----------\n" + 
							"6. ERROR in Outer.java (at line 23)\n" + 
							"	public static void foo(@Marker Outer this) {}\n" + 
							"	                                     ^^^^\n" + 
							"Explicit \'this\' parameter is allowed only in instance methods of non-anonymous classes and inner class constructors\n" + 
							"----------\n" + 
							"7. ERROR in Outer.java (at line 24)\n" + 
							"	public void foo(@Missing Outer this, int i) {}\n" + 
							"	                 ^^^^^^^\n" + 
							"Missing cannot be resolved to a type\n" + 
							"----------\n");
	}
	public void test0383908() {
		this.runNegativeTest(
				new String[]{"X.java",
				"public class X { \n" +
				"	void foo(X this) {}\n" +
				"   void foo() {}\n" +
				"}\n" +
				"class Y {\n" +
				"	void foo(Y this) {}\n" +
				"	public static void main(String[] args) {\n" +
				"		new Y().foo();\n" +
				"	}\n" +
				"}"}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 2)\n" + 
				"	void foo(X this) {}\n" + 
				"	     ^^^^^^^^^^^\n" + 
				"Duplicate method foo() in type X\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 3)\n" + 
				"	void foo() {}\n" + 
				"	     ^^^^^\n" + 
				"Duplicate method foo() in type X\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383596 -- reject annotations on nested package names.
	public void test383596() throws Exception {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"package p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z. z2;\n" +
				"public class X {\n" +
				"}"
			}, 
			"----------\n" + 
			"1. ERROR in X.java (at line 1)\n" + 
			"	package p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z. z2;\n" + 
			"	           ^^^^^^^\n" + 
			"Syntax error, type annotations are illegal here\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 1)\n" + 
			"	package p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z. z2;\n" + 
			"	                        ^^^^^^^^^^^^^^^\n" + 
			"Syntax error, type annotations are illegal here\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 1)\n" + 
			"	package p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z. z2;\n" + 
			"	                                           ^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Syntax error, type annotations are illegal here\n" + 
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383596 -- reject annotations on nested package names.
	public void test383596a() throws Exception {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"@Marker package p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z. z2;\n" +
				"public class X {\n" +
				"}"
			}, 
			"----------\n" + 
			"1. ERROR in X.java (at line 1)\n" + 
			"	@Marker package p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z. z2;\n" + 
			"	^^^^^^^\n" + 
			"Package annotations must be in file package-info.java\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 1)\n" + 
			"	@Marker package p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z. z2;\n" + 
			"	                   ^^^^^^^\n" + 
			"Syntax error, type annotations are illegal here\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 1)\n" + 
			"	@Marker package p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z. z2;\n" + 
			"	                                ^^^^^^^^^^^^^^^\n" + 
			"Syntax error, type annotations are illegal here\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 1)\n" + 
			"	@Marker package p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z. z2;\n" + 
			"	                                                   ^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Syntax error, type annotations are illegal here\n" + 
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383596 -- reject annotations on nested import names.
	public void test039b() throws Exception {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z. z2;\n" +
				"public class X {\n" +
				"}"
			}, 
			"----------\n" + 
			"1. ERROR in X.java (at line 1)\n" + 
			"	import p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z. z2;\n" + 
			"	       ^\n" + 
			"The import p cannot be resolved\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 1)\n" + 
			"	import p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z. z2;\n" + 
			"	          ^^^^^^^\n" + 
			"Syntax error, type annotations are illegal here\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 1)\n" + 
			"	import p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z. z2;\n" + 
			"	                       ^^^^^^^^^^^^^^^\n" + 
			"Syntax error, type annotations are illegal here\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 1)\n" + 
			"	import p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z. z2;\n" + 
			"	                                          ^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Syntax error, type annotations are illegal here\n" + 
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383596 -- reject annotations on nested import names.
	public void test383596b() throws Exception {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"import p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z.*;\n" +
				"public class X {\n" +
				"}"
			}, 
			"----------\n" + 
			"1. ERROR in X.java (at line 1)\n" + 
			"	import p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z.*;\n" + 
			"	       ^\n" + 
			"The import p cannot be resolved\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 1)\n" + 
			"	import p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z.*;\n" + 
			"	          ^^^^^^^\n" + 
			"Syntax error, type annotations are illegal here\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 1)\n" + 
			"	import p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z.*;\n" + 
			"	                       ^^^^^^^^^^^^^^^\n" + 
			"Syntax error, type annotations are illegal here\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 1)\n" + 
			"	import p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z.*;\n" + 
			"	                                          ^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Syntax error, type annotations are illegal here\n" + 
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383596 -- reject annotations on nested static import names.
	public void test041() throws Exception {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"import static p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z.z2;\n" +
						"public class X {\n" +
						"}"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 1)\n" + 
				"	import static p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z.z2;\n" + 
				"	              ^\n" + 
				"The import p cannot be resolved\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 1)\n" + 
				"	import static p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z.z2;\n" + 
				"	                 ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 1)\n" + 
				"	import static p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z.z2;\n" + 
				"	                              ^^^^^^^^^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 1)\n" + 
				"	import static p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z.z2;\n" + 
				"	                                                 ^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383596 -- reject annotations on nested static import names.
	public void test042() throws Exception {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"import static p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z.*;\n" +
						"public class X {\n" +
						"}"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 1)\n" + 
				"	import static p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z.*;\n" + 
				"	              ^\n" + 
				"The import p cannot be resolved\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 1)\n" + 
				"	import static p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z.*;\n" + 
				"	                 ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 1)\n" + 
				"	import static p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z.*;\n" + 
				"	                              ^^^^^^^^^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 1)\n" + 
				"	import static p. @Marker q.x. @Marker @Marker y. @Marker @Marker @Marker z.*;\n" + 
				"	                                                 ^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383596 -- reject annotations on Qualified name in explicit this.
	// Much water has flown under the bridge. The grammar itself does not allow annotations in qualified name in explicit this.
	// We now use the production UnannotatableName instead of plain Name. 
	public void test043() throws Exception {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"   class Y {\n" +
			    "       class Z {\n" +
				"           Z(X. @Marker Y  Y.this) {\n" +
				"           }\n" +
				"       }\n" +
				"    }\n" +
				"}"
			}, 
			"----------\n" + 
			"1. ERROR in X.java (at line 4)\n" + 
			"	Z(X. @Marker Y  Y.this) {\n" + 
			"	      ^^^^^^\n" + 
			"Marker cannot be resolved to a type\n" + 
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383596 -- reject annotations on Qualified name in explicit constructor call -- super form
	public void test044() throws Exception {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"public class X {\n" +
						"	static X x;\n" +
						"	public class InnerBar {\n" +
						"	}\n" +
						"	public class SubInnerBar extends InnerBar {\n" +
						"		SubInnerBar() {\n" +
						"			X.@Marker x. @Marker @Marker @Marker x.super();\n" +
						"		}\n" +
						"	}\n" +
						"}\n"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 7)\n" + 
				"	X.@Marker x. @Marker @Marker @Marker x.super();\n" + 
				"	  ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 7)\n" + 
				"	X.@Marker x. @Marker @Marker @Marker x.super();\n" + 
				"	             ^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"3. WARNING in X.java (at line 7)\n" + 
				"	X.@Marker x. @Marker @Marker @Marker x.super();\n" + 
				"	                                     ^\n" + 
				"The static field X.x should be accessed in a static way\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383596 -- reject annotations on Qualified name in explicit constructor call, super form with explicit type arguments
	public void test045() throws Exception {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"public class X {\n" +
						"	static X x;\n" +
						"	public class InnerBar {\n" +
						"	}\n" +
						"	public class SubInnerBar extends InnerBar {\n" +
						"		SubInnerBar() {\n" +
						"			X.@Marker x. @Marker @Marker @Marker x.<String>super();\n" +
						"		}\n" +
						"	}\n" +
						"}\n"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 7)\n" + 
				"	X.@Marker x. @Marker @Marker @Marker x.<String>super();\n" + 
				"	  ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 7)\n" + 
				"	X.@Marker x. @Marker @Marker @Marker x.<String>super();\n" + 
				"	             ^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"3. WARNING in X.java (at line 7)\n" + 
				"	X.@Marker x. @Marker @Marker @Marker x.<String>super();\n" + 
				"	                                     ^\n" + 
				"The static field X.x should be accessed in a static way\n" + 
				"----------\n" + 
				"4. WARNING in X.java (at line 7)\n" + 
				"	X.@Marker x. @Marker @Marker @Marker x.<String>super();\n" + 
				"	                                        ^^^^^^\n" + 
				"Unused type arguments for the non generic constructor X.InnerBar() of type X.InnerBar; it should not be parameterized with arguments <String>\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383596 -- reject annotations on Qualified name in explicit constructor call - this form
	public void test046() throws Exception {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"public class X {\n" +
						"	Bar bar;\n" +
						"	class Bar {\n" +
						"		//static Bar x;\n" +
						"		public class InnerBar {\n" +
						"			InnerBar(Bar x) {\n" +
						"			}\n" +
						"		}\n" +
						"		public class SubInnerBar extends InnerBar {\n" +
						"			SubInnerBar() {\n" +
						"				X. @Marker bar.this();\n" +
						"			}\n" +
						"		}\n" +
						"	}\n" +
						"}\n"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 11)\n" + 
				"	X. @Marker bar.this();\n" + 
				"	^^^^^^^^^^^^^^\n" + 
				"Illegal enclosing instance specification for type X.Bar.SubInnerBar\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 11)\n" + 
				"	X. @Marker bar.this();\n" + 
				"	^^^^^^^^^^^^^^\n" + 
				"Cannot make a static reference to the non-static field X.bar\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 11)\n" + 
				"	X. @Marker bar.this();\n" + 
				"	   ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
					"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383596 -- reject annotations on Qualified name in explicit constructor call, this form with explicit type arguments
	public void test047() throws Exception {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"public class X {\n" +
						"	Bar bar;\n" +
						"	class Bar {\n" +
						"		//static Bar x;\n" +
						"		public class InnerBar {\n" +
						"			InnerBar(Bar x) {\n" +
						"			}\n" +
						"		}\n" +
						"		public class SubInnerBar extends InnerBar {\n" +
						"			SubInnerBar() {\n" +
						"				X.@Marker bar.<String>this();\n" +
						"			}\n" +
						"		}\n" +
						"	}\n" +
						"}\n"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 11)\n" + 
				"	X.@Marker bar.<String>this();\n" + 
				"	^^^^^^^^^^^^^\n" + 
				"Illegal enclosing instance specification for type X.Bar.SubInnerBar\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 11)\n" + 
				"	X.@Marker bar.<String>this();\n" + 
				"	^^^^^^^^^^^^^\n" + 
				"Cannot make a static reference to the non-static field X.bar\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 11)\n" + 
				"	X.@Marker bar.<String>this();\n" + 
				"	  ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"4. WARNING in X.java (at line 11)\n" + 
				"	X.@Marker bar.<String>this();\n" + 
				"	               ^^^^^^\n" + 
				"Unused type arguments for the non generic constructor X.Bar.SubInnerBar() of type X.Bar.SubInnerBar; it should not be parameterized with arguments <String>\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383596 -- reject annotations on Qualified name in PrimaryNoNewArray
	public void test048() throws Exception {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"public class X {\n" +
						"	X bar;\n" +
						"	private void foo(X x) {\n" +
						"		System.out.println((x. @Marker bar));\n" +
						"	}\n" +
						"}\n"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	System.out.println((x. @Marker bar));\n" + 
				"	                       ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383596 -- reject annotations in qualified this.
	public void test049() throws Exception {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"public class X {\n" +
						"	class Y {\n" +
						"		class Z {\n" +
						"			void foo() {\n" +
						"				Object o = X.@Marker Y.this; \n" +
						"			}\n" +
						"		}\n" +
						"	}\n" +
						"}\n"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 5)\n" + 
				"	Object o = X.@Marker Y.this; \n" + 
				"	             ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" +
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383596 -- reject annotations in qualified super.
	public void test050() throws Exception {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"public class X {\n" +
						"	public class Y  {\n" +
						"		public void foo() {\n" +
						"			X. @Marker Y.super.hashCode();\n" +
						"		}\n" +
						"	}\n" +
						"}\n"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	X. @Marker Y.super.hashCode();\n" + 
				"	   ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383596 -- reject annotations in Name.class
	public void test051() throws Exception {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"public class X {\n" +
						"	public class Y  {\n" +
						"		public void foo() {\n" +
						"			Class<?> c = X. @Marker @Illegal Y.class;\n" +
						"		}\n" +
						"	}\n" +
						"}\n"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	Class<?> c = X. @Marker @Illegal Y.class;\n" + 
				"	                ^^^^^^^^^^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383596 -- reject annotations in Name [].class.
	public void test052() throws Exception {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"public class X {\n" +
						"	public class Y  {\n" +
						"		public void foo() {\n" +
						"			Class<?> c = X. @Marker @Another Y @YetMore [].class;\n" +
						"		}\n" +
						"	}\n" +
						"}\n"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	Class<?> c = X. @Marker @Another Y @YetMore [].class;\n" + 
				"	                ^^^^^^^^^^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 4)\n" + 
				"	Class<?> c = X. @Marker @Another Y @YetMore [].class;\n" + 
				"	                                   ^^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383596 -- reject annotations in binary expressions with qualified names.
	public void test053() throws Exception {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"public class X {\n" +
						"    static int x;\n" +
						"    static boolean fb;\n" +
						"	 public void foo(boolean b) {\n" +
						"		x = (X.@Marker x * 10);\n" +
						"		x = (X.@Marker x / 10);\n" +
						"		x = (X.@Marker x % 10);\n" +
						"		x = (X.@Marker x + 10);\n" +
						"		x = (X.@Marker x - 10);\n" +
						"		x = (X.@Marker x << 10);\n" +
						"		x = (X.@Marker x >> 10);\n" +
						"		x = (X.@Marker x >>> 10);\n" +
						"		b = (X.@Marker x < 10);\n" +
						"		b = (X.@Marker x > 10);\n" +
						"		b = (X.@Marker x <= 10);\n" +
						"		b = (X.@Marker x >= 10);\n" +
						"		b = (X.@Marker x instanceof Object);\n" +
						"		b = (X.@Marker x == 10);\n" +
						"		b = (X.@Marker x != 10);\n" +
						"		x = (X.@Marker x & 10);\n" +
						"		x = (X.@Marker x ^ 10);\n" +
						"		x = (X.@Marker x | 10);\n" +
						"		fb = (X.@Marker fb && true);\n" +
						"		fb = (X.@Marker fb || true);\n" +
						"		x = (X.@Marker fb ? 10 : 10);\n" +
						"	 }\n" +
						"}\n"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 5)\n" + 
				"	x = (X.@Marker x * 10);\n" + 
				"	       ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 6)\n" + 
				"	x = (X.@Marker x / 10);\n" + 
				"	       ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 7)\n" + 
				"	x = (X.@Marker x % 10);\n" + 
				"	       ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 8)\n" + 
				"	x = (X.@Marker x + 10);\n" + 
				"	       ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"5. ERROR in X.java (at line 9)\n" + 
				"	x = (X.@Marker x - 10);\n" + 
				"	       ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"6. ERROR in X.java (at line 10)\n" + 
				"	x = (X.@Marker x << 10);\n" + 
				"	       ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"7. ERROR in X.java (at line 11)\n" + 
				"	x = (X.@Marker x >> 10);\n" + 
				"	       ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"8. ERROR in X.java (at line 12)\n" + 
				"	x = (X.@Marker x >>> 10);\n" + 
				"	       ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"9. ERROR in X.java (at line 13)\n" + 
				"	b = (X.@Marker x < 10);\n" + 
				"	       ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"10. ERROR in X.java (at line 14)\n" + 
				"	b = (X.@Marker x > 10);\n" + 
				"	       ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"11. ERROR in X.java (at line 15)\n" + 
				"	b = (X.@Marker x <= 10);\n" + 
				"	       ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"12. ERROR in X.java (at line 16)\n" + 
				"	b = (X.@Marker x >= 10);\n" + 
				"	       ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"13. ERROR in X.java (at line 17)\n" + 
				"	b = (X.@Marker x instanceof Object);\n" + 
				"	    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Incompatible conditional operand types int and Object\n" + 
				"----------\n" + 
				"14. ERROR in X.java (at line 17)\n" + 
				"	b = (X.@Marker x instanceof Object);\n" + 
				"	       ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"15. ERROR in X.java (at line 18)\n" + 
				"	b = (X.@Marker x == 10);\n" + 
				"	       ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"16. ERROR in X.java (at line 19)\n" + 
				"	b = (X.@Marker x != 10);\n" + 
				"	       ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"17. ERROR in X.java (at line 20)\n" + 
				"	x = (X.@Marker x & 10);\n" + 
				"	       ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"18. ERROR in X.java (at line 21)\n" + 
				"	x = (X.@Marker x ^ 10);\n" + 
				"	       ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"19. ERROR in X.java (at line 22)\n" + 
				"	x = (X.@Marker x | 10);\n" + 
				"	       ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"20. ERROR in X.java (at line 23)\n" + 
				"	fb = (X.@Marker fb && true);\n" + 
				"	        ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"21. ERROR in X.java (at line 24)\n" + 
				"	fb = (X.@Marker fb || true);\n" + 
				"	        ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"22. ERROR in X.java (at line 25)\n" + 
				"	x = (X.@Marker fb ? 10 : 10);\n" + 
				"	       ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n");
	}
	/* https://bugs.eclipse.org/bugs/show_bug.cgi?id=383596 -- reject annotations in annotations with qualified names.
	   This test is disabled. Now the grammar itself forbids annotations in the said place by using the production
	   AnnotationName ::= '@' UnannotatableName. We don't want to add tests that will be fragile and unstable due to 
	   syntax. If a construct is provably not parsed at the grammar level, that ought to be good enough.
	*/
	public void test054() throws Exception {
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383596 -- reject annotations in qualified names used as annotation values.
	public void test055() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"@interface Annot {\n" +
					"	String bar();\n" +
					"}\n" +
					"@Annot(bar = X. @Marker s)\n" +
					"public class X {\n" +
					"	final static String s = \"\";\n" +
					"}\n"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	@Annot(bar = X. @Marker s)\n" + 
				"	                ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383596 -- reject annotations in qualified names that are postfix expressions.
	public void test056() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"    static int x;\n" +
					"    int foo() {\n" +
					"        return X.@Marker x;\n" +
					"    }\n" +
					"}\n"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	return X.@Marker x;\n" + 
				"	         ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383596 -- reject annotations in qualified names used in array access.
	public void test057() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"    static int x[];\n" +
					"    int foo() {\n" +
					"        return X.@Marker x[0];\n" +
					"    }\n" +
					"}\n"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	return X.@Marker x[0];\n" + 
				"	         ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383596 -- reject annotations in qualified name with type arguments used in method invocation.
	public void test058() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"    static X x;\n" +
					"    int foo() {\n" +
					"        return X.@Marker x.<String> foo();\n" +
					"    }\n" +
					"}\n"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	return X.@Marker x.<String> foo();\n" + 
				"	         ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"2. WARNING in X.java (at line 4)\n" + 
				"	return X.@Marker 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");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383596 -- reject annotations in qualified name used in method invocation.
	public void test059() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"    static X x;\n" +
					"    int foo() {\n" +
					"        return X.@Marker x. @Blah foo();\n" +
					"    }\n" +
					"}\n"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	return X.@Marker x. @Blah foo();\n" + 
				"	         ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 4)\n" + 
				"	return X.@Marker x. @Blah foo();\n" + 
				"	                    ^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383596 -- reject annotations in qualified name used in class instance creation
	public void test060() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"    static Y y;\n" +
					"    class Y {\n" +
					"        class Z {\n" +
					"            void foo() {\n" +
					"                Z z = X. @Marker y.new Z();\n" +
					"            }\n" +
					"        }\n" +
					"    }\n" +
					"}\n"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 6)\n" + 
				"	Z z = X. @Marker y.new Z();\n" + 
				"	         ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=383596 -- reject annotations in qualified name used in class instance creation
	public void test061() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"    static X x;\n" +
					"    X getX() {\n" +
					"        return (X.@Marker x);\n" +
					"    }\n" +
					"}\n"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	return (X.@Marker x);\n" + 
				"	          ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n");
	}
	public void test062() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"	public <T> @Marker Object foo() {\n" +
					"	}\n" +
					"}\n" +
					"@interface Marker {\n" +
					"}\n"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 2)\n" + 
				"	public <T> @Marker Object foo() {\n" + 
				"	           ^^^^^^^\n" + 
				"Annotation types that do not specify explicit target element types cannot be applied here\n" + 
				"----------\n");
	}
	public void test063() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"	Object o = @Marker int.class;\n" +
					"}\n" +
					"@interface Marker {\n" +
					"}\n"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 2)\n" + 
				"	Object o = @Marker int.class;\n" + 
				"	           ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n");
	}
	public void test064() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"@interface X {\n" +
					"	<T> @Marker String foo();\n" +
					"}\n" +
					"@interface Marker {\n" +
					"}\n"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 2)\n" + 
				"	<T> @Marker String foo();\n" + 
				"	    ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 2)\n" + 
				"	<T> @Marker String foo();\n" + 
				"	                   ^^^^^\n" + 
				"Annotation attributes cannot be generic\n" + 
				"----------\n");
	}
	public void test065() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"	Object o = new <String> @Marker X();\n" +
					"}\n" +
					"@interface Marker {\n" +
					"}\n"
				}, 
				"----------\n" + 
				"1. WARNING in X.java (at line 2)\n" + 
				"	Object o = new <String> @Marker X();\n" + 
				"	                ^^^^^^\n" + 
				"Unused type arguments for the non generic constructor X() of type X; it should not be parameterized with arguments <String>\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 2)\n" + 
				"	Object o = new <String> @Marker X();\n" + 
				"	                        ^^^^^^^\n" + 
				"Annotation types that do not specify explicit target element types cannot be applied here\n" + 
				"----------\n");
	}
	public void test066() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"	Object o = new X().new <String> @Marker X();\n" +
					"}\n" +
					"@interface Marker {\n" +
					"}\n"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 2)\n" + 
				"	Object o = new X().new <String> @Marker X();\n" + 
				"	                                ^^^^^^^\n" + 
				"Annotation types that do not specify explicit target element types cannot be applied here\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 2)\n" + 
				"	Object o = new X().new <String> @Marker X();\n" + 
				"	                                ^^^^^^^^^\n" + 
				"X.X cannot be resolved to a type\n" + 
				"----------\n");
	}
	public void test067() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"	Object o = x.new <String> @Marker X() {};\n" +
					"}\n" +
					"@interface Marker {\n" +
					"}\n"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 2)\n" + 
				"	Object o = x.new <String> @Marker X() {};\n" + 
				"	           ^\n" + 
				"x cannot be resolved to a variable\n" + 
				"----------\n");
	}
	public void test068() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"	Object o = new <String> @Marker X() {};\n" +
					"}\n" +
					"@interface Marker {\n" +
					"}\n"
				}, 
				"----------\n" + 
				"1. WARNING in X.java (at line 2)\n" + 
				"	Object o = new <String> @Marker X() {};\n" + 
				"	                ^^^^^^\n" + 
				"Unused type arguments for the non generic constructor X() of type X; it should not be parameterized with arguments <String>\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 2)\n" + 
				"	Object o = new <String> @Marker X() {};\n" + 
				"	                        ^^^^^^^\n" + 
				"Annotation types that do not specify explicit target element types cannot be applied here\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=385293
	public void test069() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"class X<final T> {\n" +
					"	Object o = (Object) (public X<final String>) null;\n" + 
					"}\n"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 1)\n" + 
				"	class X<final T> {\n" + 
				"	        ^^^^^\n" + 
				"Syntax error on token \"final\", delete this token\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 2)\n" + 
				"	Object o = (Object) (public X<final String>) null;\n" + 
				"	                     ^^^^^^\n" + 
				"Syntax error on token \"public\", delete this token\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 2)\n" + 
				"	Object o = (Object) (public X<final String>) null;\n" + 
				"	                              ^^^^^\n" + 
				"Syntax error on token \"final\", delete this token\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=388085
	public void test0388085() {
		this.runNegativeTest(
				new String[] {"X.java",
						"class X {\n" +
						"	public void main() {\n" +
						"		final One<@Marker ? extends Two<@Marker ? super Three<? extends Four<@Marker ? super String, @Marker ? extends Object>>>> one = null;" +
						"		one = null;\n" +
						"	}\n" +
						"}\n" +
						"class One<R> {}\n" +
						"class Two<S> {}\n" +
						"class Three<T> {}\n" +
						"class Four<U, V> {}\n"},
							"----------\n" + 
							"1. ERROR in X.java (at line 3)\n" + 
							"	final One<@Marker ? extends Two<@Marker ? super Three<? extends Four<@Marker ? super String, @Marker ? extends Object>>>> one = null;		one = null;\n" + 
							"	           ^^^^^^\n" + 
							"Marker cannot be resolved to a type\n" + 
							"----------\n" + 
							"2. ERROR in X.java (at line 3)\n" + 
							"	final One<@Marker ? extends Two<@Marker ? super Three<? extends Four<@Marker ? super String, @Marker ? extends Object>>>> one = null;		one = null;\n" + 
							"	                                 ^^^^^^\n" + 
							"Marker cannot be resolved to a type\n" + 
							"----------\n" + 
							"3. ERROR in X.java (at line 3)\n" + 
							"	final One<@Marker ? extends Two<@Marker ? super Three<? extends Four<@Marker ? super String, @Marker ? extends Object>>>> one = null;		one = null;\n" + 
							"	                                                                      ^^^^^^\n" + 
							"Marker cannot be resolved to a type\n" + 
							"----------\n" + 
							"4. ERROR in X.java (at line 3)\n" + 
							"	final One<@Marker ? extends Two<@Marker ? super Three<? extends Four<@Marker ? super String, @Marker ? extends Object>>>> one = null;		one = null;\n" + 
							"	                                                                                              ^^^^^^\n" + 
							"Marker cannot be resolved to a type\n" + 
							"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=388085
	public void test0388085a() {
		this.runNegativeTest(
				new String[] {"X.java",
						"import java.lang.annotation.Target;\n" + 
						"import static java.lang.annotation.ElementType.*;\n" + 
						"class X {\n" +
						"	public void main() {\n" +
						"		final One<@Marker ? extends Two<@Marker ? super Three<? extends Four<@Marker ? super String, @Marker ? extends Object>>>> one = null;" +
						"		one = null;\n" +
						"	}\n" +
						"}\n" +
						"class One<R> {}\n" +
						"class Two<S> {}\n" +
						"class Three<T> {}\n" +
						"class Four<U, V> {}\n" +
						"@interface Marker {}"},
						"----------\n" + 
						"1. ERROR in X.java (at line 5)\n" + 
						"	final One<@Marker ? extends Two<@Marker ? super Three<? extends Four<@Marker ? super String, @Marker ? extends Object>>>> one = null;		one = null;\n" + 
						"	          ^^^^^^^\n" + 
						"Annotation types that do not specify explicit target element types cannot be applied here\n" + 
						"----------\n" + 
						"2. ERROR in X.java (at line 5)\n" + 
						"	final One<@Marker ? extends Two<@Marker ? super Three<? extends Four<@Marker ? super String, @Marker ? extends Object>>>> one = null;		one = null;\n" + 
						"	                                ^^^^^^^\n" + 
						"Annotation types that do not specify explicit target element types cannot be applied here\n" + 
						"----------\n" + 
						"3. ERROR in X.java (at line 5)\n" + 
						"	final One<@Marker ? extends Two<@Marker ? super Three<? extends Four<@Marker ? super String, @Marker ? extends Object>>>> one = null;		one = null;\n" + 
						"	                                                                     ^^^^^^^\n" + 
						"Annotation types that do not specify explicit target element types cannot be applied here\n" + 
						"----------\n" + 
						"4. ERROR in X.java (at line 5)\n" + 
						"	final One<@Marker ? extends Two<@Marker ? super Three<? extends Four<@Marker ? super String, @Marker ? extends Object>>>> one = null;		one = null;\n" + 
						"	                                                                                             ^^^^^^^\n" + 
						"Annotation types that do not specify explicit target element types cannot be applied here\n" + 
						"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=390882
	public void test0390882() {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"import java.lang.annotation.Target;\n" +
					"import static java.lang.annotation.ElementType.*;\n" +
					"public class X {    \n " +
					"	Object o1 = (@Marker java.lang.Integer) null;   // 1. Right.\n" +
					"	Object o2 = (java. @Marker lang.Integer) null;  // 2. Wrong.\n" +
					"	Object o3 = (java.lang. @Marker Integer) null;  // 3. Legal.\n" +
					"	public void foo(java. @Marker lang.Integer arg) {}\n" +
					"	public void bar(java.lang. @Marker Integer arg) {}\n" +
					"	public void foobar(@Marker java.lang.Integer arg) {}\n" +
					"}\n" +
					"@Target(TYPE_USE)\n" +
					"@interface Marker {}\n",

					"java/lang/annotation/ElementType.java",
					"package java.lang.annotation;\n" +
					"public enum ElementType {\n" +
					"    TYPE,\n" +
					"    FIELD,\n" +
					"    METHOD,\n" +
					"    PARAMETER,\n" +
					"    CONSTRUCTOR,\n" +
					"    LOCAL_VARIABLE,\n" +
					"    ANNOTATION_TYPE,\n" +
					"    PACKAGE,\n" +
					"    TYPE_PARAMETER,\n" +
					"    TYPE_USE\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	Object o1 = (@Marker java.lang.Integer) null;   // 1. Right.\n" + 
				"	             ^^^^^^^\n" + 
				"Illegally placed annotation: type annotations must directly precede the simple name of the type they are meant to affect (or the [] for arrays)\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 5)\n" + 
				"	Object o2 = (java. @Marker lang.Integer) null;  // 2. Wrong.\n" + 
				"	                   ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 7)\n" + 
				"	public void foo(java. @Marker lang.Integer arg) {}\n" + 
				"	                      ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 9)\n" + 
				"	public void foobar(@Marker java.lang.Integer arg) {}\n" + 
				"	                   ^^^^^^^\n" + 
				"Illegally placed annotation: type annotations must directly precede the simple name of the type they are meant to affect (or the [] for arrays)\n" + 
				"----------\n");
	}
	public void test0390882a() {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"import java.lang.annotation.Target;\n" +
					"import static java.lang.annotation.ElementType.*;\n" +
					"public class X {    \n " +
					"	Object o1 = (java. @Marker @Annot lang.Integer) null;  // 1. Wrong.\n" +
					"	Object o2 = (java.lang. @Marker @Annot Integer) null;  // 2. Legal\n" +
					"	Object o3 = (java.@lang lang) null;  // 3. Wrong.\n" +
					"}\n" +
					"@Target(TYPE_USE)\n" +
					"@interface Marker {}\n" +
					"@Target(TYPE_USE)\n" +
					"@interface Annot {}",

					"java/lang/annotation/ElementType.java",
					"package java.lang.annotation;\n" +
					"public enum ElementType {\n" +
					"    TYPE,\n" +
					"    FIELD,\n" +
					"    METHOD,\n" +
					"    PARAMETER,\n" +
					"    CONSTRUCTOR,\n" +
					"    LOCAL_VARIABLE,\n" +
					"    ANNOTATION_TYPE,\n" +
					"    PACKAGE,\n" +
					"    TYPE_PARAMETER,\n" +
					"    TYPE_USE\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	Object o1 = (java. @Marker @Annot lang.Integer) null;  // 1. Wrong.\n" + 
				"	                   ^^^^^^^^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 6)\n" + 
				"	Object o3 = (java.@lang lang) null;  // 3. Wrong.\n" + 
				"	             ^^^^^^^^^^^^^^^\n" + 
				"java.lang cannot be resolved to a type\n" + 
				"----------\n");
	}
	public void test0390882b() {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"import java.lang.annotation.Target;\n" +
					"import static java.lang.annotation.ElementType.*;\n" +
					"public class X {    \n " +
					"	Object o1 = (@Marker @Annot java.util.List<String>) null; 	// 1. Wrong.\n" +
					"	Object o2 = (java. @Marker @Annot lang.Integer[]) null;		// 2. Wrong.\n" +
					"	Object o3 = (@Marker @Annot java.util.List<String>[]) null; // 3. Wrong.\n" +
					"	Object o4 = (java.util.List<String> @Marker @Annot []) null; // 4. Right.\n" +
					"	Object o5 = (java.lang.Integer @Marker @Annot []) null;	// 5. Right.\n" +
					"}\n" +
					"@Target(TYPE_USE)\n" +
					"@interface Marker {}\n" +
					"@Target(TYPE_USE)\n" +
					"@interface Annot {}",

					"java/lang/annotation/ElementType.java",
					"package java.lang.annotation;\n" +
					"public enum ElementType {\n" +
					"    TYPE,\n" +
					"    FIELD,\n" +
					"    METHOD,\n" +
					"    PARAMETER,\n" +
					"    CONSTRUCTOR,\n" +
					"    LOCAL_VARIABLE,\n" +
					"    ANNOTATION_TYPE,\n" +
					"    PACKAGE,\n" +
					"    TYPE_PARAMETER,\n" +
					"    TYPE_USE\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	Object o1 = (@Marker @Annot java.util.List<String>) null; 	// 1. Wrong.\n" + 
				"	             ^^^^^^^\n" + 
				"Illegally placed annotation: type annotations must directly precede the simple name of the type they are meant to affect (or the [] for arrays)\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 4)\n" + 
				"	Object o1 = (@Marker @Annot java.util.List<String>) null; 	// 1. Wrong.\n" + 
				"	                     ^^^^^^\n" + 
				"Illegally placed annotation: type annotations must directly precede the simple name of the type they are meant to affect (or the [] for arrays)\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 5)\n" + 
				"	Object o2 = (java. @Marker @Annot lang.Integer[]) null;		// 2. Wrong.\n" + 
				"	                   ^^^^^^^^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 6)\n" + 
				"	Object o3 = (@Marker @Annot java.util.List<String>[]) null; // 3. Wrong.\n" + 
				"	             ^^^^^^^\n" + 
				"Illegally placed annotation: type annotations must directly precede the simple name of the type they are meant to affect (or the [] for arrays)\n" + 
				"----------\n" + 
				"5. ERROR in X.java (at line 6)\n" + 
				"	Object o3 = (@Marker @Annot java.util.List<String>[]) null; // 3. Wrong.\n" + 
				"	                     ^^^^^^\n" + 
				"Illegally placed annotation: type annotations must directly precede the simple name of the type they are meant to affect (or the [] for arrays)\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=385137
	public void test0385137() {
		this.runNegativeTest(
				new String[]{ "A.java",
				"package p;" +
				"import java.lang.annotation.Target;\n" + 
				"import static java.lang.annotation.ElementType.*;\n" + 
				"public class A<T> { \n" +
				"	static class B<T> {" +
				"		static class C<K, V> {" +
				"		}	" +
				"	}\n" +
				"   public void foo() {\n" +
				"		Object o = (@Marker @Annot A.@Marker B.@Marker C) null;\n" +
				"		Object o2 = (@Marker p.@Marker A.@Marker B.@Marker C) null;\n" +
				"   }\n" +
				"}\n" +
				"@Target(TYPE_USE)\n" + 
				"@interface Marker {}\n" +
				"@Target(TYPE_USE)\n" + 
				"@interface Annot {}\n",

				"java/lang/annotation/ElementType.java",
				"package java.lang.annotation;\n" +
				"public enum ElementType {\n" +
				"    TYPE,\n" +
				"    FIELD,\n" +
				"    METHOD,\n" +
				"    PARAMETER,\n" +
				"    CONSTRUCTOR,\n" +
				"    LOCAL_VARIABLE,\n" +
				"    ANNOTATION_TYPE,\n" +
				"    PACKAGE,\n" +
				"    TYPE_PARAMETER,\n" +
				"    TYPE_USE\n" +
				"}\n"},
					"----------\n" + 
					"1. ERROR in A.java (at line 6)\n" + 
					"	Object o = (@Marker @Annot A.@Marker B.@Marker C) null;\n" + 
					"	            ^^^^^^^^^^^^^^\n" + 
					"Type annotations are not allowed on type names used to access static members\n" + 
					"----------\n" + 
					"2. WARNING in A.java (at line 6)\n" + 
					"	Object o = (@Marker @Annot A.@Marker B.@Marker C) null;\n" + 
					"	            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
					"A.B.C is a raw type. References to generic type A.B.C<K,V> should be parameterized\n" + 
					"----------\n" + 
					"3. ERROR in A.java (at line 6)\n" + 
					"	Object o = (@Marker @Annot A.@Marker B.@Marker C) null;\n" + 
					"	                             ^^^^^^^\n" + 
					"Type annotations are not allowed on type names used to access static members\n" + 
					"----------\n" + 
					"4. ERROR in A.java (at line 7)\n" + 
					"	Object o2 = (@Marker p.@Marker A.@Marker B.@Marker C) null;\n" + 
					"	             ^^^^^^^\n" + 
					"Illegally placed annotation: type annotations must directly precede the simple name of the type they are meant to affect (or the [] for arrays)\n" + 
					"----------\n" + 
					"5. WARNING in A.java (at line 7)\n" + 
					"	Object o2 = (@Marker p.@Marker A.@Marker B.@Marker C) null;\n" + 
					"	             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
					"A.B.C is a raw type. References to generic type A.B.C<K,V> should be parameterized\n" + 
					"----------\n" + 
					"6. ERROR in A.java (at line 7)\n" + 
					"	Object o2 = (@Marker p.@Marker A.@Marker B.@Marker C) null;\n" + 
					"	                       ^^^^^^^\n" + 
					"Type annotations are not allowed on type names used to access static members\n" + 
					"----------\n" + 
					"7. ERROR in A.java (at line 7)\n" + 
					"	Object o2 = (@Marker p.@Marker A.@Marker B.@Marker C) null;\n" + 
					"	                                 ^^^^^^^\n" + 
					"Type annotations are not allowed on type names used to access static members\n" + 
					"----------\n");
	}
	public void test0385137a() {
		this.runNegativeTest(
				new String[]{"A.java",
				"package p;" +
				"import java.lang.annotation.Target;\n" + 
				"import static java.lang.annotation.ElementType.*;\n" + 
				"public class A { \n" +
				"	static class B<T> {" +
				"		static class C<K, V> {" +
				"		}	" +
				"	}\n" +
				"   public void foo() {\n" +
				"		Object o1 = (@Marker p.@Marker A.@Marker B.@Marker C[]) null;\n" +
				"		Object o2 = (@Marker @Annot A.@Annot B.C<Integer, String>) null;\n" +
				"		Object o5 = (@Marker @Annot A.B<String>[]) null;\n" +
				"   }\n" +
				"}\n" +
				"@Target(TYPE_USE)\n" + 
				"@interface Marker {}\n" +
				"@Target(TYPE_USE)\n" + 
				"@interface Annot {}\n",

				"java/lang/annotation/ElementType.java",
				"package java.lang.annotation;\n" +
				"public enum ElementType {\n" +
				"    TYPE,\n" +
				"    FIELD,\n" +
				"    METHOD,\n" +
				"    PARAMETER,\n" +
				"    CONSTRUCTOR,\n" +
				"    LOCAL_VARIABLE,\n" +
				"    ANNOTATION_TYPE,\n" +
				"    PACKAGE,\n" +
				"    TYPE_PARAMETER,\n" +
				"    TYPE_USE\n" +
				"}\n",
				},
				"----------\n" + 
					"1. ERROR in A.java (at line 6)\n" + 
					"	Object o1 = (@Marker p.@Marker A.@Marker B.@Marker C[]) null;\n" + 
					"	             ^^^^^^^\n" + 
					"Illegally placed annotation: type annotations must directly precede the simple name of the type they are meant to affect (or the [] for arrays)\n" + 
					"----------\n" + 
					"2. ERROR in A.java (at line 6)\n" + 
					"	Object o1 = (@Marker p.@Marker A.@Marker B.@Marker C[]) null;\n" + 
					"	                       ^^^^^^^\n" + 
					"Type annotations are not allowed on type names used to access static members\n" + 
					"----------\n" + 
					"3. ERROR in A.java (at line 6)\n" + 
					"	Object o1 = (@Marker p.@Marker A.@Marker B.@Marker C[]) null;\n" + 
					"	                                 ^^^^^^^\n" + 
					"Type annotations are not allowed on type names used to access static members\n" + 
					"----------\n" + 
					"4. ERROR in A.java (at line 7)\n" + 
					"	Object o2 = (@Marker @Annot A.@Annot B.C<Integer, String>) null;\n" + 
					"	             ^^^^^^^^^^^^^^\n" + 
					"Type annotations are not allowed on type names used to access static members\n" + 
					"----------\n" + 
					"5. ERROR in A.java (at line 7)\n" + 
					"	Object o2 = (@Marker @Annot A.@Annot B.C<Integer, String>) null;\n" + 
					"	                              ^^^^^^\n" + 
					"Type annotations are not allowed on type names used to access static members\n" + 
					"----------\n" + 
					"6. ERROR in A.java (at line 8)\n" + 
					"	Object o5 = (@Marker @Annot A.B<String>[]) null;\n" + 
					"	             ^^^^^^^^^^^^^^\n" + 
					"Type annotations are not allowed on type names used to access static members\n" + 
					"----------\n");
	}
	public void testBug391196() {
		this.runNegativeTest(
				new String[]{
					"p/Bug391196.java",
					"package p;\n" +
					"public class Bug391196 {\n" +
					"	@Marker\n" +
					"	public class X<@Marker @Marker2 T> {\n" +
					"		@Marker @Marker2 X(@Marker int i) {}\n" +
					"		@Unresolved X() {}\n" +
					"	}\n" +
					"	@Marker\n" +
					"	enum Color {RED, BLUE}\n" +
					"	@Marker\n" +
					"	interface Inter {}\n" +
					"@java.lang.annotation.Target (java.lang.annotation.ElementType.TYPE_USE)\n" +
					"@interface Marker {}\n" + 
					"@java.lang.annotation.Target (java.lang.annotation.ElementType.TYPE_USE)\n" +
					"@interface Marker2 {}\n" + 
					"}\n",
					"java/lang/annotation/ElementType.java",
					"package java.lang.annotation;\n" +
					"public enum ElementType {\n" +
					"    TYPE,\n" +
					"    FIELD,\n" +
					"    METHOD,\n" +
					"    PARAMETER,\n" +
					"    CONSTRUCTOR,\n" +
					"    LOCAL_VARIABLE,\n" +
					"    ANNOTATION_TYPE,\n" +
					"    PACKAGE,\n" +
					"    TYPE_PARAMETER,\n" +
					"    TYPE_USE\n" +
					"}\n",
				},
				"----------\n" + 
				"1. ERROR in p\\Bug391196.java (at line 6)\n" + 
				"	@Unresolved X() {}\n" + 
				"	 ^^^^^^^^^^\n" + 
				"Unresolved cannot be resolved to a type\n" + 
				"----------\n");
	}
	public void testBug391315() {
		this.runNegativeTest(
				new String[]{
				"X.java",
				"class X<T> {\n" +
				"	X<@Marker ?> l;\n" +
				"	X<@Marker2 ?> l2;\n" +
				"	X<@Marker3 ?> l3;\n" +
				"	class Y {\n" +
				"		void Y1(Y this) {}\n" +
				"	}\n" +
				"}\n" +
				"@java.lang.annotation.Target (java.lang.annotation.ElementType.TYPE_PARAMETER)\n" +
				"@interface Marker {}\n" +
				"@java.lang.annotation.Target (java.lang.annotation.ElementType.TYPE_USE)\n" +
				"@interface Marker2 {}\n" +
				"@interface Marker3 {}\n",
				"java/lang/annotation/ElementType.java",
				"package java.lang.annotation;\n" +
				"public enum ElementType {\n" +
				"    TYPE,\n" +
				"    FIELD,\n" +
				"    METHOD,\n" +
				"    PARAMETER,\n" +
				"    CONSTRUCTOR,\n" +
				"    LOCAL_VARIABLE,\n" +
				"    ANNOTATION_TYPE,\n" +
				"    PACKAGE,\n" +
				"    TYPE_PARAMETER,\n" +
				"    TYPE_USE\n" +
				"}\n"},
				"----------\n" + 
				"1. ERROR in X.java (at line 2)\n" + 
				"	X<@Marker ?> l;\n" + 
				"	  ^^^^^^^\n" + 
				"The annotation @Marker is disallowed for this location\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 4)\n" + 
				"	X<@Marker3 ?> l3;\n" + 
				"	  ^^^^^^^^\n" + 
				"Annotation types that do not specify explicit target element types cannot be applied here\n" + 
				"----------\n");
	}
	public void testBug391315a() {
		this.runNegativeTest(
				new String[]{
				"X.java",
				"public class X<@Marker T> {\n" +
				"	@Marker T t;\n" +
				"	T t2 = (@Marker T) null;\n" +
				"}\n" +
				"class X2<@Marker2 T> {\n" +
				"	@Marker2 T t;\n" +
				"	T t2 = (@Marker2 T) null;\n" +
				"}\n" +
				"@java.lang.annotation.Target (java.lang.annotation.ElementType.TYPE_USE)\n" +
				"@interface Marker {}\n" +
				"@java.lang.annotation.Target (java.lang.annotation.ElementType.TYPE_PARAMETER)\n" +
				"@interface Marker2 {}",
				"java/lang/annotation/ElementType.java",
				"package java.lang.annotation;\n" +
				"public enum ElementType {\n" +
				"    TYPE,\n" +
				"    FIELD,\n" +
				"    METHOD,\n" +
				"    PARAMETER,\n" +
				"    CONSTRUCTOR,\n" +
				"    LOCAL_VARIABLE,\n" +
				"    ANNOTATION_TYPE,\n" +
				"    PACKAGE,\n" +
				"    TYPE_PARAMETER,\n" +
				"    TYPE_USE\n" +
				"}\n"},
				"----------\n" + 
				"1. ERROR in X.java (at line 6)\n" + 
				"	@Marker2 T t;\n" + 
				"	^^^^^^^^\n" + 
				"The annotation @Marker2 is disallowed for this location\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 7)\n" + 
				"	T t2 = (@Marker2 T) null;\n" + 
				"	        ^^^^^^^^\n" + 
				"The annotation @Marker2 is disallowed for this location\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=391500
	public void testBug391500() {
		this.runNegativeTest(
				new String[]{
				"X.java",
				"public class X {\n" +
				"	class Y {\n" +
				"		class Z {\n" +
				"		}\n" +
				"		Z z1 = new @Marker X().new @Marker Y().new @Marker Z();\n" +
				"		Z z3 = new @Marker Z(){};\n" +
				"	};\n" +
				"}\n"},
				"----------\n" + 
				"1. ERROR in X.java (at line 5)\n" + 
				"	Z z1 = new @Marker X().new @Marker Y().new @Marker Z();\n" + 
				"	            ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 5)\n" + 
				"	Z z1 = new @Marker X().new @Marker Y().new @Marker Z();\n" + 
				"	                            ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 5)\n" + 
				"	Z z1 = new @Marker X().new @Marker Y().new @Marker Z();\n" + 
				"	                                            ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 6)\n" + 
				"	Z z3 = new @Marker Z(){};\n" + 
				"	            ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n");
	}
	public void testBug391464() {
		this.runNegativeTest(
				new String[]{
				"X.java",
				"public class X<T> {\n" +
				"	public void foo() {\n" +
				"		Object o = (X @Marker []) null;\n" +
				"		o = (java.lang.String @Marker []) null;\n" +
				"		o = (X<String> @Marker []) null;\n" +
				"		o = (java.util.List<String> @Marker []) null;\n" +
				"		if (o == null) return;\n" +
				"	}" +
				"}\n"},
				"----------\n" + 
				"1. ERROR in X.java (at line 3)\n" + 
				"	Object o = (X @Marker []) null;\n" + 
				"	               ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 4)\n" + 
				"	o = (java.lang.String @Marker []) null;\n" + 
				"	                       ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 5)\n" + 
				"	o = (X<String> @Marker []) null;\n" + 
				"	                ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 6)\n" + 
				"	o = (java.util.List<String> @Marker []) null;\n" + 
				"	                             ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n");
	}	
	public void testBug391464_2() {
		this.runNegativeTest(
				new String[]{
				"X.java",
				"public class X  {\n" +
				"	class Y {\n" +
				"		class Z {}\n" +
				"	}\n" +
				"	@M X.@M Y.@Unreported Z z = null;\n" +
				"}\n" +
				"@java.lang.annotation.Target (java.lang.annotation.ElementType.TYPE_USE)\n" +
				"@interface M {\n" +
				"}\n",
				
				"java/lang/annotation/ElementType.java",
				"package java.lang.annotation;\n" +
				"public enum ElementType {\n" +
				"    TYPE,\n" +
				"    FIELD,\n" +
				"    METHOD,\n" +
				"    PARAMETER,\n" +
				"    CONSTRUCTOR,\n" +
				"    LOCAL_VARIABLE,\n" +
				"    ANNOTATION_TYPE,\n" +
				"    PACKAGE,\n" +
				"    TYPE_PARAMETER,\n" +
				"    TYPE_USE\n" +
				"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 5)\n" + 
				"	@M X.@M Y.@Unreported Z z = null;\n" + 
				"	           ^^^^^^^^^^\n" + 
				"Unreported cannot be resolved to a type\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=391108
	public void testBug391108() {
		this.runNegativeTest(
				new String[]{
						"X.java",
						"public class X {\n" +
						"	@Marker @Marker2 @Marker3 public void foo() {}\n" +
						"	@Marker @Marker2 @Marker3 void foo2() {}\n" +
						"}\n" +
						"@java.lang.annotation.Target (java.lang.annotation.ElementType.TYPE_USE)\n" +
						"@interface Marker {}\n" +
						"@java.lang.annotation.Target (java.lang.annotation.ElementType.METHOD)\n" +
						"@interface Marker2 {}\n" +
						"@java.lang.annotation.Target ({java.lang.annotation.ElementType.TYPE_USE, java.lang.annotation.ElementType.METHOD})\n" +
						"@interface Marker3 {}",
						"java/lang/annotation/ElementType.java",
						"package java.lang.annotation;\n" +
						"public enum ElementType {\n" +
						"    TYPE,\n" +
						"    FIELD,\n" +
						"    METHOD,\n" +
						"    PARAMETER,\n" +
						"    CONSTRUCTOR,\n" +
						"    LOCAL_VARIABLE,\n" +
						"    ANNOTATION_TYPE,\n" +
						"    PACKAGE,\n" +
						"    TYPE_PARAMETER,\n" +
						"    TYPE_USE\n" +
						"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 2)\n" + 
				"	@Marker @Marker2 @Marker3 public void foo() {}\n" + 
				"	^^^^^^^\n" + 
				"Type annotation is illegal for a method that returns void\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 3)\n" + 
				"	@Marker @Marker2 @Marker3 void foo2() {}\n" + 
				"	^^^^^^^\n" + 
				"Type annotation is illegal for a method that returns void\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=392119
	public void test392119() throws Exception {
		this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"@Marker78 @Marker8 @Marker7\n" +
				"public class X {\n" +
				"    Zork z;\n" +
				"}\n" +
				"@java.lang.annotation.Target ({java.lang.annotation.ElementType.TYPE_USE, java.lang.annotation.ElementType.TYPE})\n" +
				"@interface Marker78 {\n" +
				"}\n" +
				"@java.lang.annotation.Target ({java.lang.annotation.ElementType.TYPE})\n" +
				"@interface Marker7 {\n" +
				"}\n" +
				"@java.lang.annotation.Target ({java.lang.annotation.ElementType.TYPE_USE})\n" +
				"@interface Marker8 {\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",
			null,
			true, // flush output
			null,
			true, // generate output
			false,
			false);
		String expectedOutput =
				"  RuntimeInvisibleAnnotations: \n" + 
				"    #24 @Marker78(\n" + 
				"    )\n" + 
				"    #25 @Marker8(\n" + 
				"    )\n" + 
				"    #26 @Marker7(\n" + 
				"    )\n" + 
				"  Attribute: MissingTypes Length: 4\n" + 
				"}";
		checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput, ClassFileBytesDisassembler.SYSTEM);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=392119, variant with explicit class file retention.
	public void test392119b() throws Exception {
		this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"@Marker78 @Marker8 @Marker7\n" +
				"public class X {\n" +
				"    Zork z;\n" +
				"}\n" +
				"@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS)\n" +
				"@java.lang.annotation.Target ({java.lang.annotation.ElementType.TYPE_USE, java.lang.annotation.ElementType.TYPE})\n" +
				"@interface Marker78 {\n" +
				"}\n" +
				"@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS)\n" +
				"@java.lang.annotation.Target ({java.lang.annotation.ElementType.TYPE})\n" +
				"@interface Marker7 {\n" +
				"}\n" +
				"@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS)\n" +
				"@java.lang.annotation.Target ({java.lang.annotation.ElementType.TYPE_USE})\n" +
				"@interface Marker8 {\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",
			null,
			true, // flush output
			null,
			true, // generate output
			false,
			false);
		String expectedOutput =
				"  RuntimeInvisibleAnnotations: \n" + 
				"    #24 @Marker78(\n" + 
				"    )\n" + 
				"    #25 @Marker8(\n" + 
				"    )\n" + 
				"    #26 @Marker7(\n" + 
				"    )\n" + 
				"  Attribute: MissingTypes Length: 4\n" + 
				"}";
		checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput, ClassFileBytesDisassembler.SYSTEM);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=392119, variant with explicit runtime retention.
	public void test392119c() throws Exception {
		this.runNegativeTest(
			new String[] {
				"X.java", //-----------------------------------------------------------------------
				"@Marker78 @Marker8 @Marker7\n" +
				"public class X {\n" +
				"    Zork z;\n" +
				"}\n" +
				"@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)\n" +
				"@java.lang.annotation.Target ({java.lang.annotation.ElementType.TYPE_USE, java.lang.annotation.ElementType.TYPE})\n" +
				"@interface Marker78 {\n" +
				"}\n" +
				"@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)\n" +
				"@java.lang.annotation.Target ({java.lang.annotation.ElementType.TYPE})\n" +
				"@interface Marker7 {\n" +
				"}\n" +
				"@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)\n" +
				"@java.lang.annotation.Target ({java.lang.annotation.ElementType.TYPE_USE})\n" +
				"@interface Marker8 {\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",
			null,
			true, // flush output
			null,
			true, // generate output
			false,
			false);
		String expectedOutput =
				"  RuntimeVisibleAnnotations: \n" + 
				"    #24 @Marker78(\n" + 
				"    )\n" + 
				"    #25 @Marker8(\n" + 
				"    )\n" + 
				"    #26 @Marker7(\n" + 
				"    )\n";
		checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput, ClassFileBytesDisassembler.SYSTEM);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=394355
	public void testBug394355() {
		this.runNegativeTest(
			new String[]{
				"X.java",
				"import java.lang.annotation.Target;\n" +
				"import static java.lang.annotation.ElementType.*;\n" +
				"public class X {\n" +
				"	public void foo(@Marker @Marker2 X this) {}\n" +
				"	class Y {\n" +
				"		Y(@Marker @Marker2 X X.this) {}\n" +
				"	}\n" +
				"}\n" +
				"@Target (java.lang.annotation.ElementType.TYPE_USE)\n" +
				"@interface Marker {}\n" +
				"@Target ({METHOD, PARAMETER, TYPE, PACKAGE, FIELD, CONSTRUCTOR, LOCAL_VARIABLE, TYPE_PARAMETER})\n" +
				"@interface Marker2 {}",
				"java/lang/annotation/ElementType.java",
				"package java.lang.annotation;\n" +
				"public enum ElementType {\n" +
				"    TYPE,\n" +
				"    FIELD,\n" +
				"    METHOD,\n" +
				"    PARAMETER,\n" +
				"    CONSTRUCTOR,\n" +
				"    LOCAL_VARIABLE,\n" +
				"    ANNOTATION_TYPE,\n" +
				"    PACKAGE,\n" +
				"    TYPE_PARAMETER,\n" +
				"    TYPE_USE\n" +
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 4)\n" + 
			"	public void foo(@Marker @Marker2 X this) {}\n" + 
			"	                        ^^^^^^^^\n" + 
			"The annotation @Marker2 is disallowed for this location\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 6)\n" + 
			"	Y(@Marker @Marker2 X X.this) {}\n" + 
			"	          ^^^^^^^^\n" + 
			"The annotation @Marker2 is disallowed for this location\n" + 
			"----------\n"); 
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=399453
	public void testBug399453() {
		this.runNegativeTest(
				new String[]{
					"X.java",
					"import java.lang.annotation.Target;\n" +
					"import static java.lang.annotation.ElementType.*;\n" +
					"public class X {\n" +
					"	public void foo() {\n" +
					"		int @Marker [][][] i = new @Marker2 int @Marker @Marker2 [2] @Marker @Marker2 [@Marker bar()] @Marker @Marker2 [];\n" +
					"		int @Marker [][][] j = new @Marker2 int @Marker @Marker2 [2] @Marker @Marker2 [@Marker X.bar2(2)] @Marker @Marker2 [];\n" +
					"	}\n" +
					"	public int bar() {\n" +
					"		return 2;\n" +
					"	}\n" +
					"	public static int bar2(int k) {\n" +
					"		return k;\n" + 
					"	}\n" +
					"}\n" +
					"@Target (java.lang.annotation.ElementType.TYPE_USE)\n" +
					"@interface Marker {}\n" +
					"@Target (java.lang.annotation.ElementType.TYPE_USE)\n" +
					"@interface Marker2 {}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 5)\n" + 
				"	int @Marker [][][] i = new @Marker2 int @Marker @Marker2 [2] @Marker @Marker2 [@Marker bar()] @Marker @Marker2 [];\n" + 
				"	                                                                               ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 6)\n" + 
				"	int @Marker [][][] j = new @Marker2 int @Marker @Marker2 [2] @Marker @Marker2 [@Marker X.bar2(2)] @Marker @Marker2 [];\n" + 
				"	                                                                               ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n"); 
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=399453
	public void testBug391894() {
		this.runNegativeTest(
				new String[]{
					"X.java",
					"import java.lang.annotation.Target;\n" +
					"import static java.lang.annotation.ElementType.*;\n" +
					"public class X {\n" +
					"	public void foo() {\n" +
					"		int @Marker [][][] i = new @Marker2 int @Marker @Marker2 [2] @Marker @Marker2 [@Marker bar()] ;\n" +
					"		int @Marker [] j = new @Marker2 int @Marker @Marker2 [2] @Marker @Marker2 [@Marker bar()] ;\n" +
					"	}\n" +
					"	public int bar() {\n" +
					"		return 2;\n" +
					"	}\n" +
					"}\n" +
					"@Target (java.lang.annotation.ElementType.TYPE_USE)\n" +
					"@interface Marker {}\n" +
					"@Target (java.lang.annotation.ElementType.TYPE_USE)\n" +
					"@interface Marker2 {}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 5)\n" + 
				"	int @Marker [][][] i = new @Marker2 int @Marker @Marker2 [2] @Marker @Marker2 [@Marker bar()] ;\n" + 
				"	                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Type mismatch: cannot convert from int[][] to int[][][]\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 5)\n" + 
				"	int @Marker [][][] i = new @Marker2 int @Marker @Marker2 [2] @Marker @Marker2 [@Marker bar()] ;\n" + 
				"	                                                                               ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 6)\n" + 
				"	int @Marker [] j = new @Marker2 int @Marker @Marker2 [2] @Marker @Marker2 [@Marker bar()] ;\n" + 
				"	                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Type mismatch: cannot convert from int[][] to int[]\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 6)\n" + 
				"	int @Marker [] j = new @Marker2 int @Marker @Marker2 [2] @Marker @Marker2 [@Marker bar()] ;\n" + 
				"	                                                                           ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n"); 
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=402618, [1.8][compiler] Compiler fails to resolve type annotations on method/constructor references
	public void test402618() {
		this.runNegativeTest(
				new String[]{
					"X.java",
					"import java.util.List;\n" +
					"interface I {\n" +
					"	void foo(List<String> l);\n" +
					"}\n" +
					"\n" +
					"public class X {\n" +
					"	public void main(String[] args) {\n" +
					"		I i = @Readonly List<@English String>::<@NonNegative Integer>size;\n" +
					"	}\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 8)\n" + 
				"	I i = @Readonly List<@English String>::<@NonNegative Integer>size;\n" + 
				"	       ^^^^^^^^\n" + 
				"Readonly cannot be resolved to a type\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 8)\n" + 
				"	I i = @Readonly List<@English String>::<@NonNegative Integer>size;\n" + 
				"	                      ^^^^^^^\n" + 
				"English cannot be resolved to a type\n" + 
				"----------\n" + 
				"3. WARNING in X.java (at line 8)\n" + 
				"	I i = @Readonly List<@English String>::<@NonNegative Integer>size;\n" + 
				"	                                        ^^^^^^^^^^^^^^^^^^^^\n" + 
				"Unused type arguments for the non generic method size() of type List<String>; it should not be parameterized with arguments <Integer>\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 8)\n" + 
				"	I i = @Readonly List<@English String>::<@NonNegative Integer>size;\n" + 
				"	                                         ^^^^^^^^^^^\n" + 
				"NonNegative cannot be resolved to a type\n" + 
				"----------\n"); 
		}
	public void testBug403132() {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"	class Y {\n" +
					"		class Z {\n" +
					"			public Z (@A X.@B Y Y.this, String str) {}\n" +
					"    	 	public void foo (@A X.@B Y.@C Z this, String str) {}\n" +
					"		}\n" +
					"    }\n" +
					"}\n"
				}, 
				"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	public Z (@A X.@B Y Y.this, String str) {}\n" + 
				"	           ^\n" + 
				"A cannot be resolved to a type\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 4)\n" + 
				"	public Z (@A X.@B Y Y.this, String str) {}\n" + 
				"	                ^\n" + 
				"B cannot be resolved to a type\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 5)\n" + 
				"	public void foo (@A X.@B Y.@C Z this, String str) {}\n" + 
				"	                  ^\n" + 
				"A cannot be resolved to a type\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 5)\n" + 
				"	public void foo (@A X.@B Y.@C Z this, String str) {}\n" + 
				"	                       ^\n" + 
				"B cannot be resolved to a type\n" + 
				"----------\n" + 
				"5. ERROR in X.java (at line 5)\n" + 
				"	public void foo (@A X.@B Y.@C Z this, String str) {}\n" + 
				"	                            ^\n" + 
				"C cannot be resolved to a type\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=403410
	public void testBug403410() {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"import java.lang.annotation.Target;\n" +
					"import static java.lang.annotation.ElementType.*;\n" +
					"@Target (java.lang.annotation.ElementType.TYPE_USE)\n" +
					"@interface A {}\n" +
					"public class X {\n" +
					"	class Y {\n" +
					"		public Y (final @A X X.this) {}\n" +
					"		public Y (static @A X X.this, int i) {}\n" +
					"		public void foo(final @A Y this) {}\n" +
					"		public void foo(static @A Y this, int i) {}\n" +
					"}\n}"},
					"----------\n" + 
					"1. ERROR in X.java (at line 7)\n" + 
					"	public Y (final @A X X.this) {}\n" + 
					"	          ^^^^^^^^^^^^^^^^^\n" + 
					"Syntax error, modifiers are not allowed here\n" + 
					"----------\n" +
					"2. ERROR in X.java (at line 8)\n" + 
					"	public Y (static @A X X.this, int i) {}\n" + 
					"	          ^^^^^^^^^^^^^^^^^^\n" + 
					"Syntax error, modifiers are not allowed here\n" + 
					"----------\n" + 
					"3. ERROR in X.java (at line 9)\n" + 
					"	public void foo(final @A Y this) {}\n" + 
					"	                ^^^^^^^^^^^^^^^\n" + 
					"Syntax error, modifiers are not allowed here\n" + 
					"----------\n" + 
					"4. ERROR in X.java (at line 10)\n" + 
					"	public void foo(static @A Y this, int i) {}\n" + 
					"	                ^^^^^^^^^^^^^^^^\n" + 
					"Syntax error, modifiers are not allowed here\n" + 
					"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=403581,  [1.8][compiler] Compile error on varargs annotations.
	public void test403581() {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"import java.util.List;\n" +
					"public class X {\n" +
					"	void foo(List<String> @Marker ... ls) {}\n" +
					"}\n" +
					"@java.lang.annotation.Target(java.lang.annotation.ElementType.TYPE_USE)\n" +
					"@interface Marker {\n" +
					"}\n"
				},
				"----------\n" + 
				"1. WARNING in X.java (at line 3)\n" + 
				"	void foo(List<String> @Marker ... ls) {}\n" + 
				"	                                  ^^\n" + 
				"Type safety: Potential heap pollution via varargs parameter ls\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=392671, [1.8][recovery] NPE with a method with explicit this and a following incomplete parameter
	public void test392671() {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"class X {\n" +
					"    public void foobar(X this, int, int k) {} // NPE!\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 1)\n" + 
				"	class X {\n" + 
				"	        ^\n" + 
				"Syntax error, insert \"}\" to complete ClassBody\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 2)\n" + 
				"	public void foobar(X this, int, int k) {} // NPE!\n" + 
				"	                           ^^^\n" + 
				"Syntax error, insert \"... VariableDeclaratorId\" to complete FormalParameter\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 3)\n" + 
				"	}\n" + 
				"	^\n" + 
				"Syntax error on token \"}\", delete this token\n" + 
				"----------\n");
	}
	// [1.8][compiler] Missing expected error for incorrect placement of type annotation (https://bugs.eclipse.org/bugs/show_bug.cgi?id=406587)
	public void test406587() {
		this.runNegativeTest(
				new String[] {
					"p/X.java",
					"package p;\n" +
					"import java.lang.annotation.*;\n" +
					"public class X {\n" +
					"	@B(1) @A(1) String field1;\n" +
					"	@B @A X.Y field3;\n" +
					"	@A @B p.X.Y field4;\n" +
					"	@B(1) @A(1) java.lang.@A(1) @B(1) String field2;\n" +
					"	public @B(1) @A(1) java.lang. @A(1) @B(1)  String foo(@A(1) @B(1) java.lang. @A(1) @B(1) String str1) {\n" +
					"		@A(1) @B(1)  String local1;\n" +
					"		@A(1) @B(1) java.lang.  @B(1) @A(1) String local2;\n" +
					"		@B @A X.Y local3;\n" +
					"		@B @A p.X.Y local4;\n" +
					"		@B @A p.q.X local5;\n" +
					"		return null;\n" +
					"	}\n" +
					"	class Y {}" +
					"}\n" +
					"@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER, ElementType.LOCAL_VARIABLE})\n" +
					"@interface A {\n" +
					"	int value() default -1;\n" +
					"}\n" +
					"@Target(ElementType.TYPE_USE)\n" +
					"@interface B {\n" +
					"	int value() default -1;\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in p\\X.java (at line 6)\n" + 
				"	@A @B p.X.Y field4;\n" + 
				"	   ^^\n" + 
				"Illegally placed annotation: type annotations must directly precede the simple name of the type they are meant to affect (or the [] for arrays)\n" + 
				"----------\n" + 
				"2. ERROR in p\\X.java (at line 7)\n" + 
				"	@B(1) @A(1) java.lang.@A(1) @B(1) String field2;\n" + 
				"	^^\n" + 
				"Illegally placed annotation: type annotations must directly precede the simple name of the type they are meant to affect (or the [] for arrays)\n" + 
				"----------\n" + 
				"3. ERROR in p\\X.java (at line 7)\n" + 
				"	@B(1) @A(1) java.lang.@A(1) @B(1) String field2;\n" + 
				"	                      ^^\n" + 
				"The annotation @A is disallowed for this location\n" + 
				"----------\n" + 
				"4. ERROR in p\\X.java (at line 8)\n" + 
				"	public @B(1) @A(1) java.lang. @A(1) @B(1)  String foo(@A(1) @B(1) java.lang. @A(1) @B(1) String str1) {\n" + 
				"	       ^^\n" + 
				"Illegally placed annotation: type annotations must directly precede the simple name of the type they are meant to affect (or the [] for arrays)\n" + 
				"----------\n" + 
				"5. ERROR in p\\X.java (at line 8)\n" + 
				"	public @B(1) @A(1) java.lang. @A(1) @B(1)  String foo(@A(1) @B(1) java.lang. @A(1) @B(1) String str1) {\n" + 
				"	                              ^^\n" + 
				"The annotation @A is disallowed for this location\n" + 
				"----------\n" + 
				"6. ERROR in p\\X.java (at line 8)\n" + 
				"	public @B(1) @A(1) java.lang. @A(1) @B(1)  String foo(@A(1) @B(1) java.lang. @A(1) @B(1) String str1) {\n" + 
				"	                                                            ^^\n" + 
				"Illegally placed annotation: type annotations must directly precede the simple name of the type they are meant to affect (or the [] for arrays)\n" + 
				"----------\n" + 
				"7. ERROR in p\\X.java (at line 8)\n" + 
				"	public @B(1) @A(1) java.lang. @A(1) @B(1)  String foo(@A(1) @B(1) java.lang. @A(1) @B(1) String str1) {\n" + 
				"	                                                                             ^^\n" + 
				"The annotation @A is disallowed for this location\n" + 
				"----------\n" + 
				"8. ERROR in p\\X.java (at line 10)\n" + 
				"	@A(1) @B(1) java.lang.  @B(1) @A(1) String local2;\n" + 
				"	      ^^\n" + 
				"Illegally placed annotation: type annotations must directly precede the simple name of the type they are meant to affect (or the [] for arrays)\n" + 
				"----------\n" + 
				"9. ERROR in p\\X.java (at line 10)\n" + 
				"	@A(1) @B(1) java.lang.  @B(1) @A(1) String local2;\n" + 
				"	                              ^^\n" + 
				"The annotation @A is disallowed for this location\n" + 
				"----------\n" + 
				"10. ERROR in p\\X.java (at line 12)\n" + 
				"	@B @A p.X.Y local4;\n" + 
				"	^^\n" + 
				"Illegally placed annotation: type annotations must directly precede the simple name of the type they are meant to affect (or the [] for arrays)\n" + 
				"----------\n" + 
				"11. ERROR in p\\X.java (at line 13)\n" + 
				"	@B @A p.q.X local5;\n" + 
				"	      ^^^\n" + 
				"p.q cannot be resolved to a type\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=417076, Eclipse compiler rejects multiple annotations for varargs.
	public void test417076() {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"import java.lang.annotation.ElementType;\n" +
					"import java.lang.annotation.Target;\n" +
					"@Target(ElementType.TYPE_USE)\n" +
					"@interface A {\n" +
					"}\n" +
					"@Target(ElementType.TYPE_USE)\n" +
					"@interface B {\n" +
					"}\n" +
					"@Target(ElementType.TYPE_USE)\n" +
					"@interface C {\n" +
					"}\n" +
					"public class X {\n" +
					"	public @A String foo(int @B @C @D ... args) {\n" +
					"	      return null;\n" +
					"	}\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 13)\n" + 
				"	public @A String foo(int @B @C @D ... args) {\n" + 
				"	                                ^\n" + 
				"D cannot be resolved to a type\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=417076, Eclipse compiler rejects multiple annotations for varargs.
	public void test417076b() {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"import java.lang.annotation.ElementType;\n" +
					"import java.lang.annotation.Target;\n" +
					"@Target(ElementType.TYPE_USE)\n" +
					"@interface A {\n" +
					"}\n" +
					"@Target(ElementType.TYPE_USE)\n" +
					"@interface B {\n" +
					"}\n" +
					"@Target(ElementType.TYPE_USE)\n" +
					"@interface C {\n" +
					"}\n" +
					"public class X {\n" +
					"	public @A String foo(int @B @C @A ... args) {\n" +
					"	      return null;\n" +
					"	}\n" +
					"	public @A String goo(int @B @C @A ... args) {\n" +
					"	}\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 16)\n" + 
				"	public @A String goo(int @B @C @A ... args) {\n" + 
				"	                 ^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"This method must return a result of type String\n" + 
				"----------\n");
	}
	// [1.8][compiler] Illegal type annotations not rejected (https://bugs.eclipse.org/bugs/show_bug.cgi?id=415308)
	// This is the basic test case which demonstrated the issue for a local variable.
	// We correctly identified the problem in function bar but failed to do so for foo.
	public void test415308a() {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"import java.lang.annotation.ElementType;\n" +
					"import java.lang.annotation.Target;\n" +
					"\n" +
					"@Target(ElementType.TYPE_USE)\n" +
					"@interface Illegal {\n" +
					"}\n" +
					"class Y {\n" +
					"	static class Z {\n" +
					"		Z() {}\n" +
					"	}\n" +
					"}\n" +
					"class X {\n" +
					"	Y.Z foo() {\n" +
					"		@Illegal Y.Z z = null;\n" +
					"		return z;\n" +
					"	}\n" +
					"	Y.Z bar() {\n" +
					"		Y.Z z = (@Illegal Y.Z)null;\n" +
					"		return z;\n" +
					"	}\n" +
					"}\n"
				},
				"----------\n" +
				"1. ERROR in X.java (at line 14)\n" +
				"	@Illegal Y.Z z = null;\n" +
				"	^^^^^^^^\n" +
				"Type annotations are not allowed on type names used to access static members\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 18)\n" +
				"	Y.Z z = (@Illegal Y.Z)null;\n" +
				"	         ^^^^^^^^\n" +
				"Type annotations are not allowed on type names used to access static members\n" +
				"----------\n");
	}
	// [1.8][compiler] Illegal type annotations not rejected (https://bugs.eclipse.org/bugs/show_bug.cgi?id=415308)
	// This test case is similar to test415308a. SimpleTypes on which annotations are applied are modified to array
	// types.
	public void test415308a2() {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"import java.lang.annotation.ElementType;\n" +
						"import java.lang.annotation.Target;\n" +
						"\n" +
						"@Target(ElementType.TYPE_USE)\n" +
						"@interface Illegal {\n" +
						"}\n" +
						"class Y {\n" +
						"	static class Z {\n" +
						"		Z() {}\n" +
						"	}\n" +
						"}\n" +
						"class X {\n" +
						"	Y.Z[] foo() {\n" +
						"		@Illegal Y.Z[] z = null;\n" +
						"		return z;\n" +
						"	}\n" +
						"	Y.Z[] bar() {\n" +
						"		Y.Z[] z = (@Illegal Y.Z[])null;\n" +
						"		return z;\n" +
						"	}\n" +
						"}\n"
				},
				"----------\n" +
				"1. ERROR in X.java (at line 14)\n" +
				"	@Illegal Y.Z[] z = null;\n" +
				"	^^^^^^^^\n" +
				"Type annotations are not allowed on type names used to access static members\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 18)\n" +
				"	Y.Z[] z = (@Illegal Y.Z[])null;\n" +
				"	           ^^^^^^^^\n" +
				"Type annotations are not allowed on type names used to access static members\n" +
				"----------\n");
	}
	// [1.8][compiler] Illegal type annotations not rejected (https://bugs.eclipse.org/bugs/show_bug.cgi?id=415308)
	// Testing type use annotations on nested types.
	// We check all the qualifiers as we look for a static type. This test checks if we are able to
	// go beyond 1 level as part of the loop.
	public void test415308b() {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"import java.lang.annotation.ElementType;\n" +
						"import java.lang.annotation.Target;\n" +
						"\n" +
						"@Target(ElementType.TYPE_USE)\n" +
						"@interface Illegal {\n" +
						"}\n" +
						"class Y {\n" +
						"	static class YY {\n" +
						"		class Z {\n" +
						"			Z() {}\n" +
						"		}\n" +
						"	}\n" +
						"}\n" +
						"class X {\n" +
						"	Y.YY.Z foo() {\n" +
						"		@Illegal Y.YY.Z z = null;\n" +
						"		return z;\n" +
						"	}\n" +
						"	Y.YY.Z foo2() {\n" +
						"		Y.@Illegal YY.Z z = null;\n" +
						"		return z;\n" +
						"	}\n" +
						"	Y.YY.Z foo3() {\n" +
						"		Y.YY.@Illegal Z z = null;\n" +
						"		return z;\n" +
						"	}\n" +
						"}\n"
				},
				"----------\n" +
				"1. ERROR in X.java (at line 16)\n" +
				"	@Illegal Y.YY.Z z = null;\n" +
				"	^^^^^^^^\n" +
				"Type annotations are not allowed on type names used to access static members\n" +
				"----------\n");
	}
	// [1.8][compiler] Illegal type annotations not rejected (https://bugs.eclipse.org/bugs/show_bug.cgi?id=415308)
	// This test case is similar to test415308a. SimpleTypes on which annotations are applied are modified to array
	// types.
	public void test415308b2() {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"import java.lang.annotation.ElementType;\n" +
						"import java.lang.annotation.Target;\n" +
						"\n" +
						"@Target(ElementType.TYPE_USE)\n" +
						"@interface Illegal {\n" +
						"}\n" +
						"class Y {\n" +
						"	static class YY {\n" +
						"		class Z {\n" +
						"			Z() {}\n" +
						"		}\n" +
						"	}\n" +
						"}\n" +
						"class X {\n" +
						"	Y.YY.Z[] foo() {\n" +
						"		@Illegal Y.YY.Z[] z = null;\n" +
						"		return z;\n" +
						"	}\n" +
						"	Y.YY.Z[] foo2() {\n" +
						"		Y.@Illegal YY.Z[] z = null;\n" +
						"		return z;\n" +
						"	}\n" +
						"	Y.YY.Z[] foo3() {\n" +
						"		Y.YY.@Illegal Z[] z = null;\n" +
						"		return z;\n" +
						"	}\n" +
						"}\n"
				},
				"----------\n" +
				"1. ERROR in X.java (at line 16)\n" +
				"	@Illegal Y.YY.Z[] z = null;\n" +
				"	^^^^^^^^\n" +
				"Type annotations are not allowed on type names used to access static members\n" +
				"----------\n");
	}
	// [1.8][compiler] Illegal type annotations not rejected (https://bugs.eclipse.org/bugs/show_bug.cgi?id=415308)
	// The test case is to validate that we report errors for only type annotations and nothing else in case of
	// of parameter types.
	public void test415308c() {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"import java.lang.annotation.ElementType;\n" +
						"import java.lang.annotation.Target;\n" +
						"\n" +
						"@Target(ElementType.TYPE_USE)\n" +
						"@interface IllegalTypeUse {\n" +
						"}\n" +
						"@Target({ElementType.TYPE_USE, ElementType.PARAMETER})\n" +
						"@interface LegalTypeUseParam {\n" +
						"}\n" +
						"@Target(ElementType.PARAMETER)\n" +
						"@interface LegalParam {\n" +
						"}\n" +
						"class Y {\n" +
						"	static class Z {\n" +
						"		Z() {}\n" +
						"	}\n" +
						"}\n" +
						"class X {\n" +
						"	Y.Z foo(@LegalParam Y.Z z) { //Legal\n" +
						"		return z;\n" +
						"	}\n" +
						"	Y.Z foo2(@LegalTypeUseParam Y.Z z) { //Legal\n" +
						"		return z;\n" +
						"	}\n" +
						"	Y.Z foo3(@IllegalTypeUse @LegalParam Y.Z z) { //Illegal\n" +
						"		return z;\n" +
						"	}\n" +
						"}\n"
				},
				"----------\n" +
				"1. ERROR in X.java (at line 25)\n" +
				"	Y.Z foo3(@IllegalTypeUse @LegalParam Y.Z z) { //Illegal\n" +
				"	         ^^^^^^^^^^^^^^^\n" +
				"Type annotations are not allowed on type names used to access static members\n" +
				"----------\n");
	}
	//[1.8][compiler] Illegal type annotations not rejected (https://bugs.eclipse.org/bugs/show_bug.cgi?id=415308)
	//The test case is to validate type use annotation for class fields.
	public void test415308d() {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"import java.lang.annotation.ElementType;\n" +
						"import java.lang.annotation.Target;\n" +
						"\n" +
						"@Target(ElementType.TYPE_USE)\n" +
						"@interface Illegal {\n" +
						"}\n" +
						"class Y {\n" +
						"	static class Z {\n" +
						"		Z() {}\n" +
						"	}\n" +
						"}\n" +
						"class X {\n" +
						"   @Illegal \n" +
						"	Y.Z z;\n" +
						"}\n"
				},
				"----------\n" +
				"1. ERROR in X.java (at line 13)\n" +
				"	@Illegal \n" +
				"	^^^^^^^^\n" +
				"Type annotations are not allowed on type names used to access static members\n" +
				"----------\n");
	}
	//[1.8][compiler] Illegal type annotations not rejected (https://bugs.eclipse.org/bugs/show_bug.cgi?id=415308)
	//The test case checks for annotations which are not exclusively TYPE_USE. We should not report a error.
	public void test415308d2() {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"import java.lang.annotation.ElementType;\n" +
						"import java.lang.annotation.Target;\n" +
						"\n" +
						"@Target({ElementType.TYPE_USE, ElementType.FIELD})\n" +
						"@interface Legal {\n" +
						"}\n" +
						"class Y {\n" +
						"	static class Z {\n" +
						"		Z() {}\n" +
						"	}\n" +
						"}\n" +
						"class X {\n" +
						"   @Legal \n" +
						"	Y.Z z;\n" +
						"}\n"
				},
				"");
	}
	//[1.8][compiler] Illegal type annotations not rejected (https://bugs.eclipse.org/bugs/show_bug.cgi?id=415308)
	//The test case is to validate type use annotation for class fields.
	//We check all the qualifiers as we look for a static type. This test checks if we are able to
	//go beyond 1 level as part of the loop.
	public void test415308e() {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"import java.lang.annotation.ElementType;\n" +
						"import java.lang.annotation.Target;\n" +
						"\n" +
						"@Target(ElementType.TYPE_USE)\n" +
						"@interface Illegal {\n" +
						"}\n" +
						"@Target(ElementType.TYPE_USE)\n" +
						"@interface Illegal2 {\n" +
						"}\n" +
						"@Target(ElementType.FIELD)\n" +
						"@interface Legal {\n" +
						"}\n" +
						"class Y {\n" +
						"	static class YY {\n" +
						"		class Z {\n" +
						"			Z() {}\n" +
						"		}\n" +
						"	}\n" +
						"}\n" +
						"class X {\n" +
						"   @Legal @Illegal @Illegal2\n" +
						"	Y.YY.Z z;\n" +
						"}\n"
				},
				"----------\n" +
				"1. ERROR in X.java (at line 21)\n" +
				"	@Legal @Illegal @Illegal2\n" +
				"	       ^^^^^^^^\n" +
				"Type annotations are not allowed on type names used to access static members\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 21)\n" +
				"	@Legal @Illegal @Illegal2\n" +
				"	                ^^^^^^^^^\n" +
				"Type annotations are not allowed on type names used to access static members\n" +
				"----------\n");
	}
	// [1.8][compiler] Illegal type annotations not rejected (https://bugs.eclipse.org/bugs/show_bug.cgi?id=415308)
	// The test case is to validate type use annotations on return types for methods.
	public void test415308f() {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"import java.lang.annotation.ElementType;\n" +
						"import java.lang.annotation.Target;\n" +
						"\n" +
						"@Target(ElementType.TYPE_USE)\n" +
						"@interface Illegal {\n" +
						"}\n" +
						"class Y {\n" +
						"	static class Z {\n" +
						"		Z() {}\n" +
						"	}\n" +
						"}\n" +
						"class X {\n" +
						"   public @Illegal Y.Z foo() { return null;}\n" +
						"}\n"
				},
				"----------\n" +
				"1. ERROR in X.java (at line 13)\n" +
				"	public @Illegal Y.Z foo() { return null;}\n" +
				"	       ^^^^^^^^\n" +
				"Type annotations are not allowed on type names used to access static members\n" +
				"----------\n");
	}
	// [1.8][compiler] Illegal type annotations not rejected (https://bugs.eclipse.org/bugs/show_bug.cgi?id=415308)
	// The test case is a array version of test415308f.
	public void test415308f2() {
		this.runNegativeTest(
				new String[] {
						"X.java",
						"import java.lang.annotation.ElementType;\n" +
						"import java.lang.annotation.Target;\n" +
						"\n" +
						"@Target(ElementType.TYPE_USE)\n" +
						"@interface Illegal {\n" +
						"}\n" +
						"class Y {\n" +
						"	static class Z {\n" +
						"		Z() {}\n" +
						"	}\n" +
						"}\n" +
						"class X {\n" +
						"   public @Illegal Y.Z[] foo() { return null;}\n" +
						"}\n"
				},
				"----------\n" +
				"1. ERROR in X.java (at line 13)\n" +
				"	public @Illegal Y.Z[] foo() { return null;}\n" +
				"	       ^^^^^^^^\n" +
				"Type annotations are not allowed on type names used to access static members\n" +
				"----------\n");
	}
	// [1.8][compiler] Illegal type annotations not rejected (https://bugs.eclipse.org/bugs/show_bug.cgi?id=415308)
	// The test case is used to test enums with type annotations.
	public void test415308g() {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"import java.lang.annotation.ElementType;\n" +
					"import java.lang.annotation.Target;\n" +
					"\n" +
					"@Target(ElementType.TYPE_USE)\n" +
					"@interface Illegal {\n" +
					"}\n" +
					"class Y {\n" +
					"	enum A { B }\n" +
					"}\n" +
					"class X {\n" +
					"	@Illegal Y.A foo(@Illegal Y.A a) {\n" +
					"		return a;\n" +
					"	}\n" +
					"}\n"
				},
				"----------\n" +
				"1. ERROR in X.java (at line 11)\n" +
				"	@Illegal Y.A foo(@Illegal Y.A a) {\n" +
				"	^^^^^^^^\n" +
				"Type annotations are not allowed on type names used to access static members\n" +
				"----------\n" +
				"2. ERROR in X.java (at line 11)\n" +
				"	@Illegal Y.A foo(@Illegal Y.A a) {\n" +
				"	                 ^^^^^^^^\n" +
				"Type annotations are not allowed on type names used to access static members\n" +
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=418041, NPE during AST creation.
	public void test418041() {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"import java.lang.annotation.ElementType;\n" +
					"import java.lang.annotation.Target;\n" +
					"import java.util.List;\n" +
					"@Target(ElementType.TYPE_USE)\n" +
					"@interface Readonly {\n" +
					"}\n" +
					"class UnmodifiableList<T> implements\n" +
					"@Readonly List<@Readonly T> { }\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 7)\n" + 
				"	class UnmodifiableList<T> implements\n" + 
				"	      ^^^^^^^^^^^^^^^^\n" + 
				"The type UnmodifiableList<T> must implement the inherited abstract method List<T>.addAll(int, Collection<? extends T>)\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 7)\n" + 
				"	class UnmodifiableList<T> implements\n" + 
				"	      ^^^^^^^^^^^^^^^^\n" + 
				"The type UnmodifiableList<T> must implement the inherited abstract method List<T>.addAll(Collection<? extends T>)\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 7)\n" + 
				"	class UnmodifiableList<T> implements\n" + 
				"	      ^^^^^^^^^^^^^^^^\n" + 
				"The type UnmodifiableList<T> must implement the inherited abstract method List<T>.lastIndexOf(Object)\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 7)\n" + 
				"	class UnmodifiableList<T> implements\n" + 
				"	      ^^^^^^^^^^^^^^^^\n" + 
				"The type UnmodifiableList<T> must implement the inherited abstract method List<T>.subList(int, int)\n" + 
				"----------\n" + 
				"5. ERROR in X.java (at line 7)\n" + 
				"	class UnmodifiableList<T> implements\n" + 
				"	      ^^^^^^^^^^^^^^^^\n" + 
				"The type UnmodifiableList<T> must implement the inherited abstract method List<T>.contains(Object)\n" + 
				"----------\n" + 
				"6. ERROR in X.java (at line 7)\n" + 
				"	class UnmodifiableList<T> implements\n" + 
				"	      ^^^^^^^^^^^^^^^^\n" + 
				"The type UnmodifiableList<T> must implement the inherited abstract method List<T>.get(int)\n" + 
				"----------\n" + 
				"7. ERROR in X.java (at line 7)\n" + 
				"	class UnmodifiableList<T> implements\n" + 
				"	      ^^^^^^^^^^^^^^^^\n" + 
				"The type UnmodifiableList<T> must implement the inherited abstract method List<T>.retainAll(Collection<?>)\n" + 
				"----------\n" + 
				"8. ERROR in X.java (at line 7)\n" + 
				"	class UnmodifiableList<T> implements\n" + 
				"	      ^^^^^^^^^^^^^^^^\n" + 
				"The type UnmodifiableList<T> must implement the inherited abstract method List<T>.clear()\n" + 
				"----------\n" + 
				"9. ERROR in X.java (at line 7)\n" + 
				"	class UnmodifiableList<T> implements\n" + 
				"	      ^^^^^^^^^^^^^^^^\n" + 
				"The type UnmodifiableList<T> must implement the inherited abstract method List<T>.indexOf(Object)\n" + 
				"----------\n" + 
				"10. ERROR in X.java (at line 7)\n" + 
				"	class UnmodifiableList<T> implements\n" + 
				"	      ^^^^^^^^^^^^^^^^\n" + 
				"The type UnmodifiableList<T> must implement the inherited abstract method List<T>.toArray(T[])\n" + 
				"----------\n" + 
				"11. ERROR in X.java (at line 7)\n" + 
				"	class UnmodifiableList<T> implements\n" + 
				"	      ^^^^^^^^^^^^^^^^\n" + 
				"The type UnmodifiableList<T> must implement the inherited abstract method List<T>.toArray()\n" + 
				"----------\n" + 
				"12. ERROR in X.java (at line 7)\n" + 
				"	class UnmodifiableList<T> implements\n" + 
				"	      ^^^^^^^^^^^^^^^^\n" + 
				"The type UnmodifiableList<T> must implement the inherited abstract method List<T>.isEmpty()\n" + 
				"----------\n" + 
				"13. ERROR in X.java (at line 7)\n" + 
				"	class UnmodifiableList<T> implements\n" + 
				"	      ^^^^^^^^^^^^^^^^\n" + 
				"The type UnmodifiableList<T> must implement the inherited abstract method List<T>.listIterator(int)\n" + 
				"----------\n" + 
				"14. ERROR in X.java (at line 7)\n" + 
				"	class UnmodifiableList<T> implements\n" + 
				"	      ^^^^^^^^^^^^^^^^\n" + 
				"The type UnmodifiableList<T> must implement the inherited abstract method List<T>.listIterator()\n" + 
				"----------\n" + 
				"15. ERROR in X.java (at line 7)\n" + 
				"	class UnmodifiableList<T> implements\n" + 
				"	      ^^^^^^^^^^^^^^^^\n" + 
				"The type UnmodifiableList<T> must implement the inherited abstract method List<T>.add(int, T)\n" + 
				"----------\n" + 
				"16. ERROR in X.java (at line 7)\n" + 
				"	class UnmodifiableList<T> implements\n" + 
				"	      ^^^^^^^^^^^^^^^^\n" + 
				"The type UnmodifiableList<T> must implement the inherited abstract method List<T>.add(T)\n" + 
				"----------\n" + 
				"17. ERROR in X.java (at line 7)\n" + 
				"	class UnmodifiableList<T> implements\n" + 
				"	      ^^^^^^^^^^^^^^^^\n" + 
				"The type UnmodifiableList<T> must implement the inherited abstract method List<T>.set(int, T)\n" + 
				"----------\n" + 
				"18. ERROR in X.java (at line 7)\n" + 
				"	class UnmodifiableList<T> implements\n" + 
				"	      ^^^^^^^^^^^^^^^^\n" + 
				"The type UnmodifiableList<T> must implement the inherited abstract method List<T>.size()\n" + 
				"----------\n" + 
				"19. ERROR in X.java (at line 7)\n" + 
				"	class UnmodifiableList<T> implements\n" + 
				"	      ^^^^^^^^^^^^^^^^\n" + 
				"The type UnmodifiableList<T> must implement the inherited abstract method List<T>.containsAll(Collection<?>)\n" + 
				"----------\n" + 
				"20. ERROR in X.java (at line 7)\n" + 
				"	class UnmodifiableList<T> implements\n" + 
				"	      ^^^^^^^^^^^^^^^^\n" + 
				"The type UnmodifiableList<T> must implement the inherited abstract method List<T>.remove(int)\n" + 
				"----------\n" + 
				"21. ERROR in X.java (at line 7)\n" + 
				"	class UnmodifiableList<T> implements\n" + 
				"	      ^^^^^^^^^^^^^^^^\n" + 
				"The type UnmodifiableList<T> must implement the inherited abstract method List<T>.remove(Object)\n" + 
				"----------\n" + 
				"22. ERROR in X.java (at line 7)\n" + 
				"	class UnmodifiableList<T> implements\n" + 
				"	      ^^^^^^^^^^^^^^^^\n" + 
				"The type UnmodifiableList<T> must implement the inherited abstract method List<T>.removeAll(Collection<?>)\n" + 
				"----------\n" + 
				"23. ERROR in X.java (at line 7)\n" + 
				"	class UnmodifiableList<T> implements\n" + 
				"	      ^^^^^^^^^^^^^^^^\n" + 
				"The type UnmodifiableList<T> must implement the inherited abstract method List<T>.iterator()\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=418041, NPE during AST creation.
	public void test418041a() {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X <@Marker T extends @Marker Y<@Marker ?>, @Marker Q extends @Marker Integer> {\n" +
					"}\n" +
					"@java.lang.annotation.Target (java.lang.annotation.ElementType.TYPE_USE)\n" +
					"@interface Marker {}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 1)\n" + 
				"	public class X <@Marker T extends @Marker Y<@Marker ?>, @Marker Q extends @Marker Integer> {\n" + 
				"	                                          ^\n" +
				"Y cannot be resolved to a type\n" + 
				"----------\n" + 
				"2. WARNING in X.java (at line 1)\n" + 
				"	public class X <@Marker T extends @Marker Y<@Marker ?>, @Marker Q extends @Marker Integer> {\n" + 
				"	                                                                          ^^^^^^^^^^^^^^^\n" + 
				"The type parameter Q should not be bounded by the final type Integer. Final types cannot be further extended\n" + 
				"----------\n");
	}
	public void testWildcardCapture() {
		runNegativeTest(
			new String[] {
				"X.java",
				"import java.lang.annotation.ElementType;\n" +
				"import java.lang.annotation.Target;\n" +
				"import java.util.List;\n" +
				"@Target(ElementType.TYPE_USE)\n" +
				"@interface NonNull {\n" +
				"}\n" +
				"@Target(ElementType.TYPE_USE)\n" +
				"@interface Nullable {\n" +
				"}\n" +
				"@Target(ElementType.TYPE_USE)\n" +
				"@interface T {\n" +
				"}\n" +
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		List<@Nullable ? extends X> lx1 = null;\n" +
				"		List<@NonNull ? extends X> lx2 = null;\n" +
				"		lx1 = lx2;\n" +
				"		lx1.add(lx2.get(0));\n" +
				"		lx1.add(lx1.get(0));\n" +
				"       getAdd(lx1, lx2);\n" +
				"	}\n" +
				"	static <@NonNull P>  void getAdd(List<P> p1, List<P> p2) {\n" +
				"		p1.add(p2.get(0));\n" +
				"	}\n" +
				"}\n"
			}, 
			"----------\n" + 
			"1. ERROR in X.java (at line 18)\n" + 
			"	lx1.add(lx2.get(0));\n" + 
			"	    ^^^\n" + 
			"The method add(capture#3-of ? extends X) in the type List<capture#3-of ? extends X> is not applicable for the arguments (capture#4-of ? extends X)\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 19)\n" + 
			"	lx1.add(lx1.get(0));\n" + 
			"	    ^^^\n" + 
			"The method add(capture#5-of ? extends X) in the type List<capture#5-of ? extends X> is not applicable for the arguments (capture#6-of ? extends X)\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 20)\n" + 
			"	getAdd(lx1, lx2);\n" + 
			"	^^^^^^\n" + 
			"The method getAdd(List<P>, List<P>) in the type X is not applicable for the arguments (List<capture#7-of ? extends X>, List<capture#8-of ? extends X>)\n" + 
			"----------\n");		
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=414038, [1.8][compiler] CCE in resolveAnnotations
	public void testBug414038() {
		runNegativeTest(
			new String[] {
				"X.java",
				"import java.lang.annotation.*;\n" +
				"@Target(ElementType.TYPE_USE)\n" +
				"@interface NonNull { int[].class value() default 0;}\n" +
				"public class X extends @NonNull() Object {    \n" +
				"    public static int i = 0; \n" +
				"}\n"
			}, 
			"----------\n" + 
			"1. ERROR in X.java (at line 3)\n" + 
			"	@interface NonNull { int[].class value() default 0;}\n" + 
			"	                          ^^^^^^\n" + 
			"Syntax error on tokens, delete these tokens\n" + 
			"----------\n");		
	}	
	public void testGenericConstructor() {
		runNegativeTest(
			new String[] {
				"X.java",
				"import java.lang.annotation.Annotation;\n" +
				"import java.lang.annotation.ElementType;\n" +
				"import java.lang.annotation.Target;\n" +
				"@Target(ElementType.TYPE_USE)\n" +
				"@interface T {\n" +
				"} \n" +
				"public class X { \n" +
				"\n" +
				"	<P> @T X() {\n" +
				"	}\n" +
				"   @T <P> X(X x) {\n" +
				"   }\n" +
				"}\n"
			}, 
			"----------\n" + 
			"1. ERROR in X.java (at line 9)\n" + 
			"	<P> @T X() {\n" + 
			"	    ^\n" + 
			"Syntax error on token \"@\", delete this token\n" + 
			"----------\n");		
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=419833, [1.8] NPE in CompilationUnitProblemFinder and ASTNode
	public void test419833() {
		runNegativeTest(
			new String[] {
				"X.java",
				"import java.lang.annotation.Target;\n" +
				"import java.lang.annotation.ElementType;\n" +
				"@Target(ElementType.TYPE_USE)\n" +
				"@interface T {\n" +
				"}\n" +
				"class S {\n" +
				"}\n" +
				"interface I {\n" +
				"}\n" +
				"public class X extends @T S implements @T  {\n" +
				"	public int foo() {\n" +
				"       return 0;\n" +
				"	}	\n" +
				"}\n"
			}, 
			"----------\n" + 
			"1. ERROR in X.java (at line 10)\n" + 
			"	public class X extends @T S implements @T  {\n" + 
			"	                                       ^\n" + 
			"Syntax error on token \"@\", delete this token\n" + 
			"----------\n");		
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=420038,  [1.8][compiler] Tolerate type annotations on array dimensions of class literals for now for compatibility. 
	public void test420038() {
		runNegativeTest(
			new String[] {
				"X.java",
				"import java.lang.annotation.ElementType;\n" +
				"import java.lang.annotation.Target;\n" +
				"@Target(ElementType.TYPE_USE)\n" +
				"@interface T {\n" +
				"}\n" +
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		Class<?> c = int @T [].class; \n" +
				"	}\n" +
				"}\n"
			}, 
			"----------\n" + 
			"1. ERROR in X.java (at line 8)\n" + 
			"	Class<?> c = int @T [].class; \n" + 
			"	                 ^^\n" + 
			"Syntax error, type annotations are illegal here\n" + 
			"----------\n");		
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=420284, [1.8][compiler] IllegalStateException from TypeSystem.cacheDerivedType 
	public void test420284() {
		runNegativeTest(
			new String[] {
				"X.java",
				"import java.io.Serializable;\n" +
				"import java.util.List;\n" +
				"public class X {\n" +
				"    void foo(Object o) {\n" +
				"        Integer i = (Integer & Serializable) o;\n" +
				"        List<@NonNull Integer> l;\n" +
				"    }\n" +
				"}\n"
			}, 
			"----------\n" + 
			"1. ERROR in X.java (at line 6)\n" + 
			"	List<@NonNull Integer> l;\n" + 
			"	      ^^^^^^^\n" + 
			"NonNull cannot be resolved to a type\n" + 
			"----------\n");		
	}	
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=391521, [1.8][compiler] Error highlighting is not accurate for type references with type annotations
	public void test391521() {
		runNegativeTest(
			new String[] {
				"X.java",
				"class Y {}\n" +
				"public class X {\n" +
				"    Y y1 = (@Marker Z) null;\n" +
				"    Y y2 = new @Marker Z();\n" +
				"    Y[] y3 = (@Marker Z[]) null;\n" +
				"    Y[] y4 = new @Marker Z[0];\n" +
				"    Y[] y5 = (@Marker Y.Z) null;\n" +
				"    Y[] y6 = new @Marker Y.  Z();\n" +
				"    Y[] y7 = (@Marker Y.Z[]) null;\n" +
				"    Y[] y8 = new @Marker Y[0].  Z;\n" +
				"    Y[] y9 = new @Marker Y.  Z[0];\n" +
				"}\n" +
				"@java.lang.annotation.Target (java.lang.annotation.ElementType.TYPE_USE)\n" +
				"@interface Marker{}\n" +
				"\n"
			},
			"----------\n" +
			"1. ERROR in X.java (at line 3)\n" +
			"	Y y1 = (@Marker Z) null;\n" +
			"	       ^^^^^^^^^^^^^^^^\n" +
			"Z cannot be resolved to a type\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 3)\n" +
			"	Y y1 = (@Marker Z) null;\n" +
			"	                ^\n" +
			"Z cannot be resolved to a type\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 4)\n" +
			"	Y y2 = new @Marker Z();\n" +
			"	                   ^\n" +
			"Z cannot be resolved to a type\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 5)\n" +
			"	Y[] y3 = (@Marker Z[]) null;\n" +
			"	         ^^^^^^^^^^^^^^^^^^\n" +
			"Z cannot be resolved to a type\n" +
			"----------\n" +
			"5. ERROR in X.java (at line 5)\n" +
			"	Y[] y3 = (@Marker Z[]) null;\n" +
			"	                  ^\n" +
			"Z cannot be resolved to a type\n" +
			"----------\n" +
			"6. ERROR in X.java (at line 6)\n" +
			"	Y[] y4 = new @Marker Z[0];\n" +
			"	                     ^\n" +
			"Z cannot be resolved to a type\n" +
			"----------\n" +
			"7. ERROR in X.java (at line 7)\n" +
			"	Y[] y5 = (@Marker Y.Z) null;\n" +
			"	                  ^^^\n" +
			"Y.Z cannot be resolved to a type\n" +
			"----------\n" +
			"8. ERROR in X.java (at line 8)\n" +
			"	Y[] y6 = new @Marker Y.  Z();\n" +
			"	                     ^^^^^\n" +
			"Y.Z cannot be resolved to a type\n" +
			"----------\n" +
			"9. ERROR in X.java (at line 9)\n" +
			"	Y[] y7 = (@Marker Y.Z[]) null;\n" +
			"	                  ^^^\n" +
			"Y.Z cannot be resolved to a type\n" +
			"----------\n" +
			"10. ERROR in X.java (at line 10)\n" +
			"	Y[] y8 = new @Marker Y[0].  Z;\n" +
			"	                            ^\n" +
			"Z cannot be resolved or is not a field\n" +
			"----------\n" +
			"11. ERROR in X.java (at line 11)\n" +
			"	Y[] y9 = new @Marker Y.  Z[0];\n" +
			"	                     ^^^^^\n" +
			"Y.Z cannot be resolved to a type\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=414038, [1.8][compiler] CCE in resolveAnnotations
	public void test414038() {
		runNegativeTest(
			new String[] {
					"X.java", 
					"import java.lang.annotation.*;\n" +
					"@Target(ElementType.TYPE_USE)\n" +
					"@interface NonNull { int[].class value() default 0;}\n" +
					"public class X extends @NonNull() Object {    \n" +
					"    public static int i = 0; \n" +
					"}\n"
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 3)\n" + 
			"	@interface NonNull { int[].class value() default 0;}\n" + 
			"	                          ^^^^^^\n" + 
			"Syntax error on tokens, delete these tokens\n" + 
			"----------\n",
			true);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=421791,  [1.8][compiler] TYPE_USE annotations should be allowed on annotation type declarations
	public void test421791() {
		runNegativeTest(
				new String[] {
						"X.java",
						"import java.lang.annotation.ElementType;\n" +
						"import java.lang.annotation.Target;\n" +
						"@Target(ElementType.TYPE_USE)\n" +
						"@interface T {}\n" +
						"@T\n" +
						"@interface T2 {}\n" +
						"public class X {}\n"
				},
				"",
				true);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=424977,  [1.8][compiler]ArrayIndexIndexOutOfBoundException in annotated wrong<> code
	public void testBug426977() {
		Map customOptions = getCompilerOptions();
		customOptions.put(CompilerOptions.OPTION_Store_Annotations, CompilerOptions.ENABLED);
		runNegativeTest(
			new String[] {
				"test/X.java",
				"package test;\n" +
				"import java.lang.annotation.ElementType;\n" + 
				"import java.lang.annotation.Target;\n" + 
				"\n" + 
				"public class X {\n" + 
				"    test.@A Outer<>.@A Inner<> i;\n" + 
				"}\n" +
				"class Outer<T> {\n" +
				"    class Inner {}\n" +
				"}\n" +
				"@Target(ElementType.TYPE_USE)\n" + 
				"@interface A {}\n"
			},
			"----------\n" + 
			"1. ERROR in test\\X.java (at line 6)\n" + 
			"	test.@A Outer<>.@A Inner<> i;\n" + 
			"	^^^^^^^^^^^^^\n" + 
			"Incorrect number of arguments for type Outer<T>; it cannot be parameterized with arguments <>\n" + 
			"----------\n",
			null,
			true,
			customOptions);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=424977,  [1.8][compiler] ArrayIndexIndexOutOfBoundException in annotated wrong<> code
	public void testBug426977a() {
		Map customOptions = getCompilerOptions();
		customOptions.put(CompilerOptions.OPTION_Store_Annotations, CompilerOptions.ENABLED);
		runNegativeTest(
			new String[] {
				"test/X.java",
				"package test;\n" +
				"import java.lang.annotation.ElementType;\n" + 
				"import java.lang.annotation.Target;\n" + 
				"\n" + 
				"public class X {\n" + 
				"    test.@A Outer<Object>.@A Inner<> i;\n" + 
				"}\n" +
				"class Outer<T> {\n" +
				"    class Inner {}\n" +
				"}\n" +
				"@Target(ElementType.TYPE_USE)\n" + 
				"@interface A {}\n"
			},
			"----------\n" + 
			"1. ERROR in test\\X.java (at line 6)\n" + 
			"	test.@A Outer<Object>.@A Inner<> i;\n" + 
			"	^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"The type Outer<Object>.Inner is not generic; it cannot be parameterized with arguments <>\n" + 
			"----------\n",
			null,
			true,
			customOptions);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=425599, [1.8][compiler] ISE when trying to compile qualified and annotated class instance creation
	public void test425599() {
		Map customOptions = getCompilerOptions();
		customOptions.put(CompilerOptions.OPTION_Store_Annotations, CompilerOptions.ENABLED);
		runNegativeTest(
			new String[] {
				"X.java",
				"import java.lang.annotation.ElementType;\n" +
				"import java.lang.annotation.Target;\n" +
				"public class X {\n" +
				"    Object ax = new @A Outer().new Middle<String>();\n" +
				"}\n" +
				"@Target(ElementType.TYPE_USE) @interface A {}\n" +
				"class Outer {\n" +
				"    class Middle<E> {}\n" +
				"}\n"
			},
			"",
			null,
			true,
			customOptions);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=427955, [1.8][compiler] NPE in TypeSystem.getUnannotatedType
	public void test427955() {
		Map customOptions = getCompilerOptions();
		customOptions.put(CompilerOptions.OPTION_Store_Annotations, CompilerOptions.ENABLED);
		runNegativeTest(
			new String[] {
				"X.java",
				"/**\n" +
				" * @param <K> unused\n" +
				" * @param <V> unused\n" +
				" */\n" +
				"public class X {}\n" +
				"class Outer<K, V> {\n" +
				"  void method() {\n" +
				"    //Internal compiler error: java.lang.NullPointerException at\n" +
				"    // org.eclipse.jdt.internal.compiler.lookup.TypeSystem.getUnannotatedType(TypeSystem.java:76)\n" +
				"    new Inner<>(null);\n" +
				"  }\n" +
				"  final class Inner<K2, V2> {\n" +
				"    /**\n" +
				"     * @param next unused \n" +
				"     */\n" +
				"    Inner(Inner<K2, V2> next) {}\n" +
				"  }\n" +
				"}\n"
			},
			"",
			null,
			true,
			customOptions);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=419827,  [1.8] Annotation with TYPE_USE as target is not allowed to use container with target TYPE
	public void test419827a() {
		runNegativeTest(
				new String[] {
					"X.java",
					"import java.lang.annotation.ElementType;\n" +
					"import java.lang.annotation.Repeatable;\n" +
					"import java.lang.annotation.Target;\n" +
					"\n" +
					"@Target({ElementType.TYPE_USE})\n" +
					"@Repeatable(FooContainer.class)\n" +
					"@interface Foo {}\n" +
					"@Target({ElementType.TYPE, ElementType.TYPE_USE})\n" +
					"@interface FooContainer {\n" +
					"	Foo[] value();\n" +
					"}\n" +
					"public class X{}\n"
				},
				"",
				true);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=419827,  [1.8] Annotation with TYPE_USE as target is not allowed to use container with target TYPE
	// Although the target of FooContainer is different from that of Foo, Foo container cannot be used in any place where
	// Foo can't be used.
	public void test419827b() {
		runNegativeTest(
				new String[] {
					"X.java",
					"import java.lang.annotation.ElementType;\n" +
					"import java.lang.annotation.Repeatable;\n" +
					"import java.lang.annotation.Target;\n" +
					"\n" +
					"@Target({ElementType.TYPE_USE})\n" +
					"@Repeatable(FooContainer.class)\n" +
					"@interface Foo {}\n" +
					"@Target({ElementType.TYPE})\n" +
					"@interface FooContainer {\n" +
					"	Foo[] value();\n" +
					"}\n" +
					"public class X{}\n"
				},
				"",
				true);
	}
}
