/*******************************************************************************
 * Copyright (c) 2013, 2019 GK Software AG, 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:
 *     Stephan Herrmann - initial API and implementation
 *     Jesper S Moller - realigned with bug 399695
 *******************************************************************************/
package org.eclipse.jdt.core.tests.compiler.regression;

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

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

import junit.framework.Test;

// See https://bugs.eclipse.org/380501
// Bug 380501 - [1.8][compiler] Add support for default methods (JSR 335)
@SuppressWarnings({ "unchecked", "rawtypes" })
public class InterfaceMethodsTest extends AbstractComparableTest {

// Static initializer to specify tests subset using TESTS_* static variables
// All specified tests which do not belong to the class are skipped...
	static {
//			TESTS_NAMES = new String[] { "testBug421543" };
//			TESTS_NUMBERS = new int[] { 561 };
//			TESTS_RANGE = new int[] { 1, 2049 };
	}

	public static Test suite() {
		return buildMinimalComplianceTestSuite(testClass(), F_1_8);
	}

	public static Test setUpTest(Test test) throws Exception {
		TestCase.setUpTest(test);
		RegressionTestSetup suite = new RegressionTestSetup(ClassFileConstants.JDK1_8);
		suite.addTest(test);
		return suite;
	}

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

	public InterfaceMethodsTest(String name) {
		super(name);
	}

	// default methods with various modifiers, positive cases
	public void testModifiers1() {
		runConformTest(
		new String[] {
			"I.java",
			"import java.lang.annotation.*;\n" +
			"@Target(ElementType.METHOD) @interface Annot{}\n" +
			"public interface I {\n" +
			"    default void foo1()  {}\n" +
			"    public default void foo2() { System.exit(0); }\n" +
			"    strictfp default void foo3() {}\n" +
			"    public default strictfp void foo4() {}\n" +
			"    public default strictfp @Annot void foo5() {}\n" +
			"}\n",
		}, 
		"");
	}
		

	// default methods with various modifiers, negative cases
	public void testModifiers1a() {
		String infMod = this.complianceLevel >= ClassFileConstants.JDK9 ? " private," : "";
		runNegativeTest(
		new String[] {
			"I.java",
			"import java.lang.annotation.*;\n" +
			"@Target(ElementType.METHOD) @interface Annot{}\n" +
			"public interface I {\n" +
			"    default void foo1()  {}\n" +
			"    public default synchronized void foo2() { System.exit(0); }\n" +
			"    strictfp default void foo3() {}\n" +
			"    public default strictfp synchronized void foo4() {}\n" +
			"    public default strictfp synchronized @Annot void foo5() {}\n" +
			"}\n"}, 
			"----------\n" + 
			"1. ERROR in I.java (at line 5)\n" + 
			"	public default synchronized void foo2() { System.exit(0); }\n" + 
			"	                                 ^^^^^^\n" + 
			"Illegal modifier for the interface method foo2; only public,"+ infMod +" abstract, default, static and strictfp are permitted\n" + 
			"----------\n" + 
			"2. ERROR in I.java (at line 7)\n" + 
			"	public default strictfp synchronized void foo4() {}\n" + 
			"	                                          ^^^^^^\n" + 
			"Illegal modifier for the interface method foo4; only public,"+ infMod +" abstract, default, static and strictfp are permitted\n" + 
			"----------\n" + 
			"3. ERROR in I.java (at line 8)\n" + 
			"	public default strictfp synchronized @Annot void foo5() {}\n" + 
			"	                                                 ^^^^^^\n" + 
			"Illegal modifier for the interface method foo5; only public,"+ infMod +" abstract, default, static and strictfp are permitted\n" + 
			"----------\n");
	}

	// default methods with various modifiers, simple syntax error blows the parser
	public void testModifiers1b() {
		runNegativeTest(
		new String[] {
			"I.java",
			"import java.lang.annotation.*;\n" +
			"@Target(ElementType.METHOD) @interface Annot{}\n" +
			"public interface I {\n" +
			"    default void foo1() { System.out.println(3); }\n" +
			"    public default void foo2() {}\n" +
			"    stritfp default void foo3() {}\n" + // typo in strictfp
			"    default public strictfp void foo4() {}\n" +
			"    public strictfp  default @Annot void foo5() {}\n" +
			"    public default <T> T foo6(T t) { return t; }\n" +
			"}\n"},
			"----------\n" +
			"1. ERROR in I.java (at line 6)\n" +
			"	stritfp default void foo3() {}\n" +
			"	^^^^^^^\n" +
			"Syntax error, insert \"Identifier (\" to complete MethodHeaderName\n" +
			"----------\n" +
//{ObjectTeams: funny syntax errors, but so what ...
			"2. ERROR in I.java (at line 6)\n" + 
			"	stritfp default void foo3() {}\n" + 
			"	^^^^^^^\n" + 
			"Syntax error, insert \")\" to complete MethodSpecLong\n" + 
			"----------\n" + 
			"3. ERROR in I.java (at line 6)\n" + 
			"	stritfp default void foo3() {}\n" + 
			"	^^^^^^^\n" + 
			"Syntax error, insert \"<-\" to complete CallinBindingLeft\n" + 
			"----------\n" + 
			"4. ERROR in I.java (at line 6)\n" + 
			"	stritfp default void foo3() {}\n" + 
			"	^^^^^^^\n" + 
			"Syntax error, insert \"MethodSpecsLong EmptyParameterMappings\" to complete InvalidCallinBinding\n" +
// SH}
			"----------\n");
	}

	// regular interface with illegal modifiers
	public void testModifiers2() {
		String infMod = this.complianceLevel >= ClassFileConstants.JDK9 ? " private," : "";
		runNegativeTest(
		new String[] {
			"I.java",
			"import java.lang.annotation.*;\n" +
			"@Target(ElementType.METHOD) @interface Annot{}\n" +
			"public interface I {\n" +
			"    void foo1();\n" +
			"    public synchronized void foo2();\n" +
			"    strictfp void foo3();\n" +
			"    public strictfp synchronized void foo4();\n" +
			"    public strictfp synchronized @Annot void foo5();\n" +
			"}\n"},
			"----------\n" +
			"1. ERROR in I.java (at line 5)\n" +
			"	public synchronized void foo2();\n" +
			"	                         ^^^^^^\n" +
			"Illegal modifier for the interface method foo2; only public,"+ infMod +" abstract, default, static and strictfp are permitted\n" +
			"----------\n" +
			"2. ERROR in I.java (at line 6)\n" +
			"	strictfp void foo3();\n" +
			"	              ^^^^^^\n" +
			"strictfp is not permitted for abstract interface method foo3\n" +
			"----------\n" +
			"3. ERROR in I.java (at line 7)\n" +
			"	public strictfp synchronized void foo4();\n" +
			"	                                  ^^^^^^\n" +
			"strictfp is not permitted for abstract interface method foo4\n" +
			"----------\n" +
			"4. ERROR in I.java (at line 7)\n" +
			"	public strictfp synchronized void foo4();\n" +
			"	                                  ^^^^^^\n" +
			"Illegal modifier for the interface method foo4; only public,"+ infMod +" abstract, default, static and strictfp are permitted\n" +
			"----------\n" +
			"5. ERROR in I.java (at line 8)\n" +
			"	public strictfp synchronized @Annot void foo5();\n" +
			"	                                         ^^^^^^\n" +
			"strictfp is not permitted for abstract interface method foo5\n" +
			"----------\n" +
			"6. ERROR in I.java (at line 8)\n" +
			"	public strictfp synchronized @Annot void foo5();\n" +
			"	                                         ^^^^^^\n" + 
			"Illegal modifier for the interface method foo5; only public,"+ infMod +" abstract, default, static and strictfp are permitted\n" +
			"----------\n");
	}

	// default & regular methods with modifiers that are illegal even for default methods
	public void testModifiers3() {
		String infMod = this.complianceLevel >= ClassFileConstants.JDK9 ? " private," : "";
		runNegativeTest(
		new String[] {
			"I.java",
			"public interface I {\n" +
			"    native void foo1();\n" +
			"    static void foo2();\n" +
			"    native default void foo3() {}\n" +
			"    default native void foo4() {}\n" +
			"    static default void foo5() {}\n" +
			"    default static void foo6() {}\n" +
			"}\n"},
			"----------\n" + 
			"1. ERROR in I.java (at line 2)\n" + 
			"	native void foo1();\n" + 
			"	            ^^^^^^\n" + 
			"Illegal modifier for the interface method foo1; only public,"+ infMod +" abstract, default, static and strictfp are permitted\n" + 
			"----------\n" + 
			"2. ERROR in I.java (at line 3)\n" + 
			"	static void foo2();\n" + 
			"	            ^^^^^^\n" + 
			"This method requires a body instead of a semicolon\n" + 
			"----------\n" + 
			"3. ERROR in I.java (at line 4)\n" + 
			"	native default void foo3() {}\n" + 
			"	                    ^^^^^^\n" + 
			"Illegal modifier for the interface method foo3; only public,"+ infMod +" abstract, default, static and strictfp are permitted\n" + 
			"----------\n" + 
			"4. ERROR in I.java (at line 5)\n" + 
			"	default native void foo4() {}\n" + 
			"	                    ^^^^^^\n" + 
			"Illegal modifier for the interface method foo4; only public,"+ infMod +" abstract, default, static and strictfp are permitted\n" + 
			"----------\n" + 
			"5. ERROR in I.java (at line 6)\n" + 
			"	static default void foo5() {}\n" + 
			"	                    ^^^^^^\n" + 
			"Illegal combination of modifiers for the interface method foo5; only one of abstract, default, or static permitted\n" + 
			"----------\n" + 
			"6. ERROR in I.java (at line 7)\n" + 
			"	default static void foo6() {}\n" + 
			"	                    ^^^^^^\n" + 
			"Illegal combination of modifiers for the interface method foo6; only one of abstract, default, or static permitted\n" + 
			"----------\n");
	}

	// if an interface methods is explicitly "abstract" it cannot have a (default) body
	public void testModifiers4() {
		runNegativeTest(
		new String[] {
			"I.java",
			"import java.lang.annotation.*;\n" +
			"public interface I {\n" +
			"    abstract void foo1();\n" + // OK
			"    public abstract default void foo2() {}\n" +
			"    default abstract void foo3() {}\n" +
			"    void foo4() { }\n" + // implicit "abstract" without "default" doesn't allow a body, either
			"    abstract static default void foo5() {}\n" + // double fault
			"}\n"},
			"----------\n" + 
			"1. ERROR in I.java (at line 4)\n" + 
			"	public abstract default void foo2() {}\n" + 
			"	                             ^^^^^^\n" + 
			"Illegal combination of modifiers for the interface method foo2; only one of abstract, default, or static permitted\n" + 
			"----------\n" + 
			"2. ERROR in I.java (at line 5)\n" + 
			"	default abstract void foo3() {}\n" + 
			"	                      ^^^^^^\n" + 
			"Illegal combination of modifiers for the interface method foo3; only one of abstract, default, or static permitted\n" + 
			"----------\n" + 
			"3. ERROR in I.java (at line 6)\n" + 
			"	void foo4() { }\n" + 
			"	     ^^^^^^\n" + 
			"Abstract methods do not specify a body\n" + 
			"----------\n" + 
			"4. ERROR in I.java (at line 7)\n" + 
			"	abstract static default void foo5() {}\n" + 
			"	                             ^^^^^^\n" + 
			"Illegal combination of modifiers for the interface method foo5; only one of abstract, default, or static permitted\n" + 
			"----------\n");
	}

	// class implements interface with default method. 
	// - no need to implement this interface method as it is not abstract
	public void testModifiers5() {
		runConformTest(
			new String[] {
				"C.java",
				"public class C implements I {\n" +
				"    public static void main(String[] args) {\n" +
				"        new C().foo();\n" +
				"    }\n" +
				"}\n",
				"I.java",
				"public interface I {\n" +
				"    default void foo() {\n" +
				"        System.out.println(\"default\");\n" +
				"    }\n" +
				"}\n"
			},
			"default"
			);
	}

	// class implements interface with default method. 
	// - no need to implement this interface method as it is not abstract, but other abstract method exists
	public void testModifiers6() {
		runNegativeTest(
			new String[] {
				"I.java",
				"public interface I {\n" +
				"    default void foo() {}\n" +
				"    void bar();\n" +
				"}\n",
				"C.java",
				"public class C implements I {}\n"
			},
			"----------\n" + 
			"1. ERROR in C.java (at line 1)\n" + 
			"	public class C implements I {}\n" + 
			"	             ^\n" + 
			"The type C must implement the inherited abstract method I.bar()\n" + 
			"----------\n");
	}

	// a default method has a semicolon body / an undocumented empty body
	public void testModifiers7() {
		Map options = getCompilerOptions();
		options.put(JavaCore.COMPILER_PB_UNDOCUMENTED_EMPTY_BLOCK, JavaCore.ERROR);
		runNegativeTest(
			new String[] {
				"I.java",
				"public interface I {\n" +
				"    default void foo();\n" +
				"    default void bar() {}\n" +
				"    default void zork() { /* nop */ }\n" +
				"}\n"
			},
			"----------\n" +
			"1. ERROR in I.java (at line 2)\n" +
			"	default void foo();\n" +
			"	             ^^^^^\n" +
			"This method requires a body instead of a semicolon\n" +
			"----------\n" +
			"2. ERROR in I.java (at line 3)\n" +
			"	default void bar() {}\n" +
			"	                   ^^\n" +
			"Empty block should be documented\n" +
			"----------\n",
			null/*classLibs*/,
			true/*shouldFlush*/,
			options);
	}

	// JLS 9.4.2  - default method cannot override method from Object
	// Bug 382355 - [1.8][compiler] Compiler accepts erroneous default method
	// new error message
	public void testObjectMethod1() {
		runNegativeTest(
			new String[] {
				"I.java",
				"public interface I {\n" +
				"    public default String toString () { return \"\";}\n" + 
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in I.java (at line 2)\n" + 
			"	public default String toString () { return \"\";}\n" + 
			"	                      ^^^^^^^^^^^\n" + 
			"A default method cannot override a method from java.lang.Object \n" + 
			"----------\n");
	}
	
	// JLS 9.4.2  - default method cannot override method from Object
	// Bug 382355 - [1.8][compiler] Compiler accepts erroneous default method
	// when using a type variable this is already reported as a name clash
	public void testObjectMethod2() {
		runNegativeTest(
			new String[] {
				"I.java",
				"public interface I<T> {\n" +
				"    public default boolean equals (T other) { return false;}\n" + 
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in I.java (at line 2)\n" + 
			"	public default boolean equals (T other) { return false;}\n" + 
			"	                       ^^^^^^^^^^^^^^^^\n" + 
			"Name clash: The method equals(T) of type I<T> has the same erasure as equals(Object) of type Object but does not override it\n" + 
			"----------\n");
	}
	
	// JLS 9.4.2  - default method cannot override method from Object
	// Bug 382355 - [1.8][compiler] Compiler accepts erroneous default method
	// one error for final method is enough
	public void testObjectMethod3() {
		runNegativeTest(
			new String[] {
				"I.java",
				"public interface I<T> {\n" +
				"    @Override\n" +
				"    default public Class<?> getClass() { return null;}\n" + 
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in I.java (at line 3)\n" + 
			"	default public Class<?> getClass() { return null;}\n" + 
			"	                        ^^^^^^^^^^\n" + 
			"Cannot override the final method from Object\n" + 
			"----------\n");
	}

	// JLS 9.4.1
	// Bug 382347 - [1.8][compiler] Compiler accepts incorrect default method inheritance
	// an inherited default methods clashes with another inherited method
	// simple case
	public void testInheritedDefaultOverrides01() {
		runNegativeTest(
			new String[] {
				"I1.java",
				"public interface I1 {\n" +
				"	String foo();\n" +
				"}\n",
				"I2.java",
				"public interface I2 {\n" +
				"	default String foo() { return \"\"; }\n" +
				"}\n",
				"I3.java",
				"public interface I3 extends I1, I2 {\n" +
				"}\n",
			},
			"----------\n" + 
			"1. ERROR in I3.java (at line 1)\n" + 
			"	public interface I3 extends I1, I2 {\n" + 
			"	                 ^^\n" + 
			"The default method foo() inherited from I2 conflicts with another method inherited from I1\n" +
			"----------\n");
	}
	
	// JLS 9.4.1
	// Bug 382347 - [1.8][compiler] Compiler accepts incorrect default method inheritance
	// an inherited default methods clashes with another inherited method
	// indirect inheritance
	public void testInheritedDefaultOverrides02() {
		runNegativeTest(
			new String[] {
				"I1.java",
				"public interface I1 {\n" +
				"	String foo();\n" +
				"}\n",
				"I2.java",
				"public interface I2 {\n" +
				"	default String foo() { return \"\"; }\n" +
				"}\n",
				"I1A.java",
				"public interface I1A extends I1 {\n" +
				"}\n",
				"I2A.java",
				"public interface I2A extends I2 {\n" +
				"}\n",
				"I3.java",
				"public interface I3 extends I1A, I2A {\n" +
				"}\n",
			},
			"----------\n" + 
			"1. ERROR in I3.java (at line 1)\n" + 
			"	public interface I3 extends I1A, I2A {\n" + 
			"	                 ^^\n" + 
			"The default method foo() inherited from I2 conflicts with another method inherited from I1\n" +
			"----------\n");
	}

	// JLS 9.4.1
	// Bug 382347 - [1.8][compiler] Compiler accepts incorrect default method inheritance
	// Parameterized case is already reported as a clash
	public void testInheritedDefaultOverrides03() {
		runNegativeTest(
			new String[] {
				"I1.java",
				"import java.util.List;\n" +
				"public interface I1 {\n" +
				"	String foo(List<String> l);\n" +
				"}\n",
				"I2.java",
				"import java.util.List;\n" +
				"public interface I2 {\n" +
				"   @SuppressWarnings(\"rawtypes\")\n" +
				"	default String foo(List l) { return \"\"; }\n" +
				"}\n",
				"I3.java",
				"import java.util.List;\n" +
				"public interface I3 extends I1, I2 {\n" +
				"   @Override\n" +
				"   String foo(List<String> l);\n" +
				"}\n",
			},
			"----------\n" + 
			"1. ERROR in I3.java (at line 4)\n" + 
			"	String foo(List<String> l);\n" + 
			"	       ^^^^^^^^^^^^^^^^^^^\n" + 
			"Name clash: The method foo(List<String>) of type I3 has the same erasure as foo(List) of type I2 but does not override it\n" + 
			"----------\n");
	}

	// JLS 9.4.1
	// Bug 382347 - [1.8][compiler] Compiler accepts incorrect default method inheritance
	// Parameterized case is already reported as a clash - inverse case of previous
	public void testInheritedDefaultOverrides04() {
		runNegativeTest(
			new String[] {
				"I1.java",
				"import java.util.List;\n" +
				"public interface I1 {\n" +
				"	default String foo(List<String> l) { return \"\"; }\n" +
				"}\n",
				"I2.java",
				"import java.util.List;\n" +
				"public interface I2 {\n" +
				"   @SuppressWarnings(\"rawtypes\")\n" +
				"	String foo(List l);\n" +
				"}\n",
				"I3.java",
				"import java.util.List;\n" +
				"public interface I3 extends I1, I2 {\n" +
				"   @Override\n" +
				"   String foo(List<String> l);\n" +
				"}\n",
			},
			"----------\n" + 
			"1. ERROR in I3.java (at line 4)\n" + 
			"	String foo(List<String> l);\n" + 
			"	       ^^^^^^^^^^^^^^^^^^^\n" + 
			"Name clash: The method foo(List<String>) of type I3 has the same erasure as foo(List) of type I2 but does not override it\n" + 
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=390761
	public void testDefaultNonclash() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public interface X extends Map<String, Object> {\n" +
				"   Zork z;\n" +
				"}\n" +
				"\n" +
				"interface Map<K,V> extends MapStream<K, V>  {\n" +
				"   @Override\n" +
				"	default Iterable<BiValue<K, V>> asIterable() {\n" +
				"		return null;\n" +
				"	}\n" +
				"}\n" +
				"interface MapStream<K, V> {\n" +
				"	Iterable<BiValue<K, V>> asIterable();\n" +
				"}\n" +
				"\n" +
				"interface BiValue<T, U> {\n" +
				"    T getKey();\n" +
				"    U getValue();\n" +
				"}\n",
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 2)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=390761
	public void testDefaultNonclash2() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public interface X extends Map<String, Object> {\n" +
				"   Zork z;\n" +
				"}\n" +
				"\n" +
				"interface Map<K,V> extends MapStream<K, V>  {\n" +
				"   @Override\n" +
				"	Iterable<BiValue<K, V>> asIterable();\n" +
				"}\n" +
				"interface MapStream<K, V> {\n" +
				"	default Iterable<BiValue<K, V>> asIterable() {\n" +
				"       return null;\n" +
				"   }\n" +
				"}\n" +
				"\n" +
				"interface BiValue<T, U> {\n" +
				"    T getKey();\n" +
				"    U getValue();\n" +
				"}\n",
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 2)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
	}
	
	public void testDefaultNonclash3() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public interface X extends Map<String, Object> {\n" +
				"   Zork z;\n" +
				"}\n" +
				"\n" +
				"interface Map<K,V> extends MapStream<K, V>  {\n" +
				"   @Override\n" +
				"	default Iterable<BiValue<K, V>> asIterable() {\n" +
				"       return null;\n" +
				"   }\n" +
				"}\n" +
				"interface MapStream<K, V> {\n" +
				"	default Iterable<BiValue<K, V>> asIterable() {\n" +
				"       return null;\n" +
				"   }\n" +
				"}\n" +
				"\n" +
				"interface BiValue<T, U> {\n" +
				"    T getKey();\n" +
				"    U getValue();\n" +
				"}\n",
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 2)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=390761
	public void testDefaultNonclash4() {
		runNegativeTest(
			new String[] {
				"X.java",
				"public interface X extends Map<String, Object> {\n" +
				"   Zork z;\n" +
				"}\n" +
				"\n" +
				"interface Map<K,V> extends MapStream<K, V>  {\n" +
				"   @Override\n" +
				"	Iterable<BiValue<K, V>> asIterable();\n" +
				"}\n" +
				"interface MapStream<K, V> {\n" +
				"	Iterable<BiValue<K, V>> asIterable();\n" +
				"}\n" +
				"\n" +
				"interface BiValue<T, U> {\n" +
				"    T getKey();\n" +
				"    U getValue();\n" +
				"}\n",
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 2)\n" + 
			"	Zork z;\n" + 
			"	^^^^\n" + 
			"Zork cannot be resolved to a type\n" + 
			"----------\n");
	}

	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=420080
	public void testDefaultNonclash5() {
		runConformTest(
			new String[] {
				"X.java",
				"public class X extends G implements I {\n" + 
				"}\n" + 
				"\n" + 
				"interface I {\n" + 
				"	default int foo (){\n" + 
				"		return 0;\n" + 
				"	}\n" + 
				"}\n" + 
				"\n" + 
				"class G {\n" + 
				"	public int foo() {\n" + 
				"		return 0;\n" + 
				"	}\n" + 
				"}\n"
			});
	}

	// JLS 9.4.1
	// Bug 382347 - [1.8][compiler] Compiler accepts incorrect default method inheritance
	// Don't report conflict between the same method inherited on two paths.
	public void testInheritedDefaultOverrides05() {
		runConformTest(
			new String[] {
				"StringList.java",
				"import java.util.Collection;\n" +
				"public abstract class StringList implements Collection<String> {\n" +
				"}\n"
			},
			"");
	}

	// JLS 9.4.1
	// Bug 382347 - [1.8][compiler] Compiler accepts incorrect default method inheritance
	// extract from SuperTypeTest.test013():
	public void testInheritedDefaultOverrides06() {
		runConformTest(
			new String[] {
				"IterableList.java",
				"import java.util.*;\n" +
				"public interface IterableList<E> extends Iterable<E>, List<E> {}\n" +
				"interface ListIterable<E> extends Iterable<E>, List<E> {}\n" +
				"\n"
			},
			"");
	}

	// JLS 8.1.1.1 abstract Classes
	// Default method overrides an abstract method from its super interface
	public void testAbstract01() {
		runConformTest(
			new String[] {
				"I2.java",
				"public interface I2 {\n" +
				"    void test();\n" +
				"}\n",
				"I1.java",
				"public interface I1 extends I2 {\n" +
				"    default void test() {}\n" +
				"}\n",
				"C.java",
				"public class C implements I1 {\n" +
				"}\n"
			});
	}

	// JLS 8.1.1.1 abstract Classes
	// Default method conflicts with independent interface method
	public void testAbstract02() {
		runNegativeTest(
			new String[] {
				"I1.java",
				"public interface I1 {\n" +
				"    void test();\n" +
				"}\n",
				"I2.java",
				"public interface I2 {\n" +
				"    default void test() {}\n" +
				"}\n",
				"C.java",
				"public class C implements I1, I2 {\n" +
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in C.java (at line 1)\n" + 
			"	public class C implements I1, I2 {\n" + 
			"	             ^\n" + 
			"The default method test() inherited from I2 conflicts with another method inherited from I1\n" + 
			"----------\n");
			// Note: javac first complains: C is not abstract and does not override abstract method test() in I1
			//       only when C is marked abstract does the conflict between abstract and default method surface
	}

	// JLS 8.1.1.1 abstract Classes
	// Default method conflicts independent interface method
	// same as above except for order of implements list
	public void testAbstract02a() {
		runNegativeTest(
			new String[] {
				"I1.java",
				"public interface I1 {\n" +
				"    void test();\n" +
				"}\n",
				"I2.java",
				"public interface I2 {\n" +
				"    default void test() {}\n" +
				"}\n",
				"C.java",
				"public class C implements I2, I1 {\n" +
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in C.java (at line 1)\n" + 
			"	public class C implements I2, I1 {\n" + 
			"	             ^\n" + 
			"The default method test() inherited from I2 conflicts with another method inherited from I1\n" + 
			"----------\n");
			// Note: javac first complains: C is not abstract and does not override abstract method test() in I1
			//       only when C is marked abstract does the conflict between abstract and default method surface
	}

	// JLS 8.1.1.1 abstract Classes
	// Default method does not override independent abstract method
	// class is abstract
	public void testAbstract02b() {
		runNegativeTest(
			new String[] {
				"I1.java",
				"public interface I1 {\n" +
				"    void test();\n" +
				"}\n",
				"I2.java",
				"public interface I2 {\n" +
				"    default void test() {}\n" +
				"}\n",
				"C.java",
				"public abstract class C implements I2, I1 {\n" +
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in C.java (at line 1)\n" + 
			"	public abstract class C implements I2, I1 {\n" + 
			"	                      ^\n" + 
			"The default method test() inherited from I2 conflicts with another method inherited from I1\n" + 
			"----------\n");
	}

	// same as above but only interfaces
	public void testAbstract02c() {
		runNegativeTest(
			new String[] {
				"I1.java",
				"public interface I1 {\n" +
				"    void test();\n" +
				"}\n",
				"I2.java",
				"public interface I2 {\n" +
				"    default void test() {}\n" +
				"}\n",
				"I3.java",
				"public interface I3 extends I1, I2 {\n" +
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in I3.java (at line 1)\n" + 
			"	public interface I3 extends I1, I2 {\n" + 
			"	                 ^^\n" + 
			"The default method test() inherited from I2 conflicts with another method inherited from I1\n" + 
			"----------\n");
	}

	// JLS 8.1.1.1 abstract Classes
	// Default method overrides an abstract method from its super interface - class implements both
	public void testAbstract03() {
		runConformTest(
			new String[] {
				"I1.java",
				"public interface I1 {\n" +
				"    void test();\n" +
				"}\n",
				"I2.java",
				"public interface I2 extends I1 {\n" +
				"    @Override\n" +
				"    default void test() {}\n" +
				"}\n",
				"C.java",
				"public class C implements I1, I2 {\n" +
				"}\n"
			});
	}
	
	// JLS 8.1.1.1 abstract Classes
	// Default method overrides an abstract method from its super interface - class implements both
	// same as above except for order of implements list
	public void testAbstract03a() {
		runConformTest(
			new String[] {
				"I1.java",
				"public interface I1 {\n" +
				"    void test();\n" +
				"}\n",
				"I2.java",
				"public interface I2 extends I1 {\n" +
				"    @Override\n" +
				"    default void test() {}\n" +
				"}\n",
				"C.java",
				"public class C implements I2, I1 {\n" +
				"}\n"
			});
	}

	// JLS 8.1.1.1 abstract Classes
	// default method is not inherited because a more specific abstract method is.
	public void testAbstract04() {
		runNegativeTest(
			new String[] {
				"I1.java",
				"public interface I1 {\n" +
				"    default void test() {}\n" +
				"}\n",
				"I2.java",
				"public interface I2 extends I1 {\n" +
				"    @Override\n" +
				"    void test();\n" +
				"}\n",
				"C.java",
				"public class C implements I2, I1 {\n" +
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in C.java (at line 1)\n" + 
			"	public class C implements I2, I1 {\n" + 
			"	             ^\n" + 
			"The type C must implement the inherited abstract method I2.test()\n" + 
			"----------\n");
	}

	// JLS 8.1.1.1 abstract Classes
	// default method is not inherited because a more specific abstract method is.
	// same as above except for order of implements list
	public void testAbstract04a() {
		runNegativeTest(
			new String[] {
				"I1.java",
				"public interface I1 {\n" +
				"    default void test() {}\n" +
				"}\n",
				"I2.java",
				"public interface I2 extends I1 {\n" +
				"    @Override\n" +
				"    void test();\n" +
				"}\n",
				"C.java",
				"public class C implements I2, I1 {\n" +
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in C.java (at line 1)\n" + 
			"	public class C implements I2, I1 {\n" + 
			"	             ^\n" + 
			"The type C must implement the inherited abstract method I2.test()\n" + 
			"----------\n");
	}

	// abstract class method trumps otherwise conflicting default methods: the conflict scenario
	public void testAbstract05() {
		runNegativeTest(
			new String[] {
				"I1.java",
				"public interface I1 {\n" +
				"	default String value1() { return null; }\n" +
				"}\n",
				"I2.java",
				"public interface I2 {\n" +
				"	default String value1() { return \"\"; }\n" + // conflicts with other default method
				"}\n",
				"C2.java",
				"public abstract class C2 implements I1, I2 {\n" +
				"}\n",
			},
			"----------\n" + 
			"1. ERROR in C2.java (at line 1)\n" + 
			"	public abstract class C2 implements I1, I2 {\n" + 
			"	                      ^^\n" + 
			"Duplicate default methods named value1 with the parameters () and () are inherited from the types I2 and I1\n" + 
			"----------\n");
	}

	// abstract class method trumps otherwise conflicting default methods: conflict resolved
	public void testAbstract06() {
		runNegativeTest(
			new String[] {
				"I1.java",
				"public interface I1 {\n" +
				"	default String value1() { return null; }\n" +
				"}\n",
				"I2.java",
				"public interface I2 {\n" +
				"	default String value1() { return \"\"; }\n" + // conflicts with other default method
				"}\n",
				"C1.java",
				"public abstract class C1 {\n" +
				"	abstract Object value1();\n" + // trumps the conflicting methods (without overriding)
				"}\n",
				"C2.java",
				"public abstract class C2 extends C1 implements I1, I2 {\n" +
				"}\n",
				"C3.java",
				"public class C3 extends C2 {\n" +
				"	@Override\n" +
				"	public Object value1() { return this; } // too week, need a method returning String\n" +
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in C3.java (at line 3)\n" + 
			"	public Object value1() { return this; } // too week, need a method returning String\n" + 
			"	       ^^^^^^\n" + 
			"The return type is incompatible with I1.value1()\n" + 
			"----------\n" + 
			"2. ERROR in C3.java (at line 3)\n" + 
			"	public Object value1() { return this; } // too week, need a method returning String\n" + 
			"	       ^^^^^^\n" + 
			"The return type is incompatible with I2.value1()\n" + 
			"----------\n");
	}

	// abstract class method trumps otherwise conflicting default methods: conflict resolved
	// variant: second method is not a default method
	public void testAbstract06a() {
		runNegativeTest(
			new String[] {
				"I1.java",
				"public interface I1 {\n" +
				"	default String value1() { return null; }\n" +
				"}\n",
				"I2.java",
				"public interface I2 {\n" +
				"	String value1();\n" + // conflicts with other default method
				"}\n",
				"C1.java",
				"public abstract class C1 {\n" +
				"	abstract Object value1();\n" + // trumps the conflicting methods (without overriding)
				"}\n",
				"C2.java",
				"public abstract class C2 extends C1 implements I1, I2 {\n" +
				"}\n",
				"C3.java",
				"public class C3 extends C2 {\n" +
				"	@Override\n" +
				"	public Object value1() { return this; } // too week, need a method returning String\n" +
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in C3.java (at line 3)\n" + 
			"	public Object value1() { return this; } // too week, need a method returning String\n" + 
			"	       ^^^^^^\n" + 
			"The return type is incompatible with I2.value1()\n" + 
			"----------\n" + 
			"2. ERROR in C3.java (at line 3)\n" + 
			"	public Object value1() { return this; } // too week, need a method returning String\n" + 
			"	       ^^^^^^\n" + 
			"The return type is incompatible with I1.value1()\n" + 
			"----------\n");
	}
	
	// abstract class method trumps otherwise conflicting default methods: conflict not resolved due to insufficient visibility
	public void testAbstract6b() {
		runNegativeTest(
			new String[] {
				"I1.java",
				"public interface I1 {\n" +
				"	default String value1() { return null; }\n" +
				"}\n",
				"I2.java",
				"public interface I2 {\n" +
				"	default String value1() { return \"\"; }\n" + // conflicts with other default method
				"}\n",
				"p1/C1.java",
				"package p1;\n" +
				"public abstract class C1 {\n" +
				"	abstract Object value1();\n" + // trump with package visibility doesn't work
				"}\n",
				"C2.java",
				"public abstract class C2 extends p1.C1 implements I1, I2 {\n" +
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in C2.java (at line 1)\n" + 
			"	public abstract class C2 extends p1.C1 implements I1, I2 {\n" + 
			"	                      ^^\n" + 
			"Duplicate default methods named value1 with the parameters () and () are inherited from the types I2 and I1\n" + 
			"----------\n");
	}

	// abstract class method trumps otherwise conflicting default method: only one default method
	public void testAbstract07() {
		runNegativeTest(
			new String[] {
				"I1.java",
				"public interface I1 {\n" +
				"	default String value1() { return null; }\n" +
				"}\n",
				"C1.java",
				"public abstract class C1 {\n" +
				"	abstract Object value1();\n" + // trumps the conflicting method (without overriding)
				"}\n",
				"C2.java",
				"public abstract class C2 extends C1 implements I1 {\n" +
				"}\n",
				"C3.java",
				"public class C3 extends C2 {\n" +
				"	@Override\n" +
				"	public Object value1() { return this; } // too week, need a method returning String\n" +
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in C3.java (at line 3)\n" + 
			"	public Object value1() { return this; } // too week, need a method returning String\n" + 
			"	       ^^^^^^\n" + 
			"The return type is incompatible with I1.value1()\n" + 
			"----------\n");
	}

	// class inherits two override equivalent methods,
	// must be declared abstract, although one of the methods is a default method.
	public void testAbstract08() {
		runNegativeTest(
			new String[] {
				"I1.java",
				"public interface I1 {\n" +
				"	default String value() { return null; }\n" +
				"}\n",
				"C1.java",
				"public abstract class C1 {\n" +
				"	public abstract String value();" +
				"}\n",
				"C2.java",
				"public class C2 extends C1 implements I1 {\n" +
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in C2.java (at line 1)\n" + 
			"	public class C2 extends C1 implements I1 {\n" + 
			"	             ^^\n" + 
			"The type C2 must implement the inherited abstract method C1.value()\n" + 
			"----------\n");
	}

	// an annotation type cannot have default methods
	public void testAnnotation1() {
		runNegativeTest(
			new String[] {
				"I.java",
				"public @interface I {\n" +
				"    default String id() { return \"1\"; }\n" +
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in I.java (at line 2)\n" + 
			"	default String id() { return \"1\"; }\n" + 
			"	^^^^^^^\n" + 
			"Syntax error on token \"default\", @ expected\n" + 
			"----------\n");
	}
	
	// basic situation similar to AmbiguousMethodTest.test009()
	public void testSuperCall1() throws Exception {
		this.runConformTest(
			new String[] {
				"OrderedSet.java",
				"import java.util.*;\n" +
				"import java.util.stream.Stream;\n" +
				"public interface OrderedSet<E> extends List<E>, Set<E> {\n" +
				"	@Override\n" +
				"	boolean add(E o);\n" +
				"	@Override\n" +
				"	default Spliterator<E> spliterator() { if (true) return List.super.spliterator(); else return Set.super.spliterator(); }\n" +
				"}\n"
			},
			""
		);
		String expectedOutput =
				"  // Method descriptor #14 ()Ljava/util/Spliterator;\n" + 
				"  // Signature: ()Ljava/util/Spliterator<TE;>;\n" + 
				"  // Stack: 1, Locals: 1\n" + 
				"  public java.util.Spliterator spliterator();\n" + 
				"    0  aload_0 [this]\n" + 
				"    1  invokespecial java.util.List.spliterator() : java.util.Spliterator [17]\n" + 
				"    4  areturn\n";
		checkDisassembledClassFile(OUTPUT_DIR + File.separator + "OrderedSet.class", "OrderedSet", expectedOutput);
	}

	// some illegal cases
	// - call to indirect super
	// - call to super of outer
	// - target method is not a default method
	// - attempt to use this syntax for a super-ctor call
	public void testSuperCall2() {
		this.runNegativeTest(
			new String[] {
				"T.java",
				"import java.util.*;\n" +
				"import java.util.stream.Stream;\n" +
				"public abstract class T<E> implements OrderedSet<E> {\n" +
				"	@Override\n" +
				"	public Stream<E> stream() {\n" +
				"		return List.super.stream(); // List is not a direct super interface\n" +
				"	}\n" +
				"	@Override\n" +
				"	public Stream<E> parallelStream() { return OrderedSet.super.parallelStream();}\n" + // OK
				"   class Inner {\n" +
				"		public Stream<E> stream() {\n" +
				"			return OrderedSet.super.stream(); // not a super interface of the direct enclosing class\n" +
				"		}\n" +
				"	}\n" +
				"	@Override\n" +
				"	public boolean add(E o) {\n" +
				"		OrderedSet.super.add(o); // target not a default method\n" +
				"	}\n" +
				"	T() {\n" +
				"		OrderedSet.super(); // not applicable for super ctor call\n" +
				"	}\n" +
				"}\n" +
				"interface OrderedSet<E> extends List<E>, Set<E> {\n" +
				"	@Override\n" +
				"	boolean add(E o);\n" +
				"	@Override\n" +
				"   default Spliterator<E> spliterator() { return List.super.spliterator(); }\n" +
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in T.java (at line 6)\n" + 
			"	return List.super.stream(); // List is not a direct super interface\n" + 
			"	       ^^^^^^^^^^\n" + 
			"Illegal reference to super type List, cannot bypass the more specific direct super type OrderedSet\n" + 
			"----------\n" + 
			"2. ERROR in T.java (at line 12)\n" + 
			"	return OrderedSet.super.stream(); // not a super interface of the direct enclosing class\n" + 
			"	       ^^^^^^^^^^^^^^^^\n" + 
			"No enclosing instance of the type OrderedSet<E> is accessible in scope\n" + 
			"----------\n" + 
			"3. ERROR in T.java (at line 17)\n" + 
			"	OrderedSet.super.add(o); // target not a default method\n" + 
			"	^^^^^^^^^^^^^^^^^^^^^^^\n" + 
			"Cannot directly invoke the abstract method add(E) for the type OrderedSet<E>\n" + 
			"----------\n" + 
			"4. ERROR in T.java (at line 20)\n" + 
			"	OrderedSet.super(); // not applicable for super ctor call\n" + 
			"	^^^^^^^^^^\n" + 
			"Illegal enclosing instance specification for type Object\n" + 
			"----------\n"
		);
	}

	// with execution
	public void testSuperCall3() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X implements I2 {\n" +
				"	@Override\n" +
				"	public void print() {\n" +
				"		I2.super.print();\n" +
				"		System.out.print(\"!\");" +
				"	}\n" +
				"	public static void main(String... args) {\n" +
				"		new X().print();\n" +
				"	}\n" +
				"}\n" +
				"interface I1 {\n" +
				"	default void print() {\n" +
				"		System.out.print(\"O\");\n" +
				"	}\n" +
				"}\n" +
				"interface I2 extends I1 {\n" +
				"	default void print() {\n" +
				"		I1.super.print();\n" +
				"		System.out.print(\"K\");\n" +
				"	}\n" +
				"}\n"
			},
			"OK!"
		);
	}

	// 15.12.1
	// https://bugs.eclipse.org/404649 - [1.8][compiler] detect illegal reference to indirect or redundant super
	public void testSuperCall4() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X implements I2, I1 {\n" +
				"	@Override\n" +
				"	public void print() {\n" +
				"		I1.super.print(); // illegal attempt to skip I2.print()\n" +
				"		System.out.print(\"!\");" +
				"	}\n" +
				"	public static void main(String... args) {\n" +
				"		new X().print();\n" +
				"	}\n" +
				"}\n" +
				"interface I1 {\n" +
				"	default void print() {\n" +
				"		System.out.print(\"O\");\n" +
				"	}\n" +
				"}\n" +
				"interface I2 extends I1 {\n" +
				"	@Override default void print() {\n" +
				"		System.out.print(\"K\");\n" +
				"	}\n" +
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 4)\n" + 
			"	I1.super.print(); // illegal attempt to skip I2.print()\n" + 
			"	^^^^^^^^\n" + 
			"Illegal reference to super type I1, cannot bypass the more specific direct super type I2\n" + 
			"----------\n"
		);
	}

	// 15.12.1
	// https://bugs.eclipse.org/404649 - [1.8][compiler] detect illegal reference to indirect or redundant super
	public void testSuperCall5() {
		this.runNegativeTest(
			new String[] {
				"X.java",
				"public class X implements I2, I1 {\n" +
				"	@Override\n" +
				"	public void print() {\n" +
				"		I1.super.print(); // illegal attempt to skip I2.print()\n" +
				"		System.out.print(\"!\");" +
				"	}\n" +
				"	public static void main(String... args) {\n" +
				"		new X().print();\n" +
				"	}\n" +
				"}\n" +
				"interface I1 {\n" +
				"	default void print() {\n" +
				"		System.out.print(\"O\");\n" +
				"	}\n" +
				"}\n" +
				"interface I2 extends I1 {\n" +
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 4)\n" + 
			"	I1.super.print(); // illegal attempt to skip I2.print()\n" + 
			"	^^^^^^^^\n" + 
			"Illegal reference to super type I1, cannot bypass the more specific direct super type I2\n" + 
			"----------\n"
		);
	}

	// 15.12.3
	// https://bugs.eclipse.org/404649 - [1.8][compiler] detect illegal reference to indirect or redundant super
	public void testSuperCall6() {
		this.runNegativeTest(
			new String[] {
				"SuperOverride.java",
				"interface I0 {\n" + 
				"	default void foo() { System.out.println(\"I0\"); }\n" + 
				"}\n" + 
				"\n" + 
				"interface IA extends I0 {}\n" + 
				"\n" + 
				"interface IB extends I0 {\n" + 
				"	@Override default void foo() {\n" + 
				"		System.out.println(\"IB\");\n" + 
				"	}\n" + 
				"}\n" + 
				"interface IX extends IA, IB {\n" + 
				"	@Override default void foo() {\n" + 
				"		IA.super.foo(); // illegal attempt to skip IB.foo()\n" + 
				"	}\n" + 
				"}\n" + 
				"public class SuperOverride implements IX {\n" + 
				"	public static void main(String[] args) {\n" + 
				"		new SuperOverride().foo();\n" + 
				"	}\n" + 
				"}\n"
			},
			"----------\n" + 
			"1. ERROR in SuperOverride.java (at line 14)\n" + 
			"	IA.super.foo(); // illegal attempt to skip IB.foo()\n" + 
			"	^^^^^^^^^^^^^^\n" + 
			"Illegal reference to super method foo() from type I0, cannot bypass the more specific override from type IB\n" + 
			"----------\n"
		);
	}

	// Bug 401235 - [1.8][compiler] 'this' reference must be allowed in default methods and local classes
	public void testThisReference1() {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X implements I1, I2 {\n" +
				"	@Override\n" +
				"	public String s1() { return \"O\"; }\n" +
				"	@Override\n" +
				"	public String s2() { return \"K\"; }\n" +
				"	public static void main(String... args) {\n" +
				"		X x = new X();\n" +
				"		x.print1();\n" +
				"		x.print2();\n" +
				"	}\n" +
				"}\n" +
				"interface I1 {\n" +
				"	String s1();" +
				"	default void print1() {\n" +
				"		System.out.print(this.s1());\n" + // 'this' as a receiver
				"	}\n" +
				"}\n" +
				"interface I2 {\n" +
				"	String s2();\n" +
				"	default void print2() {\n" +
				"		class Inner {\n" +
				"			String value() { return I2.this.s2(); }\n" + // qualified 'this' refering to the enclosing interface type
				"		}\n" +
				"		System.out.print(new Inner().value());\n" +
				"	}\n" +
				"}\n"
			},
			"OK"
		);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=399780
	// Test for different legal and illegal keywords for static and default methods in interfaces
	public void testStaticMethod01() {
		runNegativeTest(
				new String[] {
					"I.java",
					"public interface I {\n" +
					"	static void foo() {}\n" +
					"	static void foo1();\n" +
					"	public static default void foo2 () {};\n" +
					"	abstract static void foo3();\n" +
					"	abstract static void foo4() {}\n" +
					"}"
				},
				"----------\n" + 
				"1. ERROR in I.java (at line 3)\n" + 
				"	static void foo1();\n" + 
				"	            ^^^^^^\n" + 
				"This method requires a body instead of a semicolon\n" + 
				"----------\n" + 
				"2. ERROR in I.java (at line 4)\n" + 
				"	public static default void foo2 () {};\n" + 
				"	                           ^^^^^^^\n" + 
				"Illegal combination of modifiers for the interface method foo2; only one of abstract, default, or static permitted\n" + 
				"----------\n" + 
				"3. ERROR in I.java (at line 5)\n" + 
				"	abstract static void foo3();\n" + 
				"	                     ^^^^^^\n" + 
				"Illegal combination of modifiers for the interface method foo3; only one of abstract, default, or static permitted\n" + 
				"----------\n" + 
				"4. ERROR in I.java (at line 6)\n" + 
				"	abstract static void foo4() {}\n" + 
				"	                     ^^^^^^\n" + 
				"Illegal combination of modifiers for the interface method foo4; only one of abstract, default, or static permitted\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=399780
	// Test invocation of static methods with different contexts - negative tests
	public void testStaticMethod02() {
		runNegativeTest(
				new String[] {
					"I.java",
					"public interface I {\n" +
					"	public static void foo() {\n" +
					"		bar();\n" +
					"		this.bar();\n" +
					"   }\n" +
					"	public default void bar () {\n" +
					"		this.foo();\n" +
					"	}\n" +
					"}\n" +
					"interface II extends I{\n" +
					"	public static void foobar() {\n" +
					"		super.bar();\n" +
					"   }\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in I.java (at line 3)\n" + 
				"	bar();\n" + 
				"	^^^\n" + 
				"Cannot make a static reference to the non-static method bar() from the type I\n" + 
				"----------\n" + 
				"2. ERROR in I.java (at line 4)\n" + 
				"	this.bar();\n" + 
				"	^^^^\n" + 
				"Cannot use this in a static context\n" + 
				"----------\n" + 
				"3. ERROR in I.java (at line 7)\n" + 
				"	this.foo();\n" + 
				"	     ^^^\n" + 
				"This static method of interface I can only be accessed as I.foo\n" +
				"----------\n" + 
				"4. ERROR in I.java (at line 12)\n" + 
				"	super.bar();\n" + 
				"	^^^^^\n" + 
				"Cannot use super in a static context\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=399780
	// Test invocation of static methods with different contexts - positive tests
	public void testStaticMethod03() throws Exception {
		runConformTest(
			new String[] {
				"C.java",
				"interface I {\n" +
				"	public static void foo() {\n" +
				"		System.out.println(\"I#foo() invoked\");\n" +
				"   }\n" +
				"}\n" +
				"interface J extends I {\n" +
				"	public static void foo() {\n" +
				"		System.out.println(\"J#foo() invoked\");\n" +
				"   }\n" +
				"	public default void bar () {\n" +
				"		foo();\n" +
				"	}\n" +
				"}\n" +
				"public class C implements J {\n" +
				"	public static void main(String[] args) {\n" +
				"		C c = new C();\n" +
				"		c.bar();\n" +
				"       J.foo();\n" +
				"       I.foo();\n" +
				"	}\n" +
				"}"
			},
			"J#foo() invoked\n" +
			"J#foo() invoked\n" + 
			"I#foo() invoked");
		String expectedOutput =
				"  // Method descriptor #17 ([Ljava/lang/String;)V\n" + 
				"  // Stack: 2, Locals: 2\n" + 
				"  public static void main(java.lang.String[] args);\n" + 
				"     0  new C [1]\n" + 
				"     3  dup\n" + 
				"     4  invokespecial C() [18]\n" + 
				"     7  astore_1 [c]\n" + 
				"     8  aload_1 [c]\n" + 
				"     9  invokevirtual C.bar() : void [19]\n" + 
				"    12  invokestatic J.foo() : void [22]\n" + 
				"    15  invokestatic I.foo() : void [25]\n" + 
				"    18  return\n" + 
				"      Line numbers:\n" + 
				"        [pc: 0, line: 16]\n" + 
				"        [pc: 8, line: 17]\n" + 
				"        [pc: 12, line: 18]\n" + 
				"        [pc: 15, line: 19]\n" + 
				"        [pc: 18, line: 20]\n" + 
				"      Local variable table:\n" + 
				"        [pc: 0, pc: 19] local: args index: 0 type: java.lang.String[]\n" + 
				"        [pc: 8, pc: 19] local: c index: 1 type: C\n";
		checkDisassembledClassFile(OUTPUT_DIR + File.separator + "C.class", "C", expectedOutput);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=399780
	// Test invocation of static methods with different contexts - negative tests
	public void testStaticMethod04() {
		runNegativeTest(
				new String[] {
						"X.java",
						"public class X implements II {\n"
						+ "	@Override"
						+ "	public void foo() {\n"
						+ "		 bar();\n"
						+ "		 bar2();\n"
						+ "	}\n"
						+ "	public static void main(String[] args) {\n"
						+ "		bar();\n"
						+ "		II.bar();\n"
						+ "		(new X()).bar();\n"
						+ "		II.bar();\n"
						+ "		II ii = new X();\n"
						+ "		ii.bar();\n"
						+ "		ii.bar2();\n"
						+ "		I i = new X();\n"
						+ "		i.bar();\n"
						+ "      new I() {}.foo();\n"
						+ "	}\n"
						+ "}\n"
						+ "interface I {\n"
						+ "	public static void bar() {\n"
						+ "		bar2();\n"
						+ "	}\n"
						+ "	public default void bar2() {\n"
						+ "		bar();\n"
						+ "	}\n"
						+ "}\n"
						+ "interface II extends I {\n"
						+ "	public default void foo() {\n"
						+ "		bar();\n"
						+ "	}\n"
						+ "}\n"
				},
				"----------\n" + 
				"1. ERROR in X.java (at line 3)\n" + 
				"	bar();\n" + 
				"	^^^\n" + 
				"The method bar() is undefined for the type X\n" + 
				"----------\n" + 
				"2. ERROR in X.java (at line 7)\n" + 
				"	bar();\n" + 
				"	^^^\n" + 
				"The method bar() is undefined for the type X\n" + 
				"----------\n" + 
				"3. ERROR in X.java (at line 8)\n" + 
				"	II.bar();\n" + 
				"	   ^^^\n" + 
				"The method bar() is undefined for the type II\n" + 
				"----------\n" + 
				"4. ERROR in X.java (at line 9)\n" + 
				"	(new X()).bar();\n" + 
				"	          ^^^\n" + 
				"The method bar() is undefined for the type X\n" + 
				"----------\n" + 
				"5. ERROR in X.java (at line 10)\n" + 
				"	II.bar();\n" + 
				"	   ^^^\n" + 
				"The method bar() is undefined for the type II\n" + 
				"----------\n" + 
				"6. ERROR in X.java (at line 12)\n" + 
				"	ii.bar();\n" + 
				"	   ^^^\n" + 
				"The method bar() is undefined for the type II\n" + 
				"----------\n" + 
				"7. ERROR in X.java (at line 15)\n" + 
				"	i.bar();\n" + 
				"	  ^^^\n" + 
				"This static method of interface I can only be accessed as I.bar\n" + 
				"----------\n" + 
				"8. ERROR in X.java (at line 16)\n" + 
				"	new I() {}.foo();\n" + 
				"	           ^^^\n" + 
				"The method foo() is undefined for the type new I(){}\n" + 
				"----------\n" + 
				"9. ERROR in X.java (at line 21)\n" + 
				"	bar2();\n" + 
				"	^^^^\n" + 
				"Cannot make a static reference to the non-static method bar2() from the type I\n" + 
				"----------\n" + 
				"10. ERROR in X.java (at line 29)\n" + 
				"	bar();\n" + 
				"	^^^\n" + 
				"The method bar() is undefined for the type II\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=399780
	public void testStaticMethod05() {
		runNegativeTest(
				new String[] {
						"X.java",
						"interface I {\n" +
						"	static void foo(int x) { }\n" +
						"}\n" +
						"interface II extends I {\n" +
						"	static void goo(int x) {}   		// No Error.\n" +
						"}\n" +
						"interface III extends II {\n" +
						"	default void foo(int x, int y) {}   // No Error.\n" +
						"	default void goo() {}   			// No Error.\n" +
						"	default void foo(int x) {}   		// No Error.\n" +
						"	default void goo(int x) {}   		// No Error.\n" +
						"}\n" +
						"class Y {\n" +
						"	static void goo(int x) {}\n" +
						"}\n" +
						"class X extends Y {\n" +
						"	void foo(int x) {}   // No error.\n" +
						"	void goo() {}   	 // No Error.\n" +
						"	void goo(int x) {}   // Error.\n" +
						"}\n"
						},
						"----------\n" + 
						"1. ERROR in X.java (at line 19)\n" + 
						"	void goo(int x) {}   // Error.\n" + 
						"	     ^^^^^^^^^^\n" + 
						"This instance method cannot override the static method from Y\n" + 
						"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=399780
	// Test that extending interfaces inherit visible fields and inner types.
	public void testStaticMethod06() {
		runConformTest(
				new String[] {
					"C.java",
					"interface I {\n" +
					"	public static String CONST = \"CONSTANT\";\n" +
					"	public static void foo(String[] args) {\n" +
					"		System.out.println(args[0]);\n" +
					"   }\n" +
					" 	public interface Inner {}\n" +
					"}\n" +
					"interface J extends I {\n" +
					"	public static void foo() {\n" +
					"		I.foo(new String[]{CONST});\n" +
					"   }\n" +
					" 	public interface InnerInner extends Inner {}\n" +
					"}\n" +
					"public class C implements J {\n" +
					"	public static void main(String[] args) {\n" +
					"       J.foo();\n" +
					"       I.foo(new String[]{\"LITERAL\"});\n" +
					"	}\n" +
					"}"
				},
				"CONSTANT\n" + 
				"LITERAL");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=399780
	// Test that type parameter from enclosing type is not allowed to be referred to in static interface methods
	public void testStaticMethod07() {
		runNegativeTest(
				new String[] {
					"C.java",
					"interface I <T> {\n" +
					"	public static T foo(T t) {\n" +
					"		return t;" +
					"   }\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in C.java (at line 2)\n" + 
				"	public static T foo(T t) {\n" + 
				"	              ^\n" + 
				"Cannot make a static reference to the non-static type T\n" + 
				"----------\n" + 
				"2. ERROR in C.java (at line 2)\n" + 
				"	public static T foo(T t) {\n" + 
				"	                    ^\n" + 
				"Cannot make a static reference to the non-static type T\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=399780
	public void testStaticMethod08() {
		runNegativeTest(
				new String[] {
					"C.java",
					"@interface A {\n" +
					"	static String foo() default \"Blah\";\n" +
					"}\n"
				},
				"----------\n" + 
				"1. ERROR in C.java (at line 2)\n" + 
				"	static String foo() default \"Blah\";\n" + 
				"	              ^^^^^\n" + 
				"Illegal modifier for the annotation attribute A.foo; only public & abstract are permitted\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=399780
	public void testStaticMethod09() {
		runNegativeTest(
				new String[] {
						"C.java",
						"interface A {\n" +
						"	static void foo() {}\n" +
						"	default void goo(A a) {\n" +
						"		a.foo();\n" +
						"	}\n" +
						"}\n"
				},
				"----------\n" + 
				"1. ERROR in C.java (at line 4)\n" + 
				"	a.foo();\n" + 
				"	  ^^^\n" + 
				"This static method of interface A can only be accessed as A.foo\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=399780
	public void testStaticMethod10() {
		runNegativeTest(
				new String[] {
						"C.java",
						"interface A {\n" +
						"	static void foo(long x) {}\n" +
						"	static void foo(int x) {}\n" +
						"	default void goo(A a) {\n" +
						"		a.foo(10);\n" +
						"	}\n" +
						"}\n"
				},
				"----------\n" + 
				"1. ERROR in C.java (at line 5)\n" + 
				"	a.foo(10);\n" + 
				"	  ^^^\n" + 
				"This static method of interface A can only be accessed as A.foo\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=399780
	public void testStaticMethod11() {
		runNegativeTest(
				new String[] {
						"C.java",
						"interface A<X> {\n" +
						"	void foo(X x);\n" +
						"}\n" +
						"interface B extends A<String> {\n" +
						"    static void foo(String s) {}\n" +
						"}\n"
				},
				"----------\n" + 
				"1. ERROR in C.java (at line 5)\n" + 
				"	static void foo(String s) {}\n" + 
				"	            ^^^^^^^^^^^^^\n" + 
				"This static method cannot hide the instance method from A<String>\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=399780
	public void testStaticMethod12() {
		runNegativeTest(
				new String[] {
						"C.java",
						"interface A<X> {\n" +
						"	static void foo(String x) {}\n" +
						"}\n" +
						"interface B extends A<String> {\n" +
						"    static void foo(String s) {}\n" +
						"}\n" +
						"public class X {\n" +
						"}\n"
				},
				"----------\n" + 
				"1. WARNING in C.java (at line 1)\n" + 
				"	interface A<X> {\n" + 
				"	            ^\n" + 
				"The type parameter X is hiding the type X\n" + 
				"----------\n" + 
				"2. ERROR in C.java (at line 7)\n" + 
				"	public class X {\n" + 
				"	             ^\n" + 
				"The public type X must be defined in its own file\n" + 
				"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=399780
	public void testStaticMethod13() {
		runNegativeTest(
				new String[] {
						"C.java",
						"interface A {\n" +
						"	static void foo(String x) {\n" +
						"       System.out.println(this);\n"+
						"       System.out.println(super.hashCode());\n" +
						"   }\n" +
						"}\n"
				},
				"----------\n" + 
				"1. ERROR in C.java (at line 3)\n" + 
				"	System.out.println(this);\n" + 
				"	                   ^^^^\n" + 
				"Cannot use this in a static context\n" + 
				"----------\n" + 
				"2. ERROR in C.java (at line 4)\n" + 
				"	System.out.println(super.hashCode());\n" + 
				"	                   ^^^^^\n" + 
				"Cannot use super in a static context\n" + 
				"----------\n");
	}
    // https://bugs.eclipse.org/bugs/show_bug.cgi?id=406619, [1.8][compiler] Incorrect suggestion that method can be made static.
	public void test406619() {
		Map compilerOptions = getCompilerOptions();
		compilerOptions.put(CompilerOptions.OPTION_ReportMethodCanBeStatic, CompilerOptions.ERROR);
		compilerOptions.put(CompilerOptions.OPTION_ReportMethodCanBePotentiallyStatic, CompilerOptions.ERROR);
		this.runNegativeTest(
			new String[] {
				"X.java", 
				"interface X {\n" +
				"	default int foo() {\n" +
				"		return 10;\n" +
				"	}\n" +
				"}\n"
			},
			"",
			null /* no extra class libraries */,
			true /* flush output directory */,
			compilerOptions /* custom options */
		);
	}

	// class implements interface with default method. 
	// - witness for NoSuchMethodError in synthetic method (SuperMethodAccess) - turned out to be a JVM bug
	public void testSuperAccess01() {
		runConformTest(
			new String[] {
				"C.java",
				"interface I {\n" +
				"    public default void foo() {\n" +
				"        System.out.println(\"default\");\n" +
				"    }\n" +
				"}\n" +
				"public class C implements I {\n" +
				"    public static void main(String[] args) {\n" +
				"        C c = new C();\n" +
				"        c.foo();\n" +
				"    }\n" +
				"}\n"
			},
			"default"
			);
	}

	// class implements interface with default method. 
	// - intermediate public interface
	public void testSuperAccess02() {
		runConformTest(
			new String[] {
				"p1/C.java",
				"package p1;\n" +
				"public class C implements p2.J {\n" +
				"    public static void main(String[] args) {\n" +
				"        C c = new C();\n" +
				"        c.foo();\n" +
				"    }\n" +
				"}\n",
				"p2/J.java",
				"package p2;\n" +
				"interface I {\n" +
				"    public default void foo() {\n" +
				"        System.out.println(\"default\");\n" +
				"    }\n" +
				"}\n" +
				"public interface J extends I {}\n"
			},
			"default");
	}
	
	// https://bugs.eclipse.org/421796 - Bug 421796 - [1.8][compiler] java.lang.AbstractMethodError executing default method code.
	public void testSuperAccess03() {
		runConformTest(
			new String[] {
				"X.java",
				"interface I  {\n" + 
				"    void foo(); \n" + 
				"}\n" + 
				"\n" + 
				"interface J extends I {\n" + 
				"    default void foo() {\n" + 
				"    }\n" + 
				"}\n" + 
				"\n" + 
				"interface K extends J {\n" + 
				"}\n" + 
				"\n" + 
				"public class X implements K {\n" + 
				"	public static void main(String argv[]) {\n" + 
				"		X test = new X();\n" + 
				"		((J)test).foo();\n" + 
				"		test.foo();\n" + 
				"	}\n" + 
				"}\n"
			});
	}

	// Variant of test MethodVerifyTest.test144() from https://bugs.eclipse.org/bugs/show_bug.cgi?id=194034
	public void testBridge01() {
		this.runNegativeTest(
			new String[] {
				"PurebredCatShopImpl.java",
				"import java.util.List;\n" +
				"interface Pet {}\n" +
				"interface Cat extends Pet {}\n" +
				"interface PetShop { default List<Pet> getPets() { return null; } }\n" +
				"interface CatShop extends PetShop {\n" +
				"	default <V extends Pet> List<? extends Cat> getPets() { return null; }\n" +
				"}\n" +
				"interface PurebredCatShop extends CatShop {}\n" +
				"class CatShopImpl implements CatShop {\n" +
				"	@Override public List<Pet> getPets() { return null; }\n" +
				"}\n" +
				"class PurebredCatShopImpl extends CatShopImpl implements PurebredCatShop {}"
			},
			"----------\n" + 
			"1. ERROR in PurebredCatShopImpl.java (at line 6)\n" + 
			"	default <V extends Pet> List<? extends Cat> getPets() { return null; }\n" + 
			"	                                            ^^^^^^^^^\n" + 
			"Name clash: The method getPets() of type CatShop has the same erasure as getPets() of type PetShop but does not override it\n" + 
			"----------\n" + 
			"2. WARNING in PurebredCatShopImpl.java (at line 10)\n" + 
			"	@Override public List<Pet> getPets() { return null; }\n" + 
			"	                 ^^^^\n" + 
			"Type safety: The return type List<Pet> for getPets() from the type CatShopImpl needs unchecked conversion to conform to List<? extends Cat> from the type CatShop\n" + 
			"----------\n"
		);
	}
	// yet another variant, checking that exactly one bridge method is created, so that
	// the most specific method is dynamically invoked via all declared types.
	public void testBridge02() {
		this.runConformTest(
			new String[] {
				"PurebredCatShopImpl.java",
				"import java.util.List;\n" +
				"import java.util.ArrayList;\n" +
				"interface Pet {}\n" +
				"interface Cat extends Pet {}\n" +
				"interface PetShop { default List<Pet> getPets() { return null; } }\n" +
				"interface CatShop extends PetShop {\n" +
				"	@Override default ArrayList<Pet> getPets() { return null; }\n" +
				"}\n" +
				"interface PurebredCatShop extends CatShop {}\n" +
				"class CatShopImpl implements CatShop {\n" +
				"	@Override public ArrayList<Pet> getPets() { return new ArrayList<>(); }\n" +
				"}\n" +
				"public class PurebredCatShopImpl extends CatShopImpl implements PurebredCatShop {\n" +
				"	public static void main(String... args) {\n" +
				"		PurebredCatShopImpl pcsi = new PurebredCatShopImpl();\n" +
				"		System.out.print(pcsi.getPets().size());\n" +
				"		CatShopImpl csi = pcsi;\n" +
				"		System.out.print(csi.getPets().size());\n" +
				"		CatShop cs = csi;\n" +
				"		System.out.print(cs.getPets().size());\n" +
				"		PetShop ps = cs;\n" +
				"		System.out.print(ps.getPets().size());\n" +
				"	}\n" +
				"}\n"
			},
			"0000"
		);
	}
	
	// modeled after org.eclipse.jdt.core.tests.compiler.regression.AmbiguousMethodTest.test081()
	// see https://bugs.eclipse.org/391376 - [1.8] check interaction of default methods with bridge methods and generics
    // see https://bugs.eclipse.org/404648 - [1.8][compiler] investigate differences between compilers re AmbiguousMethodTest
	public void _testBridge03() {
		runConformTest(
			new String[] {
				"C.java",
				"interface A<ModelType extends D, ValueType> extends\n" + 
				"		I<ModelType, ValueType> {\n" + 
				"\n" + 
				"	@Override\n" + 
				"	public default void doSet(ModelType valueGetter) {\n" + 
				"		this.set((ValueType) valueGetter.getObject());\n" + 
				"	}\n" + 
				"\n" + 
				"	@Override\n" + 
				"	public default void set(Object object) {\n" + 
				"		System.out.println(\"In A.set(Object)\");\n" + 
				"	}\n" + 
				"}\n" + 
				"\n" + 
				"class B implements A<E, CharSequence> {\n" + 
				"\n" + 
				"	public void set(CharSequence string) {\n" + 
				"		System.out.println(\"In B.set(CharSequence)\");\n" + 
				"	}\n" + 
				"}\n" + 
				"\n" + 
				"public class C extends B {\n" + 
				"\n" + 
				"	static public void main(String[] args) {\n" + 
				"		C c = new C();\n" + 
				"		c.run();\n" + 
				"	}\n" + 
				"\n" + 
				"	public void run() {\n" + 
				"		E e = new E<String>(String.class);\n" + 
				"		this.doSet(e);\n" + 
				"	}\n" + 
				"\n" + 
				"}\n" + 
				"\n" + 
				"class D {\n" + 
				"	public Object getObject() {\n" + 
				"		return null;\n" + 
				"	}\n" + 
				"}\n" + 
				"\n" + 
				"class E<Type extends CharSequence> extends D {\n" + 
				"\n" + 
				"	private Class<Type> typeClass;\n" + 
				"\n" + 
				"	public E(Class<Type> typeClass) {\n" + 
				"		this.typeClass = typeClass;\n" + 
				"	}\n" + 
				"\n" + 
				"	@Override\n" + 
				"	public Type getObject() {\n" + 
				"		try {\n" + 
				"			return (Type) typeClass.newInstance();\n" + 
				"		} catch (Exception e) {\n" + 
				"			throw new RuntimeException(e);\n" + 
				"		}\n" + 
				"	}\n" + 
				"\n" + 
				"}\n" + 
				"\n" + 
				"interface I<ModelType, ValueType> {\n" + 
				"\n" + 
				"	public void doSet(ModelType model);\n" + 
				"\n" + 
				"	public void set(ValueType value);\n" + 
				"\n" + 
				"}\n"
			},
			"In B.set(CharSequence)");
	}
	
    
    // modeled after org.eclipse.jdt.core.tests.compiler.regression.AmbiguousMethodTest.test081()
    // see https://bugs.eclipse.org/391376 - [1.8] check interaction of default methods with bridge methods and generics
    // see https://bugs.eclipse.org/404648 - [1.8][compiler] investigate differences between compilers re AmbiguousMethodTest
    public void _testBridge04() {
        runConformTest(
            new String[] {
                "C.java",
                "interface A<ModelType extends D, ValueType> extends\n" + 
                "       I<ModelType, ValueType> {\n" + 
                "\n" + 
                "   @Override\n" + 
                "   public default void doSet(ModelType valueGetter) {\n" + 
                "       this.set((ValueType) valueGetter.getObject());\n" + 
                "   }\n" + 
                "\n" + 
                "   @Override\n" + 
                "   public default void set(Object object) {\n" + 
                "       System.out.println(\"In A.set(Object)\");\n" + 
                "   }\n" + 
                "}\n" + 
                "\n" + 
                "interface B extends A<E, CharSequence> {\n" + 
                "\n" + 
                "   public default void set(CharSequence string) {\n" + 
                "       System.out.println(\"In B.set(CharSequence)\");\n" + 
                "   }\n" + 
                "}\n" + 
                "\n" + 
                "public class C implements B {\n" + 
                "\n" + 
                "   static public void main(String[] args) {\n" + 
                "       C c = new C();\n" + 
                "       c.run();\n" + 
                "   }\n" + 
                "\n" + 
                "   public void run() {\n" + 
                "       E e = new E<String>(String.class);\n" + 
                "       this.doSet(e);\n" + 
                "   }\n" + 
                "\n" + 
                "}\n" + 
                "\n" + 
                "class D {\n" + 
                "   public Object getObject() {\n" + 
                "       return null;\n" + 
                "   }\n" + 
                "}\n" + 
                "\n" + 
                "class E<Type extends CharSequence> extends D {\n" + 
                "\n" + 
                "   private Class<Type> typeClass;\n" + 
                "\n" + 
                "   public E(Class<Type> typeClass) {\n" + 
                "       this.typeClass = typeClass;\n" + 
                "   }\n" + 
                "\n" + 
                "   @Override\n" + 
                "   public Type getObject() {\n" + 
                "       try {\n" + 
                "           return (Type) typeClass.newInstance();\n" + 
                "       } catch (Exception e) {\n" + 
                "           throw new RuntimeException(e);\n" + 
                "       }\n" + 
                "   }\n" + 
                "\n" + 
                "}\n" + 
                "\n" + 
                "interface I<ModelType, ValueType> {\n" + 
                "\n" + 
                "   public void doSet(ModelType model);\n" + 
                "\n" + 
                "   public void set(ValueType value);\n" + 
                "\n" + 
                "}\n"
            },
            "In B.set(CharSequence)");
    }
    
    // test for different error messages in modifiers.
	public void test400977() {
		String infMod = this.complianceLevel >= ClassFileConstants.JDK9 ? " private," : "";
		runNegativeTest(
		new String[] {
			"I.java",
			"public interface I {\n" +
			"    default abstract void foo();\n" +
			"    public abstract default strictfp final void bar();" +
			"}\n"}, 
			"----------\n" +
			"1. ERROR in I.java (at line 2)\n" +
			"	default abstract void foo();\n" +
			"	                      ^^^^^\n" +
			"Illegal combination of modifiers for the interface method foo; only one of abstract, default, or static permitted\n" +
			"----------\n" +
			"2. ERROR in I.java (at line 3)\n" +
			"	public abstract default strictfp final void bar();}\n" +
			"	                                            ^^^^^\n" +
			"strictfp is not permitted for abstract interface method bar\n" +
			"----------\n" +
			"3. ERROR in I.java (at line 3)\n" +
			"	public abstract default strictfp final void bar();}\n" +
			"	                                            ^^^^^\n" +
			"Illegal combination of modifiers for the interface method bar; only one of abstract, default, or static permitted\n" +
			"----------\n" +
			"4. ERROR in I.java (at line 3)\n" +
			"	public abstract default strictfp final void bar();}\n" +
			"	                                            ^^^^^\n" +
			"Illegal modifier for the interface method bar; only public,"+ infMod +" abstract, default, static and strictfp are permitted\n" +
			"----------\n");
	}
    // https://bugs.eclipse.org/bugs/show_bug.cgi?id=420084,  [1.8] static interface method cannot be resolved without receiver when imported statically
	public void testBug420084() {
		runNegativeTest(
			new String[] {
				"p/J.java",
				"package p;\n" +
				"public interface J {\n" +
				"	static int foo(){return 0;}\n" +
				"}\n",
				"I.java",
				"import static p.J.foo;\n" +
				"public interface I {\n" +
				"	static int call() {\n" +
				"		return foo();\n" +
				"	}\n" +
				"}\n"
			}, 
			"");
	}
    // https://bugs.eclipse.org/bugs/show_bug.cgi?id=421543, [1.8][compiler] Compiler fails to recognize default method being turned into abstract by subtytpe
	public void testBug421543() {
		runNegativeTest(
			new String[] {
				"X.java",
				"interface I  {\n" +
				"	default void foo() {}\n" +
				"}\n" +
				"interface J extends I {\n" +
				"	void foo();\n" +
				"}\n" +
				"public class X implements J {\n" +
				"}\n"
			}, 
			"----------\n" + 
			"1. WARNING in X.java (at line 5)\n" + 
			"	void foo();\n" + 
			"	     ^^^^^\n" + 
			"The method foo() of type J should be tagged with @Override since it actually overrides a superinterface method\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 7)\n" + 
			"	public class X implements J {\n" + 
			"	             ^\n" + 
			"The type X must implement the inherited abstract method J.foo()\n" + 
			"----------\n");
	}
    // https://bugs.eclipse.org/bugs/show_bug.cgi?id=421543, [1.8][compiler] Compiler fails to recognize default method being turned into abstract by subtytpe
	public void testBug421543a() {
		runNegativeTest(
			new String[] {
				"X.java",
				"interface I<T>  {\n" +
				"	default void foo(T t) {}\n" +
				"}\n" +
				"interface J extends I<J> {\n" +
				"	void foo(J t);\n" +
				"}\n" +
				"public class X implements J {\n" +
				"}\n"
			}, 
			"----------\n" + 
			"1. WARNING in X.java (at line 5)\n" + 
			"	void foo(J t);\n" + 
			"	     ^^^^^^^^\n" + 
			"The method foo(J) of type J should be tagged with @Override since it actually overrides a superinterface method\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 7)\n" + 
			"	public class X implements J {\n" + 
			"	             ^\n" + 
			"The type X must implement the inherited abstract method J.foo(J)\n" + 
			"----------\n");
	}
    // https://bugs.eclipse.org/bugs/show_bug.cgi?id=421543, [1.8][compiler] Compiler fails to recognize default method being turned into abstract by subtytpe
	public void testBug421543b() {
		runConformTest(
			new String[] {
				"X.java",
				"interface I<T>  {\n" +
				"	void foo(T t);\n" +
				"}\n" +
				"@SuppressWarnings(\"override\")\n" +
				"interface J extends I<J> {\n" +
				"	default void foo(J t) {}\n" +
				"}\n" +
				"public class X implements J {\n" +
				"}\n"
			}, 
			"");
	}
    // https://bugs.eclipse.org/bugs/show_bug.cgi?id=421797, [1.8][compiler] ClassFormatError with default methods & I.super.foo() syntax
	public void testBug421797() {
		runConformTest(
			new String[] {
				"X.java",
				"interface I {\n" +
				"	int m(String s, int val);\n" +
				"	public default int foo(String s, int val) {\n" +
				"		System.out.print(s + \" from I.foo:\");\n" +
				"		return val * val; \n" +
				"	}\n" +
				"}\n" +
				"interface T extends I {\n" +
				"	public default int m(String s, int value) { \n" +
				"		I i = I.super::foo; \n" +
				"		return i.foo(s, value);\n" +
				"	}\n" +
				"}\n" +
				"public class X {\n" +
				"	public static void main(String argv[]) {  \n" +
				"		System.out.println(new T(){}.m(\"Hello\", 1234));\n" +
				"	}\n" +
				"}\n"
			}, 
			"Hello from I.foo:1522756");
	}	
	
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=422731, [1.8] Ambiguous method not reported on overridden default method 
	public void test422731() throws Exception {
		this.runNegativeTest(
			new String[] {
					"X.java",
					"public class X extends Base implements I {\n" +
					"	public static void main(String[] args) {\n" +
					"		X x = new X();\n" +
					"		x.foo((short)5, (short)10);\n" +
					"		x.bar((short)5, (short)10);\n" +
					"	}\n" +
					"	public void foo(short s, int i) {} // No error, but should have been\n" +
					"	public void bar(short s, int i) {} // Correctly reported\n" +
					"\n" +
					"}\n" +
					"interface I {\n" +
					"	public default void foo(int i, short s) {}\n" +
					"}\n" +
					"class Base {\n" +
					"	public void bar(int i, short s) {}\n" +
					"}\n",
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 4)\n" + 
			"	x.foo((short)5, (short)10);\n" + 
			"	  ^^^\n" + 
			"The method foo(short, int) is ambiguous for the type X\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 5)\n" + 
			"	x.bar((short)5, (short)10);\n" + 
			"	  ^^^\n" + 
			"The method bar(short, int) is ambiguous for the type X\n" + 
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=425719, [1.8][compiler] Bogus ambiguous call error from compiler
	public void test425719() throws Exception {
		this.runConformTest(
			new String[] {
					"X.java",
					"interface I {\n" +
					"   default void foo(Object obj) {\n" +
					"	   System.out.println(\"interface method\");\n" +
					"   }\n" +
					"}\n" +
					"class Base {\n" +
					"    public void foo(Object obj) {\n" +
					"        System.out.println(\"class method\");\n" +
					"   }\n" +
					"}\n" +
					"public class X extends Base implements I {\n" +
					"	 public static void main(String argv[]) {\n" +
					"	    	new X().foo(null);\n" +
					"	    }\n" +
					"}\n",
			},
			"class method");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=425718, [1.8] default method changes access privilege of protected overridden method from Object 
	public void test425718() throws Exception {
		this.runNegativeTest(
			new String[] {
					"X.java",
					"interface I {\n" +
					"   default Object clone() { return null; };\n" +
					"}\n" +
					"public class X  {\n" +
					"    public void foo() {\n" +
					"        I x = new I(){};\n" +
					"        System.out.println(x.clone());\n" +
					"    }\n" +
					"}\n",
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 6)\n" + 
			"	I x = new I(){};\n" + 
			"	          ^^^\n" + 
			"The inherited method Object.clone() cannot hide the public abstract method in I\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 6)\n" + 
			"	I x = new I(){};\n" + 
			"	          ^^^\n" + 
			"Exception CloneNotSupportedException in throws clause of Object.clone() is not compatible with I.clone()\n" + 
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=426318, [1.8][compiler] Bogus name clash error in the presence of default methods and varargs
	public void test426318() throws Exception {
		this.runNegativeTest(
			new String[] {
					"X.java",
					"abstract class Y { \n" +
					"    public abstract void foo(Object[] x);\n" +
					"    public abstract void goo(Object[] x);\n" +
					"}\n" +
					"interface I {\n" +
					"   default public <T> void foo(T... x) {};\n" +
					"   public abstract <T> void goo(T ... x);\n" +
					"}\n" +
					"public abstract class X extends Y implements I { \n" +
					"}\n",
			},
			"----------\n" + 
			"1. WARNING in X.java (at line 6)\n" + 
			"	default public <T> void foo(T... x) {};\n" + 
			"	                                 ^\n" + 
			"Type safety: Potential heap pollution via varargs parameter x\n" + 
			"----------\n" + 
			"2. WARNING in X.java (at line 7)\n" + 
			"	public abstract <T> void goo(T ... x);\n" + 
			"	                                   ^\n" + 
			"Type safety: Potential heap pollution via varargs parameter x\n" + 
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=424914, [1.8][compiler] No error shown for method reference with super enclosed in an interface
	public void test424914() throws Exception {
		this.runNegativeTest(
			new String[] {
					"X.java",
					"interface A {\n" +
					"	String foo();\n" +
					"	String b = super.toString();\n" +
					"	default void fun1() {\n" +
					"		System.out.println((A) super::toString);\n" +
					"		super.toString();\n" +
					"		Object.super.toString();\n" +
					"	}\n" +
					"}\n",
			},
			"----------\n" + 
			"1. ERROR in X.java (at line 3)\n" + 
			"	String b = super.toString();\n" + 
			"	           ^^^^^\n" + 
			"Cannot use super in a static context\n" + 
			"----------\n" + 
			"2. ERROR in X.java (at line 5)\n" + 
			"	System.out.println((A) super::toString);\n" + 
			"	                       ^^^^^\n" + 
			"super reference is illegal in interface context\n" + 
			"----------\n" + 
			"3. ERROR in X.java (at line 6)\n" + 
			"	super.toString();\n" + 
			"	^^^^^\n" + 
			"super reference is illegal in interface context\n" + 
			"----------\n" + 
			"4. ERROR in X.java (at line 7)\n" + 
			"	Object.super.toString();\n" + 
			"	^^^^^^^^^^^^\n" + 
			"No enclosing instance of the type Object is accessible in scope\n" + 
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=424914, [1.8][compiler] No error shown for method reference with super enclosed in an interface
	public void test424914a() throws Exception {
		this.runConformTest(
			new String[] {
					"X.java",
					"interface B {\n" +
					"	default void foo() {\n" +
					"		System.out.println(\"B.foo\");\n" +
					"	}\n" +
					"}\n" +
					"interface A extends B {\n" +
					"	default void foo() {\n" +
					"		System.out.println(\"A.foo\");\n" +
					"		B.super.foo();\n" +
					"	}\n" +
					"}\n" +
					"public class X implements A {\n" +
					"	public static void main(String[] args) {\n" +
					"		A a = new X();\n" +
					"		a.foo();\n" +
					"	}\n" +
					"}\n",
			},
			"A.foo\n" + 
			"B.foo");
	}	
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=427478, [1.8][compiler] Wrong "Duplicate default methods" error on AbstractDoubleSpliterator
	public void test427478() throws Exception { // extracted smaller test case.
		this.runConformTest(
			new String[] {
					"X.java",
					"import java.util.function.Consumer;\n" +
					"import java.util.function.DoubleConsumer;\n" +
					"public interface X<T> {\n" +
					"    default void forEachRemaining(Consumer<? super T> action) {\n" +
					"    }\n" +
					"    public interface OfPrimitive<T, T_CONS, T_SPLITR extends OfPrimitive<T, T_CONS, T_SPLITR>> extends X<T> {\n" +
					"        default void forEachRemaining(T_CONS action) {\n" +
					"        }\n" +
					"    }\n" +
					"    public interface OfDouble extends OfPrimitive<Double, DoubleConsumer, OfDouble> {\n" +
					"        default void forEachRemaining(Consumer<? super Double> action) {\n" +
					"        }\n" +
					"        default void forEachRemaining(DoubleConsumer action) {\n" +
					"        }\n" +
					"    }\n" +
					"}\n" +
					"abstract class AbstractDoubleSpliterator implements X.OfDouble {\n" +
					"}\n",
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=427478, [1.8][compiler] Wrong "Duplicate default methods" error on AbstractDoubleSpliterator
	public void test427478a() throws Exception { // full test case.
		this.runConformTest(
			new String[] {
					"Spliterator.java",
					"import java.util.function.Consumer;\n" +
					"import java.util.function.DoubleConsumer;\n" +
					"public interface Spliterator<T> {\n" +
					"    default void forEachRemaining(Consumer<? super T> action) {\n" +
					"    }\n" +
					"    public interface OfPrimitive<T, T_CONS, T_SPLITR extends OfPrimitive<T, T_CONS, T_SPLITR>>\n" +
					"            extends Spliterator<T> {\n" +
					"        // overloads Spliterator#forEachRemaining(Consumer<? super T>)\n" +
					"        default void forEachRemaining(T_CONS action) {\n" +
					"        }\n" +
					"    }\n" +
					"    public interface OfDouble extends OfPrimitive<Double, DoubleConsumer, OfDouble> {\n" +
					"        @Override // the method from Spliterator\n" +
					"        default void forEachRemaining(Consumer<? super Double> action) {\n" +
					"        }\n" +
					"        \n" +
					"        @Override // the method from OfPrimitive\n" +
					"        default void forEachRemaining(DoubleConsumer action) {\n" +
					"        }\n" +
					"    }\n" +
					"}\n" +
					"class Spliterators {\n" +
					"    /* Error on class: Duplicate default methods named forEachRemaining with\n" +
					"     * the parameters (Consumer<? super Double>) and (Consumer<? super T>) are\n" +
					"     * inherited from the types Spliterator.OfDouble and Spliterator<Double>\n" +
					"     */\n" +
					"    public abstract static class AbstractDoubleSpliterator implements Spliterator.OfDouble {\n" +
					"        /* Implementation that prevents the compile error: */\n" +
					"//        @Override // the method from Spliterator\n" +
					"//        public void forEachRemaining(Consumer<? super Double> action) {\n" +
					"//        }\n" +
					"    }\n" +
					"}\n",
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=423467, [1.8][compiler] wrong error for functional interface with @Override default method
	public void test423467() throws Exception { // full test case.
		this.runConformTest(
			new String[] {
					"X.java",
					"interface I {\n" +
					"    int foo(String s);\n" +
					"}\n" +
					"@FunctionalInterface\n" +
					"interface A extends I { // wrong compile error (A *is* a functional interface)\n" +
					"    @Override\n" +
					"    default int foo(String s) {\n" +
					"        return -1;\n" +
					"    }\n" +
					"    Integer foo(java.io.Serializable s);\n" +
					"}\n" +
					"public class X {\n" +
					"    A a = (s) -> 10;\n" +
					"}\n" +
					"@FunctionalInterface\n" +
					"interface B { // OK\n" +
					"    default int foo(String s) {\n" +
					"        return -1;\n" +
					"    }\n" +
					"    Integer foo(java.io.Serializable s);\n" +
					"}\n"
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=438471, Java 1.8 functional interface rejected if it extends an interface which overrides another interface's method
	public void test438471() throws Exception {
		this.runConformTest(
			new String[] {
				"Bar.java",
				"@FunctionalInterface\n" +
				"public interface Bar extends Overridden {\n" + 
					"	void foo();\n" + 
					"	@Override\n" + 
					"	default void close() {\n" + 
					"		System.out.println(\"bar\");\n" + 
					"	}\n" + 
					"}\n" + 
					"\n" + 
					"interface Overridden extends AutoCloseable {\n" + 
					"	// Works without this overridden method\n" + 
					"	@Override\n" + 
					"	void close();\n" + 
					"}"
			},
			"");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350, [1.8][compiler] Missing bridge method in interface results in AbstractMethodError
	public void test436350() throws Exception {
		this.runConformTest(
			new String[] {
				"X.java",
				"public class X {\n" +
				"    public static void main(String [] args) {\n" +
				"    }\n" +
				"}\n" +
				"interface GenericInterface<T> {\n" +
				"	T reduce(Integer i);\n" +
				"}\n" +
				"interface DoubleInterface extends GenericInterface<Double> {\n" +
				"	default Double reduce(Integer i) {\n" +
				"		return 0.0;\n" +
				"	}\n" +
				"	double reduce(String s);\n" +
				"}\n", // =================
			},
			"");
		// 	ensure bridge methods are generated in interfaces.
		String expectedOutput =
				"  public bridge synthetic java.lang.Object reduce(java.lang.Integer arg0);\n" + 
				"    0  aload_0 [this]\n" + 
				"    1  aload_1 [arg0]\n" + 
				"    2  invokeinterface DoubleInterface.reduce(java.lang.Integer) : java.lang.Double [24] [nargs: 2]\n" + 
				"    7  areturn\n";

		File f = new File(OUTPUT_DIR + File.separator + "DoubleInterface.class");
		byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
		ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
		String result = disassembler.disassemble(classFileBytes, "\n", ClassFileBytesDisassembler.DETAILED);
		int index = result.indexOf(expectedOutput);
		if (index == -1 || expectedOutput.length() == 0) {
			System.out.println(Util.displayString(result, 3));
		}
		if (index == -1) {
			assertEquals("Wrong contents", expectedOutput, result);
		}
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=436350, [1.8][compiler] Missing bridge method in interface results in AbstractMethodError
	public void test436350a() throws Exception {
		this.runConformTest(
			new String[] {
				"X.java",
				"import java.util.Iterator;\n" +
				"import java.util.PrimitiveIterator;\n" +
				"import java.util.PrimitiveIterator.OfDouble;\n" +
				"/**\n" +
				" * @author Tobias Grasl\n" +
				" */\n" +
				"public class X {\n" +
				"	public static void main(String[] args) {\n" +
				"		final double[] doubles = new double[]{1,2,3};\n" +
				"		OfDouble doubleIterator = new DoubleArrayIterator(doubles);\n" +
				"		Double value = new Reducer<Double>().reduce(doubleIterator, new DoubleInterface() {\n" +
				"			@Override\n" +
				"			public double reduce(OfDouble iterator_) {\n" +
				"				double sum = 0;\n" +
				"				while(iterator_.hasNext()) {\n" +
				"					sum += iterator_.nextDouble();\n" +
				"				}\n" +
				"				return sum;\n" +
				"			}\n" +
				"		});\n" +
				"		System.out.println(\"Anonymous class value: \"+value);\n" +
				"		doubleIterator = new DoubleArrayIterator(doubles);\n" +
				"		value = new Reducer<Double>().reduce(doubleIterator, (DoubleInterface) iterator_ -> {\n" +
				"			double sum = 0;\n" +
				"			while(iterator_.hasNext()) {\n" +
				"				sum += iterator_.nextDouble();\n" +
				"			}\n" +
				"			return sum;\n" +
				"		});\n" +
				"		System.out.println(\"Lambda expression value: \"+value);\n" +
				"	}\n" +
				"	private static class DoubleArrayIterator implements PrimitiveIterator.OfDouble {\n" +
				"		int index = 0;\n" +
				"		private double[] _doubles;\n" +
				"		public DoubleArrayIterator(double[] doubles_) {\n" +
				"			_doubles = doubles_;\n" +
				"		}\n" +
				"		@Override\n" +
				"		public boolean hasNext() {\n" +
				"			return index < _doubles.length;\n" +
				"		}\n" +
				"		@Override\n" +
				"		public double nextDouble() {\n" +
				"			return _doubles[index++];\n" +
				"		}\n" +
				"	};\n" +
				"	interface GenericInterface<T> {\n" +
				"		T reduce(Iterator<T> iterator_);\n" +
				"	}\n" +
				"	interface DoubleInterface extends GenericInterface<Double> {\n" +
				"		default Double reduce(Iterator<Double> iterator_) {\n" +
				"			if(iterator_ instanceof PrimitiveIterator.OfDouble) {\n" +
				"				return reduce((PrimitiveIterator.OfDouble)iterator_);\n" +
				"			}\n" +
				"			return Double.NaN;\n" +
				"		};\n" +
				"		double reduce(PrimitiveIterator.OfDouble iterator_);\n" +
				"	}\n" +
				"	static class Reducer<T> {\n" +
				"		T reduce(Iterator<T> iterator_, GenericInterface<T> reduction_) {\n" +
				"			return reduction_.reduce(iterator_);\n" +
				"		}\n" +
				"	}\n" +
				"}\n", // =================
			},
			"Anonymous class value: 6.0\n" + 
			"Lambda expression value: 6.0");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=437522, [1.8][compiler] Missing compile error in Java 8 mode for Interface.super.field access
	public void testBug437522() throws Exception {
		runNegativeTest(
			new String[] {
				"X.java",
				"interface T {\n" +
				"    int f = 0;\n" +
				"    void foo();\n" +
				"    default String def() { return \"T.def\"; }\n" +
				"}\n" +
				"class S {\n" +
				"    public static final int f = 0;\n" +
				"}\n" +
				"class C extends S implements T {\n" +
				"    @Override\n" +
				"    public void foo() {\n" +
				"        System.out.println(T.super.f); // no error in Java 8 (wrong) without fix\n" +
				"        System.out.println(T.super.def()); // new JLS8 15.12.1 form (OK)\n" +
				"        System.out.println(S.super.f); // compile error (correct)\n" +
				"    }\n" +
				"}\n" +
				"class X {\n" +
				"    T f = new T() {\n" +
				"        @Override\n" +
				"        public void foo() {\n" +
				"            System.out.println(T.super.f); // no error in Java 8 (wrong) without fix\n" +
				"        }\n" +
				"    };\n" +
				"}\n" +
				"class Y { int f = 1;}\n" +
				"class Z extends Y {\n" +
				"	int foo2() { return super.f;}\n" +
				"	static int foo() { return super.f;}\n" +
				"}\n" +
				"interface T2 { int f = 0; }\n" +
				"class X2  implements T2 {	\n" +
				"	int i = T2.super.f;\n" +
				"}\n" +
				"interface T3 { int f = 0; }\n" +
				"interface T4 extends T3 { int f = 0; }\n" +
				"class X3  implements T4 {	\n" +
				"	int i = T4.super.f;\n" +
				"}\n" +
				"interface T5 { int f = 0; }\n" +
				"class X5 implements T5 {	\n" +
				"	static int i = T5.super.f;\n" +
				"}\n" +
				"interface T6 { int f = 0; }\n" +
				"class X6 implements T6 {	\n" +
				"	static int i = T6.super.f;\n" +
				"}\n",
			},
			"----------\n" +
			"1. ERROR in X.java (at line 12)\n" +
			"	System.out.println(T.super.f); // no error in Java 8 (wrong) without fix\n" +
			"	                   ^^^^^^^\n" +
			"No enclosing instance of the type T is accessible in scope\n" +
			"----------\n" +
			"2. ERROR in X.java (at line 14)\n" +
			"	System.out.println(S.super.f); // compile error (correct)\n" +
			"	                   ^^^^^^^\n" +
			"No enclosing instance of the type S is accessible in scope\n" +
			"----------\n" +
			"3. ERROR in X.java (at line 21)\n" +
			"	System.out.println(T.super.f); // no error in Java 8 (wrong) without fix\n" +
			"	                   ^^^^^^^\n" +
			"No enclosing instance of the type T is accessible in scope\n" +
			"----------\n" +
			"4. ERROR in X.java (at line 28)\n" +
			"	static int foo() { return super.f;}\n" +
			"	                          ^^^^^\n" +
			"Cannot use super in a static context\n" +
			"----------\n" +
			"5. ERROR in X.java (at line 32)\n" +
			"	int i = T2.super.f;\n" +
			"	        ^^^^^^^^\n" +
			"No enclosing instance of the type T2 is accessible in scope\n" +
			"----------\n" +
			"6. ERROR in X.java (at line 37)\n" +
			"	int i = T4.super.f;\n" +
			"	        ^^^^^^^^\n" +
			"No enclosing instance of the type T4 is accessible in scope\n" +
			"----------\n" +
			"7. ERROR in X.java (at line 41)\n" +
			"	static int i = T5.super.f;\n" +
			"	               ^^^^^^^^\n" +
			"Cannot use super in a static context\n" +
			"----------\n" +
			"8. ERROR in X.java (at line 41)\n" +
			"	static int i = T5.super.f;\n" +
			"	               ^^^^^^^^\n" +
			"No enclosing instance of the type T5 is accessible in scope\n" +
			"----------\n" +
			"9. ERROR in X.java (at line 45)\n" +
			"	static int i = T6.super.f;\n" +
			"	               ^^^^^^^^\n" +
			"Cannot use super in a static context\n" +
			"----------\n" +
			"10. ERROR in X.java (at line 45)\n" +
			"	static int i = T6.super.f;\n" +
			"	               ^^^^^^^^\n" +
			"No enclosing instance of the type T6 is accessible in scope\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=437522, [1.8][compiler] Missing compile error in Java 8 mode for Interface.super.field access
	// Example JLS: 15.11.2-1.
	public void testBug437522a() throws Exception {
		runConformTest(
			true,
			new String[] {
				"X.java",
				"interface I  { int x = 0; }\n" +
				"class T1 implements I { int x = 1; }\n" +
				"class T2 extends T1   { int x = 2; }\n" +
				"class T3 extends T2 {\n" +
				"    int x = 3;\n" +
				"    void test() {\n" +
				"        System.out.println(\"x= \"          + x);\n" +
				"        System.out.println(\"super.x= \"    + super.x);\n" +
				"        System.out.println(\"((T2)this).x= \" + ((T2)this).x);\n" +
				"        System.out.println(\"((T1)this).x= \" + ((T1)this).x);\n" +
				"        System.out.println(\"((I)this).x= \"  + ((I)this).x);\n" +
				"    }\n" +
				"}\n" +
				"public class X {\n" +
				"    public static void main(String[] args) {\n" +
				"        new T3().test();\n" +
				"    }\n" +
				"}\n",
			},
			null, null,
			"----------\n" +
			"1. WARNING in X.java (at line 3)\n" +
			"	class T2 extends T1   { int x = 2; }\n" +
			"	                            ^\n" +
			"The field T2.x is hiding a field from type T1\n" +
			"----------\n" +
			"2. WARNING in X.java (at line 5)\n" +
			"	int x = 3;\n" +
			"	    ^\n" +
			"The field T3.x is hiding a field from type T2\n" +
			"----------\n" +
			"3. WARNING in X.java (at line 11)\n" +
			"	System.out.println(\"((I)this).x= \"  + ((I)this).x);\n" +
			"	                                                ^\n" +
			"The static field I.x should be accessed in a static way\n" +
			"----------\n",
			"x= 3\n" +
			"super.x= 2\n" +
			"((T2)this).x= 2\n"	+
			"((T1)this).x= 1\n" +
			"((I)this).x= 0",
			"", JavacTestOptions.DEFAULT);
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=453552, Invalid '@FunctionalInterface error when two interfaces extend the same functional interface.
	public void test453552() throws Exception {
		this.runConformTest(
			new String[] {
				"FunctionalInterface1.java",
				"@FunctionalInterface\n" + 
				"interface FunctionalInterface1 {\n" + 
				"    void methodWithoutDefault();\n" + 
				"}\n" + 
				"@FunctionalInterface\n" + 
				"interface FunctionalInterface2 extends FunctionalInterface1{}\n" + 
				"@FunctionalInterface\n" + 
				"interface FunctionalInterface3 extends FunctionalInterface1{}\n" + 
				"@FunctionalInterface\n" + 
				"interface FunctionalInterface4 extends FunctionalInterface2, FunctionalInterface3{}\n" + 
				"@FunctionalInterface\n" + 
				"interface RunnableFunctionalInterface extends Runnable, FunctionalInterface4{\n" + 
				"	default void methodWithoutDefault(){\n" + 
				"		// implements methodWithoutDefault\n" + 
				"	}\n" + 
				"}\n"
			});
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=453552, Invalid '@FunctionalInterface error when two interfaces extend the same functional interface.
	public void test453552_comment2() throws Exception {
		this.runConformTest(
			new String[] {
				"FI1.java",
				"interface FI1<T,R> {\n" + 
				"	R call(T input);\n" + 
				"}\n" + 
				"interface FI2<U,V> {\n" + 
				"	V call(U input);\n" + 
				"}\n" + 
				"@FunctionalInterface\n" + 
				"interface FI3<X,Y> extends FI1<X,Y>, FI2<X,Y> {\n" + 
				"	Y apply(X input);\n" + 
				"\n" + 
				"   @Override\n" + 
				"   default Y call(X input) {\n" + 
				"       return apply(input);\n" + 
				"   }\n" + 
				"}"
			});
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=477891, [1.8] regression caused by the fix for bug 438812: order dependencies in analysis of default method inheritance
	public void test477891_comment0() throws Exception {
		this.runNegativeTest(
			new String[] {
				"D.java",
				"interface A {\n" + 
				"    public default void display() {\n" +
				"        System.out.println(\"Display from A\");\n" + 
				"    }\n" + 
				"}\n" + 
				"interface B extends A {\n" + 
				"	@Override\n" +
				"    public default void display() {\n" + 
				"        System.out.println(\"Display from B\");\n" + 
				"    }\n" + 
				"}\n" + 
				"interface C extends A {\n" + 
				"	@Override\n" +
				"    public void display();\n" + 
				"}\n" + 
				"public interface D extends B, C {\n" + 
				"}\n"
			},
			"----------\n" +
			"1. ERROR in D.java (at line 16)\n" +
			"	public interface D extends B, C {\n" +
			"	                 ^\n" +
			"The default method display() inherited from B conflicts with another method inherited from C\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=477891, [1.8] regression caused by the fix for bug 438812: order dependencies in analysis of default method inheritance
	public void test477891_comment0_a() throws Exception {
		this.runNegativeTest(
			new String[] {
				"D.java",
				"interface A {\n" + 
				"    public default void display() {\n" + 
				"        System.out.println(\"Display from A\");\n" + 
				"    }\n" + 
				"}\n" + 
				"interface B extends A {\n" + 
				"	@Override\n" +
				"    public default void display() {\n" + 
				"        System.out.println(\"Display from B\");\n" + 
				"    }\n" + 
				"}\n" + 
				"interface C extends A {\n" + 
				"	@Override\n" +
				"    public void display();\n" + 
				"}\n" + 
				"public interface D extends C, B {\n" + 
				"}\n"
			},
			"----------\n" +
			"1. ERROR in D.java (at line 16)\n" +
			"	public interface D extends C, B {\n" +
			"	                 ^\n" +
			"The default method display() inherited from B conflicts with another method inherited from C\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=477891, [1.8] regression caused by the fix for bug 438812: order dependencies in analysis of default method inheritance
	public void test477891_comment3_a() throws Exception {
		this.runNegativeTest(
			new String[] {
				"Z.java",
				"import java.util.*;\n" + 
				"interface Z<E> extends X<E>, Y<E> {\n" + 
				"}\n" + 
				"interface Y<E> extends AB<E> {\n" + 
				"	@Override\n" +
				"	default Spliterator<E> spliterator() { return null; };\n" + 
				"}\n" + 
				"interface X<E> extends AB<E> {\n" + 
				"	@Override\n" +
				"	Spliterator<E> spliterator();\n" + 
				"}\n" + 
				"interface AB<E> {\n" + 
				"	default Spliterator<E> spliterator() { return null; }\n" + 
				"}\n" 
			},
			"----------\n" +
			"1. ERROR in Z.java (at line 2)\n" +
			"	interface Z<E> extends X<E>, Y<E> {\n" +
			"	          ^\n" +
			"The default method spliterator() inherited from Y<E> conflicts with another method inherited from X<E>\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=477891, [1.8] regression caused by the fix for bug 438812: order dependencies in analysis of default method inheritance
	public void test477891_comment3_b() throws Exception {
		this.runNegativeTest(
			new String[] {
				"Z.java",
				"import java.util.*;\n" + 
				"interface Z<E> extends Y<E>, X<E> {\n" + 
				"}\n" + 
				"interface Y<E> extends AB<E> {\n" + 
				"	@Override\n" +
				"	default Spliterator<E> spliterator() { return null; };\n" + 
				"}\n" + 
				"interface X<E> extends AB<E> {\n" + 
				"	@Override\n" +
				"	Spliterator<E> spliterator();\n" + 
				"}\n" + 
				"interface AB<E> {\n" + 
				"	default Spliterator<E> spliterator() { return null; }\n" + 
				"}\n" 
			},
			"----------\n" +
			"1. ERROR in Z.java (at line 2)\n" +
			"	interface Z<E> extends Y<E>, X<E> {\n" +
			"	          ^\n" +
			"The default method spliterator() inherited from Y<E> conflicts with another method inherited from X<E>\n" +
			"----------\n");
	}
	// https://bugs.eclipse.org/bugs/show_bug.cgi?id=477891, [1.8] regression caused by the fix for bug 438812: order dependencies in analysis of default method inheritance
		public void test477891_comment3_c() throws Exception {
			this.runNegativeTest(
				new String[] {
					"Z.java",
					"import java.util.*;\n" + 
					"interface Z<E> extends X<E>, Y<E> {\n" + 
					"}\n" + 
					"interface Y<E> extends AB<E> {\n" + 
					"	@Override\n" +
					"	default Spliterator<E> spliterator() { return null; };\n" + 
					"}\n" + 
					"interface X<E> {\n" + 
					"	Spliterator<E> spliterator();\n" + 
					"}\n" + 
					"interface AB<E> {\n" + 
					"	default Spliterator<E> spliterator() { return null; }\n" + 
					"}\n" 
				},
				"----------\n" +
				"1. ERROR in Z.java (at line 2)\n" +
				"	interface Z<E> extends X<E>, Y<E> {\n" +
				"	          ^\n" +
				"The default method spliterator() inherited from Y<E> conflicts with another method inherited from X<E>\n" +
				"----------\n");
		}
		// https://bugs.eclipse.org/bugs/show_bug.cgi?id=477891, [1.8] regression caused by the fix for bug 438812: order dependencies in analysis of default method inheritance
		public void test477891_comment3_d() throws Exception {
			this.runNegativeTest(
				new String[] {
					"Z.java",
					"import java.util.*;\n" + 
					"interface Z<E> extends Y<E>, X<E> {\n" + 
					"}\n" + 
					"interface Y<E> extends AB<E> {\n" + 
					"	@Override\n" +
					"	default Spliterator<E> spliterator() { return null; };\n" + 
					"}\n" + 
					"interface X<E> {\n" + 
					"	Spliterator<E> spliterator();\n" + 
					"}\n" + 
					"interface AB<E> {\n" + 
					"	default Spliterator<E> spliterator() { return null; }\n" + 
					"}\n" 
				},
				"----------\n" +
				"1. ERROR in Z.java (at line 2)\n" +
				"	interface Z<E> extends Y<E>, X<E> {\n" +
				"	          ^\n" +
				"The default method spliterator() inherited from Y<E> conflicts with another method inherited from X<E>\n" +
				"----------\n");
		}
	public void test458547_comment0_a() throws Exception {
		this.runNegativeTest(
			new String[] {
				"JavaTest.java",
				"public class JavaTest {\n" + 
				"	interface A {\n" + 
				"		default void foo() { }\n" + 
				"	}\n" + 
				"	interface B {\n" + 
				"		void foo();\n" + 
				"	}\n" + 
				"	interface C {\n" + 
				"		void foo();\n" + 
				"	}\n" + 
				"	interface D extends A, B {\n" + 
				"		@Override default void foo() { }\n" + 
				"	}\n" + 
				"	class E implements A, B, C, D {\n" + 
				"	}\n" + 
				"}" 
			},
			"----------\n" +
			"1. ERROR in JavaTest.java (at line 14)\n" +
			"	class E implements A, B, C, D {\n" +
			"	      ^\n" +
			"The default method foo() inherited from JavaTest.D conflicts with another method inherited from JavaTest.C\n" +
			"----------\n");
	}
	public void test458547_comment0_b() throws Exception {
		this.runNegativeTest(
			new String[] {
				"JavaTest.java",
				"public class JavaTest {\n" + 
				"	interface A {\n" + 
				"		default void foo() { }\n" + 
				"	}\n" + 
				"	interface B {\n" + 
				"		void foo();\n" + 
				"	}\n" + 
				"	interface C {\n" + 
				"		void foo();\n" + 
				"	}\n" + 
				"	interface D extends A, B {\n" + 
				"		@Override default void foo() { }\n" + 
				"	}\n" + 
				"	class E implements B, C, A, D {\n" + 
				"	}\n" + 
				"}" 
			},
			"----------\n" +
			"1. ERROR in JavaTest.java (at line 14)\n" +
			"	class E implements B, C, A, D {\n" +
			"	      ^\n" +
			"The default method foo() inherited from JavaTest.D conflicts with another method inherited from JavaTest.C\n" +
			"----------\n");
	}

	public void testBug539743() {
		runConformTest(
		new String[] {
			"Test.java",
			"public class Test {\n" + 
			"	static <V> void m(V v) {\n" + 
			"\n" + 
			"	}\n" + 
			"\n" + 
			"	interface Foo {\n" + 
			"		@SuppressWarnings(\"unchecked\")\n" + 
			"		default <U> U f() {\n" + 
			"			return (U) new Object();\n" + 
			"		}\n" + 
			"	}\n" + 
			"\n" + 
			"	static class Bar implements Foo {\n" + 
			"		@SuppressWarnings(\"unchecked\")\n" + 
			"		@Override\n" + 
			"		public Object f() {\n" + 
			"			m(Foo.super.f());\n" + 
			"			return null;\n" + 
			"		}\n" + 
			"	}\n" + 
			"}",
		}, 
		"");
	}
}
