/******************************************************************************* * Copyright (c) 2013, 2016 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation * Stephan Herrmann - Contribution for * Bug 400874 - [1.8][compiler] Inference infrastructure should evolve to meet JLS8 18.x (Part G of JSR335 spec) * Bug 425156 - [1.8] Lambda as an argument is flagged with incompatible error *******************************************************************************/ package org.eclipse.jdt.core.tests.compiler.regression; import junit.framework.Test; @SuppressWarnings({ "rawtypes" }) public class OverloadResolutionTest8 extends AbstractRegressionTest { static { // TESTS_NAMES = new String[] { "test007"}; // TESTS_NUMBERS = new int[] { 50 }; // TESTS_RANGE = new int[] { 11, -1 }; } public OverloadResolutionTest8(String name) { super(name); } public static Test suite() { return buildMinimalComplianceTestSuite(testClass(), F_1_8); } public static Class testClass() { return OverloadResolutionTest8.class; } public void test001() { this.runNegativeTest( new String[] { "X.java", "interface I {\n" + " int foo(int [] a);\n" + "}\n" + "interface J {\n" + " int foo(int a);\n" + "}\n" + "public class X {\n" + " public static void main(String[] args) {\n" + " System.out.println(foo((a)->a.length));\n" + " }\n" + " static String foo(I i) {\n" + " return(\"foo(I)\");\n" + " }\n" + " static String foo(J j) {\n" + " return(\"foo(J)\");\n" + " }\n" + "}\n", }, "----------\n" + "1. ERROR in X.java (at line 9)\n" + " System.out.println(foo((a)->a.length));\n" + " ^^^\n" + "The method foo(I) is ambiguous for the type X\n" + "----------\n" ); } public void test002() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " void foo();\n" + "}\n" + "interface J {\n" + " int foo();\n" + "}\n" + "public class X {\n" + " static void goo(I i) {\n" + " System.out.println(\"goo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"goo(J)\");\n" + " }\n" + " public static void main(String[] args) {\n" + " final boolean x = true;\n" + " goo(()-> goo((I)null));\n" + " }\n" + " int f() {\n" + " final boolean x = true;\n" + " while (x);\n" + " }\n" + "}\n", }, "goo(I)"); } public void test003() { this.runConformTest( new String[] { "X.java", "interface J {\n" + " int foo();\n" + "}\n" + "public class X {\n" + " static final boolean f = true;\n" + " static void goo(J j) {\n" + " System.out.println(\"goo(J)\");\n" + " }\n" + " public static void main(String[] args) {\n" + " final boolean x = true;\n" + " goo(()-> { \n" + " final boolean y = true;\n" + " while (y); \n" + " });\n" + " goo(()-> { \n" + " while (x); \n" + " });\n" + " goo(()-> { \n" + " while (f); \n" + " });\n" + " }\n" + "}\n", }, "goo(J)\n" + "goo(J)\n" + "goo(J)"); } public void test004() { this.runNegativeTest( new String[] { "X.java", "interface J {\n" + " int foo();\n" + "}\n" + "public class X {\n" + " static boolean f = true;\n" + " static void goo(J j) {\n" + " System.out.println(\"goo(J)\");\n" + " }\n" + " public static void main(String[] args) {\n" + " boolean x = true;\n" + " goo(()-> { \n" + " boolean y = true;\n" + " while (y); \n" + " });\n" + " goo(()-> { \n" + " while (x); \n" + " });\n" + " goo(()-> { \n" + " while (f); \n" + " });\n" + " }\n" + "}\n", }, // none of the lambdas is compatible because none is value-compatible, whereas foo() needs to return int. "----------\n" + "1. ERROR in X.java (at line 11)\n" + " goo(()-> { \n" + " ^^^\n" + "The method goo(J) in the type X is not applicable for the arguments (() -> {})\n" + "----------\n2. ERROR in X.java (at line 15)\n" + " goo(()-> { \n" + " ^^^\n" + "The method goo(J) in the type X is not applicable for the arguments (() -> {})\n" + "----------\n" + "3. ERROR in X.java (at line 18)\n" + " goo(()-> { \n" + " ^^^\n" + "The method goo(J) in the type X is not applicable for the arguments (() -> {})\n" + "----------\n"); } public void test005() { this.runNegativeTest( new String[] { "X.java", "interface J {\n" + " int foo();\n" + "}\n" + "public class X {\n" + " final boolean f = true;\n" + " static void goo(J j) {\n" + " System.out.println(\"goo(J)\");\n" + " }\n" + " public static void main(String[] args) {\n" + " final boolean x = true;\n" + " goo(()-> { \n" + " final boolean y = true;\n" + " while (y); \n" + " });\n" + " goo(()-> { \n" + " while (x); \n" + " });\n" + " goo(()-> { \n" + " while (f); \n" + " });\n" + " }\n" + "}\n", }, "----------\n" + "1. ERROR in X.java (at line 18)\n" + " goo(()-> { \n" + " ^^^\n" + "The method goo(J) in the type X is not applicable for the arguments (() -> {})\n" + // because lambda has errors -> not valueCompatible "----------\n" + "2. ERROR in X.java (at line 19)\n" + " while (f); \n" + " ^\n" + "Cannot make a static reference to the non-static field f\n" + "----------\n"); } public void test006() { this.runNegativeTest( new String[] { "X.java", "public class X {\n" + " public static interface StringToInt {\n" + " int stoi(String s);\n" + " }\n" + " public static interface ReduceInt {\n" + " int reduce(int a, int b);\n" + " }\n" + " void foo(StringToInt s) { }\n" + " void bar(ReduceInt r) { }\n" + " void bar() {\n" + " bar((int x, int y) -> x+y); //SingleVariableDeclarations are OK\n" + " foo(s -> s.length());\n" + " foo((s) -> s.length());\n" + " foo((String s) -> s.length()); //SingleVariableDeclaration is OK\n" + " bar((x, y) -> x+y);\n" + " }\n" + "}\n", }, ""); } public void test007() { this.runNegativeTest( new String[] { "X.java", "interface J {\n" + " void foo();\n" + "}\n" + "public class X {\n" + " static void goo(J j) {\n" + " System.out.println(\"goo(J)\");\n" + " }\n" + " public static void main(String[] args) {\n" + " goo(()-> 10); \n" + " }\n" + "}\n", }, "----------\n" + "1. ERROR in X.java (at line 9)\n" + " goo(()-> 10); \n" + " ^^^\n" + "The method goo(J) in the type X is not applicable for the arguments (() -> {})\n" + "----------\n" + "2. ERROR in X.java (at line 9)\n" + " goo(()-> 10); \n" + " ^^\n" + "Void methods cannot return a value\n" + "----------\n"); } public void test008() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " Object foo();\n" + "}\n" + "interface J {\n" + " String foo();\n" + "}\n" + "public class X {\n" + " public static void main(String[] args) {\n" + " System.out.println(foo(()->null));\n" + " }\n" + " static String foo(I i) {\n" + " return(\"foo(I)\");\n" + " }\n" + " static String foo(J j) {\n" + " return(\"foo(J)\");\n" + " }\n" + "}\n", }, "foo(J)"); } public void test009() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " Object foo();\n" + "}\n" + "interface J {\n" + " void foo();\n" + "}\n" + "public class X {\n" + " public static void main(String[] args) {\n" + " System.out.println(foo(()-> {}));\n" + " }\n" + " static String foo(I i) {\n" + " return(\"foo(I)\");\n" + " }\n" + " static String foo(J j) {\n" + " return(\"foo(J)\");\n" + " }\n" + "}\n", }, "foo(J)"); } public void test010() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " Object foo();\n" + "}\n" + "interface J {\n" + " void foo();\n" + "}\n" + "public class X {\n" + " public static void main(String[] args) {\n" + " System.out.println(foo(()-> foo(()->null)));\n" + " }\n" + " static String foo(I i) {\n" + " return(\"foo(I)\");\n" + " }\n" + " static String foo(J j) {\n" + " return(\"foo(J)\");\n" + " }\n" + "}\n", }, "foo(I)"); } public void test011() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " int foo();\n" + "}\n" + "interface J {\n" + " String foo();\n" + "}\n" + "public class X {\n" + " public static void main(String[] args) {\n" + " System.out.println(foo(()-> \"Hello\" ));\n" + " }\n" + " static String foo(I i) {\n" + " return(\"foo(I)\");\n" + " }\n" + " static String foo(J j) {\n" + " return(\"foo(J)\");\n" + " }\n" + "}\n", }, "foo(J)"); } public void test012() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " int foo();\n" + "}\n" + "interface J {\n" + " String foo();\n" + "}\n" + "public class X {\n" + " public static void main(String[] args) {\n" + " System.out.println(foo(()-> 1234 ));\n" + " }\n" + " static String foo(I i) {\n" + " return(\"foo(I)\");\n" + " }\n" + " static String foo(J j) {\n" + " return(\"foo(J)\");\n" + " }\n" + "}\n", }, "foo(I)"); } public void test013() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " int foo();\n" + "}\n" + "interface J {\n" + " Integer foo();\n" + "}\n" + "public class X {\n" + " public static void main(String[] args) {\n" + " System.out.println(foo(()-> 1234 ));\n" + " }\n" + " static String foo(I i) {\n" + " return(\"foo(I)\");\n" + " }\n" + " static String foo(J j) {\n" + " return(\"foo(J)\");\n" + " }\n" + "}\n", }, "foo(I)"); } public void test014() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " Integer foo();\n" + "}\n" + "interface J {\n" + " int foo();\n" + "}\n" + "public class X {\n" + " \n" + " static void foo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " \n" + " static void foo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " \n" + " public static void main(String[] args) {\n" + " foo(()-> new Integer(10));\n" + " }\n" + "}\n", }, "foo(I)"); } public void test015() { this.runConformTest( new String[] { "X.java", "interface J {\n" + " int foo();\n" + "}\n" + "interface I {\n" + " Integer foo();\n" + "}\n" + "public class X {\n" + " \n" + " static void foo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " \n" + " static void foo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " \n" + " public static void main(String[] args) {\n" + " foo(()-> new Integer(10));\n" + " }\n" + "}\n", }, "foo(I)"); } public void test016() { this.runConformTest( new String[] { "X.java", "interface O {\n" + " Object foo();\n" + "}\n" + "interface S {\n" + " String foo();\n" + "}\n" + "interface I {\n" + " O foo();\n" + "}\n" + "interface J {\n" + " S foo();\n" + "}\n" + "public class X {\n" + " static void foo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void foo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) {\n" + " foo(()-> ()-> \"String\");\n" + " }\n" + "}\n", }, "foo(J)"); } public void test017() { this.runConformTest( new String[] { "X.java", "interface J {\n" + " int foo();\n" + "}\n" + "public class X {\n" + " static void foo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) {\n" + " foo(()-> new Integer(10));\n" + " }\n" + "}\n", }, "foo(J)"); } public void test018() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " X [] foo(int x);\n" + "}\n" + "public class X {\n" + " static void foo(I x) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " I i = X[]::new;\n" + " public static void main(String[] args) {\n" + " foo(X[]::new);\n" + " }\n" + "}\n", }, "foo(I)"); } public void test019() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " void foo(int x);\n" + "}\n" + "public class X {\n" + " static void foo(I x) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " I i = X[]::new;\n" + " public static void main(String[] args) {\n" + " foo(X[]::new);\n" + " }\n" + "}\n", }, "foo(I)"); } public void test020() { this.runNegativeTest( new String[] { "X.java", "interface I {\n" + " Y foo(int x);\n" + "}\n" + "interface J {\n" + " Y foo();\n" + "}\n" + "class Y {\n" + " Y() {\n" + " }\n" + " \n" + " Y(int x) {\n" + " }\n" + "}\n" + "public class X {\n" + " static void foo(I i) {\n" + " }\n" + " static void foo(J j) {\n" + " }\n" + " public static void main(String[] args) {\n" + " foo(Y::new);\n" + " }\n" + "}\n", }, "----------\n" + "1. ERROR in X.java (at line 20)\n" + " foo(Y::new);\n" + " ^^^\n" + "The method foo(I) is ambiguous for the type X\n" + "----------\n"); } public void test021() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " Y foo(int x);\n" + "}\n" + "interface J {\n" + " Y foo();\n" + "}\n" + "class Y {\n" + " private Y() {\n" + " }\n" + " \n" + " Y(int x) {\n" + " }\n" + "}\n" + "public class X {\n" + " static void foo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void foo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) {\n" + " foo(Y::new);\n" + " }\n" + "}\n", }, "foo(I)"); } public void test022() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " Y foo(int x);\n" + "}\n" + "interface J {\n" + " Y foo();\n" + "}\n" + "class Y {\n" + " Y(float f) {\n" + " System.out.println(\"Y(float)\");\n" + " }\n" + " \n" + " Y(int x) {\n" + " System.out.println(\"Y(int)\");\n" + " }\n" + "}\n" + "public class X {\n" + " static void foo(I i) {\n" + " i.foo(10);\n" + " }\n" + " static void foo(J j) {\n" + " j.foo();\n" + " }\n" + " public static void main(String[] args) {\n" + " foo(Y::new);\n" + " }\n" + "}\n", }, "Y(int)"); } public void test023() { this.runNegativeTest( new String[] { "X.java", "interface I {\n" + " Y foo(int x);\n" + "}\n" + "interface J {\n" + " Y foo();\n" + "}\n" + "class Y {\n" + " Y(int ... x) {\n" + " }\n" + " \n" + "}\n" + "public class X {\n" + " static void foo(I i) {\n" + " }\n" + " static void foo(J j) {\n" + " }\n" + " public static void main(String[] args) {\n" + " foo(Y::new);\n" + " }\n" + "}\n", }, "----------\n" + "1. ERROR in X.java (at line 18)\n" + " foo(Y::new);\n" + " ^^^\n" + "The method foo(I) is ambiguous for the type X\n" + "----------\n"); } public void test024() { this.runNegativeTest( new String[] { "X.java", "interface I {\n" + " Y foo(int x);\n" + "}\n" + "interface J {\n" + " Y foo(int x);\n" + "}\n" + "class Y {\n" + " Y(int x) {\n" + " }\n" + " \n" + "}\n" + "public class X {\n" + " static void foo(I i) {\n" + " }\n" + " static void foo(J j) {\n" + " }\n" + " public static void main(String[] args) {\n" + " foo(Y::new);\n" + " }\n" + "}\n", }, "----------\n" + "1. ERROR in X.java (at line 18)\n" + " foo(Y::new);\n" + " ^^^\n" + "The method foo(I) is ambiguous for the type X\n" + "----------\n"); } public void test025() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " Y foo(int x);\n" + "}\n" + "interface J {\n" + " X foo(int x);\n" + "}\n" + "class Y extends X {\n" + " Y(int x) {\n" + " }\n" + "}\n" + "public class X {\n" + " static void foo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void foo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) {\n" + " foo(Y::new);\n" + " }\n" + "}\n", }, "foo(I)"); } public void test026() { this.runNegativeTest( new String[] { "X.java", "interface I {\n" + " Y foo(int x);\n" + "}\n" + "interface J {\n" + " X foo(int x);\n" + "}\n" + "class Y extends X {\n" + " <T> Y(int x) {\n" + " }\n" + "}\n" + "public class X {\n" + " static void foo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void foo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) {\n" + " foo(Y::new);\n" + " }\n" + "}\n", }, "----------\n" + "1. ERROR in X.java (at line 19)\n" + " foo(Y::new);\n" + " ^^^\n" + "The method foo(I) is ambiguous for the type X\n" + "----------\n"); } public void test027() { // javac bug: 8b115 complains of ambiguity here. this.runConformTest( false /* skipJavac */, JavacTestOptions.Excuse.JavacDoesNotCompileCorrectSource, new String[] { "X.java", "interface I {\n" + " Y foo(int x);\n" + "}\n" + "interface J {\n" + " X foo(int x);\n" + "}\n" + "class Y extends X {\n" + " <T> Y(int x) {\n" + " }\n" + "}\n" + "public class X {\n" + " static void foo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void foo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) {\n" + " foo(Y::<String>new);\n" + " }\n" + "}\n", }, "foo(I)"); } public void test028() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " Y [] foo(int x);\n" + "}\n" + "interface J {\n" + " X [] foo();\n" + "}\n" + "class Y extends X {\n" + "}\n" + "public class X {\n" + " static void foo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void foo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) {\n" + " foo(Y []::new);\n" + " }\n" + "}\n", }, "foo(I)"); } public void test029() { this.runNegativeTest( new String[] { "X.java", "interface I {\n" + " Y [] foo(int x);\n" + "}\n" + "interface J {\n" + " X [] foo();\n" + "}\n" + "class Y extends X {\n" + "}\n" + "public class X {\n" + " static void foo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void foo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) {\n" + " foo(X []::new);\n" + " }\n" + "}\n", }, "----------\n" + "1. ERROR in X.java (at line 17)\n" + " foo(X []::new);\n" + " ^^^\n" + "The method foo(I) in the type X is not applicable for the arguments (X[]::new)\n" + "----------\n" + "2. ERROR in X.java (at line 17)\n" + " foo(X []::new);\n" + " ^^^^^^^^^\n" + "Constructed array X[] cannot be assigned to Y[] as required in the interface descriptor \n" + "----------\n"); } public void test030() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " Y [] foo(int x);\n" + "}\n" + "interface J {\n" + " X [] foo(int x);\n" + "}\n" + "class Y extends X {\n" + "}\n" + "public class X {\n" + " static void foo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void foo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) {\n" + " foo(X []::new);\n" + " }\n" + "}\n", }, "foo(J)"); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=401850, [1.8][compiler] Compiler fails to type poly allocation expressions in method invocation contexts public void test031() { this.runConformTest( new String[] { "X.java", "public class X<T> {\n" + " void foo(X<String> s) {\n" + " System.out.println(\"foo(X<String>)\");\n" + " }\n" + " public static void main(String[] args) {\n" + " new X<String>().foo(new X<>());\n" + " }\n" + "}\n", }, "foo(X<String>)"); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=401850, [1.8][compiler] Compiler fails to type poly allocation expressions in method invocation contexts // FAIL: we no longer see that both methods are applicable... // inference starts with X#RAW, finds the second method, then infers the diamond to Object and sees that foo is not ambiguous public void _test032() { this.runNegativeTest( new String[] { "X.java", "public class X<T> {\n" + " void foo(X<String> s, Object o) {\n" + " System.out.println(\"foo(X<String>)\");\n" + " }\n" + " void foo(X xs, String s) {\n" + " System.out.println(\"foo(X<String>)\");\n" + " }\n" + " public static void main(String[] args) {\n" + " new X<String>().foo(new X<>(), \"Hello\");\n" + " }\n" + "}\n", }, "----------\n" + "1. WARNING in X.java (at line 5)\n" + " void foo(X xs, String s) {\n" + " ^\n" + "X is a raw type. References to generic type X<T> should be parameterized\n" + "----------\n" + "2. ERROR in X.java (at line 9)\n" + " new X<String>().foo(new X<>(), \"Hello\");\n" + " ^^^\n" + "The method foo(X<String>, Object) is ambiguous for the type X<String>\n" + "----------\n"); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=401850, [1.8][compiler] Compiler fails to type poly allocation expressions in method invocation contexts public void test033() { this.runConformTest( new String[] { "X.java", "class Y<T> {}\n" + "public class X<T> extends Y<T> {\n" + " void foo(X<String> s) {\n" + " System.out.println(\"foo(X<String>)\");\n" + " }\n" + " void foo(Y<String> y) {\n" + " System.out.println(\"foo(Y<String>)\");\n" + " }\n" + " public static void main(String[] args) {\n" + " new X<String>().foo(new X<>());\n" + " }\n" + "}\n", }, "foo(X<String>)"); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=422050, [1.8][compiler] Overloaded method call with poly-conditional expression rejected by the compiler public void test422050() { this.runConformTest( new String[] { "X.java", "interface I { \n" + " int foo(); \n" + "}\n" + "interface J { \n" + " double foo(); \n" + "}\n" + "public class X {\n" + " static int foo(I i) {\n" + " return 0;\n" + " }\n" + " static int foo(J j) {\n" + " return 1;\n" + " }\n" + " public static void main(String argv[]) {\n" + " System.out.println(foo (() -> true ? 0 : 1));\n" + " }\n" + "}\n", }, "0"); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=400871, [1.8][compiler] Overhaul overload resolution to reconcile with JLS8 15.12.2 public void test400871() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " void foo();\n" + "}\n" + "interface J {\n" + " int foo();\n" + "}\n" + "public class X {\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " static int foo() {\n" + " return 0;\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(X::foo);\n" + " }\n" + "}\n", }, "foo(J)"); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=400871, [1.8][compiler] Overhaul overload resolution to reconcile with JLS8 15.12.2 public void test400871a() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " void foo(int x);\n" + "}\n" + "interface J {\n" + " int foo(int x);\n" + "}\n" + "class Y {\n" + " int foo(int y) {\n" + " return 0;\n" + " }\n" + "}\n" + "public class X extends Y {\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " int foo(int x) {\n" + " return 0;\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X()::foo);\n" + " }\n" + "}\n", }, "foo(J)"); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=400871, [1.8][compiler] Overhaul overload resolution to reconcile with JLS8 15.12.2 public void test400871b() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " void foo(int x);\n" + "}\n" + "interface J {\n" + " int foo(int x);\n" + "}\n" + "class Y {\n" + " <T> int foo(int y) {\n" + " return 0;\n" + " }\n" + "}\n" + "public class X extends Y {\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " int foo(int x) {\n" + " return 0;\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X()::foo);\n" + " }\n" + "}\n", }, "foo(J)"); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=400871, [1.8][compiler] Overhaul overload resolution to reconcile with JLS8 15.12.2 public void test400871c() { this.runNegativeTest( new String[] { "X.java", "interface I {\n" + " void foo(int x);\n" + "}\n" + "interface J {\n" + " int foo(int x);\n" + "}\n" + "class Y {\n" + " <T> int foo(String y) {\n" + " return 0;\n" + " }\n" + "}\n" + "public class X extends Y {\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " int foo(int x) {\n" + " return 0;\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X()::foo);\n" + " }\n" + "}\n", }, "----------\n" + "1. ERROR in X.java (at line 23)\n" + " goo(new X()::foo);\n" + " ^^^\n" + "The method goo(I) is ambiguous for the type X\n" + "----------\n"); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=400871, [1.8][compiler] Overhaul overload resolution to reconcile with JLS8 15.12.2 public void test400871d() { this.runNegativeTest( new String[] { "X.java", "interface I {\n" + " void foo(int x);\n" + "}\n" + "interface J {\n" + " int foo(int x);\n" + "}\n" + "class Y {\n" + " int foo(String y) {\n" + " return 0;\n" + " }\n" + "}\n" + "public class X extends Y {\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " <T> int foo(int x) {\n" + " return 0;\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X()::foo);\n" + " }\n" + "}\n", }, "----------\n" + "1. ERROR in X.java (at line 23)\n" + " goo(new X()::foo);\n" + " ^^^\n" + "The method goo(I) is ambiguous for the type X\n" + "----------\n"); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=400871, [1.8][compiler] Overhaul overload resolution to reconcile with JLS8 15.12.2 public void test4008712() { this.runNegativeTest( new String[] { "X.java", "interface I {\n" + " void foo(int x);\n" + "}\n" + "interface J {\n" + " int foo(int x);\n" + "}\n" + "class Y {\n" + " int foo(String y) {\n" + " return 0;\n" + " }\n" + "}\n" + "public class X extends Y {\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " <T> int foo(int x) {\n" + " return 0;\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X()::foo);\n" + " }\n" + "}\n", }, "----------\n" + "1. ERROR in X.java (at line 23)\n" + " goo(new X()::foo);\n" + " ^^^\n" + "The method goo(I) is ambiguous for the type X\n" + "----------\n"); } public void test4008712e() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " void foo(int x);\n" + "}\n" + "interface J {\n" + " int foo(int x);\n" + "}\n" + "class Y {\n" + " int foo(int y) {\n" + " return 0;\n" + " }\n" + "}\n" + "public class X extends Y {\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X()::foo);\n" + " }\n" + "}\n", }, "foo(J)"); } public void test4008712f() { this.runNegativeTest( new String[] { "X.java", "interface I {\n" + " void foo(int x);\n" + "}\n" + "interface J {\n" + " int foo(int x);\n" + "}\n" + "class Y {\n" + " int foo(int ... x) {\n" + " return 0;\n" + " }\n" + "}\n" + "public class X extends Y {\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X()::foo);\n" + " }\n" + "}\n", }, "----------\n" + "1. ERROR in X.java (at line 20)\n" + " goo(new X()::foo);\n" + " ^^^\n" + "The method goo(I) is ambiguous for the type X\n" + "----------\n"); } public void test4008712g() { this.runNegativeTest( new String[] { "X.java", "interface I {\n" + " void foo(int x);\n" + "}\n" + "interface J {\n" + " int foo(int x);\n" + "}\n" + "class Y {\n" + " private int foo(int x) {\n" + " return 0;\n" + " }\n" + "}\n" + "public class X extends Y {\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X()::foo);\n" + " }\n" + "}\n", }, "----------\n" + "1. WARNING in X.java (at line 8)\n" + " private int foo(int x) {\n" + " ^^^^^^^^^^\n" + "The method foo(int) from the type Y is never used locally\n" + "----------\n" + "2. ERROR in X.java (at line 20)\n" + " goo(new X()::foo);\n" + " ^^^\n" + "The method goo(I) in the type X is not applicable for the arguments (new X()::foo)\n" + "----------\n" + "3. ERROR in X.java (at line 20)\n" + " goo(new X()::foo);\n" + " ^^^^^^^^^^^^\n" + "The type X does not define foo(int) that is applicable here\n" + "----------\n"); } public void test4008712h() { this.runNegativeTest( new String[] { "X.java", "interface I {\n" + " void foo(int x);\n" + "}\n" + "interface J {\n" + " int foo(int x);\n" + "}\n" + "class Y {\n" + " public <T> int foo(int x) {\n" + " return 0;\n" + " }\n" + "}\n" + "public class X extends Y {\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X()::foo);\n" + " }\n" + "}\n", }, "----------\n" + "1. ERROR in X.java (at line 20)\n" + " goo(new X()::foo);\n" + " ^^^\n" + "The method goo(I) is ambiguous for the type X\n" + "----------\n"); } public void test4008712i() { // javac bug: 8b115 complains of ambiguity here. this.runConformTest( false /* skipJavac */, JavacTestOptions.Excuse.JavacDoesNotCompileCorrectSource, new String[] { "X.java", "interface I {\n" + " void foo(int x);\n" + "}\n" + "interface J {\n" + " int foo(int x);\n" + "}\n" + "class Y {\n" + " public <T> int foo(int x) {\n" + " return 0;\n" + " }\n" + "}\n" + "public class X extends Y {\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X()::<String>foo);\n" + " }\n" + "}\n", }, "foo(J)"); } public void test4008712j() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " void foo(String x);\n" + "}\n" + "interface J {\n" + " int foo(String x);\n" + "}\n" + "class Y<T> {\n" + " public T foo(T x) {\n" + " return null;\n" + " }\n" + "}\n" + "public class X<T> extends Y<T> {\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X<String>()::foo);\n" + " }\n" + "}\n", }, "foo(I)"); } public void test4008712k() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " void foo(String x);\n" + "}\n" + "interface J {\n" + " String foo(String x);\n" + "}\n" + "class Y<T> {\n" + " public T foo(T x) {\n" + " return null;\n" + " }\n" + "}\n" + "public class X<T> extends Y<T> {\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X<String>()::foo);\n" + " }\n" + "}\n", }, "foo(J)"); } public void test4008712l() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " void foo(String x);\n" + "}\n" + "interface J {\n" + " String foo(String x);\n" + "}\n" + "class Y<T> {\n" + " public T foo(T x) {\n" + " return null;\n" + " }\n" + "}\n" + "public class X<T> extends Y<String> {\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X<String>()::foo);\n" + " }\n" + "}\n", }, "foo(J)"); } public void test4008712m() { this.runNegativeTest( new String[] { "X.java", "interface I {\n" + " void foo(String x);\n" + "}\n" + "interface J {\n" + " String foo(String x);\n" + "}\n" + "class Y<T> {\n" + " public T foo(T x) {\n" + " return null;\n" + " }\n" + "}\n" + "public class X<T> extends Y<String> {\n" + " public void foo() {}\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X<String>()::foo);\n" + " }\n" + "}\n", }, "----------\n" + "1. ERROR in X.java (at line 21)\n" + " goo(new X<String>()::foo);\n" + " ^^^\n" + "The method goo(I) is ambiguous for the type X<T>\n" + "----------\n"); } public void test4008712n() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " void foo(String x);\n" + "}\n" + "interface J {\n" + " String foo(String x);\n" + "}\n" + "class Y<T> {\n" + " public T foo(T x) {\n" + " return null;\n" + " }\n" + "}\n" + "public class X<T> extends Y<String> {\n" + " public String foo(String s) { return null; }\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X<String>()::foo);\n" + " }\n" + "}\n", }, "foo(J)"); } public void test4008712o() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " void foo(String x);\n" + "}\n" + "interface J {\n" + " String foo(String x);\n" + "}\n" + "interface K<T> {\n" + " public T foo(T x);\n" + "}\n" + "class Y<T> implements K {\n" + " public Object foo(Object x) {\n" + " return null;\n" + " }\n" + "}\n" + "public class X<T> extends Y<String> {\n" + " public Object foo(Object s) { return null; }\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X<String>()::foo);\n" + " }\n" + "}\n", }, "foo(I)"); } public void test4008712p() { this.runNegativeTest( new String[] { "X.java", "interface I {\n" + " void foo(String x);\n" + "}\n" + "interface J {\n" + " String foo(String x);\n" + "}\n" + "class Y<T> {\n" + " public T foo(T x) {\n" + " return null;\n" + " }\n" + "}\n" + "public class X<T> extends Y<String> {\n" + " public String foo(String s) { return null; }\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X()::foo);\n" + " }\n" + "}\n", }, "----------\n" + "1. ERROR in X.java (at line 21)\n" + " goo(new X()::foo);\n" + " ^^^\n" + "The method goo(I) is ambiguous for the type X<T>\n" + "----------\n" + "2. WARNING in X.java (at line 21)\n" + " goo(new X()::foo);\n" + " ^\n" + "X is a raw type. References to generic type X<T> should be parameterized\n" + "----------\n"); } public void test4008712q() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " void foo(String x);\n" + "}\n" + "interface J {\n" + " String foo(String x);\n" + "}\n" + "class Y<T> {\n" + " public T foo(T x) {\n" + " return null;\n" + " }\n" + "}\n" + "public class X<T> extends Y<String> {\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X()::foo);\n" + " }\n" + "}\n", }, "foo(I)"); } public void test4008712r() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " void foo();\n" + "}\n" + "interface J {\n" + " String foo();\n" + "}\n" + "class Y<T> {\n" + " public T foo(T x) {\n" + " return null;\n" + " }\n" + "}\n" + "public class X<T> extends Y<String> {\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X[0]::clone);\n" + " }\n" + "}\n", }, "foo(I)"); } public void test4008712s() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " void foo();\n" + "}\n" + "interface J {\n" + " String foo();\n" + "}\n" + "class Y<T> {\n" + " public T foo(T x) {\n" + " return null;\n" + " }\n" + "}\n" + "public class X<T> extends Y<String> {\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X[0]::toString);\n" + " }\n" + "}\n", }, "foo(J)"); } public void test4008712t() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " Class foo();\n" + "}\n" + "interface J {\n" + " Object foo();\n" + "}\n" + "class Y<T> {\n" + " public T foo(T x) {\n" + " return null;\n" + " }\n" + "}\n" + "public class X<T> extends Y<String> {\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X[0]::getClass);\n" + " }\n" + "}\n", }, "foo(I)"); } public void test4008712u() { this.runNegativeTest( new String[] { "X.java", "interface I {\n" + " void foo();\n" + "}\n" + "interface J {\n" + " int foo();\n" + "}\n" + "class Y<T> {\n" + " public T foo(T x) {\n" + " return null;\n" + " }\n" + "}\n" + "public class X<T> extends Y<String> {\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(I::clone);\n" + " }\n" + "}\n", }, "----------\n" + "1. ERROR in X.java (at line 20)\n" + " goo(I::clone);\n" + " ^^^\n" + "The method goo(I) in the type X<T> is not applicable for the arguments (I::clone)\n" + "----------\n" + "2. ERROR in X.java (at line 20)\n" + " goo(I::clone);\n" + " ^^^^^^^^\n" + "The type I does not define clone() that is applicable here\n" + "----------\n"); } public void test4008712v() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " void foo();\n" + "}\n" + "interface J {\n" + " int foo();\n" + "}\n" + "class Y<T> {\n" + " public T foo(T x) {\n" + " return null;\n" + " }\n" + "}\n" + "public class X<T> extends Y<String> {\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " I i = () -> {};\n" + " goo(i::hashCode);\n" + " }\n" + "}\n", }, "foo(J)"); } public void test4008712w() { this.runNegativeTest( new String[] { "X.java", "interface I {\n" + " void foo();\n" + "}\n" + "interface J {\n" + " int foo();\n" + "}\n" + "class Y<T> {\n" + " public T foo(T x) {\n" + " return null;\n" + " }\n" + "}\n" + "public class X<T> extends Y<String> {\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " I i = () -> {};\n" + " goo(i::clone);\n" + " }\n" + "}\n", }, "----------\n" + "1. ERROR in X.java (at line 21)\n" + " goo(i::clone);\n" + " ^^^\n" + "The method goo(I) in the type X<T> is not applicable for the arguments (i::clone)\n" + "----------\n" + "2. ERROR in X.java (at line 21)\n" + " goo(i::clone);\n" + " ^^^^^^^^\n" + "The type I does not define clone() that is applicable here\n" + "----------\n"); } public void test4008712x() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " void foo(String x);\n" + "}\n" + "interface J {\n" + " String foo(String x);\n" + "}\n" + "class Y<T> {\n" + " public T foo(T x) {\n" + " return null;\n" + " }\n" + " private void foo() {}\n" + "}\n" + "public class X<T> extends Y<String> {\n" + " public String foo(String s) { return null; }\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X<String>()::foo);\n" + " }\n" + "}\n", }, "foo(J)"); } public void test4008712y() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " void foo();\n" + "}\n" + "interface J {\n" + " int foo();\n" + "}\n" + "public class X {\n" + " public int foo() { return 0; }\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X()::foo);\n" + " }\n" + "}\n", }, "foo(J)"); } public void test4008712z() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " long foo();\n" + "}\n" + "interface J {\n" + " int foo();\n" + "}\n" + "public class X {\n" + " public int foo() { return 0; }\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X()::foo);\n" + " }\n" + "}\n", }, "foo(J)"); } public void test4008712za() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " long foo();\n" + "}\n" + "interface J {\n" + " int foo();\n" + "}\n" + "public class X {\n" + " public long foo() { return 0; }\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X()::foo);\n" + " }\n" + "}\n", }, "foo(I)"); } public void test4008712zb() { this.runNegativeTest( new String[] { "X.java", "interface I {\n" + " void foo();\n" + "}\n" + "interface J {\n" + " void foo();\n" + "}\n" + "public class X {\n" + " public long foo() { return 0; }\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X()::foo);\n" + " }\n" + "}\n", }, "----------\n" + "1. ERROR in X.java (at line 16)\n" + " goo(new X()::foo);\n" + " ^^^\n" + "The method goo(I) is ambiguous for the type X\n" + "----------\n"); } public void test4008712zc() { this.runNegativeTest( new String[] { "X.java", "interface I {\n" + " int foo();\n" + "}\n" + "interface J {\n" + " Integer foo();\n" + "}\n" + "public class X {\n" + " public long foo() { return 0; }\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X()::foo);\n" + " }\n" + "}\n", }, "----------\n" + "1. ERROR in X.java (at line 16)\n" + " goo(new X()::foo);\n" + " ^^^\n" + "The method goo(I) in the type X is not applicable for the arguments (new X()::foo)\n" + "----------\n" + "2. ERROR in X.java (at line 16)\n" + " goo(new X()::foo);\n" + " ^^^^^^^^^^^^\n" + "The type of foo() from the type X is long, this is incompatible with the descriptor\'s return type: int\n" + "----------\n"); } public void test4008712zd() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " int foo();\n" + "}\n" + "interface J {\n" + " Long foo();\n" + "}\n" + "public class X {\n" + " public long foo() { return 0; }\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X()::foo);\n" + " }\n" + "}\n", }, "foo(J)"); } public void test4008712ze() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " int foo();\n" + "}\n" + "interface J {\n" + " Integer foo();\n" + "}\n" + "public class X {\n" + " public int foo() { return 0; }\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X()::foo);\n" + " }\n" + "}\n", }, "foo(I)"); } public void test4008712zf() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " int foo();\n" + "}\n" + "interface J {\n" + " Integer foo();\n" + "}\n" + "public class X {\n" + " public Integer foo() { return 0; }\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X()::foo);\n" + " }\n" + "}\n", }, "foo(J)"); } public void test4008712zg() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " Integer foo();\n" + "}\n" + "interface J {\n" + " Long foo();\n" + "}\n" + "public class X {\n" + " public Integer foo() { return 0; }\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X()::foo);\n" + " }\n" + "}\n", }, "foo(I)"); } public void test4008712zh() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " Integer foo();\n" + "}\n" + "interface J {\n" + " Long foo();\n" + "}\n" + "public class X {\n" + " public Long foo() { return 0L; }\n" + " static void goo(I i) {\n" + " System.out.println(\"foo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"foo(J)\");\n" + " }\n" + " public static void main(String[] args) { \n" + " goo(new X()::foo);\n" + " }\n" + "}\n", }, "foo(J)"); } public void testVarargs() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " void foo();\n" + "}\n" + "public class X {\n" + " static void goo(I ... i) {\n" + " i[0].foo();\n" + " }\n" + " public static void main(String[] args) {\n" + " goo(()->{ System.out.println(\"Lambda\");});\n" + " }\n" + "}\n", }, "Lambda"); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=401850, [1.8][compiler] Compiler fails to type poly allocation expressions in method invocation contexts public void test401850() { this.runConformTest( new String[] { "X.java", "public class X<T> {\n" + " void foo(X<String> s) {\n" + " System.out.println(\"foo(X<String>)\");\n" + " }\n" + " void foo(int x) {\n" + " System.out.println(\"foo(int)\");\n" + " }\n" + " public static void main(String[] args) {\n" + " new X<String>().foo(new X<>());\n" + " }\n" + "}\n", }, "foo(X<String>)"); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=427072, [1.8][compiler] Regression since fix of bug 423505: Method is ambiguous for type X public void test427072() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " Object m(X t);\n" + "}\n" + "interface J extends I {\n" + "}\n" + "public class X {\n" + " int foo() { return 0; }\n" + " int test() {\n" + " return foo(X::foo);\n" + " }\n" + " int foo(I i) {return 0;}\n" + " int foo(J j) { return 1;}\n" + " public static void main(String args[]) {\n" + " X x = new X();\n" + " int i = x.test();\n" + " System.out.println(i);\n" + " }\n" + "}\n", }, "1"); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=427072, [1.8][compiler] Regression since fix of bug 423505: Method is ambiguous for type X public void test427072a() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " Object m(X t);\n" + "}\n" + "interface J extends I {\n" + "}\n" + "public class X {\n" + " int foo() { return 0; }\n" + " int test() {\n" + " return foo((x) -> x);\n" + " }\n" + " int foo(I i) {return 0;}\n" + " int foo(J j) { return 1;}\n" + " public static void main(String args[]) {\n" + " X x = new X();\n" + " int i = x.test();\n" + " System.out.println(i);\n" + " }\n" + "}\n", }, "1"); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=427072, [1.8][compiler] Regression since fix of bug 423505: Method is ambiguous for type X public void test427072b() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " Object m(X t);\n" + "}\n" + "interface J extends I {\n" + "}\n" + "public class X {\n" + " int foo() { return 0; }\n" + " int test() {\n" + " return foo(true ? (x) -> x : X::foo);\n" + " }\n" + " int foo(I i) {return 0;}\n" + " int foo(J j) { return 1;}\n" + " public static void main(String args[]) {\n" + " X x = new X();\n" + " int i = x.test();\n" + " System.out.println(i);\n" + " }\n" + "}\n", }, "1"); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=427072, [1.8][compiler] Regression since fix of bug 423505: Method is ambiguous for type X public void test427072c() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " Object m(X t);\n" + "}\n" + "interface J extends I {\n" + "}\n" + "public class X {\n" + " int foo1() { return 0; }\n" + " int foo2() { return 0; }\n" + " int test() {\n" + " return foo(true ? X::foo1 : X::foo2);\n" + " }\n" + " int foo(I i) {return 0;}\n" + " int foo(J j) { return 1;}\n" + " public static void main(String args[]) {\n" + " X x = new X();\n" + " int i = x.test();\n" + " System.out.println(i);\n" + " }\n" + "}\n", }, "1"); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=427628, regression : The method * is ambiguous for the type * public void test427628() { this.runConformTest( new String[] { "X.java", "public class X {\n" + " public static void main(String [] args) {\n" + " new X().error(null);\n" + " }\n" + " public void error(I i) {\n" + " test(i!=null?i.getJ():null);\n" + " }\n" + " public void test(I i) {\n" + " System.out.println(\"I\");\n" + " }\n" + " public void test(J j) {\n" + " System.out.println(\"J\" + j);\n" + " }\n" + " public class I{\n" + " public J getJ() {\n" + " return null;\n" + " }\n" + " }\n" + " public class J{}\n" + "}\n", }, "Jnull"); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=427628, regression : The method * is ambiguous for the type * public void test427628a() { this.runNegativeTest( new String[] { "X.java", "public class X {\n" + " public static void main(String [] args) {\n" + " new X().error(null);\n" + " }\n" + " public void error(I i) {\n" + " test(i!=null?i.getJ():null);\n" + " }\n" + " public void test(I i) {\n" + " System.out.println(\"I\");\n" + " }\n" + " public void test(K k) {\n" + " System.out.println(\"K\" + j);\n" + " }\n" + " public class I{\n" + " public J getJ() {\n" + " return null;\n" + " }\n" + " }\n" + " public class J{}\n" + " public class K{}\n" + "}\n", }, "----------\n" + "1. ERROR in X.java (at line 6)\n" + " test(i!=null?i.getJ():null);\n" + " ^^^^\n" + "The method test(X.I) in the type X is not applicable for the arguments (((i != null) ? i.getJ() : null))\n" + "----------\n" + "2. ERROR in X.java (at line 6)\n" + " test(i!=null?i.getJ():null);\n" + " ^^^^^^^^\n" + "Type mismatch: cannot convert from X.J to X.I\n" + "----------\n" + "3. ERROR in X.java (at line 12)\n" + " System.out.println(\"K\" + j);\n" + " ^\n" + "j cannot be resolved to a variable\n" + "----------\n"); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=427628, regression : The method * is ambiguous for the type * public void test427628b() { this.runNegativeTest( new String[] { "X.java", "public class X {\n" + " public void setSetting(String key, String value) {\n" + " }\n" + " public void setSetting(String key, Integer value) {\n" + " setSetting(key, value == null ? null : Integer.toString(value));\n" + " }\n" + "}\n", }, ""); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=421922, [1.8][compiler] Varargs & Overload - Align to JLS8 public void _test421922() { this.runConformTest( new String[] { "X.java", "import java.util.Arrays;\n" + "public class X {\n" + " public static void main(String[] args) {\n" + " test(1);\n" + " }\n" + " public static void test(int... a) {\n" + " System.out.print(\"int ... = \");\n" + " System.out.println(Arrays.toString(a));\n" + " }\n" + " public static <T> void test(Object... a) {\n" + " System.out.print(\"Object ... = \");\n" + " System.out.println(Arrays.toString(a));\n" + " }\n" + "}\n", }, "int ... = [1]"); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=427748, [1.8][compiler] Cannot convert from Boolean to boolean on generic return type public void test427748() { this.runConformTest( new String[] { "X.java", "public class X {\n" + " public static void main(String [] args) {\n" + " getLog(doit(baction));\n" + " }\n" + " private static interface Action<T> {T run();}\n" + " private static Action<Boolean> baction = () -> true;\n" + " static void getLog(int override) {}\n" + " static void getLog(boolean override) {\n" + " System.out.println(\"OK\");\n" + " }\n" + " private static <T> T doit(Action<T> action) { return action.run(); }\n" + "}\n", }, "OK"); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=427808, [1.8] Correct super() invocation is not inferred when argument is a conditional expression public void test427808() { this.runConformTest( new String[] { "X.java", "public class X extends Foo {\n" + " public X(I i) {\n" + " super(i != null ? i.toString() : null);\n" + " }\n" + " public static void main(String [] args) {\n" + " new X(null);\n" + " }\n" + "}\n" + "class Foo implements I {\n" + " Foo(I i) {}\n" + " Foo(String string){ System.out.println(\"OK\"); }\n" + "}\n" + "interface I {}\n", }, "OK"); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=429985, [1.8][compiler] Resolution of right method signature public void test429985() { this.runConformTest( new String[] { "X.java", "import java.util.function.Supplier;\n" + "public class X {\n" + " public static void main(String[] args) {\n" + " // This does not compile with ECJ\n" + " test(() -> \"hi\");\n" + " }\n" + " // Note: when removing this code the main function compiles with ECJ\n" + " static void test(String message) {\n" + " }\n" + " static void test(Supplier<String> messageSupplier) {\n" + " System.out.println(messageSupplier.get());\n" + " }\n" + "}\n", }, "hi"); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=429985, [1.8][compiler] Resolution of right method signature public void test429985a() { this.runConformTest( new String[] { "X.java", "import java.util.function.Supplier;\n" + "public class X {\n" + " public static void main(String[] args) {\n" + " // This does not compile with ECJ\n" + " test(() -> \"hi\");\n" + " }\n" + " static void test(Supplier<String> messageSupplier) {\n" + " System.out.println(messageSupplier.get());\n" + " }\n" + " // Note: when removing this code the main function compiles with ECJ\n" + " static void test(String message) {\n" + " }\n" + "}\n", }, "hi"); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=448801, [1.8][compiler] Scope.mSMB & 15.12.3 Compile-Time Step 3 public void test448801() { this.runNegativeTest( new String[] { "X.java", "public class X {\n" + " private class Y {\n" + " }\n" + " public X(Y ...ys) {\n" + " }\n" + " public void foo(Y ...ys) {\n" + " }\n" + " public void goo() {\n" + " }\n" + "}\n", "Z.java", "interface I {\n" + " static void ifoo() {\n" + " }\n" + "}\n" + "abstract class ZSuper {\n" + " void zSuperFoo() {\n" + " }\n" + " abstract void goo();\n" + "}\n" + "public class Z extends ZSuper implements I {\n" + " void goo() {\n" + " super.zSuperFoo();\n" + " super.goo();\n" + " }\n" + " public static void main(String[] args) {\n" + " X x = new X();\n" + " x.foo();\n" + " System.out.println(x.goo());\n" + " goo();\n" + " Z.goo();\n" + " zoo();\n" + " new Z().ifoo();\n" + " super.zSuperFoo();\n" + " }\n" + " class ZZ {\n" + " class ZZZ {\n" + " void zoo() {\n" + " }\n" + " }\n" + " }\n" + "}\n" }, "----------\n" + "1. ERROR in Z.java (at line 13)\n" + " super.goo();\n" + " ^^^^^^^^^^^\n" + "Cannot directly invoke the abstract method goo() for the type ZSuper\n" + "----------\n" + "2. ERROR in Z.java (at line 16)\n" + " X x = new X();\n" + " ^^^^^^^\n" + "The constructor X(X.Y...) of type X is not applicable as the formal varargs element type X.Y is not accessible here\n" + "----------\n" + "3. ERROR in Z.java (at line 17)\n" + " x.foo();\n" + " ^^^\n" + "The method foo(X.Y...) of type X is not applicable as the formal varargs element type X.Y is not accessible here\n" + "----------\n" + "4. ERROR in Z.java (at line 18)\n" + " System.out.println(x.goo());\n" + " ^^^^^^^\n" + "The method println(boolean) in the type PrintStream is not applicable for the arguments (void)\n" + "----------\n" + "5. ERROR in Z.java (at line 19)\n" + " goo();\n" + " ^^^\n" + "Cannot make a static reference to the non-static method goo() from the type Z\n" + "----------\n" + "6. ERROR in Z.java (at line 20)\n" + " Z.goo();\n" + " ^^^^^^^\n" + "Cannot make a static reference to the non-static method goo() from the type Z\n" + "----------\n" + "7. ERROR in Z.java (at line 21)\n" + " zoo();\n" + " ^^^\n" + "The method zoo() is undefined for the type Z\n" + "----------\n" + "8. ERROR in Z.java (at line 22)\n" + " new Z().ifoo();\n" + " ^^^^\n" + "The method ifoo() is undefined for the type Z\n" + "----------\n" + "9. ERROR in Z.java (at line 23)\n" + " super.zSuperFoo();\n" + " ^^^^^\n" + "Cannot use super in a static context\n" + "----------\n"); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=450415, [1.8][compiler] Failure to resolve overloaded call. public void test450415() { this.runConformTest( new String[] { "X.java", "import java.util.List;\n" + "interface I {\n" + " String foo();\n" + "}\n" + "interface J {\n" + " List<String> foo();\n" + "}\n" + "public class X {\n" + " static void goo(I i) {\n" + " System.out.println(\"goo(I)\");\n" + " }\n" + " static void goo(J j) {\n" + " System.out.println(\"goo(J)\");\n" + " }\n" + " static <T> List<T> loo() {\n" + " return null;\n" + " }\n" + " public static void main(String[] args) {\n" + " goo(()->loo());\n" + " }\n" + "}\n" }, "goo(J)"); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=450415, [1.8][compiler] Failure to resolve overloaded call. public void test450415a() { this.runConformTest( new String[] { "X.java", "interface I {\n" + " void foo();\n" + "}\n" + "public class X {\n" + " static <T> void foo() {\n" + " class Y {\n" + " void goo(T t) {\n" + " System.out.println(\"T\");\n" + " }\n" + " void goo(I i) {\n" + " System.out.println(\"I\");\n" + " }\n" + " }\n" + " new Y().goo(()->{});\n" + " }\n" + " public static void main(String[] args) {\n" + " foo();\n" + " }\n" + "}\n" }, "I"); } public void test482440a() { runNegativeTest( new String[] { "Test.java", "class Test {\n" + "\n" + " // generic method\n" + " interface ConsumerA {\n" + " <T> void accept(int i);\n" + " }\n" + "\n" + " // non-generic\n" + " interface ConsumerB {\n" + " void accept(int i);\n" + " }\n" + "\n" + " // A before B\n" + " void execute1(ConsumerA c) {}\n" + " void execute1(ConsumerB c) {}\n" + "\n" + " // B before A\n" + " void execute2(ConsumerB c) {}\n" + " void execute2(ConsumerA c) {}\n" + "\n" + " void test() {\n" + " execute1(x -> {}); // compiles in Eclipse\n" + " execute2(x -> {}); // doesn't compile\n" + " }\n" + "\n" + "}\n" }, "----------\n" + "1. ERROR in Test.java (at line 22)\n" + " execute1(x -> {}); // compiles in Eclipse\n" + " ^^^^^^^^\n" + "The method execute1(Test.ConsumerA) is ambiguous for the type Test\n" + "----------\n" + "2. ERROR in Test.java (at line 23)\n" + " execute2(x -> {}); // doesn\'t compile\n" + " ^^^^^^^^\n" + "The method execute2(Test.ConsumerB) is ambiguous for the type Test\n" + "----------\n"); } public void test482440b() { runConformTest( new String[] { "Test.java", "class Test {\n" + "\n" + " // generic method\n" + " interface ConsumerA {\n" + " <T> void accept(int i);\n" + " }\n" + "\n" + " // non-generic\n" + " interface ConsumerB {\n" + " void accept(int i);\n" + " }\n" + "\n" + " // A before B\n" + " void execute1(ConsumerA c) {}\n" + " void execute1(ConsumerB c) {}\n" + "\n" + " // B before A\n" + " void execute2(ConsumerB c) {}\n" + " void execute2(ConsumerA c) {}\n" + "\n" + " void test() {\n" + " execute1((int x) -> {}); // compiles in Eclipse\n" + " execute2((int x) -> {}); // doesn't compile\n" + " }\n" + "\n" + "}\n" }); } }