/*******************************************************************************
 * Copyright (c) 2011, 2017 IBM Corporation and others.
 *
 * This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Stephan Herrmann - Contribution for
 *								bug 392099 - [1.8][compiler][null] Apply null annotation on types for null analysis
 *******************************************************************************/
package org.eclipse.jdt.core.tests.compiler.regression;

import junit.framework.Test;

@SuppressWarnings({ "rawtypes" })
public class GrammarCoverageTests308 extends AbstractRegressionTest {

	static { 
//		TESTS_NUMBERS = new int [] { 35 };
//		TESTS_NAMES = new String [] { "testnew" };
	}
	public static Class testClass() {
		return GrammarCoverageTests308.class;
	}
	public static Test suite() {
		return buildMinimalComplianceTestSuite(testClass(), F_1_8);
	}
	public GrammarCoverageTests308(String testName){
		super(testName);
	}
	// Lone test to verify that multiple annotations of all three kinds are accepted. All other tests will use only marker annotations
	public void test000() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X extends @Marker @SingleMember(0) @Normal(Value = 0) Object {\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 1)\n" + 
				"	public class X extends @Marker @SingleMember(0) @Normal(Value = 0) Object {\n" + 
				"	                        ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 1)\n" + 
				"	public class X extends @Marker @SingleMember(0) @Normal(Value = 0) Object {\n" + 
				"	                                ^^^^^^^^^^^^\n" + 
				"SingleMember cannot be resolved to a type\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 1)\n" + 
				"	public class X extends @Marker @SingleMember(0) @Normal(Value = 0) Object {\n" + 
				"	                                                 ^^^^^^\n" + 
				"Normal cannot be resolved to a type\n" + 
				"----------\n");
	}
	// FieldDeclaration ::= Modifiersopt Type VariableDeclarators ';'
	public void test001() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"    @Marker int x;\n" +
					"    Zork z;\n" +
					"}\n" +
					"@java.lang.annotation.Target (java.lang.annotation.ElementType.TYPE_PARAMETER)\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 2)\n" + 
				"	@Marker int x;\n" + 
				"	^^^^^^^\n" + 
				"The annotation @Marker is disallowed for this location\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 3)\n" + 
				"	Zork z;\n" + 
				"	^^^^\n" + 
				"Zork cannot be resolved to a type\n" + 
				"----------\n");
	}
	// TYPE:   MethodHeaderName ::= Modifiersopt TypeParameters Type 'Identifier' '('
	public void test002() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"    @Marker <T> @Marker int x() { return 10; };\n" +
					"    Zork z;\n" +
					"}\n" +
					"@java.lang.annotation.Target (java.lang.annotation.ElementType.TYPE_PARAMETER)\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 2)\n" + 
				"	@Marker <T> @Marker int x() { return 10; };\n" + 
				"	^^^^^^^\n" + 
				"The annotation @Marker is disallowed for this location\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 2)\n" + 
				"	@Marker <T> @Marker int x() { return 10; };\n" + 
				"	            ^^^^^^^\n" + 
				"The annotation @Marker is disallowed for this location\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 3)\n" + 
				"	Zork z;\n" + 
				"	^^^^\n" + 
				"Zork cannot be resolved to a type\n" + 
				"----------\n");
	}
	// TYPE:   MethodHeaderName ::= Modifiersopt Type 'Identifier' '('
	public void test003() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"    @Marker int x() { return 10; };\n" +
					"    Zork z;\n" +
					"}\n" +
					"@java.lang.annotation.Target (java.lang.annotation.ElementType.TYPE_PARAMETER)\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 2)\n" + 
				"	@Marker int x() { return 10; };\n" + 
				"	^^^^^^^\n" + 
				"The annotation @Marker is disallowed for this location\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 3)\n" + 
				"	Zork z;\n" + 
				"	^^^^\n" + 
				"Zork cannot be resolved to a type\n" + 
				"----------\n");
	}
	// FormalParameter ::= Modifiersopt Type VariableDeclaratorIdOrThis
	public void test004() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"    int x(@Marker int p) { return 10; };\n" +
					"    Zork z;\n" +
					"}\n" +
					"@java.lang.annotation.Target (java.lang.annotation.ElementType.TYPE_PARAMETER)\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 2)\n" + 
				"	int x(@Marker int p) { return 10; };\n" + 
				"	      ^^^^^^^\n" + 
				"The annotation @Marker is disallowed for this location\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 3)\n" + 
				"	Zork z;\n" + 
				"	^^^^\n" + 
				"Zork cannot be resolved to a type\n" + 
				"----------\n");
	}
	// FormalParameter ::= Modifiersopt Type PushZeroTypeAnnotations '...' VariableDeclaratorIdOrThis
	public void test005() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"    int x(@Marker int ... p) { return 10; };\n" +
					"    Zork z;\n" +
					"}\n" +
					"@java.lang.annotation.Target (java.lang.annotation.ElementType.TYPE_PARAMETER)\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 2)\n" + 
				"	int x(@Marker int ... p) { return 10; };\n" + 
				"	      ^^^^^^^\n" + 
				"The annotation @Marker is disallowed for this location\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 3)\n" + 
				"	Zork z;\n" + 
				"	^^^^\n" + 
				"Zork cannot be resolved to a type\n" + 
				"----------\n");
	}
	// FormalParameter ::= Modifiersopt Type @308... TypeAnnotations '...' VariableDeclaratorIdOrThis
	public void test006() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"    int x(@Marker int [] @Marker ... p) { return 10; };\n" +
					"    Zork z;\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 2)\n" + 
				"	int x(@Marker int [] @Marker ... p) { return 10; };\n" + 
				"	       ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 2)\n" + 
				"	int x(@Marker int [] @Marker ... p) { return 10; };\n" + 
				"	                      ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 3)\n" + 
				"	Zork z;\n" + 
				"	^^^^\n" + 
				"Zork cannot be resolved to a type\n" + 
				"----------\n");
	}
	// UnionType ::= Type
	// UnionType ::= UnionType '|' Type
	public void test007() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"    int x() {\n" +
					"        try {\n" +
					"        } catch (@Marker NullPointerException | @Marker ArrayIndexOutOfBoundsException e) {\n" +
					"        }\n" +
					"        return 10;\n" +
					"    }\n" +
					"    Zork z;\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	} catch (@Marker NullPointerException | @Marker ArrayIndexOutOfBoundsException e) {\n" + 
				"	          ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 4)\n" + 
				"	} catch (@Marker NullPointerException | @Marker ArrayIndexOutOfBoundsException e) {\n" + 
				"	                                         ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 8)\n" + 
				"	Zork z;\n" + 
				"	^^^^\n" + 
				"Zork cannot be resolved to a type\n" + 
				"----------\n");
	}	
	// LocalVariableDeclaration ::= Type PushModifiers VariableDeclarators
    // LocalVariableDeclaration ::= Modifiers Type PushRealModifiers VariableDeclarators
	public void test008() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"    int x() {\n" +
					"        @Marker int p;\n" +
					"        final @Marker int q;\n" +
					"        @Marker final int r;\n" +
					"        return 10;\n" +
					"    }\n" +
					"    Zork z;\n" +
					"}\n" +
					"@java.lang.annotation.Target (java.lang.annotation.ElementType.TYPE_PARAMETER)\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 3)\n" + 
				"	@Marker int p;\n" + 
				"	^^^^^^^\n" + 
				"The annotation @Marker is disallowed for this location\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 4)\n" + 
				"	final @Marker int q;\n" + 
				"	      ^^^^^^^\n" + 
				"The annotation @Marker is disallowed for this location\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 5)\n" + 
				"	@Marker final int r;\n" + 
				"	^^^^^^^\n" + 
				"The annotation @Marker is disallowed for this location\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 8)\n" + 
				"	Zork z;\n" + 
				"	^^^^\n" + 
				"Zork cannot be resolved to a type\n" + 
				"----------\n");
	}
	// Resource ::= Type PushModifiers VariableDeclaratorId EnterVariable '=' ForceNoDiet VariableInitializer RestoreDiet ExitVariableWithInitialization
	// Resource ::= Modifiers Type PushRealModifiers VariableDeclaratorId EnterVariable '=' ForceNoDiet VariableInitializer RestoreDiet ExitVariableWithInitialization
	public void test009() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"    int x() {\n" +
					"        try (@Marker Integer p = null; final @Marker Integer q = null; @Marker final Integer r = null) {\n" +
					"        }\n" +
					"        return 10;\n" +
					"    }\n" +
					"    Zork z;\n" +
					"}\n" +
					"@java.lang.annotation.Target (java.lang.annotation.ElementType.TYPE_PARAMETER)\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 3)\n" + 
				"	try (@Marker Integer p = null; final @Marker Integer q = null; @Marker final Integer r = null) {\n" + 
				"	     ^^^^^^^\n" + 
				"The annotation @Marker is disallowed for this location\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 3)\n" + 
				"	try (@Marker Integer p = null; final @Marker Integer q = null; @Marker final Integer r = null) {\n" + 
				"	             ^^^^^^^\n" + 
				"The resource type Integer does not implement java.lang.AutoCloseable\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 3)\n" + 
				"	try (@Marker Integer p = null; final @Marker Integer q = null; @Marker final Integer r = null) {\n" + 
				"	                                     ^^^^^^^\n" + 
				"The annotation @Marker is disallowed for this location\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 3)\n" + 
				"	try (@Marker Integer p = null; final @Marker Integer q = null; @Marker final Integer r = null) {\n" + 
				"	                                             ^^^^^^^\n" + 
				"The resource type Integer does not implement java.lang.AutoCloseable\n" + 
				"----------\n" + 
				"5. ERROR in X.java (at line 3)\n" + 
				"	try (@Marker Integer p = null; final @Marker Integer q = null; @Marker final Integer r = null) {\n" + 
				"	                                                               ^^^^^^^\n" + 
				"The annotation @Marker is disallowed for this location\n" + 
				"----------\n" + 
				"6. ERROR in X.java (at line 3)\n" + 
				"	try (@Marker Integer p = null; final @Marker Integer q = null; @Marker final Integer r = null) {\n" + 
				"	                                                                             ^^^^^^^\n" + 
				"The resource type Integer does not implement java.lang.AutoCloseable\n" + 
				"----------\n" + 
				"7. ERROR in X.java (at line 7)\n" + 
				"	Zork z;\n" + 
				"	^^^^\n" + 
				"Zork cannot be resolved to a type\n" + 
				"----------\n");
	}
	// EnhancedForStatementHeaderInit ::= 'for' '(' Type PushModifiers Identifier Dimsopt
	// EnhancedForStatementHeaderInit ::= 'for' '(' Modifiers Type PushRealModifiers Identifier Dimsopt
	public void test010() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"    int x() {\n" +
					"        for (@Marker int i: new int[3]) {}\n" +
					"        for (final @Marker int i: new int[3]) {}\n" +
					"        for (@Marker final int i: new int[3]) {}\n" +
					"        return 10;\n" +
					"    }\n" +
					"    Zork z;\n" +
					"}\n" +
					"@java.lang.annotation.Target (java.lang.annotation.ElementType.TYPE_PARAMETER)\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 3)\n" + 
				"	for (@Marker int i: new int[3]) {}\n" + 
				"	     ^^^^^^^\n" + 
				"The annotation @Marker is disallowed for this location\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 4)\n" + 
				"	for (final @Marker int i: new int[3]) {}\n" + 
				"	           ^^^^^^^\n" + 
				"The annotation @Marker is disallowed for this location\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 5)\n" + 
				"	for (@Marker final int i: new int[3]) {}\n" + 
				"	     ^^^^^^^\n" + 
				"The annotation @Marker is disallowed for this location\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 8)\n" + 
				"	Zork z;\n" + 
				"	^^^^\n" + 
				"Zork cannot be resolved to a type\n" + 
				"----------\n");
	}	
	// AnnotationMethodHeaderName ::= Modifiersopt TypeParameters Type 'Identifier' '('
	// AnnotationMethodHeaderName ::= Modifiersopt Type 'Identifier' '('
	public void test011() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public @interface X { \n" +
					"	public @Marker String value(); \n" +
					"	@Marker String value2(); \n" +
					"	@Marker public String value3(); \n" +
					"	public @Marker <T> @Marker String value4(); \n" +
					"	@Marker <T> @Marker String value5(); \n" +
					"	@Marker public <T> @Marker String value6(); \n" +
					"}\n" +
					
					"@java.lang.annotation.Target (java.lang.annotation.ElementType.TYPE_PARAMETER)\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 2)\n" + 
				"	public @Marker String value(); \n" + 
				"	       ^^^^^^^\n" + 
				"The annotation @Marker is disallowed for this location\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 3)\n" + 
				"	@Marker String value2(); \n" + 
				"	^^^^^^^\n" + 
				"The annotation @Marker is disallowed for this location\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 4)\n" + 
				"	@Marker public String value3(); \n" + 
				"	^^^^^^^\n" + 
				"The annotation @Marker is disallowed for this location\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 5)\n" + 
				"	public @Marker <T> @Marker String value4(); \n" + 
				"	       ^^^^^^^\n" + 
				"The annotation @Marker is disallowed for this location\n" + 
				"----------\n" + 
				"5. ERROR in X.java (at line 5)\n" + 
				"	public @Marker <T> @Marker String value4(); \n" + 
				"	                   ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"6. ERROR in X.java (at line 5)\n" + 
				"	public @Marker <T> @Marker String value4(); \n" + 
				"	                                  ^^^^^^^^\n" + 
				"Annotation attributes cannot be generic\n" + 
				"----------\n" + 
				"7. ERROR in X.java (at line 6)\n" + 
				"	@Marker <T> @Marker String value5(); \n" + 
				"	^^^^^^^\n" + 
				"The annotation @Marker is disallowed for this location\n" + 
				"----------\n" + 
				"8. ERROR in X.java (at line 6)\n" + 
				"	@Marker <T> @Marker String value5(); \n" + 
				"	            ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"9. ERROR in X.java (at line 6)\n" + 
				"	@Marker <T> @Marker String value5(); \n" + 
				"	                           ^^^^^^^^\n" + 
				"Annotation attributes cannot be generic\n" + 
				"----------\n" + 
				"10. ERROR in X.java (at line 7)\n" + 
				"	@Marker public <T> @Marker String value6(); \n" + 
				"	^^^^^^^\n" + 
				"The annotation @Marker is disallowed for this location\n" + 
				"----------\n" + 
				"11. ERROR in X.java (at line 7)\n" + 
				"	@Marker public <T> @Marker String value6(); \n" + 
				"	                   ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"12. ERROR in X.java (at line 7)\n" + 
				"	@Marker public <T> @Marker String value6(); \n" + 
				"	                                  ^^^^^^^^\n" + 
				"Annotation attributes cannot be generic\n" + 
				"----------\n");
	}
	// PrimaryNoNewArray ::= PrimitiveType Dims '.' 'class'
	// PrimaryNoNewArray ::= PrimitiveType '.' 'class'
	public void test012() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X { \n" +
					"	public void value() {\n" +
					"		Object o = @Marker int.class;\n" +
					"		Object o2 = @Marker int @Marker[] [] @Marker[].class;\n" +
					"   }\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 3)\n" + 
				"	Object o = @Marker int.class;\n" + 
				"	           ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 4)\n" + 
				"	Object o2 = @Marker int @Marker[] [] @Marker[].class;\n" + 
				"	            ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 4)\n" + 
				"	Object o2 = @Marker int @Marker[] [] @Marker[].class;\n" + 
				"	                        ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 4)\n" + 
				"	Object o2 = @Marker int @Marker[] [] @Marker[].class;\n" + 
				"	                                     ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n");
	}
	// ReferenceExpression ::= PrimitiveType Dims '::' NonWildTypeArgumentsopt IdentifierOrNew
	public void test013() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"interface I {\n" +
					"    Object copy(int [] ia);\n" +
					"}\n" +
					"public class X  {\n" +
					"    public static void main(String [] args) {\n" +
					"        I i = @Marker int @Marker []::<String>clone;\n" +
					"        Zork z;\n" +
					"    }\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 6)\n" + 
				"	I i = @Marker int @Marker []::<String>clone;\n" + 
				"	       ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 6)\n" + 
				"	I i = @Marker int @Marker []::<String>clone;\n" + 
				"	                   ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"3. WARNING in X.java (at line 6)\n" + 
				"	I i = @Marker int @Marker []::<String>clone;\n" + 
				"	                               ^^^^^^\n" + 
				"Unused type arguments for the non generic method clone() of type Object; it should not be parameterized with arguments <String>\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 7)\n" + 
				"	Zork z;\n" + 
				"	^^^^\n" + 
				"Zork cannot be resolved to a type\n" + 
				"----------\n");
	}
	// ArrayCreationWithoutArrayInitializer ::= 'new' PrimitiveType DimWithOrWithOutExprs
	// ArrayCreationWithArrayInitializer ::= 'new' PrimitiveType DimWithOrWithOutExprs ArrayInitializer
	public void test014() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X  {\n" +
					"    public static void main(String [] args) {\n" +
					"        int i [] = new @Marker int @Marker [4];\n" +
					"        int j [] = new @Marker int @Marker [] { 10 };\n" +
					"        Zork z;\n" +
					"    }\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 3)\n" + 
				"	int i [] = new @Marker int @Marker [4];\n" + 
				"	                ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 3)\n" + 
				"	int i [] = new @Marker int @Marker [4];\n" + 
				"	                            ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 4)\n" + 
				"	int j [] = new @Marker int @Marker [] { 10 };\n" + 
				"	                ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 4)\n" + 
				"	int j [] = new @Marker int @Marker [] { 10 };\n" + 
				"	                            ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"5. ERROR in X.java (at line 5)\n" + 
				"	Zork z;\n" + 
				"	^^^^\n" + 
				"Zork cannot be resolved to a type\n" + 
				"----------\n");
	}
	// CastExpression ::= PushLPAREN PrimitiveType Dimsopt PushRPAREN InsideCastExpression UnaryExpression
	public void test015() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X  {\n" +
					"    public static void main(String [] args) {\n" +
					"        int i = (@Marker int) 0;\n" +
					"        int j [] = (@Marker int @Marker []) null;\n" +
					"        Zork z;\n" +
					"    }\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 3)\n" + 
				"	int i = (@Marker int) 0;\n" + 
				"	          ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 4)\n" + 
				"	int j [] = (@Marker int @Marker []) null;\n" + 
				"	             ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 4)\n" + 
				"	int j [] = (@Marker int @Marker []) null;\n" + 
				"	                         ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 5)\n" + 
				"	Zork z;\n" + 
				"	^^^^\n" + 
				"Zork cannot be resolved to a type\n" + 
				"----------\n");
	}
	// InstanceofExpression ::= InstanceofExpression 'instanceof' ReferenceType
	public void test016() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X  {\n" +
					"    public static void main(String [] args) {\n" +
					"        if (args instanceof @Readonly String) {\n" +
					"        }\n" +
					"    }\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 3)\n" + 
				"	if (args instanceof @Readonly String) {\n" + 
				"	    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"Incompatible conditional operand types String[] and String\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 3)\n" + 
				"	if (args instanceof @Readonly String) {\n" + 
				"	                     ^^^^^^^^\n" + 
				"Readonly cannot be resolved to a type\n" + 
				"----------\n");
	}
	// TypeArgument ::= ReferenceType
	public void test017() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X extends Y<@Marker Integer, String> {}\n" +
					"class Y<T, V> {\n" +
				    "    Zork z;\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 1)\n" + 
				"	public class X extends Y<@Marker Integer, String> {}\n" + 
				"	                          ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 3)\n" + 
				"	Zork z;\n" + 
				"	^^^^\n" + 
				"Zork cannot be resolved to a type\n" + 
				"----------\n");
	}
	// ReferenceType1 ::= ReferenceType '>'
	public void test018() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X extends Y<@Marker Integer> {}\n" +
					"class Y<T> {\n" +
				    "    Zork z;\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 1)\n" + 
				"	public class X extends Y<@Marker Integer> {}\n" + 
				"	                          ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 3)\n" + 
				"	Zork z;\n" + 
				"	^^^^\n" + 
				"Zork cannot be resolved to a type\n" + 
				"----------\n");
	}
	
	// ReferenceType2 ::= ReferenceType '>>'
	public void test019() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X<T extends Object & Comparable<? super @Marker String>> {}\n" +
					"class Y<T> {\n" +
				    "    Zork z;\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 1)\n" + 
				"	public class X<T extends Object & Comparable<? super @Marker String>> {}\n" + 
				"	                                                      ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 3)\n" + 
				"	Zork z;\n" + 
				"	^^^^\n" + 
				"Zork cannot be resolved to a type\n" + 
				"----------\n");
	}
	// ReferenceType3 ::= ReferenceType '>>>'
	public void test020() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X<A extends X<X<X<@Marker String>>>> {}\n" +
					"class Y<T> {\n" +
				    "    Zork z;\n" +
					"}\n"
 				},
 				"----------\n" + 
				"1. ERROR in X.java (at line 1)\n" + 
				"	public class X<A extends X<X<X<@Marker String>>>> {}\n" + 
				"	                           ^\n" + 
				"Bound mismatch: The type X<X<String>> is not a valid substitute for the bounded parameter <A extends X<X<X<String>>>> of the type X<A>\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 1)\n" + 
				"	public class X<A extends X<X<X<@Marker String>>>> {}\n" + 
				"	                             ^\n" + 
				"Bound mismatch: The type X<String> is not a valid substitute for the bounded parameter <A extends X<X<X<String>>>> of the type X<A>\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 1)\n" + 
				"	public class X<A extends X<X<X<@Marker String>>>> {}\n" + 
				"	                               ^^^^^^^^^^^^^^\n" + 
				"Bound mismatch: The type String is not a valid substitute for the bounded parameter <A extends X<X<X<String>>>> of the type X<A>\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 1)\n" + 
				"	public class X<A extends X<X<X<@Marker String>>>> {}\n" + 
				"	                                ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"5. ERROR in X.java (at line 3)\n" + 
				"	Zork z;\n" + 
				"	^^^^\n" + 
				"Zork cannot be resolved to a type\n" + 
				"----------\n");
	}
	// WildcardBounds ::= 'extends' ReferenceType
	// WildcardBounds ::= 'super' ReferenceType
	public void test021() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"	void foo(Map<@Marker ? super @Marker Object, @Marker ? extends @Marker String> m){}\n" +
					"   void goo(Map<@Marker ? extends @Marker Object, @Marker ? super @Marker String> m){}\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 2)\n" + 
				"	void foo(Map<@Marker ? super @Marker Object, @Marker ? extends @Marker String> m){}\n" + 
				"	         ^^^\n" + 
				"Map cannot be resolved to a type\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 2)\n" + 
				"	void foo(Map<@Marker ? super @Marker Object, @Marker ? extends @Marker String> m){}\n" + 
				"	              ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 2)\n" + 
				"	void foo(Map<@Marker ? super @Marker Object, @Marker ? extends @Marker String> m){}\n" + 
				"	                              ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 2)\n" + 
				"	void foo(Map<@Marker ? super @Marker Object, @Marker ? extends @Marker String> m){}\n" + 
				"	                                              ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"5. ERROR in X.java (at line 2)\n" + 
				"	void foo(Map<@Marker ? super @Marker Object, @Marker ? extends @Marker String> m){}\n" + 
				"	                                                                ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"6. ERROR in X.java (at line 3)\n" + 
				"	void goo(Map<@Marker ? extends @Marker Object, @Marker ? super @Marker String> m){}\n" + 
				"	         ^^^\n" + 
				"Map cannot be resolved to a type\n" + 
				"----------\n" + 
				"7. ERROR in X.java (at line 3)\n" + 
				"	void goo(Map<@Marker ? extends @Marker Object, @Marker ? super @Marker String> m){}\n" + 
				"	              ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"8. ERROR in X.java (at line 3)\n" + 
				"	void goo(Map<@Marker ? extends @Marker Object, @Marker ? super @Marker String> m){}\n" + 
				"	                                ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"9. ERROR in X.java (at line 3)\n" + 
				"	void goo(Map<@Marker ? extends @Marker Object, @Marker ? super @Marker String> m){}\n" + 
				"	                                                ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"10. ERROR in X.java (at line 3)\n" + 
				"	void goo(Map<@Marker ? extends @Marker Object, @Marker ? super @Marker String> m){}\n" + 
				"	                                                                ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n");
	}
	// TypeParameter ::= TypeParameterHeader 'extends' ReferenceType
	public void test022() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X <@Marker T extends @Marker Y<@Marker ?>, @Marker Q extends @Marker Integer> {\n" +
					"}\n" +
					"class Y<T> {}\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" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 1)\n" + 
				"	public class X <@Marker T extends @Marker Y<@Marker ?>, @Marker Q extends @Marker Integer> {\n" + 
				"	                                   ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 1)\n" + 
				"	public class X <@Marker T extends @Marker Y<@Marker ?>, @Marker Q extends @Marker Integer> {\n" + 
				"	                                             ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 1)\n" + 
				"	public class X <@Marker T extends @Marker Y<@Marker ?>, @Marker Q extends @Marker Integer> {\n" + 
				"	                                                         ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"5. 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" + 
				"6. ERROR in X.java (at line 1)\n" + 
				"	public class X <@Marker T extends @Marker Y<@Marker ?>, @Marker Q extends @Marker Integer> {\n" + 
				"	                                                                           ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n");
	}
	// TypeParameter ::= TypeParameterHeader 'extends' ReferenceType AdditionalBoundList
	// AdditionalBound ::= '&' ReferenceType
	// TypeParameter1 ::= TypeParameterHeader 'extends' ReferenceType AdditionalBoundList1
	public void test023() throws Exception {
		this.runNegativeTest(
				new String[] {
					"I.java",
					"public interface I<U extends J<? extends I<U>>> {\n" +
					"}\n" +
					"interface J<T extends I<? extends J<T>>> {\n" +
					"}\n" +
					"class CI<U extends CJ<T, U> & @Marker J<@Marker T>,\n" +
					"			T extends CI<U, T> & @Marker I<U>>\n" +
					"	implements I<U> {\n" +
					"}\n" +
					"class CJ<T extends CI<U, T> & @Marker I<@Marker U>,\n" +
					"			U extends CJ<T, U> & J<T>>\n" +
					"	implements J<T> {\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in I.java (at line 5)\n" + 
				"	class CI<U extends CJ<T, U> & @Marker J<@Marker T>,\n" + 
				"	                               ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"2. ERROR in I.java (at line 5)\n" + 
				"	class CI<U extends CJ<T, U> & @Marker J<@Marker T>,\n" + 
				"	                                         ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"3. ERROR in I.java (at line 6)\n" + 
				"	T extends CI<U, T> & @Marker I<U>>\n" + 
				"	                      ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"4. ERROR in I.java (at line 9)\n" + 
				"	class CJ<T extends CI<U, T> & @Marker I<@Marker U>,\n" + 
				"	                               ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"5. ERROR in I.java (at line 9)\n" + 
				"	class CJ<T extends CI<U, T> & @Marker I<@Marker U>,\n" + 
				"	                                         ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n");
	}
	// InstanceofExpression_NotName ::= Name 'instanceof' ReferenceType
	public void test024() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X<E> {\n" +
					"  class Y {\n" +
					"    E e;\n" +
					"    E getOtherElement(Object other) {\n" +
					"      if (!(other instanceof @Marker X<?>.Y)) {};\n" +
					"      return null;\n" +
					"    }\n" +
					"  }\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 5)\n" + 
				"	if (!(other instanceof @Marker X<?>.Y)) {};\n" + 
				"	                        ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n");
	}
	// InstanceofExpression_NotName ::= InstanceofExpression_NotName 'instanceof' ReferenceType
	public void test025() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X<P, C> {\n" +
					"  public X() {\n" +
					"    if (!(this instanceof @Marker X)) {}\n" +
					"  }\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 3)\n" + 
				"	if (!(this instanceof @Marker X)) {}\n" + 
				"	                       ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n");
	}
	// ReferenceExpressionTypeArgumentsAndTrunk ::= OnlyTypeArguments '.' ClassOrInterfaceType Dimsopt
	public void test026() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"interface I {\n" +
					"    void foo(Y<String>.Z z, int x);\n" +
					"}\n" +
					"public class X  {\n" +
					"    public static void main(String [] args) {\n" +
					"        I i = Y<String>.@Marker Z::foo;\n" +
					"        i.foo(new Y<String>().new Z(), 10); \n" +
					"        Zork z;\n" +
					"    }\n" +
					"}\n" +
					"class Y<T> {\n" +
					"    class Z {\n" +
					"        void foo(int x) {\n" +
					"	    System.out.println(x);\n" +
					"        }\n" +
					"    }\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 6)\n" + 
				"	I i = Y<String>.@Marker Z::foo;\n" + 
				"	                 ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 8)\n" + 
				"	Zork z;\n" + 
				"	^^^^\n" + 
				"Zork cannot be resolved to a type\n" + 
				"----------\n");
	}
	// ArrayCreationWithoutArrayInitializer ::= 'new' ClassOrInterfaceType DimWithOrWithOutExprs
	// ArrayCreationWithArrayInitializer ::= 'new' ClassOrInterfaceType DimWithOrWithOutExprs ArrayInitializer
	public void test027() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X  {\n" +
					"    public static void main(String [] args) {\n" +
					"        X [] x = new @Marker X @Marker [5];\n" +
					"        X [] x2 = new @Marker X @Marker [] { null };\n" +
					"        Zork z;\n" +
					"    }\n" +
					"}\n"				},
					"----------\n" + 
					"1. ERROR in X.java (at line 3)\n" + 
					"	X [] x = new @Marker X @Marker [5];\n" + 
					"	              ^^^^^^\n" + 
					"Marker cannot be resolved to a type\n" + 
					"----------\n" + 
					"2. ERROR in X.java (at line 3)\n" + 
					"	X [] x = new @Marker X @Marker [5];\n" + 
					"	                        ^^^^^^\n" + 
					"Marker cannot be resolved to a type\n" + 
					"----------\n" + 
					"3. ERROR in X.java (at line 4)\n" + 
					"	X [] x2 = new @Marker X @Marker [] { null };\n" + 
					"	               ^^^^^^\n" + 
					"Marker cannot be resolved to a type\n" + 
					"----------\n" + 
					"4. ERROR in X.java (at line 4)\n" + 
					"	X [] x2 = new @Marker X @Marker [] { null };\n" + 
					"	                         ^^^^^^\n" + 
					"Marker cannot be resolved to a type\n" + 
					"----------\n" + 
					"5. ERROR in X.java (at line 5)\n" + 
					"	Zork z;\n" + 
					"	^^^^\n" + 
					"Zork cannot be resolved to a type\n" + 
					"----------\n");
	}
	// CastExpression ::= PushLPAREN Name OnlyTypeArgumentsForCastExpression '.' ClassOrInterfaceType Dimsopt PushRPAREN InsideCastExpressionWithQualifiedGenerics UnaryExpressionNotPlusMinus
	public void test028() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X  {\n" +
					"    public static void main(String [] args) {\n" +
					"        java.util.Map.Entry [] e = (java.util.Map<String, String>.@Marker Entry []) null;\n" +
					"    }\n" +
					"}\n"				},
					"----------\n" + 
					"1. WARNING in X.java (at line 3)\n" + 
					"	java.util.Map.Entry [] e = (java.util.Map<String, String>.@Marker Entry []) null;\n" + 
					"	^^^^^^^^^^^^^^^^^^^\n" + 
					"Map.Entry is a raw type. References to generic type Map.Entry<K,V> should be parameterized\n" + 
					"----------\n" + 
					"2. ERROR in X.java (at line 3)\n" + 
					"	java.util.Map.Entry [] e = (java.util.Map<String, String>.@Marker Entry []) null;\n" + 
					"	                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
					"The member type Map.Entry<K,V> cannot be qualified with a parameterized type, since it is static. Remove arguments from qualifying type Map<String,String>\n" + 
					"----------\n" + 
					"3. ERROR in X.java (at line 3)\n" + 
					"	java.util.Map.Entry [] e = (java.util.Map<String, String>.@Marker Entry []) null;\n" + 
					"	                                                           ^^^^^^\n" + 
					"Marker cannot be resolved to a type\n" + 
					"----------\n");
	}
	// ReferenceType1 ::= ClassOrInterface '<' TypeArgumentList2
	public void test029() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"import java.io.Serializable;\n" +
					"import java.util.List;\n" +
					"public class X<T extends Comparable<T> & Serializable> {\n" +
					"	void foo(List<? extends @Marker Comparable<T>> p) {} \n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	void foo(List<? extends @Marker Comparable<T>> p) {} \n" + 
				"	                         ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n");
	}
	// ReferenceType2 ::= ClassOrInterface '<' TypeArgumentList3
	public void test030() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"class Base {\n" +
					"}\n" +
					"class Foo<U extends Base, V extends Bar<U, @Marker Foo<U, V>>> {\n" +
					"}\n" +
					"class Bar<E extends Base, F extends Foo<E, @Marker Bar<E, F>>> {\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 3)\n" + 
				"	class Foo<U extends Base, V extends Bar<U, @Marker Foo<U, V>>> {\n" + 
				"	                                           ^^^^^^^^^^^\n" + 
				"Bound mismatch: The type Foo<U,V> is not a valid substitute for the bounded parameter <F extends Foo<E,Bar<E,F>>> of the type Bar<E,F>\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 3)\n" + 
				"	class Foo<U extends Base, V extends Bar<U, @Marker Foo<U, V>>> {\n" + 
				"	                                            ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 5)\n" + 
				"	class Bar<E extends Base, F extends Foo<E, @Marker Bar<E, F>>> {\n" + 
				"	                                           ^^^^^^^^^^^\n" + 
				"Bound mismatch: The type Bar<E,F> is not a valid substitute for the bounded parameter <V extends Bar<U,Foo<U,V>>> of the type Foo<U,V>\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 5)\n" + 
				"	class Bar<E extends Base, F extends Foo<E, @Marker Bar<E, F>>> {\n" + 
				"	                                            ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n");
	}
	// ClassHeaderExtends ::= 'extends' ClassType
	public void test031() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X extends @Marker Object {\n" +
					"}\n"
				},
				"----------\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");
	}
	// ClassInstanceCreationExpression ::= 'new' OnlyTypeArguments ClassType EnterInstanceCreationArgumentList '(' ArgumentListopt ')' UnqualifiedClassBodyopt
	// ClassInstanceCreationExpression ::= 'new' ClassType EnterInstanceCreationArgumentList '(' ArgumentListopt ')' UnqualifiedClassBodyopt
	public void test032() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"    X x = new @Marker X();\n" +
					"    X y = new <String> @Marker X();\n" +		
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 2)\n" + 
				"	X x = new @Marker X();\n" + 
				"	           ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"2. WARNING in X.java (at line 3)\n" + 
				"	X y = 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" + 
				"3. ERROR in X.java (at line 3)\n" + 
				"	X y = new <String> @Marker X();\n" + 
				"	                    ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n");
	}
	// ClassInstanceCreationExpression ::= Primary '.' 'new' OnlyTypeArguments ClassType EnterInstanceCreationArgumentList '(' ArgumentListopt ')' QualifiedClassBodyopt
	// ClassInstanceCreationExpression ::= Primary '.' 'new' ClassType EnterInstanceCreationArgumentList '(' ArgumentListopt ')' QualifiedClassBodyopt
	public void test033() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"    class Y {\n" +
					"    }\n" +
					"    Y y1 = new @Marker X().new @Marker Y();\n" +
					"    Y y2 = new @Marker X().new <String> @Marker Y();\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 4)\n" + 
				"	Y y1 = new @Marker X().new @Marker Y();\n" + 
				"	            ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 4)\n" + 
				"	Y y1 = new @Marker X().new @Marker Y();\n" + 
				"	                            ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 5)\n" + 
				"	Y y2 = new @Marker X().new <String> @Marker Y();\n" + 
				"	            ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"4. WARNING in X.java (at line 5)\n" + 
				"	Y y2 = new @Marker X().new <String> @Marker Y();\n" + 
				"	                            ^^^^^^\n" + 
				"Unused type arguments for the non generic constructor X.Y() of type X.Y; it should not be parameterized with arguments <String>\n" + 
				"----------\n" + 
				"5. ERROR in X.java (at line 5)\n" + 
				"	Y y2 = new @Marker X().new <String> @Marker Y();\n" + 
				"	                                     ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n");
	}
	// ClassInstanceCreationExpression ::= ClassInstanceCreationExpressionName 'new' ClassType EnterInstanceCreationArgumentList '(' ArgumentListopt ')' QualifiedClassBodyopt
	// ClassInstanceCreationExpression ::= ClassInstanceCreationExpressionName 'new' OnlyTypeArguments ClassType EnterInstanceCreationArgumentList '(' ArgumentListopt ')' QualifiedClassBodyopt
	public void test034() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"    X x;\n" +
					"    class Y {\n" +
					"    }\n" +
					"    Y y1 = @Marker x.new @Marker Y();\n" +
					"    Y y2 = @Marker x.new <String> @Marker Y();\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 5)\n" + 
				"	Y y1 = @Marker x.new @Marker Y();\n" + 
				"	       ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 5)\n" + 
				"	Y y1 = @Marker x.new @Marker Y();\n" + 
				"	                      ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 6)\n" + 
				"	Y y2 = @Marker x.new <String> @Marker Y();\n" + 
				"	       ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"4. WARNING in X.java (at line 6)\n" + 
				"	Y y2 = @Marker x.new <String> @Marker Y();\n" + 
				"	                      ^^^^^^\n" + 
				"Unused type arguments for the non generic constructor X.Y() of type X.Y; it should not be parameterized with arguments <String>\n" + 
				"----------\n" + 
				"5. ERROR in X.java (at line 6)\n" + 
				"	Y y2 = @Marker x.new <String> @Marker Y();\n" + 
				"	                               ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n");
	}
	// MethodHeaderThrowsClause ::= 'throws' ClassTypeList
	// ClassTypeList -> ClassTypeElt
	// ClassTypeList ::= ClassTypeList ',' ClassTypeElt
	// ClassTypeElt ::= ClassType
	public void test035() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X {\n" +
					"    void foo() throws @Marker NullPointerException, @Marker ArrayIndexOutOfBoundsException {}\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 2)\n" + 
				"	void foo() throws @Marker NullPointerException, @Marker ArrayIndexOutOfBoundsException {}\n" + 
				"	                   ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 2)\n" + 
				"	void foo() throws @Marker NullPointerException, @Marker ArrayIndexOutOfBoundsException {}\n" + 
				"	                                                 ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n");
	}
	// ClassHeaderImplements ::= 'implements' InterfaceTypeList
	// InterfaceHeaderExtends ::= 'extends' InterfaceTypeList
	// InterfaceTypeList -> InterfaceType
	// InterfaceTypeList ::= InterfaceTypeList ',' InterfaceType
	// InterfaceType ::= ClassOrInterfaceType
	public void test036() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"interface I {}\n" +
					"interface J {}\n" +
					"interface K extends @Marker I, @Marker J {}\n" +
					"interface L {}\n" +
					"public class X implements @Marker K, @Marker L {\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 3)\n" + 
				"	interface K extends @Marker I, @Marker J {}\n" + 
				"	                     ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 3)\n" + 
				"	interface K extends @Marker I, @Marker J {}\n" + 
				"	                                ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 5)\n" + 
				"	public class X implements @Marker K, @Marker L {\n" + 
				"	                           ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 5)\n" + 
				"	public class X implements @Marker K, @Marker L {\n" + 
				"	                                      ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n");
	}
	// ReferenceExpression ::= Name Dimsopt '::' NonWildTypeArgumentsopt IdentifierOrNew
	public void test037() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"interface I {\n" +
					"    void foo(int x);\n" +
					"}\n" +
					"public class X  {\n" +
					"    public static void main(String [] args) {\n" +
					"        I i = @Marker Y. @Marker Z @Marker [] [] @Marker [] ::foo;\n" +
					"        i.foo(10); \n" +
					"        Zork z;\n" +
					"    }\n" +
					"}\n" +
					"class Y {\n" +
					"    static class Z {\n" +
					"        public static void foo(int x) {\n" +
					"	    System.out.println(x);\n" +
					"        }\n" +
					"    }\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 6)\n" + 
				"	I i = @Marker Y. @Marker Z @Marker [] [] @Marker [] ::foo;\n" + 
				"	      ^^^^^^^\n" + 
				"Type annotations are not allowed on type names used to access static members\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 6)\n" + 
				"	I i = @Marker Y. @Marker Z @Marker [] [] @Marker [] ::foo;\n" + 
				"	      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"The type Y.Z[][][] does not define foo(int) that is applicable here\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 6)\n" + 
				"	I i = @Marker Y. @Marker Z @Marker [] [] @Marker [] ::foo;\n" + 
				"	       ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 6)\n" + 
				"	I i = @Marker Y. @Marker Z @Marker [] [] @Marker [] ::foo;\n" + 
				"	                  ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"5. ERROR in X.java (at line 6)\n" + 
				"	I i = @Marker Y. @Marker Z @Marker [] [] @Marker [] ::foo;\n" + 
				"	                            ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"6. ERROR in X.java (at line 6)\n" + 
				"	I i = @Marker Y. @Marker Z @Marker [] [] @Marker [] ::foo;\n" + 
				"	                                          ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"7. ERROR in X.java (at line 8)\n" + 
				"	Zork z;\n" + 
				"	^^^^\n" + 
				"Zork cannot be resolved to a type\n" + 
				"----------\n");
	}
	// ReferenceExpression ::= Name BeginTypeArguments ReferenceExpressionTypeArgumentsAndTrunk '::' NonWildTypeArgumentsopt IdentifierOrNew
	public void test038() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"interface I {\n" +
					"    Y foo(int x);\n" +
					"}\n" +
					"public class X  {\n" +
					"    class Z extends Y {\n" +
					"        public Z(int x) {\n" +
					"            super(x);\n" +
					"            System.out.println();\n" +
					"        }\n" +
					"    }\n" +
					"    public static void main(String [] args) {\n" +
					"        i = @Marker W<@Marker Integer>::<@Marker String> new;\n" +
					"    }\n" +
					"}\n" +
					"class W<T> extends Y {\n" +
					"    public W(T x) {\n" +
					"        super(0);\n" +
					"        System.out.println(x);\n" +
					"    }\n" +
					"}\n" +
					"class Y {\n" +
					"    public Y(int x) {\n" +
					"        System.out.println(x);\n" +
					"    }\n" +
					"}\n"


				},
				"----------\n" + 
				"1. ERROR in X.java (at line 12)\n" + 
				"	i = @Marker W<@Marker Integer>::<@Marker String> new;\n" + 
				"	^\n" + 
				"i cannot be resolved to a variable\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 12)\n" + 
				"	i = @Marker W<@Marker Integer>::<@Marker String> new;\n" + 
				"	    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"The target type of this expression must be a functional interface\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 12)\n" + 
				"	i = @Marker W<@Marker Integer>::<@Marker String> new;\n" + 
				"	     ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 12)\n" + 
				"	i = @Marker W<@Marker Integer>::<@Marker String> new;\n" + 
				"	               ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"5. ERROR in X.java (at line 12)\n" + 
				"	i = @Marker W<@Marker Integer>::<@Marker String> new;\n" + 
				"	                                  ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n");
	}
	// CastExpression ::= PushLPAREN Name PushRPAREN InsideCastExpressionLL1 UnaryExpressionNotPlusMinus
	// CastExpression ::= PushLPAREN Name Dims PushRPAREN InsideCastExpression UnaryExpressionNotPlusMinus
	// CastExpression ::= PushLPAREN Name OnlyTypeArgumentsForCastExpression Dimsopt PushRPAREN InsideCastExpression UnaryExpressionNotPlusMinus
	// CastExpression ::= PushLPAREN Name OnlyTypeArgumentsForCastExpression '.' ClassOrInterfaceType Dimsopt PushRPAREN InsideCastExpressionWithQualifiedGenerics UnaryExpressionNotPlusMinus
	public void test039() throws Exception {
		this.runNegativeTest(
				new String[] {
					"X.java",
					"public class X  {\n" +
					"    Object o = (@Marker X) null;\n" +
					"    Object p = (@Marker X @Marker []) null;\n" +
					"    Object q = (@Marker java. @Marker util. @Marker List<@Marker String> []) null;\n" +
					"    Object r = (@Marker java. @Marker util.@Marker Map<@Marker String, @Marker String>.@Marker Entry @Marker []) null;\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 2)\n" + 
				"	Object o = (@Marker X) null;\n" + 
				"	             ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 3)\n" + 
				"	Object p = (@Marker X @Marker []) null;\n" + 
				"	             ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 3)\n" + 
				"	Object p = (@Marker X @Marker []) null;\n" + 
				"	                       ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 4)\n" + 
				"	Object q = (@Marker java. @Marker util. @Marker List<@Marker String> []) 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. ERROR in X.java (at line 4)\n" + 
				"	Object q = (@Marker java. @Marker util. @Marker List<@Marker String> []) null;\n" + 
				"	             ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"6. ERROR in X.java (at line 4)\n" + 
				"	Object q = (@Marker java. @Marker util. @Marker List<@Marker String> []) null;\n" + 
				"	                          ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"7. ERROR in X.java (at line 4)\n" + 
				"	Object q = (@Marker java. @Marker util. @Marker List<@Marker String> []) null;\n" + 
				"	                                         ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"8. ERROR in X.java (at line 4)\n" + 
				"	Object q = (@Marker java. @Marker util. @Marker List<@Marker String> []) null;\n" + 
				"	                                                      ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"9. ERROR in X.java (at line 5)\n" + 
				"	Object r = (@Marker java. @Marker util.@Marker Map<@Marker String, @Marker String>.@Marker Entry @Marker []) 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" + 
				"10. ERROR in X.java (at line 5)\n" + 
				"	Object r = (@Marker java. @Marker util.@Marker Map<@Marker String, @Marker String>.@Marker Entry @Marker []) null;\n" + 
				"	            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" + 
				"The member type Map.Entry<K,V> cannot be qualified with a parameterized type, since it is static. Remove arguments from qualifying type Map<String,String>\n" + 
				"----------\n" + 
				"11. ERROR in X.java (at line 5)\n" + 
				"	Object r = (@Marker java. @Marker util.@Marker Map<@Marker String, @Marker String>.@Marker Entry @Marker []) null;\n" + 
				"	             ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"12. ERROR in X.java (at line 5)\n" + 
				"	Object r = (@Marker java. @Marker util.@Marker Map<@Marker String, @Marker String>.@Marker Entry @Marker []) null;\n" + 
				"	                          ^^^^^^^\n" + 
				"Syntax error, type annotations are illegal here\n" + 
				"----------\n" + 
				"13. ERROR in X.java (at line 5)\n" + 
				"	Object r = (@Marker java. @Marker util.@Marker Map<@Marker String, @Marker String>.@Marker Entry @Marker []) null;\n" + 
				"	                                       ^^^^^^^\n" + 
				"Type annotations are not allowed on type names used to access static members\n" + 
				"----------\n" + 
				"14. ERROR in X.java (at line 5)\n" + 
				"	Object r = (@Marker java. @Marker util.@Marker Map<@Marker String, @Marker String>.@Marker Entry @Marker []) null;\n" + 
				"	                                        ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"15. ERROR in X.java (at line 5)\n" + 
				"	Object r = (@Marker java. @Marker util.@Marker Map<@Marker String, @Marker String>.@Marker Entry @Marker []) null;\n" + 
				"	                                                    ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"16. ERROR in X.java (at line 5)\n" + 
				"	Object r = (@Marker java. @Marker util.@Marker Map<@Marker String, @Marker String>.@Marker Entry @Marker []) null;\n" + 
				"	                                                                    ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"17. ERROR in X.java (at line 5)\n" + 
				"	Object r = (@Marker java. @Marker util.@Marker Map<@Marker String, @Marker String>.@Marker Entry @Marker []) null;\n" + 
				"	                                                                                    ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n" + 
				"18. ERROR in X.java (at line 5)\n" + 
				"	Object r = (@Marker java. @Marker util.@Marker Map<@Marker String, @Marker String>.@Marker Entry @Marker []) null;\n" + 
				"	                                                                                                  ^^^^^^\n" + 
				"Marker cannot be resolved to a type\n" + 
				"----------\n");
	}
}
