blob: 9a72c7305827d5eeae6cb0eb895de175ca7f45d4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2018 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Stephan Herrmann - Contribution for
* Bug 388800 - [1.8] adjust tests to 1.8 JRE
* Keigo Imai - Contribution for bug 388903 - Cannot extend inner class as an anonymous class when it extends the outer class
*******************************************************************************/
package org.eclipse.jdt.core.tests.compiler.regression;
import java.io.File;
import java.util.Map;
import junit.framework.Test;
import org.eclipse.jdt.core.Flags;
import org.eclipse.jdt.core.ToolFactory;
import org.eclipse.jdt.core.tests.util.Util;
import org.eclipse.jdt.core.util.ClassFileBytesDisassembler;
import org.eclipse.jdt.core.util.IClassFileReader;
import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
@SuppressWarnings({ "unchecked", "rawtypes" })
public class InnerEmulationTest extends AbstractRegressionTest {
static {
// TESTS_NAMES = new String[] { "Bug58069" };
// TESTS_NUMBERS = new int[] { 173, 174 };
// TESTS_RANGE = new int[] { 144, -1 };
}
public InnerEmulationTest(String name) {
super(name);
}
@Override
protected Map getCompilerOptions() {
Map options = super.getCompilerOptions();
options.put(CompilerOptions.OPTION_ReportRawTypeReference, CompilerOptions.IGNORE);
options.put(CompilerOptions.OPTION_ReportUnusedLocal, CompilerOptions.IGNORE);
options.put(CompilerOptions.OPTION_ReportUnusedParameter, CompilerOptions.IGNORE);
options.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.IGNORE);
return options;
}
public static Test suite() {
return buildAllCompliancesTestSuite(testClass());
}
/**
* Protected access emulation : should be performed onto implicit field and method accesses
*/
public void test001() {
this.runConformTest(
new String[] {
/* p1.A */
"p1/A.java",
"package p1; \n"+
"import p2.*; \n"+
"public class A { \n"+
" protected int value = 0; \n"+
" protected A delegatee; \n"+
" public A(A del, int val) { \n"+
" this.delegatee = del; \n"+
" this.value = val; \n"+
" } \n"+
" protected void foo() { \n"+
" value += 3; \n"+
" } \n"+
" public static void main(String[] argv){ \n"+
" int result = new B( \n"+
" new B(null, 10), 20) \n"+
" .value; \n"+
" int expected = 30; \n"+
" System.out.println( \n"+
" result == expected \n"+
" ? \"SUCCESS\" \n"+
" : \"FAILED : got \"+result+\" instead of \"+ expected); \n"+
" } \n"+
"} \n",
/* p2.B */
"p2/B.java",
"package p2; \n"+
"import p1.*; \n"+
"public class B extends A { \n"+
" public B(B del, int val){ \n"+
" super(del, val); \n"+
" Runnable r = new Runnable () { \n"+
" public void run() { \n"+
" foo(); \n"+
" if (delegatee != null) \n"+
" value += 7; \n"+
" } \n"+
" }; \n"+
" r.run(); \n"+
" } \n"+
"} \n"
},
"SUCCESS"
);
}
/**
* 1FN4S4Z: The compiler doesn't detect a illegal constructor invocation which leads to a VerifyError
*/
public void test002() {
this.runNegativeTest(
new String[] {
/* A.java */
"A.java",
"class B { \n"+
"} \n"+
"public class A { \n"+
" B b; \n"+
" class C extends B { \n"+
" public C() { \n"+
" } \n"+
" } \n"+
" public A() { \n"+
" this(new C()); \n"+
" } \n"+
" public A(C c) { \n"+
" this.b = c; \n"+
" } \n"+
" public static void main(String[] args) { \n"+
" A a = new A(); \n"+
" System.out.println(a); \n"+
" } \n"+
"} \n"
},
"----------\n" +
"1. ERROR in A.java (at line 10)\n" +
" this(new C()); \n" +
" ^^^^^^^\n" +
"No enclosing instance of type A is available due to some intermediate constructor invocation\n" +
"----------\n"
);
}
/**
* 1FZ2G7R: use of non static inner class in constuctor
*/
public void test003() {
String errMessage = isMinimumCompliant(ClassFileConstants.JDK11) ?
"----------\n" +
"1. ERROR in A.java (at line 8)\n" +
" super(getRunnable(), new B().toString()); \n" +
" ^^^^^^^\n" +
"No enclosing instance of type A is available due to some intermediate constructor invocation\n" +
"----------\n"
:
"----------\n" +
"1. WARNING in A.java (at line 8)\n" +
" super(getRunnable(), new B().toString()); \n" +
" ^^^^^^^\n" +
"Access to enclosing constructor A.B() is emulated by a synthetic accessor method\n" +
"----------\n" +
"2. ERROR in A.java (at line 8)\n" +
" super(getRunnable(), new B().toString()); \n" +
" ^^^^^^^\n" +
"No enclosing instance of type A is available due to some intermediate constructor invocation\n" +
"----------\n";
this.runNegativeTest(
new String[] {
/* A.java */
"A.java",
"public class A extends Thread { \n" +
" private class B { \n" +
" } \n" +
" private static Runnable getRunnable() { \n" +
" return null; \n" +
" } \n" +
" public A() { \n" +
" super(getRunnable(), new B().toString()); \n" +
" } \n" +
"} \n"
},
errMessage);
}
/**
* 1F995V9: Walkback in innerclass emulation when mixing source and binaries
*/
public void test004() {
/* first compile A3.java */
this.runConformTest(
new String[] {
/* A3.java */
"A3.java",
"class A3 { \n"+
" class B {} \n"+
"} \n"
}); // no specific success output string
/* then compile with previous input */
this.runConformTest(
new String[] {
/* A4.java */
"A4.java",
"class A4 { \n"+
" void foo(){ \n"+
" new A3().new B(){}; \n"+
" } \n"+
"} \n"
},
null, // no specific success output string
null, // use default class-path
false,
null); // do not flush previous output dir content
}
/**
* 1FK9ALJ: Cannot invoke private super constructor ...
*/
public void test005() {
this.runConformTest(
new String[] {
/* X.java */
"X.java",
"public class X { \n"+
" private X(){} \n"+
" class Y extends X { \n"+
" } \n"+
" public static void main(String[] argv){ \n"+
" new X().new Y(); \n"+
" System.out.println(\"SUCCESS\"); \n"+
" } \n"+
"} \n"
},
"SUCCESS"
);
}
/**
* 1FKLXDL: Verification error due to incorrect private access emulation
*/
public void test006() {
this.runConformTest(
new String[] {
/* X.java */
"X.java",
"public class X { \n"+
" public static void main(String[] argv){ \n"+
" new B(); \n"+
" System.out.println(\"SUCCESS\"); \n"+
" } \n"+
" private static void foo(int i, int j) { \n"+
" System.out.println(\"private foo\"); \n"+
" } \n"+
" static class B { \n"+
" { \n"+
" foo(1, 2); \n"+
" } \n"+
" } \n"+
"} \n"
},
"private foo\n" +
"SUCCESS"
);
}
/**
* 1PQCT5T: Missing emulation for access to sibling local types
*/
public void test007() {
this.runConformTest(
new String[] {
/* Y.java */
"Y.java",
"public class Y { \n" +
" public static void main(String[] argv){ \n" +
" if (new Y().bar() == 3) \n" +
" System.out.println(\"SUCCESS\"); \n" +
" else \n" +
" System.out.println(\"FAILED\"); \n" +
" } \n" +
" int bar() { \n" +
" final int i = \"xxx\".length(); \n" +
" class X { \n" +
" class AX { \n" +
" int foo() { \n" +
" return new BX().foo(); \n" +
" } \n" +
" } \n" +
" class BX { \n" +
" int foo() { \n" +
" return new CX().foo(); \n" +
" } \n" +
" } \n" +
" class CX { \n" +
" int foo() { \n" +
" return i; \n" +
" } \n" +
" } \n" +
" } \n" +
" return new X().new AX().foo(); \n" +
" } \n"+
"} \n"
},
"SUCCESS"
);
}
/**
* 1PQCT5T: Missing emulation for access to sibling local types
*/
public void test008() {
this.runConformTest(
new String[] {
/* Y2.java */
"Y2.java",
"public class Y2 { \n" +
" public static void main(String[] argv){ \n" +
" if (new Y2().foo(45) == 45) \n" +
" System.out.println(\"SUCCESS\"); \n" +
" else \n" +
" System.out.println(\"FAILED\"); \n" +
" } \n" +
" int foo(final int i){ \n"+
" class B { \n"+
" int foo(){ \n"+
" return new C().foo(); \n"+
" } \n"+
" class C { \n"+
" int foo(){ return i; } \n"+
" } \n"+
" }; \n"+
" return new B().foo(); \n"+
" } \n"+
"} \n"
},
"SUCCESS"
);
}
/**
* 1PQCT5T: Missing emulation for access to sibling local types
*/
public void test009() {
this.runConformTest(
new String[] {
/* Y3.java */
"Y3.java",
"public class Y3 { \n" +
" public static void main(String[] argv){ \n" +
" if (new Y3().bar() == 8) \n" +
" System.out.println(\"SUCCESS\"); \n" +
" else \n" +
" System.out.println(\"FAILED\"); \n" +
" } \n" +
" int bar() { \n" +
" final int i = \"xxx\".length(); \n" +
" final String s = this.toString(); \n" +
" class X { \n" +
" class AX { \n" +
" int foo() { \n" +
" return i + new CX().foo(); \n" +
" } \n" +
" } \n" +
" class BX { \n" +
" int foo() { \n" +
" return new AX().foo(); \n" +
" } \n" +
" } \n" +
" class CX { \n" +
" int foo() { \n" +
" return 5; \n" +
" } \n" +
" } \n" +
" } \n" +
" return new X().new AX().foo(); \n" +
" } \n" +
"} \n"
},
"SUCCESS"
);
}
/**
* 1PQCT5T: Missing emulation for access to sibling local types
*/
public void test010() {
this.runConformTest(
new String[] {
/* Y4.java */
"Y4.java",
"public class Y4 { \n" +
" public static void main(String[] argv){ \n" +
" if (new Y4().bar() == 3) \n" +
" System.out.println(\"SUCCESS\"); \n" +
" else \n" +
" System.out.println(\"FAILED\"); \n" +
" } \n" +
" int bar() { \n" +
" final int i = \"xxx\".length(); \n" +
" final String s = this.toString(); \n" +
" class X { \n" +
" class AX { \n" +
" int bar() { \n" +
" class BX { \n" +
" int foo() { \n" +
" return new AX().foo(); \n" +
" } \n" +
" } \n" +
" return new BX().foo(); \n" +
" } \n" +
" int foo() { \n" +
" return i; \n" +
" } \n" +
" } \n" +
" } \n" +
" return new X().new AX().bar(); \n" +
" } \n" +
"} \n"
},
"SUCCESS"
);
}
/**
* 1PQCT5T: Missing emulation for access to sibling local types
*/
public void test011() {
this.runConformTest(
new String[] {
/* Y5.java */
"Y5.java",
"public class Y5 { \n" +
" public static void main(String[] argv){ \n" +
" if (new Y5().bar(5) == 5) \n" +
" System.out.println(\"SUCCESS\"); \n" +
" else \n" +
" System.out.println(\"FAILED\"); \n" +
" } \n" +
" int bar(final int i) { \n" +
" class X { \n" +
" int bar() { \n" +
" return new Object(){ \n" +
" int foo(){ \n" +
" return i; \n" +
" } \n" +
" }.foo(); \n" +
" } \n" +
" } \n" +
" return new X().bar(); \n" +
" } \n" +
"} \n"
},
"SUCCESS"
);
}
/**
* 1F3AH7N: GPF on innerclass emulation for double anonymous type
*/
public void test012() {
this.runConformTest(
new String[] {
/* A.java */
"A.java",
"public class A { \n" +
" public static void main(String[] argv){ \n" +
" if (new A().foo() == 5) \n" +
" System.out.println(\"SUCCESS\"); \n" +
" else \n" +
" System.out.println(\"FAILED\"); \n" +
" } \n" +
" int foo() { \n" +
" return new A() { \n" +
" int foo() { \n" +
" final int i = \"hello\".length(); \n" +
" return new A() { \n" +
" int foo() { \n" +
" return i; \n" +
" } \n" +
" } \n" +
" .foo(); \n" +
" } \n" +
" } \n" +
" .foo(); \n" +
" } \n" +
"} \n"
},
"SUCCESS"
);
}
/**
* 1F26XE2: Bug in inner class emulation
*/
public void test013() {
this.runConformTest(
new String[] {
/* Inner.java */
"Inner.java",
"public class Inner { \n" +
" public static void main(String[] argv){ \n" +
" new B().new C(\"hello\"); \n" +
" System.out.println(\"SUCCESS\"); \n" +
" } \n" +
" class A { \n"+
" public A(String s){ this.s=s; } \n"+
" String s; \n"+
" } \n"+
"} \n"+
"class B { \n"+
" class C extends Inner.A { \n"+
" public C(String s){ B.this.inner.super(s); } \n"+
" } \n"+
" Inner inner=new Inner(); \n"+
"} \n"
},
"SUCCESS"
);
}
/**
* 1EX5I8Z: Inner class emulation bug
*/
public void test014() {
this.runConformTest(
new String[] {
/* Z1.java */
"Z1.java",
"public class Z1 { \n" +
" public static void main(String[] argv){ \n" +
" new Z1().new W(); \n" +
" System.out.println(\"SUCCESS\"); \n" +
" } \n" +
" class W extends Y { \n" +
" W() { \n" +
" super(new Object(), foo()); \n" +
" } \n" +
" } \n" +
" String foo() { \n" +
" return \"\"; \n" +
" } \n" +
"} \n" +
"class Y { \n" +
" Y(Object o, String s) { \n" +
" } \n" +
"} \n"
},
"SUCCESS"
);
}
/**
* 1EUC39Y: Incorrect Synthetic Emulation
*/
public void test015() {
this.runConformTest(
new String[] {
/* AAA.java */
"AAA.java",
"public class AAA { \n"+
" public static void main(String argv[]){ \n"+
" if (new AAA().foo(5) == 15); \n"+
" System.out.println(\"SUCCESS\"); \n" +
" } \n"+
" int foo(final int loc){ \n"+
" class I { \n"+
" int i = loc; \n"+
" { \n"+
" System.out.println(\"loc=\"+ loc ); \n"+
" } \n"+
" int foo(){ \n"+
" System.out.println(\"I:i=\"+ i ); \n"+
" return i;} \n"+
" } \n"+
" class J extends I { \n"+
" I obj = new I(){ \n"+
" int foo() { \n"+
" System.out.println(\"J\"); \n"+
" return super.foo() + 10; }}; \n"+
" } \n"+
" return new J().obj.foo(); \n"+
" } \n"+
" } \n"
},
"loc=5\n" +
"loc=5\n" +
"J\n" +
"I:i=5\n" +
"SUCCESS"
);
}
/**
* 1EUC39Y: Incorrect Synthetic Emulation
*/
public void test016() {
this.runConformTest(
new String[] {
/* AAA.java */
"AAA.java",
"public class AAA { \n"+
" public static void main(String argv[]){ \n"+
" if (new AAA().foo(5) == 15); \n"+
" System.out.println(\"SUCCESS\"); \n" +
" } \n"+
" class B{} \n"+
" int foo(final int loc){ \n"+
" class I extends B { \n"+
" int i = loc; \n"+
" { \n"+
" System.out.println(\"loc=\"+ loc ); \n"+
" } \n"+
" int foo(){ \n"+
" System.out.println(\"I:i=\"+ i ); \n"+
" return i;} \n"+
" } \n"+
" class J extends I { \n"+
" I obj = new I(){ \n"+
" int foo() { \n"+
" System.out.println(\"J\"); \n"+
" return super.foo() + 10; }}; \n"+
" } \n"+
" return new J().obj.foo(); \n"+
" } \n"+
" } \n"
},
"loc=5\n" +
"loc=5\n" +
"J\n" +
"I:i=5\n" +
"SUCCESS"
);
}
/**
* Complex multi-threaded test involving inner classes
*/
public void test017() {
this.runConformTest(
new String[] {
/* MultiComplex.java */
"MultiComplex.java",
"public class MultiComplex {\n" +
" // should just be an interface, once supported...\n" +
" abstract class AbstractTask implements Runnable {\n" +
" public void run() {\n" +
" MultiComplex.this.notifyCompletion(this,0); \n" +
" }\n" +
" abstract public String taskName(); \n" +
" }\n" +
" public static void main(String argv[]){\n" +
" try {\n" +
" new MultiComplex().performTasks(3);\n" +
" }\n" +
" catch(InterruptedException e){};\n" +
" } \n" +
" void notifyCompleted(AbstractTask task) {\n" +
" }\n" +
" void notifyCompletion(AbstractTask task, int percentage) {\n" +
" }\n" +
" void notifyExecutionEnd() {\n" +
" System.out.println(\"EXECUTION FINISHED\");\n" +
" }\n" +
" void notifyExecutionStart() {\n" +
" System.out.println(\"EXECUTION STARTING\");\n" +
" }\n" +
" void performTasks(final int maxTasks) throws InterruptedException {\n" +
" Thread workers[] = new Thread[maxTasks];\n" +
" AbstractTask tasks[] = new AbstractTask[maxTasks];\n" +
" final int maxIteration = 5;\n" +
" \n" +
" // Local Task \n" +
" class Task extends AbstractTask { \n" +
" String taskName; \n" +
" Task(String aName) {\n" +
" taskName = aName;\n" +
" }\n" +
" public String taskName() { \n" +
" return taskName; \n" +
" }\n" +
" \n" +
" public void run() {\n" +
" super.run();\n" +
" for(int j = 0; j < maxIteration; j++)\n" +
" MultiComplex.this.notifyCompletion(this, (int)((float) (j + 1) / maxIteration * 100));\n" +
" }\n" +
" };\n" +
" notifyExecutionStart();\n" +
" \n" +
" // Creating and launching the tasks\n" +
" for (int ii = 0; ii < maxTasks; ii++) {\n" +
" final int i = ii;\n" +
" tasks[i] = new Task(String.valueOf(i + 1)) { \n" +
" public String taskName() { \n" +
" return super.taskName() + \" of \" + maxTasks; }\n" +
" public void run() {\n" +
" super.run();\n" +
" MultiComplex.this.notifyCompleted(this);\n" +
" } \n" +
" };\n" +
" workers[i] = new Thread(tasks[i],tasks[i].taskName());\n" +
" workers[i].start();\n" +
" }\n" +
" // Waiting for *all* tasks to be ended\n" +
" for (int i = 0; i < tasks.length; i++)\n" +
" workers[i].join();\n" +
" notifyExecutionEnd();\n" +
" }\n" +
"}\n"
},
"EXECUTION STARTING\n" +
"EXECUTION FINISHED"
);
}
/**
* Complex multi-threaded test involving inner classes
*/
public void test018() {
this.runConformTest(
new String[] {
/* MultiAnonymous.java */
"MultiAnonymous.java",
"public class MultiAnonymous {\n" +
" public static void main(String argv[]){\n" +
" try {\n" +
" new MultiAnonymous().performTasks(3);\n" +
" }\n" +
" catch(InterruptedException e){};\n" +
" }\n" +
" void notifyExecutionEnd() {\n" +
" System.out.println(\"EXECUTION FINISHED\");\n" +
" }\n" +
" void notifyExecutionStart() {\n" +
" System.out.println(\"EXECUTION STARTING\");\n" +
" }\n" +
" void performTasks(final int maxTasks) throws java.lang.InterruptedException {\n" +
" Thread workers[] = new Thread[maxTasks];\n" +
" Runnable tasks[] = new Runnable[maxTasks];\n" +
" final int maxIteration = 5;\n" +
" notifyExecutionStart();\n" +
" \n" +
" // Creating and launching the tasks\n" +
" for (int ii = 0; ii < maxTasks; ii++) {\n" +
" final int i = ii;\n" +
" tasks[i] = new Runnable() { \n" +
" public String toString() { return ((i + 1) + \" of \" + maxTasks); }\n" +
" public void run() {\n" +
" for(int j = 0; j < maxIteration; j++)\n" +
" notifyCompletion( (int)((float) (j + 1) / maxIteration * 100));\n" +
" } \n" +
" \n" +
" void notifyCompletion(int percentage) {\n" +
" }\n" +
" };\n" +
" workers[i] = new Thread(tasks[i],\"Running task(\"+(tasks[i].toString())+\")\");\n" +
" workers[i].start();\n" +
" }\n" +
" // Waiting for *all* tasks to be ended\n" +
" for (int i = 0; i < tasks.length; i++)\n" +
" workers[i].join();\n" +
" notifyExecutionEnd();\n" +
" }\n" +
"}\n"
},
"EXECUTION STARTING\n" +
"EXECUTION FINISHED"
);
}
/**
* Complex multi-threaded test involving inner classes
*/
public void test019() {
this.runConformTest(
new String[] {
/* MultiComplex2.java */
"MultiComplex2.java",
"public class MultiComplex2 {\n" +
" public interface AbstractTask extends Runnable {\n" +
" public void run();\n" +
" public String taskName(); \n" +
" }\n" +
" \n" +
" public static void main(String argv[]){\n" +
" try {\n" +
" new MultiComplex2().performTasks(3);\n" +
" }\n" +
" catch(InterruptedException e){};\n" +
" }\n" +
" void notifyCompleted(AbstractTask task) {\n" +
" }\n" +
" void notifyCompletion(AbstractTask task, int percentage) {\n" +
" }\n" +
" void notifyExecutionEnd() {\n" +
" System.out.println(\"EXECUTION FINISHED\");\n" +
" }\n" +
" void notifyExecutionStart() {\n" +
" System.out.println(\"EXECUTION STARTING\");\n" +
" }\n" +
" void performTasks(final int maxTasks) throws java.lang.InterruptedException {\n" +
" Thread workers[] = new Thread[maxTasks];\n" +
" AbstractTask tasks[] = new AbstractTask[maxTasks];\n" +
" final int maxIteration = 5;\n" +
" // Local Task\n" +
" class Task implements AbstractTask {\n" +
" String taskName;\n" +
" Task(String aName) {\n" +
" taskName = aName;\n" +
" }\n" +
" public String taskName() { \n" +
" return taskName; \n" +
" }\n" +
" \n" +
" public void run() {\n" +
" MultiComplex2.this.notifyCompletion(this,0); \n" +
" for(int j = 0; j < maxIteration; j++)\n" +
" MultiComplex2.this.notifyCompletion(this, (int)((float) (j + 1) / maxIteration * 100));\n" +
" }\n" +
" };\n" +
" notifyExecutionStart();\n" +
" \n" +
" // Creating and launching the tasks\n" +
" for (int ii = 0; ii < maxTasks; ii++) {\n" +
" final int i = ii;\n" +
" tasks[i] = new Task(String.valueOf(i + 1)) { \n" +
" public String taskName() { \n" +
" return super.taskName() + \" of \" + maxTasks; }\n" +
" public void run() {\n" +
" super.run();\n" +
" MultiComplex2.this.notifyCompleted(this);\n" +
" } \n" +
" };\n" +
" workers[i] = new Thread(tasks[i],tasks[i].taskName());\n" +
" workers[i].start();\n" +
" }\n" +
" // Waiting for *all* tasks to be ended\n" +
" for (int i = 0; i < tasks.length; i++)\n" +
" workers[i].join();\n" +
" notifyExecutionEnd();\n" +
" }\n" +
"}\n"
},
"EXECUTION STARTING\n" +
"EXECUTION FINISHED"
);
}
/**
* Complex multi-threaded test involving inner classes
*/
public void test020() {
this.runConformTest(
new String[] {
/* MultiLocal.java */
"MultiLocal.java",
"public class MultiLocal {\n" +
" public static void main(String argv[]){\n" +
" class Task implements Runnable {\n" +
" private String taskName;\n" +
" private int maxIteration; \n" +
" public Task(String name, int value) {\n" +
" taskName = name; \n" +
" maxIteration = value;\n" +
" }\n" +
" \n" +
" public String toString() { return taskName; }\n" +
" public void run() {\n" +
" for(int i = 0; i < maxIteration; i++)\n" +
" notifyCompletion( (int)((float) (i + 1) / maxIteration * 100));\n" +
" } \n" +
" \n" +
" void notifyCompletion(int percentage) {\n" +
" }\n" +
" };\n" +
" MultiLocal multi = new MultiLocal();\n" +
" int maxTasks = 3;\n" +
" Task tasks[] = new Task[maxTasks];\n" +
" for (int i = 0; i < maxTasks; i++) \n" +
" tasks[i] = new Task(String.valueOf(i),5);\n" +
" try {\n" +
" multi.performTasks(tasks);\n" +
" }\n" +
" catch(InterruptedException e){};\n" +
" }\n" +
" void notifyExecutionEnd() {\n" +
" System.out.println(\"EXECUTION FINISHED\");\n" +
" }\n" +
" void notifyExecutionStart() {\n" +
" System.out.println(\"EXECUTION STARTING\");\n" +
" }\n" +
" void performTasks(Runnable tasks[]) throws java.lang.InterruptedException {\n" +
" Thread workers[] = new Thread[tasks.length];\n" +
" notifyExecutionStart();\n" +
" \n" +
" // Launching the tasks\n" +
" for (int i = 0; i < tasks.length; i++) {\n" +
" workers[i] = new Thread(tasks[i],\"Running task(\"+(tasks[i].toString())+\")\");\n" +
" workers[i].start();\n" +
" }\n" +
" // Waiting for *all* tasks to be ended\n" +
" for (int i = 0; i < tasks.length; i++)\n" +
" workers[i].join();\n" +
" notifyExecutionEnd();\n" +
" }\n" +
"}\n"
},
"EXECUTION STARTING\n" +
"EXECUTION FINISHED"
);
}
/**
* Complex multi-threaded test involving inner classes
*/
public void test021() {
this.runConformTest(
new String[] {
/* MultiLocal2.java */
"MultiLocal2.java",
"public class MultiLocal2 {\n" +
" public static void main(String argv[]){\n" +
" final int maxTasks = 3;\n" +
" class Task implements Runnable {\n" +
" private String taskName;\n" +
" private int maxIteration;\n" +
" public Task(String name, int value) {\n" +
" taskName = name; \n" +
" maxIteration = value;\n" +
" }\n" +
" \n" +
" public String toString() { return taskName + \" of \" + String.valueOf(maxTasks); }\n" +
" public void run() {\n" +
" for(int i = 0; i < maxIteration; i++)\n" +
" notifyCompletion( (int)((float) (i + 1) / maxIteration * 100));\n" +
" } \n" +
" \n" +
" void notifyCompletion(int percentage) {\n" +
" }\n" +
" };\n" +
" MultiLocal2 multi = new MultiLocal2();\n" +
" Task tasks[] = new Task[maxTasks];\n" +
" for (int i = 0; i < maxTasks; i++) \n" +
" tasks[i] = new Task(String.valueOf(i+1),5);\n" +
" try {\n" +
" multi.performTasks(tasks);\n" +
" }\n" +
" catch(InterruptedException e){};\n" +
" }\n" +
" void notifyExecutionEnd() {\n" +
" System.out.println(\"EXECUTION FINISHED\");\n" +
" }\n" +
" void notifyExecutionStart() {\n" +
" System.out.println(\"EXECUTION STARTING\");\n" +
" }\n" +
" void performTasks(Runnable tasks[]) throws java.lang.InterruptedException {\n" +
" Thread workers[] = new Thread[tasks.length];\n" +
" notifyExecutionStart();\n" +
" \n" +
" // Launching the tasks\n" +
" for (int i = 0; i < tasks.length; i++) {\n" +
" workers[i] = new Thread(tasks[i],\"Running task(\"+(tasks[i].toString())+\")\");\n" +
" workers[i].start();\n" +
" }\n" +
" // Waiting for *all* tasks to be ended\n" +
" for (int i = 0; i < tasks.length; i++)\n" +
" workers[i].join();\n" +
" notifyExecutionEnd();\n" +
" }\n" +
"}\n"
},
"EXECUTION STARTING\n" +
"EXECUTION FINISHED"
);
}
/**
* Complex multi-threaded test involving inner classes
*/
public void test022() {
this.runConformTest(
new String[] {
/* MultiMember.java */
"MultiMember.java",
"public class MultiMember {\n" +
" class Task implements Runnable {\n" +
" private String taskName; \n" +
" private int maxIteration;\n" +
" public Task(String name, int value) {\n" +
" taskName = name; \n" +
" maxIteration = value;\n" +
" }\n" +
" public String toString() { return taskName; }\n" +
" public void run() {\n" +
" for(int i = 0; i < maxIteration; i++)\n" +
" notifyCompletion( (int)((float) (i + 1) / maxIteration * 100));\n" +
" } \n" +
" \n" +
" void notifyCompletion(int percentage) {\n" +
" }\n" +
" }\n" +
" public static void main(String argv[]){\n" +
" MultiMember multi = new MultiMember();\n" +
" int maxTasks = 3;\n" +
" Task tasks[] = new Task[maxTasks];\n" +
" for (int i = 0; i < maxTasks; i++) \n" +
" tasks[i] = multi.new Task(String.valueOf(i),5);\n" +
" try {\n" +
" multi.performTasks(tasks);\n" +
" }\n" +
" catch(InterruptedException e){};\n" +
" }\n" +
" void notifyExecutionEnd() {\n" +
" System.out.println(\"EXECUTION FINISHED\");\n" +
" }\n" +
" void notifyExecutionStart() {\n" +
" System.out.println(\"EXECUTION STARTING\");\n" +
" }\n" +
" void performTasks(Task tasks[]) throws java.lang.InterruptedException {\n" +
" Thread workers[] = new Thread[tasks.length];\n" +
" notifyExecutionStart();\n" +
" \n" +
" // Launching the tasks\n" +
" for (int i = 0; i < tasks.length; i++) {\n" +
" workers[i] = new Thread(tasks[i],\"Running task(\"+(tasks[i].toString())+\")\");\n" +
" workers[i].start();\n" +
" }\n" +
" // Waiting for *all* tasks to be ended\n" +
" for (int i = 0; i < tasks.length; i++)\n" +
" workers[i].join();\n" +
" notifyExecutionEnd();\n" +
" }\n" +
"}\n"
},
"EXECUTION STARTING\n" +
"EXECUTION FINISHED"
);
}
/**
* No need for protected access emulation
*/
public void test023() {
this.runConformTest(
new String[] {
/* X.java */
"p/X.java",
"package p; \n" +
"public class X extends q.Y { \n" +
" void bar(){ Object o = someObject; } \n"+
" public static void main(String[] argv){ \n" +
" new X().bar();\n"+
" System.out.println(\"SUCCESS\");\n"+
" }\n"+
"}\n",
/* Y.java */
"q/Y.java",
"package q; \n" +
"public class Y { \n" +
" protected Object someObject; \n" +
"}\n"
},
"SUCCESS"
);
}
/**
* No need for protected access emulation
*/
public void test024() {
this.runConformTest(
new String[] {
/* X.java */
"p/X.java",
"package p; \n" +
"public class X extends q.Y { \n" +
" void bar(){ foo(); } \n"+
" public static void main(String[] argv){ \n" +
" new X().bar();\n"+
" System.out.println(\"SUCCESS\");\n"+
" }\n"+
"}\n",
/* Y.java */
"q/Y.java",
"package q; \n" +
"public class Y { \n" +
" protected Object foo(){ return null;} \n" +
"}\n"
},
"SUCCESS"
);
}
public void test025() {
this.runConformTest(
new String[] {
/* PortReport.java */
"PortReport.java",
"import java.util.*; \n"+
"public class PortReport { \n"+
" public static void main(String[] args) { \n"+
" Portfolio port = new Portfolio(\"foobar\"); \n"+
" System.out.println(\"SUCCESS\"); \n" +
" } \n"+
"} \n",
/* Portfolio.java */
"Portfolio.java",
"import java.util.*; \n"+
"public class Portfolio { \n"+
" String name; \n"+
" public Portfolio(String buf) { \n"+
" TokenBuffer tbuf = new TokenBuffer(); \n"+
" switch (1) { \n"+
" case TokenBuffer.T_NAME : \n"+
" name = \"figi\"; \n"+
" } \n"+
" } \n"+
" String getName() { \n"+
" return name; \n"+
" } \n"+
" class TokenBuffer { \n"+
" static final int T_NAME = 3; \n"+
" } \n"+
"} \n"
},
"SUCCESS"
);
}
/**
* Compatability - Compiler does not comply with 1.1 standard.
*/
public void test026() {
this.runConformTest(
new String[] {
/* Test.java */
"p2/Test.java",
"package p2; \n"+
"public class Test { \n"+
" public static void main (String args[]){ \n"+
" new c2(); \n"+
" } \n"+
"} \n",
/* c1.java */
"p1/c1.java",
"package p1; \n"+
"public class c1 { \n"+
" protected class c1a{ \n"+
" public c1a(){} \n"+
" public void foo(){ System.out.println(\"Foo called\"); \n"+
" } \n"+
" }; \n"+
"} \n",
/* c2.java */
"p2/c2.java",
"package p2; \n"+
"import p1.*; \n"+
"public class c2 extends c1 { \n"+
" public c1a myC1a; \n"+
" { \n"+
" myC1a = new c1a(); \n"+
" myC1a.foo(); \n"+
" } \n"+
"} \n"
},
"Foo called"
);
}
/**
* Compatability - Compiler does not comply with 1.1 standard.
*/
public void test027() {
this.runNegativeTest(
new String[] {
/* Test.java */
"p2/Test.java",
"package p2; \n"+
"public class Test { \n"+
" public static void main (String args[]){ \n"+
" new c2(); \n"+
" } \n"+
"} \n",
/* c1.java */
"p1/c1.java",
"package p1; \n"+
"public class c1 { \n"+
" public class c1m { \n"+
" protected class c1a{ \n"+
" public c1a(){} \n"+
" public void foo(){ System.out.println(\"Foo called\"); \n"+
" } \n"+
" }; \n"+
" }; \n"+
"} \n",
/* c2.java */
"p2/c2.java",
"package p2; \n"+
"import p1.*; \n"+
"public class c2 extends c1 { \n"+
" public c1m.c1a myC1a; \n"+
" { \n"+
" myC1a = new c1m().new c1a(); \n"+
" myC1a.foo(); \n"+
" } \n"+
"} \n"
},
"----------\n" +
"1. ERROR in p2\\c2.java (at line 4)\n" +
" public c1m.c1a myC1a; \n" +
" ^^^^^^^\n" +
"The type c1m.c1a is not visible\n" +
"----------\n" +
"2. ERROR in p2\\c2.java (at line 6)\n" +
" myC1a = new c1m().new c1a(); \n" +
" ^^^\n" +
"The type c1.c1m.c1a is not visible\n" +
"----------\n" +
"3. ERROR in p2\\c2.java (at line 7)\n" +
" myC1a.foo(); \n" +
" ^^^^^\n" +
"The type c1.c1m.c1a is not visible\n" +
"----------\n");
}
/**
* Compatability - Compiler does not comply with 1.1 standard.
*/
public void test028() {
this.runNegativeTest(
new String[] {
/* Test.java */
"p2/Test.java",
"package p2; \n"+
"public class Test { \n"+
" public static void main (String args[]){ \n"+
" new c2(); \n"+
" } \n"+
"} \n",
/* c1.java */
"p1/c1.java",
"package p1; \n"+
"public class c1 { \n"+
" protected class c1m { \n"+
" protected class c1a{ \n"+
" public c1a(){} \n"+
" public void foo(){ System.out.println(\"Foo called\"); \n"+
" } \n"+
" }; \n"+
" }; \n"+
"} \n",
/* c2.java */
"p2/c2.java",
"package p2; \n"+
"import p1.*; \n"+
"public class c2 extends c1 { \n"+
" public c1m.c1a myC1a; \n"+
" { \n"+
" myC1a = new c1m().new c1a(); \n"+
" myC1a.foo(); \n"+
" } \n"+
"} \n"
},
"----------\n" +
"1. ERROR in p2\\c2.java (at line 4)\n" +
" public c1m.c1a myC1a; \n" +
" ^^^^^^^\n" +
"The type c1m.c1a is not visible\n" +
"----------\n" +
"2. ERROR in p2\\c2.java (at line 6)\n" +
" myC1a = new c1m().new c1a(); \n" +
" ^^^^^^^^^\n" +
"The constructor c1.c1m() is not visible\n" +
"----------\n" +
"3. ERROR in p2\\c2.java (at line 6)\n" +
" myC1a = new c1m().new c1a(); \n" +
" ^^^\n" +
"The type c1.c1m.c1a is not visible\n" +
"----------\n" +
"4. ERROR in p2\\c2.java (at line 7)\n" +
" myC1a.foo(); \n" +
" ^^^^^\n" +
"The type c1.c1m.c1a is not visible\n" +
"----------\n");
}
/**
* Compatability - Compiler does not comply with 1.1 standard.
*/
public void test029() {
this.runConformTest(
new String[] {
/* Test.java */
"p2/Test.java",
"package p2; \n"+
"public class Test { \n"+
" public static void main (String args[]){ \n"+
" new c2(); \n"+
" } \n"+
"} \n",
/* c1.java */
"p1/c1.java",
"package p1; \n"+
"public class c1 { \n"+
" protected class c1a{ \n"+
" public c1a(){} \n"+
" public void foo(){ System.out.println(\"Foo called\"); \n"+
" } \n"+
" }; \n"+
"} \n",
/* c2.java */
"p2/c2.java",
"package p2; \n"+
"import p1.*; \n"+
"public class c2 extends c1 { \n"+
" public c1.c1a myC1a;\n"+
" { \n"+
" myC1a = new c1a(); \n"+
" myC1a.foo(); \n"+
" } \n"+
"} \n"
},
"Foo called");
}
/**
* Compatability - Compiler does not comply with 1.1 standard.
*/
public void test030() {
this.runNegativeTest(
new String[] {
/* Test.java */
"p2/Test.java",
"package p2; \n"+
"public class Test { \n"+
" public static void main (String args[]){ \n"+
" new c2(); \n"+
" } \n"+
"} \n",
/* c1.java */
"p1/c1.java",
"package p1; \n"+
"public class c1 { \n"+
" protected class c1a{ \n"+
" public c1a(){} \n"+
" public void foo(){ System.out.println(\"Foo called\"); \n"+
" } \n"+
" }; \n"+
"} \n",
/* c2.java */
"p2/c2.java",
"package p2; \n"+
"import p1.*; \n"+
"public class c2 extends c1.c1a {// qualified acces does not work \n"+
" public c1a myC1a; \n"+
" { \n"+
" myC1a = new c1a(); \n"+
" myC1a.foo(); \n"+
" } \n"+
"} \n"
},
"----------\n" +
"1. ERROR in p2\\c2.java (at line 3)\n" +
" public class c2 extends c1.c1a {// qualified acces does not work \n" +
" ^^^^^^\n" +
"The type c1.c1a is not visible\n" +
"----------\n" +
"2. ERROR in p2\\c2.java (at line 4)\n" +
" public c1a myC1a; \n" +
" ^^^\n" +
"c1a cannot be resolved to a type\n" +
"----------\n" +
"3. ERROR in p2\\c2.java (at line 6)\n" +
" myC1a = new c1a(); \n" +
" ^^^^^\n" +
"c1a cannot be resolved to a type\n" +
"----------\n" +
"4. ERROR in p2\\c2.java (at line 6)\n" +
" myC1a = new c1a(); \n" +
" ^^^\n" +
"c1a cannot be resolved to a type\n" +
"----------\n" +
"5. ERROR in p2\\c2.java (at line 7)\n" +
" myC1a.foo(); \n" +
" ^^^^^\n" +
"c1a cannot be resolved to a type\n" +
"----------\n");
}
/**
* Compatibility - Compiler does not comply with 1.1 standard.
*/
public void test031() {
this.runNegativeTest(
new String[] {
/* Test.java */
"p2/Test.java",
"package p2; \n"+
"public class Test { \n"+
" public static void main (String args[]){ \n"+
" new c2(); \n"+
" } \n"+
"} \n",
/* c1.java */
"p1/c1.java",
"package p1; \n"+
"public class c1 { \n"+
" protected class c1a{ \n"+
" public c1a(){} \n"+
" public void foo(){ System.out.println(\"Foo called\"); \n"+
" } \n"+
" }; \n"+
"} \n",
/* c2.java */
"p2/c2.java",
"package p2; \n"+
"import p1.c1.*; \n"+
"public class c2 extends c1a { \n"+
" public c1a myC1a; \n"+
" { \n"+
" myC1a = new c1a(); \n"+
" myC1a.foo(); \n"+
" } \n"+
"} \n"
},
"----------\n" +
"1. ERROR in p2\\c2.java (at line 3)\n" +
" public class c2 extends c1a { \n" +
" ^^^\n" +
"The type c1a is not visible\n" +
"----------\n" +
"2. ERROR in p2\\c2.java (at line 4)\n" +
" public c1a myC1a; \n" +
" ^^^\n" +
"The type c1a is not visible\n" +
"----------\n" +
"3. ERROR in p2\\c2.java (at line 6)\n" +
" myC1a = new c1a(); \n" +
" ^^^\n" +
"The type c1a is not visible\n" +
"----------\n" +
"4. ERROR in p2\\c2.java (at line 7)\n" +
" myC1a.foo(); \n" +
" ^^^^^\n" +
"The type c1.c1a is not visible\n" +
"----------\n");
}
/**
* VerifyError using .class literal inside inner classes
*/
public void test032() {
this.runConformTest(
new String[] {
"p/A.java",
"package p; \n"+
"public class A {\n" +
" public class B {\n" +
" public B() {\n" +
" }\n" +
" public Class getCls() {\n" +
" return A.class;\n" +
" }\n" +
" }\n" +
" public A() {\n" +
" super();\n" +
" B b = new B();\n" +
" System.out.println(\"Class: \" + b.getCls());\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" A a = new A();\n" +
" }\n" +
"}\n"
},
"Class: class p.A");
}
/**
* Missing implementation in the compiler compiling invalid code
*/
public void test033() {
String errMessage = isMinimumCompliant(ClassFileConstants.JDK11) ?
"----------\n" +
"1. ERROR in p1\\A2.java (at line 20)\n" +
" (new D.E(null, null, null, new F(get()) {}) {}).execute(); \n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
"No enclosing instance of type D is accessible. Must qualify the allocation with an enclosing instance of type D (e.g. x.new A() where x is an instance of D).\n" +
"----------\n"
:
"----------\n" +
"1. WARNING in p1\\A2.java (at line 18)\n" +
" private class C extends B { \n" +
" ^\n" +
"Access to enclosing constructor A2.B() is emulated by a synthetic accessor method\n" +
"----------\n" +
"2. ERROR in p1\\A2.java (at line 20)\n" +
" (new D.E(null, null, null, new F(get()) {}) {}).execute(); \n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
"No enclosing instance of type D is accessible. Must qualify the allocation with an enclosing instance of type D (e.g. x.new A() where x is an instance of D).\n" +
"----------\n";
this.runNegativeTest(
new String[] {
/* A2.java */
"p1/A2.java",
"package p1; \n"+
"class D { \n"+
" class E { \n"+
" E(Object o, Object o1, Object o2, F f) {} \n"+
" void execute() {} \n"+
" } \n"+
"} \n"+
"class F { \n"+
" F(Object o) { \n"+
" } \n"+
"} \n"+
"public class A2 { \n"+
" private abstract class B { \n"+
" public Object get() { \n"+
" return null; \n"+
" } \n"+
" } \n"+
" private class C extends B { \n"+
" public void foo() { \n"+
" (new D.E(null, null, null, new F(get()) {}) {}).execute(); \n"+
" } \n"+
" } \n"+
"}\n"
},
errMessage);
}
/**
* Missing implementation in the compiler compiling invalid code
*/
public void test034() {
this.runConformTest(
new String[] {
/* A2.java */
"p1/A2.java",
"package p1; \n"+
"class D { \n"+
" class E { \n"+
" E(Object o, Object o1, Object o2, F f) {} \n"+
" void execute() {} \n"+
" } \n"+
"} \n"+
"class F { \n"+
" F(Object o) { \n"+
" } \n"+
"} \n"+
"public class A2 { \n"+
" private abstract class B { \n"+
" public Object get() { \n"+
" return null; \n"+
" } \n"+
" } \n"+
" private class C extends B { \n"+
" public void foo() { \n"+
" (new D().new E(null, null, null, new F(get()) {}) {}).execute(); \n"+
" } \n"+
" } \n"+
" public static void main(String[] argv){ \n"+
" new A2().new C().foo(); \n"+
" System.out.println(\"SUCCESS\"); \n"+
" } \n"+
"} \n"
},
"SUCCESS"
);
}
/**
* Missing implementation in the compiler compiling invalid code
*/
public void test035() {
String errMessage = isMinimumCompliant(ClassFileConstants.JDK11) ?
"----------\n" +
"1. ERROR in p1\\A2.java (at line 20)\n" +
" (new D.E(null, null, null, new F(get()) {})).execute(); \n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
"No enclosing instance of type D is accessible. Must qualify the allocation with an enclosing instance of type D (e.g. x.new A() where x is an instance of D).\n" +
"----------\n"
:
"----------\n" +
"1. WARNING in p1\\A2.java (at line 18)\n" +
" private class C extends B { \n" +
" ^\n" +
"Access to enclosing constructor A2.B() is emulated by a synthetic accessor method\n" +
"----------\n" +
"2. ERROR in p1\\A2.java (at line 20)\n" +
" (new D.E(null, null, null, new F(get()) {})).execute(); \n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
"No enclosing instance of type D is accessible. Must qualify the allocation with an enclosing instance of type D (e.g. x.new A() where x is an instance of D).\n" +
"----------\n";
this.runNegativeTest(new String[] {
/* A2.java */
"p1/A2.java",
"package p1; \n"+
"class D { \n"+
" class E { \n"+
" E(Object o, Object o1, Object o2, F f) {} \n"+
" void execute() {} \n"+
" } \n"+
"} \n"+
"class F { \n"+
" F(Object o) { \n"+
" } \n"+
"} \n"+
"public class A2 { \n"+
" private abstract class B { \n"+
" public Object get() { \n"+
" return null; \n"+
" } \n"+
" } \n"+
" private class C extends B { \n"+
" public void foo() { \n"+
" (new D.E(null, null, null, new F(get()) {})).execute(); \n"+
" } \n"+
" } \n"+
"}\n"},
errMessage);
}
/**
* ClassCastException during inner class emulation
*/
public void test036() {
this.runConformTest(
new String[] {
/* A.java */
"p1/A.java",
"package p1; \n"+
"public class A { \n"+
" public static void main(String[] argv){ \n"+
" new A().foo(); \n"+
" System.out.println(\"SUCCESS\"); \n"+
" } \n"+
" public Object foo() { \n"+
" B b = new B() { \n"+
" protected Object bar() { \n"+
" return new B.C() {}; \n"+
" } \n"+
" }; \n"+
" return b; \n"+
" } \n"+
"} \n"+
"class B { \n"+
" class C { \n"+
" } \n"+
"} \n"
},
"SUCCESS"
);
}
/**
* ClassCastException during inner class emulation
*/
public void test037() {
this.runConformTest(
new String[] {
/* A.java */
"p1/A.java",
"package p1; \n"+
"public class A { \n"+
" public static void main(String[] argv){ \n"+
" new A().foo(); \n"+
" System.out.println(\"SUCCESS\"); \n"+
" } \n"+
" public Object foo() { \n"+
" I i = new I() { \n"+
" protected Object bar() { \n"+
" return new I.C() {}; \n"+
" } \n"+
" }; \n"+
" return i; \n"+
" } \n"+
"} \n"+
"interface I { \n"+
" class C { \n"+
" } \n"+
"} \n"
},
"SUCCESS"
);
}
/**
* Enclosing instance comparison
*/
public void test038() {
this.runConformTest(
new String[] {
/* X.java */
"X.java",
"public class X { \n"+
" public static void main(String argv[]) { \n"+
" if (new X().foo()) \n"+
" System.out.println(\"FAILED\"); \n"+
" System.out.println(\"SUCCESS\"); \n"+
" } \n"+
" boolean bar() { \n"+
" return false; \n"+
" } \n"+
" boolean foo() { \n"+
" X x = new X() { \n"+
" boolean test() { \n"+
" return (X.this == this); \n"+
" } \n"+
" }; \n"+
" return x.bar(); \n"+
" } \n"+
"} \n"
},
"SUCCESS"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
* Invalid error when compiling access to protected member inside innerclass
*/
public void test039() {
this.runConformTest(
new String[] {
/* p1/X.java */
"p1/X.java",
"package p1; \n"+
"public class X { \n"+
" protected void foo() { \n"+
" System.out.println(\"SUCCESS\"); \n"+
" } \n"+
" public static void main(String argv[]) { \n"+
" new p2.Y().bar(); \n"+
" } \n"+
"} \n",
/* p2/Y.java */
"p2/Y.java",
"package p2; \n"+
"public class Y extends p1.X { \n"+
" public void bar() { \n"+
" new Object(){ \n"+
" void doSomething(){ \n"+
" Y.this.foo(); \n"+
" } \n"+
" }.doSomething(); \n"+
" } \n"+
"} \n",
},
"SUCCESS"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
* Invalid error when compiling access to protected member inside innerclass
*/
public void test040() {
this.runConformTest(
new String[] {
/* p1/X.java */
"p1/X.java",
"package p1; \n"+
"public class X { \n"+
" protected void foo() { \n"+
" System.out.println(\"SUCCESS\"); \n"+
" } \n"+
" public static void main(String argv[]) { \n"+
" new p2.Y().bar(); \n"+
" } \n"+
"} \n",
/* p2/Y.java */
"p2/Y.java",
"package p2; \n"+
"public class Y extends p1.X { \n"+
" public void bar() { \n"+
" new Object(){ \n"+
" void doSomething(){ \n"+
" new Y().foo(); \n"+
" } \n"+
" }.doSomething(); \n"+
" } \n"+
"} \n",
},
"SUCCESS"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
* Invalid error when compiling access to protected member inside innerclass
*/
public void test041() {
this.runConformTest(
new String[] {
/* p1/X.java */
"p1/X.java",
"package p1; \n"+
"public class X { \n"+
" protected void foo() { \n"+
" System.out.println(\"SUCCESS\"); \n"+
" } \n"+
" public static void main(String argv[]) { \n"+
" new p2.Y().bar(); \n"+
" } \n"+
"} \n",
/* p2/Y.java */
"p2/Y.java",
"package p2; \n"+
"public class Y extends p1.X { \n"+
" public void bar() { \n"+
" new Object(){ \n"+
" void doSomething(){ \n"+
" Y.super.foo(); \n"+
" } \n"+
" }.doSomething(); \n"+
" } \n"+
"} \n",
},
"SUCCESS"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
* Invalid error when compiling access to protected member inside innerclass
*/
public void test042() {
this.runConformTest(
new String[] {
/* p1/X.java */
"p1/X.java",
"package p1; \n"+
"public class X { \n"+
" protected String foo = \"SUCCESS\"; \n"+
" public static void main(String argv[]) { \n"+
" new p2.Y().bar(); \n"+
" } \n"+
"} \n",
/* p2/Y.java */
"p2/Y.java",
"package p2; \n"+
"public class Y extends p1.X { \n"+
" public void bar() { \n"+
" new Object(){ \n"+
" void doSomething(){ \n"+
" System.out.println(Y.super.foo); \n"+
" } \n"+
" }.doSomething(); \n"+
" } \n"+
"} \n",
},
"SUCCESS"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
* Invalid error when compiling access to protected member inside innerclass
*/
public void test043() {
this.runConformTest(
new String[] {
/* p1/X.java */
"p1/X.java",
"package p1; \n"+
"public class X { \n"+
" protected String foo = \"SUCCESS\"; \n"+
" public static void main(String argv[]) { \n"+
" new p2.Y().bar(); \n"+
" } \n"+
"} \n",
/* p2/Y.java */
"p2/Y.java",
"package p2; \n"+
"public class Y extends p1.X { \n"+
" public void bar() { \n"+
" new Object(){ \n"+
" void doSomething(){ \n"+
" System.out.println(Y.this.foo); \n"+
" } \n"+
" }.doSomething(); \n"+
" } \n"+
"} \n",
},
"SUCCESS"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
* Invalid error when compiling access to protected member inside innerclass
*/
public void test044() {
this.runConformTest(
new String[] {
/* p1/X.java */
"p1/X.java",
"package p1; \n"+
"public class X { \n"+
" protected String foo = \"SUCCESS\"; \n"+
" public static void main(String argv[]) { \n"+
" new p2.Y().bar(); \n"+
" } \n"+
"} \n",
/* p2/Y.java */
"p2/Y.java",
"package p2; \n"+
"public class Y extends p1.X { \n"+
" public void bar() { \n"+
" new Object(){ \n"+
" void doSomething(){ \n"+
" System.out.println(new Y().foo); \n"+
" } \n"+
" }.doSomething(); \n"+
" } \n"+
"} \n",
},
"SUCCESS"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
* Invalid error when compiling access to protected member inside innerclass
*/
public void test045() {
this.runConformTest(
new String[] {
/* p1/X.java */
"p1/X.java",
"package p1; \n"+
"public class X { \n"+
" protected String foo = \"SUCCESS\"; \n"+
" public static void main(String argv[]) { \n"+
" new p2.Y().bar(); \n"+
" } \n"+
"} \n",
/* p2/Y.java */
"p2/Y.java",
"package p2; \n"+
"public class Y extends p1.X { \n"+
" public void bar() { \n"+
" new Object(){ \n"+
" void doSomething(){ \n"+
" System.out.println(foo); \n"+
" } \n"+
" }.doSomething(); \n"+
" } \n"+
"} \n",
},
"SUCCESS"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
* Invalid error when compiling access to protected member inside innerclass
*/
public void test046() {
this.runConformTest(
new String[] {
/* p1/X.java */
"p1/X.java",
"package p1; \n"+
"public class X { \n"+
" protected String foo = \"SUCCESS\"; \n"+
" public static void main(String argv[]) { \n"+
" new p2.Y().bar(); \n"+
" } \n"+
"} \n",
/* p2/Y.java */
"p2/Y.java",
"package p2; \n"+
"public class Y extends p1.X { \n"+
" Y someY; \n"+
" public void bar() { \n"+
" someY = this; \n"+
" new Object(){ \n"+
" void doSomething(){ \n"+
" System.out.println(someY.foo); \n"+
" } \n"+
" }.doSomething(); \n"+
" } \n"+
"} \n",
},
"SUCCESS"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
* Invalid error when compiling access to protected member inside innerclass
*/
public void test047() {
this.runConformTest(
new String[] {
/* p1/X.java */
"p1/X.java",
"package p1; \n"+
"public class X { \n"+
" protected String foo = \"FAILED\"; \n"+
" public static void main(String argv[]) { \n"+
" new p2.Y().bar(); \n"+
" } \n"+
"} \n",
/* p2/Y.java */
"p2/Y.java",
"package p2; \n"+
"public class Y extends p1.X { \n"+
" public void bar() { \n"+
" new Object(){ \n"+
" void doSomething(){ \n"+
" System.out.println(Y.super.foo = \"SUCCESS\"); \n"+
" } \n"+
" }.doSomething(); \n"+
" } \n"+
"} \n",
},
"SUCCESS"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
* Invalid error when compiling access to protected member inside innerclass
*/
public void test048() {
this.runConformTest(
new String[] {
/* p1/X.java */
"p1/X.java",
"package p1; \n"+
"public class X { \n"+
" protected String foo = \"FAILED\"; \n"+
" public static void main(String argv[]) { \n"+
" new p2.Y().bar(); \n"+
" } \n"+
"} \n",
/* p2/Y.java */
"p2/Y.java",
"package p2; \n"+
"public class Y extends p1.X { \n"+
" public void bar() { \n"+
" new Object(){ \n"+
" void doSomething(){ \n"+
" System.out.println(Y.this.foo = \"SUCCESS\"); \n"+
" } \n"+
" }.doSomething(); \n"+
" } \n"+
"} \n",
},
"SUCCESS"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
* Invalid error when compiling access to protected member inside innerclass
*/
public void test049() {
this.runConformTest(
new String[] {
/* p1/X.java */
"p1/X.java",
"package p1; \n"+
"public class X { \n"+
" protected String foo = \"FAILED\"; \n"+
" public static void main(String argv[]) { \n"+
" new p2.Y().bar(); \n"+
" } \n"+
"} \n",
/* p2/Y.java */
"p2/Y.java",
"package p2; \n"+
"public class Y extends p1.X { \n"+
" public void bar() { \n"+
" new Object(){ \n"+
" void doSomething(){ \n"+
" System.out.println(new Y().foo = \"SUCCESS\"); \n"+
" } \n"+
" }.doSomething(); \n"+
" } \n"+
"} \n",
},
"SUCCESS"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
* Invalid error when compiling access to protected member inside innerclass
*/
public void test050() {
this.runConformTest(
new String[] {
/* p1/X.java */
"p1/X.java",
"package p1; \n"+
"public class X { \n"+
" protected String foo = \"FAILED\"; \n"+
" public static void main(String argv[]) { \n"+
" new p2.Y().bar(); \n"+
" } \n"+
"} \n",
/* p2/Y.java */
"p2/Y.java",
"package p2; \n"+
"public class Y extends p1.X { \n"+
" public void bar() { \n"+
" new Object(){ \n"+
" void doSomething(){ \n"+
" System.out.println(foo = \"SUCCESS\"); \n"+
" } \n"+
" }.doSomething(); \n"+
" } \n"+
"} \n",
},
"SUCCESS"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=6456
* Invalid error when compiling access to protected member inside innerclass
*/
public void test051() {
this.runConformTest(
new String[] {
/* p1/X.java */
"p1/X.java",
"package p1; \n"+
"public class X { \n"+
" protected String foo = \"FAILED\"; \n"+
" public static void main(String argv[]) { \n"+
" new p2.Y().bar(); \n"+
" } \n"+
"} \n",
/* p2/Y.java */
"p2/Y.java",
"package p2; \n"+
"public class Y extends p1.X { \n"+
" Y someY; \n"+
" public void bar() { \n"+
" someY = this; \n"+
" new Object(){ \n"+
" void doSomething(){ \n"+
" System.out.println(someY.foo = \"SUCCESS\"); \n"+
" } \n"+
" }.doSomething(); \n"+
" } \n"+
"} \n",
},
"SUCCESS"
);
}
public void test052() {
this.runConformTest(
new String[] {
/* p2/Y.java */
"p2/Y.java",
"package p2; \n"+
"public class Y { \n"+
" void bar(final int someVal){ \n"+
" class Local { \n"+
" void localDo(final int localVal){ \n"+
" new Object(){ \n"+
" void doSomething(){ \n"+
" System.out.print(someVal + localVal); \n"+
" } \n"+
" }.doSomething(); \n"+
" } \n"+
" }; \n"+
" Local loc = new Local(); \n"+
" loc.localDo(8); \n"+
" class SubLocal extends Local { \n"+
" void localDo(final int localVal){ \n"+
" super.localDo(localVal + 1); \n"+
" new Object(){ \n"+
" void doSomething(){ \n"+
" SubLocal.super.localDo(localVal + 2); \n"+
" System.out.print(someVal + localVal + 3); \n"+
" } \n"+
" }.doSomething(); \n"+
" } \n"+
" }; \n"+
" SubLocal subloc = new SubLocal(); \n"+
" subloc.localDo(8); \n"+
" } \n"+
" public static void main(String[] arguments) { \n"+
" new Y().bar(4); \n"+
" System.out.println(); \n"+
" } \n"+
"} \n",
},
"12131415"
);
}
public void test053() {
this.runConformTest(
new String[] {
/* p2/Z.java */
"p2/Z.java",
"package p2; \n"+
"import p1.X; \n"+
"public class Z { \n"+
" class ZMember extends X { \n"+
" ZMember(Object o){} \n"+
" Z bar(){ \n"+
" System.out.println(foo = \"FAILED\"); \n"+
" return Z.this; \n"+
" } \n"+
" } \n"+
" Z(final Object foo){ \n"+
" Object obj2 = new Object(){ \n"+
" Object doSomething(){ \n"+
" ZMember obj3 = new ZMember(foo){ \n"+
" Z bar(){ \n"+
" System.out.println(this.foo); \n"+
" return Z.this; \n"+
" } \n"+
" }; \n"+
" obj3.bar(); \n"+
" return this; \n"+
" } \n"+
" }.doSomething(); \n"+
" } \n"+
" public static void main(String[] arguments) { \n"+
" new Z(new Object()); \n"+
" } \n"+
"} \n",
/* p1/X.java */
"p1/X.java",
"package p1; \n"+
"public class X { \n"+
" protected String foo = \"SUCCESS\"; \n"+
"} \n"
},
"SUCCESS"
);
}
public void test055() {
this.runNegativeTest(
new String[] {
/* p1/X.java */
"p1/X.java",
"package p1; \n"+
"public class X { \n"+
" void foo() { \n"+
" class L1 { \n"+
" class LM1 { \n"+
" } \n"+
" } \n"+
" class L2 extends L1.LM1 { \n"+
" } \n"+
" new L2(); \n"+
" } \n"+
" public static void main(String[] arguments) { \n"+
" new X().foo(); \n"+
" } \n"+
"} \n",
},
"----------\n" +
"1. ERROR in p1\\X.java (at line 8)\n" +
" class L2 extends L1.LM1 { \n" +
" ^^\n" +
"No enclosing instance of type L1 is accessible to invoke the super constructor. Must define a constructor and explicitly qualify its super constructor invocation with an instance of L1 (e.g. x.super() where x is an instance of L1).\n" +
"----------\n"
);
}
public void test056() {
this.runNegativeTest(
new String[] {
/* p1/X.java */
"p1/X.java",
"package p1; \n"+
"public class X { \n"+
" void foo() { \n"+
" class L1 { \n"+
" class LM1 { \n"+
" } \n"+
" } \n"+
" new L1().new LM1(){}; //ok\n"+
" new L1.LM1(){}; //ko\n"+
" } \n"+
" public static void main(String[] arguments) { \n"+
" new X().foo(); \n"+
" } \n"+
"} \n",
},
"----------\n" +
"1. ERROR in p1\\X.java (at line 9)\n" +
" new L1.LM1(){}; //ko\n" +
" ^^^^^^^^^^^^^^\n" +
"No enclosing instance of type L1 is accessible. Must qualify the allocation with an enclosing instance of type L1 (e.g. x.new A() where x is an instance of L1).\n" +
"----------\n"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=9813
* VerifyError with Inner Class having private constructor
*/
public void test057() {
this.runConformTest(
new String[] {
/* VE_Test.java */
"VE_Test.java",
"public class VE_Test { \n"+
" class VE_Inner { \n"+
" private VE_Inner() {} \n"+
" } \n"+
" private static void test(){ \n"+
" VE_Test ve_test = new VE_Test(); \n"+
" VE_Inner pi = ve_test.new VE_Inner(); \n"+
" } \n"+
" public static void main(String[] args){ \n"+
" new VE_Test(); \n"+
" System.out.println(\"SUCCESS\"); \n"+
" } \n"+
"} \n",
},
"SUCCESS"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=11845
* NPE during emulation
*/
public void test058() {
this.runConformTest(
new String[] {
"p1/Test.java",
"package p1; \n"+
"import p2.A; \n"+
"public class Test { \n"+
" public static void main(String[] args){ \n"+
" new Test().a.bar(); \n"+
" } \n"+
" private A a = new A() { \n"+
" public void bar() { \n"+
" new Object() { \n"+
" protected void foo() { \n"+
" init(); \n"+
" } \n"+
" }.foo(); \n"+
" } \n"+
" }; \n"+
" private void init() { \n"+
" System.out.println(\"SUCCESS\"); \n"+
" } \n" +
"} \n",
"p2/A.java",
"package p2; \n"+
"public class A { \n"+
" public void bar() { \n"+
" } \n"+
" private void init() { \n"+
" System.out.println(\"FAILED\"); \n"+
" } \n"+
"} \n"
},
"SUCCESS"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=11845
* variant for single name ref
*/
public void test059() {
this.runConformTest(
new String[] {
"p1/Test.java",
"package p1; \n"+
"import p2.A; \n"+
"public class Test { \n"+
" public static void main(String[] args){ \n"+
" new Test().a.bar(); \n"+
" } \n"+
" private A a = new A() { \n"+
" public void bar() { \n"+
" new Object() { \n"+
" protected void foo() { \n"+
" System.out.println(init); \n"+
" } \n"+
" }.foo(); \n"+
" } \n"+
" }; \n"+
" private String init = \"SUCCESS\"; \n"+
"} \n",
"p2/A.java",
"package p2; \n"+
"public class A { \n"+
" public void bar() { \n"+
" } \n"+
" private String init = \"FAILED\"; \n"+
"} \n"
},
"SUCCESS"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=11845
* variant for qualified name ref
*/
public void test060() {
this.runConformTest(
new String[] {
"p1/Test.java",
"package p1; \n"+
"import p2.A; \n"+
"public class Test { \n"+
" public static void main(String[] args){ \n"+
" new Test().a.bar(); \n"+
" } \n"+
" private A a = new A() { \n"+
" public void bar() { \n"+
" class L { \n"+
" Test next = Test.this; \n"+
" protected void foo() { \n"+
" System.out.println(next.init); \n"+
" } \n"+
" }; \n" +
" new L().foo(); \n"+
" } \n"+
" }; \n"+
" private String init = \"SUCCESS\"; \n"+
"} \n",
"p2/A.java",
"package p2; \n"+
"public class A { \n"+
" public void bar() { \n"+
" } \n"+
"} \n"
},
"SUCCESS"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=11845
* variant for field name ref
*/
public void test061() {
this.runConformTest(
new String[] {
"p1/Test.java",
"package p1; \n"+
"import p2.A; \n"+
"public class Test { \n"+
" public static void main(String[] args){ \n"+
" new Test().a.bar(); \n"+
" } \n"+
" private A a = new A() { \n"+
" public void bar() { \n"+
" class L { \n"+
" protected void foo() { \n"+
" System.out.println(Test.this.init); \n"+
" } \n"+
" }; \n" +
" new L().foo(); \n"+
" } \n"+
" }; \n"+
" private String init = \"SUCCESS\"; \n"+
"} \n",
"p2/A.java",
"package p2; \n"+
"public class A { \n"+
" public void bar() { \n"+
" } \n"+
"} \n"
},
"SUCCESS"
);
}
public void test062() {
this.runConformTest(
new String[] {
"p1/X.java",
"package p1; \n"+
"public class X { \n"+
" public static void main(String args[]) { \n"+
" final String s = args.length == 0 ? \"SUCCESS\" : null; \n"+
" final class Local { \n"+
" private Local() { \n"+
" new LocalMember(); \n"+
" } \n"+
" class LocalMember { \n"+
" { \n"+
" new LocalMemberMember(); \n"+
" } \n"+
" class LocalMemberMember { \n"+
" { \n"+
" System.out.println(s); \n"+
" } \n"+
" } \n"+
" } \n"+
" } \n"+
" new Local(); \n"+
" } \n"+
"} \n"
},
"SUCCESS"
);
}
public void test062a() {
this.runConformTest(
new String[] {
"p1/X.java",
"package p1; \n"+
"public class X { \n"+
" public static void main(String args[]) { \n"+
" final String s = \"SUCCESS\";\n"+
" final class Local { \n"+
" Local() { \n"+
" new LocalMember(); \n"+
" } \n"+
" class LocalMember { \n"+
" { \n"+
" new LocalMemberMember(); \n"+
" } \n"+
" class LocalMemberMember { \n"+
" { \n"+
" System.out.println(s); \n"+
" } \n"+
" } \n"+
" } \n"+
" } \n"+
" new Local(); \n"+
" } \n"+
"} \n"
},
"SUCCESS"
);
}
public void test063() {
this.runConformTest(
new String[] {
"p1/X.java",
"package p1; \n"+
"public class X { \n"+
" String a = new Object(){ \n"+
" class LocalMember { \n"+
" String s = \"SUCCESS\"; \n"+
" }; \n"+
" String get_a(){ \n"+
" return new LocalMember().s; \n"+
" } \n"+
" }.get_a(); \n"+
" public static void main(String argv[]) { \n"+
" System.out.println(new X().a); \n"+
" } \n"+
"} \n"
},
"SUCCESS"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=21447
* should invoke Y.foo() at runtime
*/
public void test064(){
this.runConformTest(
new String[] {
"p2/Y.java",
"package p2; \n"+
"public class Y extends T { \n"+
" public static void main(String argv[]) { \n"+
" new Y().bar(); \n"+
" } \n"+
" protected void foo() { \n"+
" System.out.println(\"Y.foo()\"); \n"+
" } \n"+
"} \n",
"p1/X.java",
"package p1; \n"+
"public class X { \n"+
" protected void foo() { \n"+
" System.out.println(\"X.foo()\"); \n"+
" } \n"+
"} \n",
"p2/T.java",
"package p2; \n"+
"public class T extends p1.X { \n"+
" public void bar() { \n"+
" new Object(){ \n"+
" void doSomething(){ \n" +
" T.this.foo(); \n"+
" } \n" +
" }.doSomething(); \n" +
" } \n"+
"} \n",
},
"Y.foo()"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=21447
* variation - if T.foo() is defined
*/
public void test065(){
this.runConformTest(
new String[] {
"p2/Y.java",
"package p2; \n"+
"public class Y extends T { \n"+
" public static void main(String argv[]) { \n"+
" new Y().bar(); \n"+
" } \n"+
" protected void foo() { \n"+
" System.out.println(\"Y.foo()\"); \n"+
" } \n"+
"} \n",
"p1/X.java",
"package p1; \n"+
"public class X { \n"+
" protected void foo() { \n"+
" System.out.println(\"X.foo()\"); \n"+
" } \n"+
"} \n",
"p2/T.java",
"package p2; \n"+
"public class T extends p1.X { \n"+
" public void bar() { \n"+
" new Object(){ \n"+
" void doSomething(){ \n" +
" T.this.foo(); \n"+
" } \n" +
" }.doSomething(); \n" +
" } \n"+
" protected void foo() { \n"+
" System.out.println(\"T.foo()\"); \n"+
" } \n"+
"} \n",
},
"Y.foo()"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=21447
* should invoke Y.foo() and X.foo() at runtime (through 2 separate access methods)
*/
public void test066(){
this.runConformTest(
new String[] {
"p2/Y.java",
"package p2; \n"+
"public class Y extends T { \n"+
" public static void main(String argv[]) { \n"+
" new Y().bar(); \n"+
" } \n"+
" protected void foo() { \n"+
" System.out.print(\"Y.foo()-\"); \n"+
" } \n"+
"} \n",
"p1/X.java",
"package p1; \n"+
"public class X { \n"+
" protected void foo() { \n"+
" System.out.println(\"X.foo()\"); \n"+
" } \n"+
"} \n",
"p2/T.java",
"package p2; \n"+
"public class T extends p1.X { \n"+
" public void bar() { \n"+
" new Object(){ \n"+
" void doSomething(){ \n" +
" T.this.foo(); \n"+
" T.super.foo(); //need extra access method \n"+
" } \n" +
" }.doSomething(); \n" +
" } \n"+
"} \n",
},
"Y.foo()-X.foo()"
);
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=22093
* test collision check for synthetic accessors to constructors
*/
public void test067(){
this.runConformTest(
new String[] {
"p/Test.java",
"package p; \n"+
"public class Test { \n"+
" class Member { \n"+
" private Member(){ \n"+
" } \n"+
" private Member(Member other){ \n"+
" } \n"+
" } \n"+
" public static void main(String[] arguments) { \n"+
" Test t = new Test(); \n"+
" Member m1 = t.new Member(); \n"+
" t.new Member(m1); \n"+
" System.out.println(\"SUCCESS\"); \n"+
" } \n"+
"} \n"
},
"SUCCESS");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=25229
public void test068(){
this.runConformTest(
new String[] {
"X.java",
"public class X { \n"+
" public static void main(String[] arguments) { \n"+
" new X().new X2().foo(); \n"+
" } \n"+
" class X1 { \n"+
" void baz1() { \n"+
" System.out.print(\"-X1.baz1()\"); \n"+
" } \n"+
" } \n"+
" class X2 { \n"+
" void foo(){ \n"+
" X.this.new X1(){ \n"+
" void bar(){ \n"+
" baz(); \n"+
" baz1(); \n"+
" baz2(); \n"+
" } \n"+
" }.bar(); \n"+
" } \n"+
" void baz2() { \n"+
" System.out.println(\"-X2.baz2()\"); \n"+
" } \n"+
" } \n"+
" void baz() { \n"+
" System.out.print(\"X.baz()\"); \n"+
" } \n"+
"} \n"
},
"X.baz()-X1.baz1()-X2.baz2()");
}
// http://bugs.eclipse.org/bugs/show_bug.cgi?id=26122
// synthetic outer local variables must be appended after user arguments
public void test069() {
this.runConformTest(
new String[] {
"X.java",
"public class X { \n"+
" X(String s, int j) {} \n"+
" public static void main(String[] args) { \n"+
" final int i; \n"+
" new X(\"hello\", i = 1) { \n"+ // val$i must be appended after i got assigned
" { \n"+
" System.out.print(\"SUCCESS:\"+i); \n"+
" } \n"+
" }; \n"+
" } \n"+
"} \n"
},
"SUCCESS:1");
}
// variation on test069
public void test070() {
this.runConformTest(
new String[] {
"X.java",
"public class X { \n"+
" X() {} \n"+
" public static void main(String[] args) { \n"+
" final int i; \n"+
" new X().new Y(\"hello\", i = 1) { \n"+ // val$i must be appended after i got assigned
" { \n"+
" System.out.print(\"SUCCESS:\"+i); \n"+
" } \n"+
" }; \n"+
" } \n"+
" class Y { \n" +
" Y(String s, int j) {} \n" +
" } \n" +
"} \n"
},
"SUCCESS:1");
}
// test too many synthetic arguments
public void test071() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X { \n"+
" void foo(int i) { \n"+
" final long v0 = i, v1 = i, v2 = i, v3 = i, v4 = i, v5 = i, v6 = i; \n"+
" final long v7 = i, v8 = i, v9 = i, v10 = i, v11 = i, v12 = i, v13 = i; \n"+
" final long v14 = i, v15 = i, v16 = i, v17 = i, v18 = i, v19 = i, v20 = i; \n"+
" final long v21 = i, v22 = i, v23 = i, v24 = i, v25 = i, v26 = i, v27 = i; \n"+
" final long v28 = i, v29 = i, v30 = i, v31 = i, v32 = i, v33 = i, v34 = i; \n"+
" final long v35 = i, v36 = i, v37 = i, v38 = i, v39 = i, v40 = i, v41 = i; \n"+
" final long v42 = i, v43 = i, v44 = i, v45 = i, v46 = i, v47 = i, v48 = i; \n"+
" final long v49 = i, v50 = i, v51 = i, v52 = i, v53 = i, v54 = i, v55 = i; \n"+
" final long v56 = i, v57 = i, v58 = i, v59 = i, v60 = i, v61 = i, v62 = i; \n"+
" final long v63 = i, v64 = i, v65 = i, v66 = i, v67 = i, v68 = i, v69 = i; \n"+
" final long v70 = i, v71 = i, v72 = i, v73 = i, v74 = i, v75 = i, v76 = i; \n"+
" final long v77 = i, v78 = i, v79 = i, v80 = i, v81 = i, v82 = i, v83 = i; \n"+
" final long v84 = i, v85 = i, v86 = i, v87 = i, v88 = i, v89 = i, v90 = i; \n"+
" final long v91 = i, v92 = i, v93 = i, v94 = i, v95 = i, v96 = i, v97 = i; \n"+
" final long v98 = i, v99 = i, v100 = i, v101 = i, v102 = i, v103 = i, v104 = i; \n"+
" final long v105 = i, v106 = i, v107 = i, v108 = i, v109 = i, v110 = i, v111 = i; \n"+
" final long v112 = i, v113 = i, v114 = i, v115 = i, v116 = i, v117 = i, v118 = i; \n"+
" final long v119 = i, v120 = i, v121 = i, v122 = i, v123 = i, v124 = i, v125 = i; \n"+
" final long v126 = i; \n"+
" final int v127 = i; // int is already too many arg \n"+
" new X() { \n"+
" { \n"+
" System.out.println( \n"+
" v0 + v1 + v2 + v3 + v4 + v5 + v6 \n" +
" + v7 + v8 + v9 + v10 + v11 + v12 + v13 \n" +
" + v14 + v15 + v16 + v17 + v18 + v19 + v20 \n" +
" + v21 + v22 + v23 + v24 + v25 + v26 + v27 \n" +
" + v28 + v29 + v30 + v31 + v32 + v33 + v34 \n" +
" + v35 + v36 + v37 + v38 + v39 + v40 + v41 \n" +
" + v42 + v43 + v44 + v45 + v46 + v47 + v48 \n" +
" + v49 + v50 + v51 + v52 + v53 + v54 + v55 \n" +
" + v56 + v57 + v58 + v59 + v60 + v61 + v62 \n" +
" + v63 + v64 + v65 + v66 + v67 + v68 + v69 \n" +
" + v70 + v71 + v72 + v73 + v74 + v75 + v76 \n" +
" + v77 + v78 + v79 + v80 + v81 + v82 + v83 \n" +
" + v84 + v85 + v86 + v87 + v88 + v89 + v90 \n" +
" + v91 + v92 + v93 + v94 + v95 + v96 + v97 \n" +
" + v98 + v99 + v100 + v101 + v102 + v103 + v104 \n" +
" + v105 + v106 + v107 + v108 + v109 + v110 + v111 \n" +
" + v112 + v113 + v114 + v115 + v116 + v117 + v118 \n" +
" + v119 + v120 + v121 + v122 + v123 + v124 + v125 \n" +
" + v126); \n"+
" } \n"+
" }; \n"+
" } \n" +
"} \n"
},
"----------\n" +
"1. ERROR in X.java (at line 23)\n" +
" new X() { \n" +
" ^^^\n" +
"Too many synthetic parameters, emulated parameter val$v126 is exceeding the limit of 255 words eligible for method parameters\n" +
"----------\n",
JavacTestOptions.SKIP /* javac simply does not catch this case */);
}
// test too many synthetic arguments
public void test072() {
this.runConformTest(
new String[] {
"X.java",
"public class X { \n"+
" void foo(int i) { \n"+
" final long v0 = i, v1 = i, v2 = i, v3 = i, v4 = i, v5 = i, v6 = i; \n"+
" final long v7 = i, v8 = i, v9 = i, v10 = i, v11 = i, v12 = i, v13 = i; \n"+
" final long v14 = i, v15 = i, v16 = i, v17 = i, v18 = i, v19 = i, v20 = i; \n"+
" final long v21 = i, v22 = i, v23 = i, v24 = i, v25 = i, v26 = i, v27 = i; \n"+
" final long v28 = i, v29 = i, v30 = i, v31 = i, v32 = i, v33 = i, v34 = i; \n"+
" final long v35 = i, v36 = i, v37 = i, v38 = i, v39 = i, v40 = i, v41 = i; \n"+
" final long v42 = i, v43 = i, v44 = i, v45 = i, v46 = i, v47 = i, v48 = i; \n"+
" final long v49 = i, v50 = i, v51 = i, v52 = i, v53 = i, v54 = i, v55 = i; \n"+
" final long v56 = i, v57 = i, v58 = i, v59 = i, v60 = i, v61 = i, v62 = i; \n"+
" final long v63 = i, v64 = i, v65 = i, v66 = i, v67 = i, v68 = i, v69 = i; \n"+
" final long v70 = i, v71 = i, v72 = i, v73 = i, v74 = i, v75 = i, v76 = i; \n"+
" final long v77 = i, v78 = i, v79 = i, v80 = i, v81 = i, v82 = i, v83 = i; \n"+
" final long v84 = i, v85 = i, v86 = i, v87 = i, v88 = i, v89 = i, v90 = i; \n"+
" final long v91 = i, v92 = i, v93 = i, v94 = i, v95 = i, v96 = i, v97 = i; \n"+
" final long v98 = i, v99 = i, v100 = i, v101 = i, v102 = i, v103 = i, v104 = i; \n"+
" final long v105 = i, v106 = i, v107 = i, v108 = i, v109 = i, v110 = i, v111 = i; \n"+
" final long v112 = i, v113 = i, v114 = i, v115 = i, v116 = i, v117 = i, v118 = i; \n"+
" final long v119 = i, v120 = i, v121 = i, v122 = i, v123 = i, v124 = i, v125 = i; \n"+
" new X() { \n"+
" { \n"+
" System.out.println( \n"+
" v0 + v1 + v2 + v3 + v4 + v5 + v6 \n" +
" + v7 + v8 + v9 + v10 + v11 + v12 + v13 \n" +
" + v14 + v15 + v16 + v17 + v18 + v19 + v20 \n" +
" + v21 + v22 + v23 + v24 + v25 + v26 + v27 \n" +
" + v28 + v29 + v30 + v31 + v32 + v33 + v34 \n" +
" + v35 + v36 + v37 + v38 + v39 + v40 + v41 \n" +
" + v42 + v43 + v44 + v45 + v46 + v47 + v48 \n" +
" + v49 + v50 + v51 + v52 + v53 + v54 + v55 \n" +
" + v56 + v57 + v58 + v59 + v60 + v61 + v62 \n" +
" + v63 + v64 + v65 + v66 + v67 + v68 + v69 \n" +
" + v70 + v71 + v72 + v73 + v74 + v75 + v76 \n" +
" + v77 + v78 + v79 + v80 + v81 + v82 + v83 \n" +
" + v84 + v85 + v86 + v87 + v88 + v89 + v90 \n" +
" + v91 + v92 + v93 + v94 + v95 + v96 + v97 \n" +
" + v98 + v99 + v100 + v101 + v102 + v103 + v104 \n" +
" + v105 + v106 + v107 + v108 + v109 + v110 + v111 \n" +
" + v112 + v113 + v114 + v115 + v116 + v117 + v118 \n" +
" + v119 + v120 + v121 + v122 + v123 + v124 + v125); \n" +
" } \n"+
" }; \n"+
" } \n" +
" public static void main(String[] args) { \n"+
" System.out.print(\"SUCCESS\"); \n"+
" } \n"+
"} \n"
},
"SUCCESS");
}
/**
* verify error in synthetic access to constructor
* (ordering of parameters after moving outerlocals after user args)
*/
public void test073() {
this.runConformTest(
new String[] {
"X.java",
"public class X { \n" +
" public static void main(final String[] args) { \n" +
" class Local { \n" +
" private Local(String str){ \n" +
" Object o = args; \n" +
" System.out.println(str); \n" +
" } \n" +
" }; \n" +
" new Local(\"SUCCESS\"); \n" +
" } \n" +
"} \n"
},
"SUCCESS");
}
/**
* verify error in synthetic access to constructor - test collisions
* (ordering of parameters after moving outerlocals after user args)
*/
public void test074() {
this.runConformTest(
new String[] {
"X.java",
"public class X { \n" +
" public static void main(final String[] args) { \n" +
" class Local { \n" +
" public Local(String str, Local loc, String str2){ \n" + // collision
" } \n" +
" public Local(String str, Local loc){ \n" + // collision
" } \n" +
" private Local(String str){ \n" +
" Object o = args; \n" +
" System.out.println(str); \n" +
" } \n" +
" }; \n" +
" new Local(\"SUCCESS\"); \n" +
" } \n" +
"} \n"
},
"SUCCESS");
}
/**
* should not consider synthetic methods on binary types
*/
public void test075() {
this.runConformTest(
new String[] {
"X.java",
"public class X { \n" +
" public static void main(final String[] args) { \n" +
" System.out.println(\"SUCCESS\"); \n"+
" } \n"+
" private static void foo() { \n" +
" } \n" +
" A a = new A(); \n" +
" class A { \n" +
" private A() {} \n" +
" A(String s) { \n" +
" foo(); \n" +
" } \n" +
" A(int s) { \n" +
" foo(); \n" +
" } \n" +
" } \n" +
" class B extends A { \n" +
" B(){ \n" +
" super(); \n" +
" } \n" +
" } \n" +
"} \n"
},
"SUCCESS");
this.runNegativeTest(
new String[] {
"Y.java",
"public class Y { \n" +
" void foo(){ \n" +
" new X().new A(null); \n" +
" new X().access$0(); \n" +
" } \n"+
"} \n"
},
"----------\n" +
"1. ERROR in Y.java (at line 4)\n" +
" new X().access$0(); \n" +
" ^^^^^^^^\n" +
"The method access$0() is undefined for the type X\n" +
"----------\n",
null, // use default class-path
false); // do not flush previous output dir content
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=27413
* implicit enclosing instances
*/
public void test076() {
CompilerOptions options = new CompilerOptions(getCompilerOptions());
if (options.sourceLevel <= ClassFileConstants.JDK1_3) {
this.runNegativeTest(
new String[] {
"X.java",
"public class X { \n"+
" X(Object o){ \n"+
" class A { \n"+
" private A() { \n"+ // implicit enclosing instance in non-static context
" } \n"+
" } \n"+
" class B extends X { \n"+
" B() { \n"+
" super(new A(){ \n"+
" }); \n"+
" } \n"+
" } \n"+
" } \n"+
"} \n"
},
"----------\n" +
"1. ERROR in X.java (at line 9)\n" +
" super(new A(){ \n" +
" }); \n" +
" ^^^^^^^^^^^^^^^\n" +
"No enclosing instance of type X is available due to some intermediate constructor invocation\n" +
"----------\n" +
"2. WARNING in X.java (at line 9)\n" +
" super(new A(){ \n" +
" ^^^\n" +
"Access to enclosing constructor A() is emulated by a synthetic accessor method\n" +
"----------\n");
return;
}
if (options.sourceLevel <= ClassFileConstants.JDK1_4) {
this.runNegativeTest(
new String[] {
"X.java",
"public class X { \n"+
" X(Object o){ \n"+
" class A { \n"+
" private A() { \n"+ // implicit enclosing instance in non-static context
" } \n"+
" } \n"+
" class B extends X { \n"+
" B() { \n"+
" super(new A(){ \n"+
" }); \n"+
" } \n"+
" } \n"+
" } \n"+
"} \n"
},
"----------\n" +
"1. ERROR in X.java (at line 9)\n" +
" super(new A(){ \n" +
" }); \n" +
" ^^^^^^^^^^^^^^^\n" +
"No enclosing instance of type X is available due to some intermediate constructor invocation\n" +
"----------\n");
return;
}
this.runConformTest(
new String[] {
"X.java",
"public class X { \n"+
" X(Object o){ \n"+
" class A { \n"+
" private A() { \n"+ // implicit enclosing instance in non-static context
" } \n"+
" } \n"+
" class B extends X { \n"+
" B() { \n"+
" super(new A(){ \n"+
" }); \n"+
" } \n"+
" } \n"+
" } \n"+
"} \n"
},
"");
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=27413
* implicit enclosing instances
*/
public void test077() {
this.runConformTest(
new String[] {
"X.java",
"public class X { \n"+
" public static void main(String[] args){ \n"+
" System.out.println(\"SUCCESS\"); \n"+
" } \n" +
" X(Object o){ \n"+
" } \n" +
" static void foo() { \n"+
" class A { \n"+ // no implicit enclosing in STATIC context
" private A() { \n"+
" } \n"+
" } \n"+
" class B extends X { \n"+
" B() { \n"+
" super(new A(){ \n"+
" }); \n"+
" } \n"+
" } \n"+
" } \n"+
"} \n"
},
"SUCCESS");
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=27413
* implicit enclosing instances
*/
public void test078() {
CompilerOptions options = new CompilerOptions(getCompilerOptions());
if (options.sourceLevel <= ClassFileConstants.JDK1_3) {
this.runNegativeTest(
new String[] {
"X.java",
"public class X { \n"+
" X(Object o){ \n"+
" class A { \n"+
" private A() { \n"+ // implicit enclosing instance in non-static context
" } \n"+
" } \n"+
" class B extends X { \n"+
" B() { \n"+
" super(new A(){ \n"+
" void foo() { System.out.println(X.this); } \n"+
" }); \n"+
" } \n"+
" } \n"+
" } \n"+
"} \n"
},
"----------\n" +
"1. ERROR in X.java (at line 9)\n" +
" super(new A(){ \n" +
" void foo() { System.out.println(X.this); } \n" +
" }); \n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
"No enclosing instance of type X is available due to some intermediate constructor invocation\n" +
"----------\n" +
"2. WARNING in X.java (at line 9)\n" +
" super(new A(){ \n" +
" ^^^\n" +
"Access to enclosing constructor A() is emulated by a synthetic accessor method\n" +
"----------\n" +
"3. ERROR in X.java (at line 10)\n" +
" void foo() { System.out.println(X.this); } \n" +
" ^^^^^^\n" +
"No enclosing instance of the type X is accessible in scope\n" +
"----------\n");
return;
}
if (options.sourceLevel <= ClassFileConstants.JDK1_4) {
this.runNegativeTest(
new String[] {
"X.java",
"public class X { \n"+
" X(Object o){ \n"+
" class A { \n"+
" private A() { \n"+ // implicit enclosing instance in non-static context
" } \n"+
" } \n"+
" class B extends X { \n"+
" B() { \n"+
" super(new A(){ \n"+
" void foo() { System.out.println(X.this); } \n"+
" }); \n"+
" } \n"+
" } \n"+
" } \n"+
"} \n"
},
"----------\n" +
"1. ERROR in X.java (at line 9)\n" +
" super(new A(){ \n" +
" void foo() { System.out.println(X.this); } \n" +
" }); \n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
"No enclosing instance of type X is available due to some intermediate constructor invocation\n" +
"----------\n" +
"2. ERROR in X.java (at line 10)\n" +
" void foo() { System.out.println(X.this); } \n" +
" ^^^^^^\n" +
"No enclosing instance of the type X is accessible in scope\n" +
"----------\n");
return;
}
this.runConformTest(
new String[] {
"X.java",
"public class X { \n"+
" X(Object o){ \n"+
" class A { \n"+
" private A() { \n"+ // implicit enclosing instance in non-static context
" } \n"+
" } \n"+
" class B extends X { \n"+
" B() { \n"+
" super(new A(){ \n"+
" void foo() { System.out.println(X.this); } \n"+
" }); \n"+
" } \n"+
" } \n"+
" } \n"+
"} \n"
},
"");
}
/*
* Check that X.this is actually bound to an X, and not innermost compatible type (Z)
*/
public void test079() {
this.runConformTest(
new String[] {
"X.java",
"public class X { \n"+
" public static void main(String[] arguments) { \n"+
" new X().new Y().new Z().bar(); \n"+
" } \n"+
" String foo() { return \"X-foo\"; } \n"+
" class Y extends X { \n"+
" String foo() { return \"Y-foo\"; } \n"+
" class Z extends Y { \n"+
" Z(){ \n"+
" X.this.super(); \n"+
" } \n"+
" String foo() { return \"Z-foo\"; } \n"+
" void bar () { \n"+
" System.out.println(X.this.foo()); \n"+
" } \n"+
" } \n"+
" } \n"+
"} \n"
},
"X-foo");
}
public void test080() { // verified as conform
this.runConformTest(
new String[] {
"X.java",
"public class X { \n"+
" public static void main(String[] arguments) { \n"+
" new X().new C(); \n"+
" } \n"+
" int m() { \n"+
" System.out.println(\"SUCCESS\"); \n"+
" return 1; \n"+
" } \n"+
" class C extends B { \n"+
" C(int j){} \n"+
" C(){ \n"+
" this(X.this.m()); \n"+
" } \n"+
" } \n"+
"} \n"+
"class B extends X { \n"+
"} \n"
},
"SUCCESS");
}
public void test081() {
this.runConformTest(
new String[] {
"p/X.java",
"package p; \n"+
"public class X { \n"+
" public static void main(String[] arguments) { \n"+
" new X().new C(); \n"+
" } \n"+
" int m() { \n"+
" System.out.println(\"SUCCESS\"); \n"+
" return 1; \n"+
" } \n"+
" class C extends q.B { \n"+
" C(int j){} \n"+
" C(){ \n"+
" this(m()); \n"+ // only X.this can see m()
" } \n"+
" } \n"+
"} \n",
"q/B.java",
"package q; \n"+
"public class B extends p.X { \n"+
"} \n"
},
"SUCCESS");
}
/*
* Default constructor for Z, will use enclosing 'this' as default-value for enclosing instance for super().
*/
public void test083() {
this.runConformTest(
new String[] {
"X.java",
"public class X { \n"+
" public static void main(String[] arguments) { \n"+
" new X().new Y().new Z().bar(); \n"+
" } \n"+
" String foo() { return \"X-foo\"; } \n"+
" class Y extends X { \n"+
" String foo() { return \"Y-foo\"; } \n"+
" class Z { \n"+
" Z(){ \n"+
" //X.this.super(); \n"+
" } \n"+
" String foo() { return \"Z-foo\"; } \n"+
" void bar () { \n"+
" System.out.println(X.this.foo()); \n"+
" } \n"+
" } \n"+
" } \n"+
"} \n"
},
"X-foo");
}
public void test084() {
this.runConformTest(
new String[] {
"Foo.java",
"public class Foo { \n"+
" public static void main(String[] arguments) { \n"+
" new Foo(null); \n"+
" } \n"+
" Foo(int i){} \n"+
" Foo(Object o){ \n"+
" class A { \n"+
" private A() { \n"+
" } \n"+
" } \n"+
" class B extends Foo { \n"+
" B() { \n"+
" super(0); \n"+
" new A(){ \n"+
" void foo() { \n"+
" System.out.println(Foo.this.getClass().getName()); \n"+
" } \n"+
" }.foo(); \n"+
" } \n"+
" } \n"+
" new B(); \n"+
" } \n"+
"} \n",
},
"Foo");
}
public void test085() {
CompilerOptions options = new CompilerOptions(getCompilerOptions());
if (options.sourceLevel < ClassFileConstants.JDK1_5) {
this.runNegativeTest(
new String[] {
"X.java",
"public class X { \n"+
" int m() { \n"+
" return 1; \n"+
" } \n"+
" class C extends B { \n"+
" C(int j){} \n"+
" C(){ \n"+
" this( \n"+
" new B(){ \n"+
" X x = X.this; \n"+
" int m(){ \n"+
" return 1; \n"+
" } \n"+
" }.m()); \n"+
" } \n"+
" } \n"+
"} \n"+
"class B extends X { \n"+
"} \n"
},
"----------\n" +
"1. ERROR in X.java (at line 10)\n" +
" X x = X.this; \n" +
" ^^^^^^\n" +
"No enclosing instance of the type X is accessible in scope\n" +
"----------\n");
return;
}
this.runConformTest(
new String[] {
"X.java",
"public class X { \n"+
" int m() { \n"+
" return 1; \n"+
" } \n"+
" class C extends B { \n"+
" C(int j){} \n"+
" C(){ \n"+
" this( \n"+
" new B(){ \n"+
" X x = X.this; \n"+
" int m(){ \n"+
" return 1; \n"+
" } \n"+
" }.m()); \n"+
" } \n"+
" } \n"+
"} \n"+
"class B extends X { \n"+
"} \n"
},
"");
}
public void test086() {
this.runConformTest(
new String[] {
"X.java",
"public class X { \n"+
" public static void main(String[] arguments) { \n"+
" new X().new C(); \n"+
" } \n"+
" int m() { \n"+
" return 1; \n"+
" } \n"+
" class C extends B { \n"+
" C(int j){} \n"+
" C(){ \n"+
" this( \n"+
" new B(){ \n"+
" int m(){ \n"+
" System.out.println(\"SUCCESS\"); \n"+
" return 1; \n"+
" } \n"+
" }.m()); \n"+
" } \n"+
" } \n"+
"} \n"+
"class B extends X { \n"+
"} \n"
},
"SUCCESS");
}
public void test087() {
CompilerOptions options = new CompilerOptions(getCompilerOptions());
if (options.complianceLevel <= ClassFileConstants.JDK1_4) {
this.runConformTest(
new String[] {
"X.java",
"public class X { \n"+
" public static void main(String[] arguments) { \n"+
" new X().f(); \n"+
" } \n"+
" void f () { \n"+
" class C { \n"+
" C() { \n"+
" System.out.println(\"[\"+X.this.getClass().getName()+\"]\"); \n"+
" } \n"+
" } \n"+
" class N extends X { \n"+
" { new C(); } // selects N.this, not O.this \n"+
" } \n"+
" new N(); \n"+
" } \n"+
"} \n"
},
"[X$1$N]");
return;
}
this.runConformTest(
true,
new String[] {
"X.java",
"public class X {\n"+
" public static void main(String[] arguments) {\n"+
" new X().f();\n"+
" }\n"+
" void f () {\n"+
" class C {\n"+
" C() {\n"+
" System.out.println(\"[\"+X.this.getClass().getName()+\"]\"); \n"+
" }\n"+
" }\n"+
" class N extends X {\n"+
" { new C(); } // selects N.this, not O.this \n"+
" }\n"+
" new N();\n"+
" } \n"+
"}\n"
},
"",
"[X$1N]", // should be [X] indeed
"",
JavacTestOptions.EclipseHasABug.EclipseBug235809);
}
public void test088() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X { \n"+
" class Middle { \n"+
" class Inner { \n"+
" } \n"+
" } \n"+
" class M extends Middle.Inner { \n"+
" } \n"+
"} \n"
},
"----------\n" +
"1. ERROR in X.java (at line 6)\n" +
" class M extends Middle.Inner { \n" +
" ^\n" +
"No enclosing instance of type X.Middle is accessible to invoke the super constructor. Must define a constructor and explicitly qualify its super constructor invocation with an instance of X.Middle (e.g. x.super() where x is an instance of X.Middle).\n" +
"----------\n");
}
public void test089() {
this.runConformTest(
new String[] {
"X.java",
"public class X { \n"+
" static class Middle { \n"+
" static class Inner { \n"+
" } \n"+
" } \n"+
" class M extends Middle.Inner { \n"+
" } \n"+
" public static void main(String[] arguments) { \n"+
" new X().new M(); \n" +
" System.out.println(\"SUCCESS\"); \n"+
" } \n"+
"} \n"
},
"SUCCESS");
}
public void test090() {
this.runConformTest(
new String[] {
"X.java",
"public class X { \n"+
" void foo() { \n"+
" class Middle { \n"+
" class Inner { \n"+
" } \n"+
" } \n"+
" class M extends Middle.Inner { \n"+
" M() { \n"+
" new Middle().super(); \n"+
" } \n"+
" } \n"+
" } \n"+
" public static void main(String[] arguments) { \n"+
" new X().foo(); \n" +
" System.out.println(\"SUCCESS\"); \n"+
" } \n"+
"} \n"
},
"SUCCESS");
}
// ensure that local member empty constructor gets implicit constructor call
public void test091() {
this.runConformTest(
new String[] {
"X.java",
"public class X { \n"+
" Object o = new Object() { \n"+
" class Inner { \n"+
" private Inner() {} \n"+
" } \n"+
" }.new Inner(){}; \n"+
" public static void main(String[] arguments) { \n"+
" new X(); \n"+
" System.out.println(\"SUCCESS\"); \n"+
" } \n"+
"} \n",
},
"SUCCESS");
}
/**
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=29636
* ensure first anonymous is X$1(extends X), last is X$2(extends A)
*/
public void test092() {
this.runConformTest(
new String[] {
"X.java",
"public class X { \n"+
" class A { \n"+
" } \n"+
" public static void main(String[] arguments) { \n"+
" System.out.println(\"[\"+new X(){}.new A(){}.getClass().getName()+\"]\"); \n"+
" } \n"+
"} \n",
},
"[X$2]");
}
public void test093() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X { \n"+
" public static void main(String[] arguments) { \n"+
" System.out.println(X.this); \n"+
" } \n"+
"} \n",
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" System.out.println(X.this); \n" +
" ^^^^^^\n" +
"Cannot use this in a static context\n" +
"----------\n");
}
public void test094() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X { \n"+
" class Y {} \n"+
" public static void main(String[] arguments) { \n"+
" int i = 0; \n"+
" i.new Y(); \n"+
" } \n"+
"} \n",
},
"----------\n" +
"1. ERROR in X.java (at line 5)\n" +
" i.new Y(); \n" +
" ^\n" +
"Cannot use an expression of the type int as a valid enclosing instance\n" +
"----------\n");
}
//http://bugs.eclipse.org/bugs/show_bug.cgi?id=30280
public void test095() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X { \n"+
" class Y {} \n"+
" public static void main(String[] arguments) { \n"+
" int i = 0; \n"+
" i.new Y(){}; \n"+
" } \n"+
"} \n",
},
"----------\n" +
"1. ERROR in X.java (at line 5)\n" +
" i.new Y(){}; \n" +
" ^\n" +
"Cannot use an expression of the type int as a valid enclosing instance\n" +
"----------\n");
}
public void test096() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X { \n"+
" static class Y {} \n"+
" void foo() { \n"+
" new X().new Y(){}; \n"+
" } \n"+
"} \n",
},
"----------\n" +
"1. ERROR in X.java (at line 4)\n" +
" new X().new Y(){}; \n" +
" ^^^^^^^\n" +
"Illegal enclosing instance specification for type X.Y\n" +
"----------\n");
}
/**
* http://bugs.eclipse.org/bugs/show_bug.cgi?id=35456
*/
public void test097() {
this.runConformTest(
new String[] {
"apples/Base.java",
"package apples; \n" +
"public class Base { \n"+
" protected String foo = \"SUCCESS\"; \n" +
" public static void main(String[] args){ \n"+
" new oranges.Derived().new Inner(new oranges.Derived()).bug(); \n"+
" } \n"+
"} \n",
"oranges/Derived.java",
"package oranges; \n"+
"import apples.*; \n"+
"public class Derived extends Base { \n"+
" public class Inner { \n"+
" Derived c = null; \n"+
" public Inner(Derived c) { \n"+
" this.c = c; \n"+
" } \n"+
" public void bug() { \n"+
" // The following reference to Base.foo causes the \n"+
" // VerifyError \n"+
" System.out.println(c.foo); \n"+
" } \n"+
" } \n"+
"} \n",
},
"SUCCESS");
}
/**
* http://bugs.eclipse.org/bugs/show_bug.cgi?id=33751
*/
public void test098() {
this.runConformTest(
true,
new String[] {
"X.java",
"public class X { \n"+
" public static void main(String[] args) { \n"+
" System.out.println(\"first inner class = \" + new Object() {}.getClass()); \n"+
" if (true) { \n"+
" System.out.println(\"Always true\"); \n"+
" } else { \n"+
" System.out.println(\"unreachable inner class = \" + new Object() {}.getClass()); \n"+
" } \n"+
" System.out.println(\"last inner class = \" + new Object() {}.getClass()); \n"+
" } \n"+
"} \n",
},
"----------\n" +
"1. WARNING in X.java (at line 6)\n" +
" } else { \n" +
" System.out.println(\"unreachable inner class = \" + new Object() {}.getClass()); \n" +
" } \n" +
" ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n" +
"Dead code\n" +
"----------\n",
"first inner class = class X$1\n" +
"Always true\n" +
"last inner class = class X$2",
"",
JavacTestOptions.SKIP /* optimization that we chose deliberately */);
}
/**
* http://bugs.eclipse.org/bugs/show_bug.cgi?id=40240
*/
public void test099() {
this.runConformTest(
new String[] {
"Y.java",
"public class Y { \n" +
" public static void main(String[] args) { \n" +
" class Local {} \n"+
" System.out.println(\"SUCCESS\"); \n" +
" } \n" +
"} \n",
},
"SUCCESS");
CompilerOptions options = new CompilerOptions(getCompilerOptions());
if (options.complianceLevel <= ClassFileConstants.JDK1_4) {
this.runNegativeTest(
new String[] {
"X.java",
"public class X { \n" +
" public static void main(String argv[]) { \n" +
" Object a = new Y$1$Local(); // compile-time error \n" +
" } \n" +
"} \n",
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" Object a = new Y$1$Local(); // compile-time error \n" +
" ^^^^^^^^^\n" +
"The nested type Y$1$Local cannot be referenced using its binary name\n" +
"----------\n",
null,
false);
return;
}
this.runNegativeTest(
false,
new String[] {
"X.java",
"public class X { \n" +
" public static void main(String argv[]) { \n" +
" Object a = new Y$1Local(); // compile-time error \n" +
" } \n" +
"} \n",
},
null,
null,
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" Object a = new Y$1Local(); // compile-time error \n" +
" ^^^^^^^^\n" +
"The nested type Y$1Local cannot be referenced using its binary name\n" +
"----------\n",
JavacTestOptions.JavacHasABug.JavacBug4094180);
}
/*
* Check that member type allocation is granted access to compatible enclosing instance available as constructor argument
*/
public void test101() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" X(Object o) {\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new X(null).new M(null);\n" +
" System.out.println(\"SUCCESS\");\n" +
" }\n" +
" class M extends Top {\n" + // no issue if M is unrelated to X
" M() {\n" +
" super(null);\n" +
" }\n" +
" M(Object o) {\n" +
" super(new M(){});\n" +
" }\n" +
" }\n" +
" class Top {\n" +
" Top(Object o) {\n" +
" }\n" +
" }\n" +
"}\n",
},
"SUCCESS");
}
/*
* Check that direct member type allocation is denied access to compatible enclosing instance available as constructor argument
*/
public void test102() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" X(Object o) {\n" +
" }\n" +
" class M extends X {\n" +
" M() {\n" +
" super(null); //1\n" +
" }\n" +
" M(Object o) {\n" +
" super(new M());//2\n" +
" }\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 9)\n" +
" super(new M());//2\n" +
" ^^^^^^^\n" +
"No enclosing instance of type X is available due to some intermediate constructor invocation\n" +
"----------\n");
}
/*
* Check that indirect member type allocation is denied access to compatible enclosing instance available as constructor argument
*/
public void test104() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" X(Object o) {\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new X(null).new M(null);\n" +
" System.out.println(\"SUCCESS\");\n" +
" }\n" +
" class N extends X {\n" +
" N() {\n" +
" super(null); //1\n" +
" }\n" +
" N(Object o) {\n" +
" super(new M());//2\n" +
" }\n" +
" }\n" +
" class M extends X {\n" +
" M() {\n" +
" super(null); //3\n" +
" }\n" +
" M(Object o) {\n" +
" super(new M());//4\n" +
" }\n" +
" }\n" +
"}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 13)\n" +
" super(new M());//2\n" +
" ^^^^^^^\n" +
"No enclosing instance of type X is available due to some intermediate constructor invocation\n" +
"----------\n" +
"2. ERROR in X.java (at line 21)\n" +
" super(new M());//4\n" +
" ^^^^^^^\n" +
"No enclosing instance of type X is available due to some intermediate constructor invocation\n" +
"----------\n");
}
public void test107() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X { \n" +
" public static class Y { \n" +
" public Y(Z z) {} \n" +
" } \n" +
" public interface Z {} \n" +
"} \n" +
"\n" +
"class A { \n" +
" private static class B extends X.Y implements X.Z { \n" +
" B(A a) { \n" +
" super(B.this); \n" +
" } \n" +
" } \n" +
"} ",
},
"----------\n" +
"1. ERROR in X.java (at line 11)\n" +
" super(B.this); \n" +
" ^^^^^^\n" +
"Cannot refer to \'this\' nor \'super\' while explicitly invoking a constructor\n" +
"----------\n");
}
// javac 1.4.2 incorrectly accepts it, jikes rejects it as we do
public void test108() {
CompilerOptions options = new CompilerOptions(getCompilerOptions());
if (options.sourceLevel == ClassFileConstants.JDK1_4) { // 1.3 and 1.5 both accept it
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" {\n" +
" class Local1 extends X {\n" +
" }\n" +
" class Local2 extends Local1 {\n" +
" }\n" +
" }\n" +
"}",
},
"----------\n" +
"1. ERROR in X.java (at line 5)\n" +
" class Local2 extends Local1 {\n" +
" ^^^^^^\n" +
"No enclosing instance of type X is available due to some intermediate constructor invocation\n" +
"----------\n");
return;
}
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" {\n" +
" class Local1 extends X {\n" +
" }\n" +
" class Local2 extends Local1 {\n" +
" }\n" +
" }\n" +
"}",
},
"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=44538
public void test109() {
CompilerOptions options = new CompilerOptions(getCompilerOptions());
if (options.sourceLevel == ClassFileConstants.JDK1_4) { // 1.3 and 1.5 both accept it
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public void bar() {\n" +
" class C extends X {\n" +
" public void foo() {\n" +
" \n" +
" }\n" +
" }\n" +
" X a= new X() {\n" +
" public void foo() {\n" +
" \n" +
" }\n" +
" };\n" +
" class D extends C {\n" +
" \n" +
" };\n" +
" }\n" +
"}"
},
"----------\n" +
"1. ERROR in X.java (at line 13)\n" +
" class D extends C {\n" +
" ^\n" +
"No enclosing instance of type X is available due to some intermediate constructor invocation\n" +
"----------\n");
return;
}
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public void bar() {\n" +
" class C extends X {\n" +
" public void foo() {\n" +
" \n" +
" }\n" +
" }\n" +
" X a= new X() {\n" +
" public void foo() {\n" +
" \n" +
" }\n" +
" };\n" +
" class D extends C {\n" +
" \n" +
" };\n" +
" }\n" +
"}"
},
"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=44715 - NPE when generating fake reachable local type
public void test110() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String[] args) {\n" +
" if (true) {\n" +
" System.out.println(\"SUCCESS\");\n" +
" return;\n" +
" }\n" +
" class ShouldNotBeGenerated {\n" +
" }\n" +
" }\n" +
"}"
},
"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=44715 - variation with anonymous type
public void test111() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String[] args) {\n" +
" if (true) {\n" +
" System.out.println(\"SUCCESS\");\n" +
" return;\n" +
" }\n" +
" new Object() {}; \n" +
" }\n" +
"}"
},
"SUCCESS");
}
public void test112() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" private Object t;\n" +
" X(Object t) {\n" +
" this.t = t;\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new X(\"OUTER\").bar();\n" +
" }\n" +
" void bar() {\n" +
" new X(this) {\n" +
" void run() {\n" +
" new Object() {\n" +
" void run() {\n" +
" System.out.println(t);\n" +
" }\n" +
" }.run();\n" +
" }\n" +
" }.run();\n" +
" }\n" +
"}\n"
},
"OUTER");
}
public void test113() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" private Object t;\n" +
" X(Object t) {\n" +
" this.t = t;\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new X(\"OUTER\").bar();\n" +
" }\n" +
" void bar() {\n" +
" new X(this) {\n" +
" void run() {\n" +
" new Object() {\n" +
" void run() {\n" +
" try { \n" +
" X x = (X) t; \n" +
" } catch(ClassCastException e){ \n" +
" System.out.println(\"SUCCESS\");\n" +
" } \n" +
" }\n" +
" }.run();\n" +
" }\n" +
" }.run();\n" +
" }\n" +
"}\n"
},
"SUCCESS");
}
public void test114() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" String s;\n" +
" X(String s) {\n" +
" this.s = s;\n" +
" }\n" +
" void foo() {\n" +
" class L extends X {\n" +
" L() {\n" +
" super(s);\n" +
" System.out.println(s); \n" +
" }\n" +
" }\n" +
" new L();\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new X(\"SUCCESS\").foo(); \n" +
" }\n" +
"}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 9)\n" +
" super(s);\n" +
" ^\n" +
"Cannot refer to an instance field s while explicitly invoking a constructor\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=58606
public void test115() {
this.runConformTest(
new String[] {
"p2/X2.java",
"package p2;\n" +
"public class X2 extends p1.X1 {\n" +
" private void foo() {\n" +
" new p1.X1.M1() {\n" +
" public void bar() {\n" +
" System.out.print(X2.this.field);\n" +
" X2.this.doit();\n" +
" }\n" +
" }.bar();\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" X2 t2 = new X2();\n" +
" t2.foo();\n" +
" }\n" +
"}",
"p1/X1.java",
"package p1;\n" +
"public class X1 {\n" +
" public abstract class M1 {\n" +
" public abstract void bar();\n" +
" }\n" +
" protected static String field = \"SUCC\";\n" +
" protected static void doit() {\n" +
" System.out.println(\"ESS\");\n" +
" }\n" +
"}",
},
"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=68698
public void test116() {
this.runNegativeTest(
new String[] {
"X.java",
"class Display {\n" +
" public interface Bla {\n" +
" void a();\n" +
" }\n" +
"}\n" +
"public class X {\n" +
" void aMethod() {\n" +
" Display display = null;\n" +
" display.new Bla() {\n" +
" };\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 9)\n" +
" display.new Bla() {\n" +
" ^^^^^^^\n" +
"Illegal enclosing instance specification for type Display.Bla\n" +
"----------\n" +
"2. ERROR in X.java (at line 9)\n" +
" display.new Bla() {\n" +
" ^^^^^\n" +
"The type new Display.Bla(){} must implement the inherited abstract method Display.Bla.a()\n" +
"----------\n");
}
public void test117() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" \n" +
" public static void main(String[] args) {\n" +
" new X().bar();\n" +
" }\n" +
" void bar() {\n" +
" new X(){\n" +
" void baz() {\n" +
" new M();\n" +
" }\n" +
" }.baz();\n" +
" }\n" +
" class M {\n" +
" M() {\n" +
" System.out.println(\"SUCCESS\");\n" +
" }\n" +
" }\n" +
"}\n",
},
"SUCCESS");
}
public void test118() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" void foo() {}\n" +
" class M {\n" +
" M(Object o) {}\n" +
" M() {\n" +
" this(new Object() {\n" +
" void baz() {\n" +
" foo();\n" +
" bar();\n" +
" }\n" +
" });\n" +
" new Object() {\n" +
" void baz() {\n" +
" foo();\n" +
" bar();\n" +
" }\n" +
" };\n" +
" }\n" +
" void bar() {}\n" +
" void baz() {\n" +
" new Object() {\n" +
" void baz() {\n" +
" foo();\n" +
" bar();\n" +
" }\n" +
" };\n" +
" }\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 9)\n" +
" bar();\n" +
" ^^^\n" +
"Cannot refer to an instance method while explicitly invoking a constructor\n" +
"----------\n");
}
public void test119() {
CompilerOptions options = new CompilerOptions(getCompilerOptions());
if (options.sourceLevel < ClassFileConstants.JDK1_5) {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String[] args) {\n" +
" new X().new M();\n" +
" }\n" +
" void foo(String s) { System.out.print(\"<foo:\"+s+\">\"); }\n" +
" class M {\n" +
" M(Runnable r) { r.run(); }\n" +
" M() {\n" +
" this(new Runnable() {\n" +
" public void run() {\n" +
" foo(\"0\");\n" +
" new Object() {\n" +
" void baz() {\n" +
"// foo(\"1\");\n" +
" }\n" +
" };\n" +
" class Local {\n" +
" void baz() {\n" +
"// foo(\"2\");\n" +
" }\n" +
" } \n" +
" new Local();\n" +
" }\n" +
" });\n" +
" new Object() {\n" +
" void baz() {\n" +
" foo(\"3\");\n" +
" bar(\"3\");\n" +
" }\n" +
" }.baz();\n" +
" }\n" +
" void bar(String s) { System.out.print(\"<bar:\"+s+\">\"); }\n" +
" void baz() {\n" +
" new Object() {\n" +
" void baz() {\n" +
" foo(\"4\");\n" +
" bar(\"4\");\n" +
" }\n" +
" };\n" +
" }\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 11)\n" +
" foo(\"0\");\n" +
" ^^^^^^^^\n" +
"No enclosing instance of the type X is accessible in scope\n" +
"----------\n");
return;
}
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String[] args) {\n" +
" new X().new M();\n" +
" }\n" +
" void foo(String s) { System.out.print(\"<foo:\"+s+\">\"); }\n" +
" class M {\n" +
" M(Runnable r) { r.run(); }\n" +
" M() {\n" +
" this(new Runnable() {\n" +
" public void run() {\n" +
" foo(\"0\");\n" +
" new Object() {\n" +
" void baz() {\n" +
"// foo(\"1\");\n" +
" }\n" +
" };\n" +
" class Local {\n" +
" void baz() {\n" +
"// foo(\"2\");\n" +
" }\n" +
" } \n" +
" new Local();\n" +
" }\n" +
" });\n" +
" new Object() {\n" +
" void baz() {\n" +
" foo(\"3\");\n" +
" bar(\"3\");\n" +
" }\n" +
" }.baz();\n" +
" }\n" +
" void bar(String s) { System.out.print(\"<bar:\"+s+\">\"); }\n" +
" void baz() {\n" +
" new Object() {\n" +
" void baz() {\n" +
" foo(\"4\");\n" +
" bar(\"4\");\n" +
" }\n" +
" };\n" +
" }\n" +
" }\n" +
"}\n",
},
"<foo:0><foo:3><bar:3>");
}
public void test120() {
CompilerOptions options = new CompilerOptions(getCompilerOptions());
if (options.sourceLevel < ClassFileConstants.JDK1_5) {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" void foo() {}\n" +
" class M {\n" +
" M(Object o) {}\n" +
" M() {\n" +
" this(new Object() {\n" +
" void baz() {\n" +
" new Object() {\n" +
" void baz() {\n" +
" foo(); //0\n" +
" }\n" +
" };\n" +
" class Local {\n" +
" void baz() {\n" +
" foo(); //1\n" +
" }\n" +
" }\n" +
" new Local();\n" +
" foo();//2\n" +
" }\n" +
" });\n" +
" new Object() {\n" +
" void baz() {\n" +
" foo();//3\n" +
" bar();\n" +
" }\n" +
" };\n" +
" }\n" +
" void bar() {}\n" +
" void baz() {\n" +
" new Object() {\n" +
" void baz() {\n" +
" foo();//4\n" +
" bar();\n" +
" }\n" +
" };\n" +
" }\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 10)\n" +
" foo(); //0\n" +
" ^^^^^\n" +
"No enclosing instance of the type X is accessible in scope\n" +
"----------\n" +
"2. ERROR in X.java (at line 15)\n" +
" foo(); //1\n" +
" ^^^^^\n" +
"No enclosing instance of the type X is accessible in scope\n" +
"----------\n" +
"3. ERROR in X.java (at line 19)\n" +
" foo();//2\n" +
" ^^^^^\n" +
"No enclosing instance of the type X is accessible in scope\n" +
"----------\n");
return;
}
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" void foo() {}\n" +
" class M {\n" +
" M(Object o) {}\n" +
" M() {\n" +
" this(new Object() {\n" +
" void baz() {\n" +
" class Local {\n" +
" void baz() {\n" +
" foo(); //1\n" +
" }\n" +
" }\n" +
" new Local();\n" +
" foo();//2\n" +
" }\n" +
" });\n" +
" new Object() {\n" +
" void baz() {\n" +
" foo();//3\n" +
" bar();\n" +
" }\n" +
" };\n" +
" }\n" +
" void bar() {}\n" +
" void baz() {\n" +
" new Object() {\n" +
" void baz() {\n" +
" foo();//4\n" +
" bar();\n" +
" }\n" +
" };\n" +
" }\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 10)\n" +
" foo(); //1\n" +
" ^^^^^\n" +
"No enclosing instance of the type X is accessible in scope\n" +
"----------\n");
}
public void test121() {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" X(Object o) {\n" +
" }\n" +
" class M extends X {\n" +
" M() {\n" +
" super(null); //1\n" +
" }\n" +
" M(Object o) {\n" +
" super(new X(null){});//2\n" +
" }\n" +
" }\n" +
"}\n",
},
"");
}
public void _test122() {
CompilerOptions options = new CompilerOptions(getCompilerOptions());
if (options.sourceLevel < ClassFileConstants.JDK1_5) {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String[] args) {\n" +
" new X().new M();\n" +
" }\n" +
" void foo(String s) { System.out.print(\"<foo:\"+s+\">\"); }\n" +
" class M {\n" +
" M(Runnable r) { r.run(); }\n" +
" M() {\n" +
" this(new Runnable() {\n" +
" {\n" +
" foo(\"0\");\n" +
" bar(\"0\");\n" +
" }\n" +
" public void run() {\n" +
" }\n" +
" });\n" +
" }\n" +
" void bar(String s) { System.out.print(\"<bar:\"+s+\">\"); }\n" +
" }\n" +
"}\n",
},
"----------\n" +
"cannot access foo(0)\n" +
"----------\n" +
"2. ERROR in X.java (at line 12)\n" +
" bar(\"0\");\n" +
" ^^^\n" +
"Cannot refer to an instance method while explicitly invoking a constructor\n" +
"----------\n");
return;
}
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String[] args) {\n" +
" new X().new M();\n" +
" }\n" +
" void foo(String s) { System.out.print(\"<foo:\"+s+\">\"); }\n" +
" class M {\n" +
" M(Runnable r) { r.run(); }\n" +
" M() {\n" +
" this(new Runnable() {\n" +
" {\n" +
" foo(\"0\");\n" +
" bar(\"0\");\n" +
" }\n" +
" public void run() {\n" +
" }\n" +
" });\n" +
" }\n" +
" void bar(String s) { System.out.print(\"<bar:\"+s+\">\"); }\n" +
" }\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 12)\n" +
" bar(\"0\");\n" +
" ^^^\n" +
"Cannot refer to an instance method while explicitly invoking a constructor\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=110182 - variation
public void test123() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"class Y {\n" +
" public static final boolean b = false;\n" +
"}\n" +
"public class X {\n" +
" private static Y y = new Y(); \n" +
" private static Object o = new Object(); \n" +
"\n" +
" static class Z {\n" +
" Z() {\n" +
" if (y.b) {\n" +
" System.out.println(\"dead code\");\n" +
" }\n" +
" }\n" +
" public int bar() {\n" +
" if (y.b) {\n" +
" System.out.println(\"dead code\");\n" +
" }\n" +
" System.out.println(\"bar\");\n" +
" return 0;\n" +
" }\n" +
" }\n" +
" static int foo() {\n" +
" synchronized(o) { \n" +
" Z z = new Z();\n" +
" return z.bar();\n" +
" }\n" +
" }\n" +
" \n" +
" public static void main(String[] args) {\n" +
" foo();\n" +
" }\n" +
"}\n",
},
"bar");
String nestHost = "";
CompilerOptions options = new CompilerOptions(getCompilerOptions());
if (options.complianceLevel >= ClassFileConstants.JDK11) {
nestHost = "\n" +
"Nest Host: #32 X\n";
}
// ensure synthetic access method got generated for enclosing field
String expectedOutput =
" // Method descriptor #6 ()V\n" +
" // Stack: 1, Locals: 1\n" +
" X$Z();\n" +
" 0 aload_0 [this]\n" +
" 1 invokespecial java.lang.Object() [8]\n" +
" 4 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 9]\n" +
" [pc: 4, line: 13]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 5] local: this index: 0 type: X.Z\n" +
" \n" +
" // Method descriptor #15 ()I\n" +
" // Stack: 2, Locals: 1\n" +
" public int bar();\n" +
" 0 getstatic java.lang.System.out : java.io.PrintStream [16]\n" +
" 3 ldc <String \"bar\"> [22]\n" +
" 5 invokevirtual java.io.PrintStream.println(java.lang.String) : void [23]\n" +
" 8 iconst_0\n" +
" 9 ireturn\n" +
" Line numbers:\n" +
" [pc: 0, line: 18]\n" +
" [pc: 8, line: 19]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 10] local: this index: 0 type: X.Z\n" +
"\n" +
" Inner classes:\n" +
" [inner class info: #1 X$Z, outer class info: #32 X\n" +
" inner name: #34 Z, accessflags: 8 static]\n" +
nestHost +
"}";
File f = new File(OUTPUT_DIR + File.separator + "X$Z.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=77473
public void test124() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String[] args) throws Exception {\n" +
" Foo foo = new Foo();\n" +
" try {\n" +
" foo.frob(Baz.class);\n" +
" System.out.println(\"FAILED\");\n" +
" } catch(IllegalAccessException e){\n" +
" System.out.println(\"SUCCESS\");\n" +
" }\n" +
" }\n" +
" private static class Baz {\n" +
" }\n" +
"}\n" +
"class Foo {\n" +
" public void frob(Class cls) throws Exception {\n" +
" Object o = cls.newInstance();\n" +
" }\n" +
"}\n",
},
"SUCCESS");
// ensure synthetic access method got generated for enclosing field
String expectedOutput =
" // Method descriptor #6 ()V\n" +
" // Stack: 1, Locals: 1\n" +
" private X$Baz();\n" +
" 0 aload_0 [this]\n" +
" 1 invokespecial java.lang.Object() [8]\n" +
" 4 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 11]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 5] local: this index: 0 type: X.Baz\n";
File f = new File(OUTPUT_DIR + File.separator + "X$Baz.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=77473 - variation
public void test125() throws Exception {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" \n" +
" void foo(final String s) {\n" +
" class Local {\n" +
" private Local() {}\n" +
" void bar() {\n" +
" System.out.println(s);\n" +
" }\n" +
" }\n" +
" new Local().bar();\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new X().foo(\"SUCCESS\");\n" +
" }\n" +
"}\n",
},
"SUCCESS");
// check private constructor outcome (if >= 1.4 modifier change, if 1.3 synthetic emulation)
CompilerOptions options = new CompilerOptions(getCompilerOptions());
String expectedOutput = options.complianceLevel <= ClassFileConstants.JDK1_3
? "class X$1$Local {\n" +
" \n" +
" // Field descriptor #6 LX;\n" +
" final synthetic X this$0;\n" +
" \n" +
" // Field descriptor #9 Ljava/lang/String;\n" +
" private final synthetic java.lang.String val$s;\n" +
" \n" +
" // Method descriptor #11 (LX;Ljava/lang/String;)V\n" +
" // Stack: 2, Locals: 3\n" +
" private X$1$Local(X arg0, java.lang.String arg1);\n" +
" 0 aload_0 [this]\n" +
" 1 invokespecial java.lang.Object() [13]\n" +
" 4 aload_0 [this]\n" +
" 5 aload_1 [arg0]\n" +
" 6 putfield X$1$Local.this$0 : X [16]\n" +
" 9 aload_0 [this]\n" +
" 10 aload_2 [arg1]\n" +
" 11 putfield X$1$Local.val$s : java.lang.String [18]\n" +
" 14 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 5]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 15] local: this index: 0 type: new X(){}.Local\n" +
" \n" +
" // Method descriptor #15 ()V\n" +
" // Stack: 2, Locals: 1\n" +
" void bar();\n" +
" 0 getstatic java.lang.System.out : java.io.PrintStream [25]\n" +
" 3 aload_0 [this]\n" +
" 4 getfield X$1$Local.val$s : java.lang.String [18]\n" +
" 7 invokevirtual java.io.PrintStream.println(java.lang.String) : void [31]\n" +
" 10 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 7]\n" +
" [pc: 10, line: 8]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 11] local: this index: 0 type: new X(){}.Local\n" +
" \n" +
" // Method descriptor #37 (LX;Ljava/lang/String;LX$1$Local;)V\n" +
" // Stack: 3, Locals: 4\n" +
" synthetic X$1$Local(X arg0, java.lang.String arg1, new X(){}.Local arg2);\n" +
" 0 aload_0 [this]\n" +
" 1 aload_1 [arg0]\n" +
" 2 aload_2 [arg1]\n" +
" 3 invokespecial X$1$Local(X, java.lang.String) [38]\n" +
" 6 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 5]\n" +
"\n" +
" Inner classes:\n" +
" [inner class info: #1 X$1$Local, outer class info: #0\n" +
" inner name: #43 Local, accessflags: 0 default]\n" +
"}"
: options.complianceLevel == ClassFileConstants.JDK1_4
? "class X$1$Local {\n" +
" \n" +
" // Field descriptor #6 LX;\n" +
" final synthetic X this$0;\n" +
" \n" +
" // Field descriptor #9 Ljava/lang/String;\n" +
" private final synthetic java.lang.String val$s;\n" +
" \n" +
" // Method descriptor #11 (LX;Ljava/lang/String;)V\n" +
" // Stack: 2, Locals: 3\n" +
" X$1$Local(X arg0, java.lang.String arg1);\n" +
" 0 aload_0 [this]\n" +
" 1 aload_1 [arg0]\n" +
" 2 putfield X$1$Local.this$0 : X [13]\n" +
" 5 aload_0 [this]\n" +
" 6 aload_2 [arg1]\n" +
" 7 putfield X$1$Local.val$s : java.lang.String [15]\n" +
" 10 aload_0 [this]\n" +
" 11 invokespecial java.lang.Object() [17]\n" +
" 14 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 5]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 15] local: this index: 0 type: new X(){}.Local\n" +
" \n" +
" // Method descriptor #19 ()V\n" +
" // Stack: 2, Locals: 1\n" +
" void bar();\n" +
" 0 getstatic java.lang.System.out : java.io.PrintStream [25]\n" +
" 3 aload_0 [this]\n" +
" 4 getfield X$1$Local.val$s : java.lang.String [15]\n" +
" 7 invokevirtual java.io.PrintStream.println(java.lang.String) : void [31]\n" +
" 10 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 7]\n" +
" [pc: 10, line: 8]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 11] local: this index: 0 type: new X(){}.Local\n" +
"\n" +
" Inner classes:\n" +
" [inner class info: #1 X$1$Local, outer class info: #0\n" +
" inner name: #40 Local, accessflags: 0 default]\n" +
"}"
: "class X$1Local {\n" +
" \n" +
" // Field descriptor #6 LX;\n" +
" final synthetic X this$0;\n" +
" \n" +
" // Field descriptor #8 Ljava/lang/String;\n" +
" private final synthetic java.lang.String val$s;\n" +
" \n" +
" // Method descriptor #10 (LX;Ljava/lang/String;)V\n" +
" // Stack: 2, Locals: 3\n" +
(isMinimumCompliant(ClassFileConstants.JDK11) ? " private " :" ") +
"X$1Local(X arg0, java.lang.String arg1);\n" +
" 0 aload_0 [this]\n" +
" 1 aload_1 [arg0]\n" +
" 2 putfield X$1Local.this$0 : X [12]\n" +
" 5 aload_0 [this]\n" +
" 6 aload_2 [arg1]\n" +
" 7 putfield X$1Local.val$s : java.lang.String [14]\n" +
" 10 aload_0 [this]\n" +
" 11 invokespecial java.lang.Object() [16]\n" +
" 14 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 5]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 15] local: this index: 0 type: new X(){}\n" +
" \n" +
" // Method descriptor #18 ()V\n" +
" // Stack: 2, Locals: 1\n" +
" void bar();\n" +
" 0 getstatic java.lang.System.out : java.io.PrintStream [24]\n" +
" 3 aload_0 [this]\n" +
" 4 getfield X$1Local.val$s : java.lang.String [14]\n" +
" 7 invokevirtual java.io.PrintStream.println(java.lang.String) : void [30]\n" +
" 10 return\n" +
" Line numbers:\n" +
" [pc: 0, line: 7]\n" +
" [pc: 10, line: 8]\n" +
" Local variable table:\n" +
" [pc: 0, pc: 11] local: this index: 0 type: new X(){}\n" +
"\n" +
" Inner classes:\n" +
" [inner class info: #1 X$1Local, outer class info: #0\n" +
" inner name: #44 Local, accessflags: 0 default]\n" +
(isMinimumCompliant(ClassFileConstants.JDK11) ?
" Enclosing Method: #39 #41 X.foo(Ljava/lang/String;)V\n" +
"\n" +
"Nest Host: #39 X\n" : "");
File f = new File(OUTPUT_DIR + File.separator + (options.complianceLevel >= ClassFileConstants.JDK1_5 ? "X$1Local.class" : "X$1$Local.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=130117
public void test126() {
CompilerOptions options = new CompilerOptions(getCompilerOptions());
if (options.sourceLevel < ClassFileConstants.JDK1_5) {
this.runNegativeTest(
new String[] {
"X.java",
"public interface X {\n" +
" private class Inner {}\n" +
" private interface IInner {}\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 2)\n" +
" private class Inner {}\n" +
" ^^^^^\n" +
"The interface member type Inner can only be public\n" +
"----------\n" +
"2. ERROR in X.java (at line 3)\n" +
" private interface IInner {}\n" +
" ^^^^^^\n" +
"The interface member type IInner can only be public\n" +
"----------\n");
return;
}
this.runNegativeTest(
new String[] {
"X.java",
"public interface X {\n" +
" private class Inner {}\n" +
" private interface IInner {}\n" +
" private enum EInner {}\n" +
" private @interface AInner {}\n" +
"}\n",
},
"----------\n" +
"1. ERROR in X.java (at line 2)\n" +
" private class Inner {}\n" +
" ^^^^^\n" +
"The interface member type Inner can only be public\n" +
"----------\n" +
"2. ERROR in X.java (at line 3)\n" +
" private interface IInner {}\n" +
" ^^^^^^\n" +
"The interface member type IInner can only be public\n" +
"----------\n" +
"3. ERROR in X.java (at line 4)\n" +
" private enum EInner {}\n" +
" ^^^^^^\n" +
"The interface member type EInner can only be public\n" +
"----------\n" +
"4. ERROR in X.java (at line 5)\n" +
" private @interface AInner {}\n" +
" ^^^^^^\n" +
"The interface member type AInner can only be public\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=89347
public void test127() {
this.runConformTest(
new String[] {
"p/BugContainer.java",
"package p;\n" +
"\n" +
"public abstract class BugContainer {\n" +
" protected static class InternalInfo$ {\n" +
" public InternalInfo$() {}\n" +
" }\n" +
" abstract protected InternalInfo$ getInfo();\n" +
"}\n", // =================
},
"");
this.runConformTest(
new String[] {
"q/BugUser.java", // =================
"package q;\n" +
"\n" +
"import p.BugContainer;\n" +
"\n" +
"public class BugUser extends BugContainer{\n" +
" protected InternalInfo$ getInfo() {\n" +
" return new InternalInfo$();\n" +
" }\n" +
"}", // =================
},
"",
null,
false,
null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=89347 - variation
public void test128() {
this.runConformTest(
new String[] {
"p/BugContainer.java",
"package p;\n" +
"\n" +
"public abstract class BugContainer {\n" +
" protected static class InternalInfo$ {\n" +
" public InternalInfo$() {}\n" +
" }\n" +
" abstract protected InternalInfo$ getInfo();\n" +
"}\n", // =================
"q/BugUser.java", // =================
"package q;\n" +
"\n" +
"import p.BugContainer;\n" +
"\n" +
"public class BugUser extends BugContainer{\n" +
" protected InternalInfo$ getInfo() {\n" +
" return new InternalInfo$();\n" +
" }\n" +
"}", // =================
},
"");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=160132 - variation
public void test129() {
this.runConformTest(
new String[] {
"X.java", //========================
"public interface X {\n" +
" interface Entry {\n" +
" interface Internal extends Entry {\n" +
" Internal createEntry();\n" +
" }\n" +
" }\n" +
"}\n", //========================
"Y.java",
"public class Y implements X.Entry.Internal {\n" +
" public Internal createEntry() {\n" +
" return null;\n" +
" }\n" +
"}\n" , //========================
},
"");
// compile Y against X binary
this.runConformTest(
new String[] {
"Y.java", //========================
"public class Y implements X.Entry.Internal {\n" +
" public Internal createEntry() {\n" +
" return null;\n" +
" }\n" +
"}\n" , //========================
},
"",
null,
false,
null);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=164497
public void test130() {
CompilerOptions options = new CompilerOptions(getCompilerOptions());
if (options.sourceLevel <= ClassFileConstants.JDK1_3) {
runConformTest(
true /* flush output directory */,
new String[] { /* test files */
"X.java", //========================
"public class X {\n" +
" public static void main(String[] args) {\n" +
" new M().foo2();\n" +
" }\n" +
"}\n"+
"class M {\n" +
" String name;\n" +
" \n" +
" M() {\n" +
" this.name = \"SUCCESS\";\n" +
" }\n" +
"\n" +
" private class Y extends N {\n" +
" private Y() {\n" +
" super();\n" +
" }\n" +
" protected void foo(Z z) {\n" +
" z.bar(new A());\n" +
" }\n" +
" }\n" +
" \n" +
" public class A implements I {\n" +
" public void configure() {\n" +
" new B().foo();\n" +
" }\n" +
" public class B {\n" +
" public void foo() {\n" +
" try {\n" +
" System.out.println(M.this.name);\n" +
" } catch(NullPointerException e) {\n" +
" System.err.println(\"NPE THROWN\");\n" +
" }\n" +
" }\n" +
" }\n" +
" }\n" +
" \n" +
" public void foo2() {\n" +
" new Y();\n" +
" }\n" +
"}\n" +
"class Z {\n" +
" void bar(I i) {\n" +
" i.configure();\n" +
" }\n" +
"}\n" +
"\n" +
"interface I {\n" +
" void configure();\n" +
"}\n" +
"\n" +
"class N {\n" +
" protected void foo(Z z) {\n" +
" }\n" +
" N() {\n" +
" this.foo(new Z());\n" +
" }\n" +
"}\n"
},
null /* do not check compiler log */,
"" /* expected output string */,
"NPE THROWN" /* expected error string */,
JavacTestOptions.DEFAULT /* default javac test options */);
return;
}
this.runConformTest(
new String[] {
"X.java", //========================
"public class X {\n" +
" public static void main(String[] args) {\n" +
" new M().foo2();\n" +
" }\n" +
"}\n"+
"class M {\n" +
" String name;\n" +
" \n" +
" M() {\n" +
" this.name = \"SUCCESS\";\n" +
" }\n" +
"\n" +
" private class Y extends N {\n" +
" private Y() {\n" +
" super();\n" +
" }\n" +
" protected void foo(Z z) {\n" +
" z.bar(new A());\n" +
" }\n" +
" }\n" +
" \n" +
" public class A implements I {\n" +
" public void configure() {\n" +
" new B().foo();\n" +
" }\n" +
" public class B {\n" +
" public void foo() {\n" +
" System.out.println(M.this.name);\n" +
" }\n" +
" }\n" +
" }\n" +
" \n" +
" public void foo2() {\n" +
" new Y();\n" +
" }\n" +
"}\n" +
"class Z {\n" +
" void bar(I i) {\n" +
" i.configure();\n" +
" }\n" +
"}\n" +
"\n" +
"interface I {\n" +
" void configure();\n" +
"}\n" +
"\n" +
"class N {\n" +
" protected void foo(Z z) {\n" +
" }\n" +
" N() {\n" +
" this.foo(new Z());\n" +
" }\n" +
"}\n"
},
"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=165662
public void test131() {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" void foo() {\n" +
" class Local {\n" +
" void foo() {\n" +
" }\n" +
" }\n" +
" {\n" +
" class Local {\n" +
" Local(int i) {\n" +
" this.init(i);\n" +
" this.bar(); // should detect error\n" +
" }\n" +
" void init(int i) {\n" +
" }\n" +
" }\n" +
" Local l = new Local(0); // should be fine\n" +
" }\n" +
" Local l = new Local();\n" +
" l.foo();\n" +
" }\n" +
"}", // =================,
},
"----------\n" +
"1. ERROR in X.java (at line 8)\n" +
" class Local {\n" +
" ^^^^^\n" +
"Duplicate nested type Local\n" +
"----------\n" +
"2. ERROR in X.java (at line 11)\n" +
" this.bar(); // should detect error\n" +
" ^^^\n" +
"The method bar() is undefined for the type Local\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=165662
public void test132() {
this.runConformTest(
true,
new String[] {
"X.java",
"public class X {\n" +
" public static void main(String argv[]) {\n" +
" class Local {}\n" +
" class Foo {\n" +
" void foo() {\n" +
" class Local {}\n" +
" }\n" +
" }\n" +
" }\n" +
"}", // =================
},
"----------\n" +
"1. WARNING in X.java (at line 6)\n" +
" class Local {}\n" +
" ^^^^^\n" +
"The type Local is hiding the type Local\n" +
"----------\n",
"",
"",
JavacTestOptions.Excuse.EclipseHasSomeMoreWarnings);
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=168331
public void test133() {
if (this.complianceLevel >= ClassFileConstants.JDK1_5) {
this.runConformTest(
new String[] {
"X.java", //===================
"public class X {\n" +
" public static interface I {\n" +
" }\n" +
" public static interface IE extends I {\n" +
" }\n" +
" public static interface J {\n" +
" I getI(int i);\n" +
" }\n" +
" public static interface JE extends J {\n" +
" IE getI(int i);\n" +
" }\n" +
" public static class Y implements JE {\n" +
" public IE getI(int i) {\n" +
" return null;\n" +
" }\n" +
" }\n" +
" private J j = new Y();\n" +
" public void foo() {\n" +
" j.getI(0);\n" +
" System.out.println(\"SUCCESS\");\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new X().foo();\n" +
" }\n" +
"}", // =================
},
"SUCCESS");
}
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=168331
public void test134() {
if (this.complianceLevel >= ClassFileConstants.JDK1_5) {
this.runConformTest(
new String[] {
"X.java", //===================
"public class X {\n" +
" public interface I {\n" +
" public String foo();\n" +
" }\n" +
" public interface J {\n" +
" public I getI();\n" +
" }\n" +
" public static class XI implements I {\n" +
" public String foo() {\n" +
" return \"XI\";\n" +
" }\n" +
" }\n" +
" public interface K extends J {\n" +
" public XI getI();\n" +
" }\n" +
" public static abstract class XK implements K {\n" +
" public XI getI() {\n" +
" return new XI();\n" +
" }\n" +
" }\n" +
" public static class Y extends XK {\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" K k = new Y();\n" +
" System.out.println(k.getI().foo());\n" +
" J j = k;\n" +
" System.out.println(j.getI().foo());\n" +
" }\n" +
"}", // =================
},
"XI\nXI");
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=152961
public void test135() {
this.runNegativeTest(
new String[] {
"p/X.java",
"package p;\n" +
"import p.A;\n" +
"public class X {\n" +
" \n" +
" void foo(Object o, Object [] os) {\n" +
" A.M2.MM1 mm1 = (A.M2.MM1) o;\n" +
" A.M2.MM1[] mm1s = (A.M2.MM1[]) os;\n" +
" }\n" +
" private interface Outer {\n" +
" interface Inner {\n" +
" String variable = \"my testing\";\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" System.out.println(Outer.Inner.variable);\n" +
" Zork z;\n" +
" }\n" +
"}", // =================,
"p/A.java",
"package p;\n" +
"/** @deprecated */\n" +
"public class A {\n" +
" public class M1 {\n" +
" public class MM1 {\n" +
" }\n" +
" }\n" +
" public class M2 extends M1 {\n" +
" }\n" +
"}", // =================,
},
"----------\n" +
"1. WARNING in p\\X.java (at line 2)\n" +
" import p.A;\n" +
" ^^^\n" +
"The type A is deprecated\n" +
"----------\n" +
"2. WARNING in p\\X.java (at line 6)\n" +
" A.M2.MM1 mm1 = (A.M2.MM1) o;\n" +
" ^\n" +
"The type A is deprecated\n" +
"----------\n" +
"3. WARNING in p\\X.java (at line 6)\n" +
" A.M2.MM1 mm1 = (A.M2.MM1) o;\n" +
" ^^\n" +
"The type A.M2 is deprecated\n" +
"----------\n" +
"4. WARNING in p\\X.java (at line 6)\n" +
" A.M2.MM1 mm1 = (A.M2.MM1) o;\n" +
" ^^^\n" +
"The type A.M1.MM1 is deprecated\n" +
"----------\n" +
"5. WARNING in p\\X.java (at line 6)\n" +
" A.M2.MM1 mm1 = (A.M2.MM1) o;\n" +
" ^\n" +
"The type A is deprecated\n" +
"----------\n" +
"6. WARNING in p\\X.java (at line 6)\n" +
" A.M2.MM1 mm1 = (A.M2.MM1) o;\n" +
" ^^\n" +
"The type A.M2 is deprecated\n" +
"----------\n" +
"7. WARNING in p\\X.java (at line 6)\n" +
" A.M2.MM1 mm1 = (A.M2.MM1) o;\n" +
" ^^^\n" +
"The type A.M1.MM1 is deprecated\n" +
"----------\n" +
"8. WARNING in p\\X.java (at line 7)\n" +
" A.M2.MM1[] mm1s = (A.M2.MM1[]) os;\n" +
" ^\n" +
"The type A is deprecated\n" +
"----------\n" +
"9. WARNING in p\\X.java (at line 7)\n" +
" A.M2.MM1[] mm1s = (A.M2.MM1[]) os;\n" +
" ^^\n" +
"The type A.M2 is deprecated\n" +
"----------\n" +
"10. WARNING in p\\X.java (at line 7)\n" +
" A.M2.MM1[] mm1s = (A.M2.MM1[]) os;\n" +
" ^^^\n" +
"The type A.M1.MM1 is deprecated\n" +
"----------\n" +
"11. WARNING in p\\X.java (at line 7)\n" +
" A.M2.MM1[] mm1s = (A.M2.MM1[]) os;\n" +
" ^\n" +
"The type A is deprecated\n" +
"----------\n" +
"12. WARNING in p\\X.java (at line 7)\n" +
" A.M2.MM1[] mm1s = (A.M2.MM1[]) os;\n" +
" ^^\n" +
"The type A.M2 is deprecated\n" +
"----------\n" +
"13. WARNING in p\\X.java (at line 7)\n" +
" A.M2.MM1[] mm1s = (A.M2.MM1[]) os;\n" +
" ^^^\n" +
"The type A.M1.MM1 is deprecated\n" +
"----------\n" +
"14. ERROR in p\\X.java (at line 16)\n" +
" Zork z;\n" +
" ^^^^\n" +
"Zork cannot be resolved to a type\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=152961 - variation
public void test136() {
this.runNegativeTest(
new String[] {
"p/X.java",
"package p;\n" +
"public class X {\n" +
" private interface Outer {\n" +
" interface Inner {\n" +
" String variable = \"my testing\";\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" Outer.Inner variable = null;\n" +
" System.out.println(variable);\n" +
" Zork z;\n" +
" }\n" +
"}", // =================,
},
"----------\n" +
"1. ERROR in p\\X.java (at line 11)\n" +
" Zork z;\n" +
" ^^^^\n" +
"Zork cannot be resolved to a type\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=152961 - variation
public void test137() {
this.runNegativeTest(
new String[] {
"p/X.java",
"package p;\n" +
"public class X {\n" +
" private interface Outer {\n" +
" interface Inner {\n" +
" String variable = \"my testing\";\n" +
" }\n" +
" }\n" +
" private interface Outer2 extends Outer {\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" System.out.println(Outer2.Inner.variable);\n" +
" Zork z;\n" +
" }\n" +
"}", // =================,
},
"----------\n" +
"1. ERROR in p\\X.java (at line 12)\n" +
" Zork z;\n" +
" ^^^^\n" +
"Zork cannot be resolved to a type\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=152961 - variation
public void test138() {
this.runNegativeTest(
new String[] {
"p/X.java",
"public class X {\n" +
" private interface Outer {\n" +
" interface Inner {\n" +
" String variable = \"my testing\";\n" +
" }\n" +
" }\n" +
" private interface Outer2 extends Outer {\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" Outer2.Inner variable = null;\n" +
" System.out.println(variable);\n" +
" Zork z;\n" +
" }\n" +
"}", // =================,
},
"----------\n" +
"1. ERROR in p\\X.java (at line 12)\n" +
" Zork z;\n" +
" ^^^^\n" +
"Zork cannot be resolved to a type\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=152961 - variation
public void test139() {
String errMessage = isMinimumCompliant(ClassFileConstants.JDK11) ?
"----------\n" +
"1. ERROR in X.java (at line 9)\n" +
" class Y extends Zork {}\n" +
" ^^^^\n" +
"Zork cannot be resolved to a type\n" +
"----------\n"
:
"----------\n" +
"1. WARNING in X.java (at line 5)\n" +
" private class Y extends A {\n" +
" ^\n" +
"Access to enclosing constructor X.A() is emulated by a synthetic accessor method\n" +
"----------\n" +
"2. ERROR in X.java (at line 9)\n" +
" class Y extends Zork {}\n" +
" ^^^^\n" +
"Zork cannot be resolved to a type\n" +
"----------\n";
this.runNegativeTest(
new String[] {
"X.java",
"public class X { \n" +
" private class A {\n" +
" class B {}\n" +
" }\n" +
" private class Y extends A {\n" +
" }\n" +
" Y.B d = null;\n" +
"}\n" +
"class Y extends Zork {}\n", // =================
},
errMessage);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=171184
public void test140() throws Exception {
this.runConformTest(new String[] {
"p/A.java",
"package p;\n" +
"public class A {\n" +
" public static interface I {\n" +
" void foo();\n" +
" }\n" +
"}",
"p1/X.java",
"package p1;\n" +
"import p.A;\n" +
"public class X implements A.I {\n" +
" public void foo() { /* dummy */ }\n" +
"}"
});
String expectedOutput =
" Inner classes:\n" +
" [inner class info: #5 p/A$I, outer class info: #20 p/A\n" +
" inner name: #22 I, accessflags: 1545 public abstract static]\n";
checkDisassembledClassFile(OUTPUT_DIR + File.separator + "p1" + File.separator + "X.class", "X", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=171184
public void test141() throws Exception {
this.runConformTest(new String[] {
"p/A.java",
"package p;\n" +
"public class A {\n" +
" public static class B {\n" +
" void foo() { /* dummy */ }\n" +
" }\n" +
"}",
"p1/X.java",
"package p1;\n" +
"import p.A;\n" +
"public class X extends A.B {\n" +
"}"
});
String expectedOutput =
" Inner classes:\n" +
" [inner class info: #3 p/A$B, outer class info: #17 p/A\n" +
" inner name: #19 B, accessflags: 9 public static]\n";
checkDisassembledClassFile(OUTPUT_DIR + File.separator + "p1" + File.separator + "X.class", "X", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=171184
public void test142() throws Exception {
this.runConformTest(new String[] {
"p/A.java",
"package p;\n" +
"public class A {\n" +
" public class B {\n" +
" void foo() { /* dummy */ }\n" +
" }\n" +
"}",
"p1/X.java",
"package p1;\n" +
"import p.A;\n" +
"public class X {\n" +
" Object foo() {\n" +
" return new A().new B();\n" +
" }\n" +
"}"
});
String expectedOutput =
" Inner classes:\n" +
" [inner class info: #16 p/A$B, outer class info: #18 p/A\n" +
" inner name: #31 B, accessflags: 1 public]\n";
if (new CompilerOptions(getCompilerOptions()).targetJDK == ClassFileConstants.JDK1_1) {
expectedOutput =
" Inner classes:\n" +
" [inner class info: #16 p/A$B, outer class info: #18 p/A\n" +
" inner name: #27 B, accessflags: 1 public]\n";
}
checkDisassembledClassFile(OUTPUT_DIR + File.separator + "p1" + File.separator + "X.class", "X", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=171184
public void test143() throws Exception {
this.runConformTest(new String[] {
"X.java",
"class A {\n" +
" public class B {\n" +
" void foo() { /* dummy */ }\n" +
" }\n" +
"}\n" +
"public class X {\n" +
" Object foo() {\n" +
" return A.B.class;\n" +
" }\n" +
"}"
});
if (new CompilerOptions(getCompilerOptions()).targetJDK >= ClassFileConstants.JDK1_5) {
String expectedOutput =
" Inner classes:\n" +
" [inner class info: #16 A$B, outer class info: #21 A\n" +
" inner name: #23 B, accessflags: 1 public]\n";
checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput);
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=171184
public void test144() throws Exception {
this.runConformTest(new String[] {
"X.java",
"class A {\n" +
" public static class B {\n" +
" public static int CONST = 0;\n" +
" }\n" +
"}\n" +
"public class X {\n" +
" int foo() {\n" +
" return A.B.CONST;\n" +
" }\n" +
"}"
});
String expectedOutput =
" Inner classes:\n" +
" [inner class info: #17 A$B, outer class info: #25 A\n" +
" inner name: #27 B, accessflags: 9 public static]\n";
checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=171184
public void test145() throws Exception {
this.runConformTest(new String[] {
"X.java",
"class A {\n" +
" public static class B {\n" +
" }\n" +
"}\n" +
"public class X {\n" +
" A.B field;\n" +
"}"
});
String expectedOutput =
" Inner classes:\n" +
" [inner class info: #19 A$B, outer class info: #21 A\n" +
" inner name: #23 B, accessflags: 9 public static]\n";
checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=171184
public void test146() throws Exception {
this.runConformTest(new String[] {
"X.java",
"class A {\n" +
" public static class B {\n" +
" }\n" +
"}\n" +
"public class X {\n" +
" int foo(A.B o) {\n" +
" return 0;\n" +
" }\n" +
"}"
});
String expectedOutput =
" Inner classes:\n" +
" [inner class info: #21 A$B, outer class info: #23 A\n" +
" inner name: #25 B, accessflags: 9 public static]\n";
checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=171184
public void test147() throws Exception {
this.runConformTest(new String[] {
"X.java",
"class A {\n" +
" public static class B {\n" +
" }\n" +
"}\n" +
"public class X {\n" +
" A.B foo() {\n" +
" return null;\n" +
" }\n" +
"}"
});
String expectedOutput =
" Inner classes:\n" +
" [inner class info: #19 A$B, outer class info: #21 A\n" +
" inner name: #23 B, accessflags: 9 public static]\n";
checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=171184
public void test148() throws Exception {
this.runConformTest(new String[] {
"X.java",
"class A {\n" +
" public static class B extends Exception {\n" +
" }\n" +
"}\n" +
"public class X {\n" +
" void foo() throws A.B{\n" +
" }\n" +
"}"
});
String expectedOutput =
" Inner classes:\n" +
" [inner class info: #16 A$B, outer class info: #21 A\n" +
" inner name: #23 B, accessflags: 9 public static]\n";
checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=171749
public void test149() throws Exception {
this.runConformTest(new String[] {
"X.java",
"public final class X implements A.Foo1 {\n" +
" public void foo() {}\n" +
" public A.Foo2 foo2() { return null; }\n" +
" public void foo3( A.Foo3 foo ) {}\n" +
" public void foo4() { A.Foo4 foo = null; }\n" +
" public void foo5() {\n" +
" new A.Foo5() {\n" +
" public void foo() {}\n" +
" }.foo();\n" +
" }\n" +
" public static class Foo6 implements A.Foo6 {\n" +
" public void foo() {}\n" +
" }\n" +
" public void foo7() { Bar2.foo7().foo(); }\n" +
"}",
"A.java",
"class A {\n" +
" public static interface Foo1 { void foo(); }\n" +
" public static interface Foo2 { void foo(); }\n" +
" public static interface Foo3 { void foo(); }\n" +
" public static interface Foo4 { void foo(); }\n" +
" public static interface Foo5 { void foo(); }\n" +
" public static interface Foo6 { void foo(); }\n" +
" public static interface Foo7 { void foo(); }\n" +
"}",
"Bar2.java",
"class Bar2 {\n" +
" public static A.Foo7 foo7() { return null; }\n" +
"}"
});
String expectedOutput =
" Inner classes:\n" +
" [inner class info: #5 A$Foo1, outer class info: #44 A\n" +
" inner name: #46 Foo1, accessflags: 1545 public abstract static],\n" +
" [inner class info: #47 A$Foo2, outer class info: #44 A\n" +
" inner name: #49 Foo2, accessflags: 1545 public abstract static],\n" +
" [inner class info: #50 A$Foo3, outer class info: #44 A\n" +
" inner name: #52 Foo3, accessflags: 1545 public abstract static],\n" +
" [inner class info: #39 A$Foo7, outer class info: #44 A\n" +
" inner name: #53 Foo7, accessflags: 1545 public abstract static],\n" +
" [inner class info: #25 X$1, outer class info: #0\n" +
" inner name: #0, accessflags: 0 default],\n" +
" [inner class info: #54 X$Foo6, outer class info: #1 X\n" +
" inner name: #56 Foo6, accessflags: 9 public static]\n";
checkDisassembledClassFile(OUTPUT_DIR + File.separator + "X.class", "X", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=210422
public void test150() {
this.runNegativeTest(
new String[] {
"X.java",
"import java.io.Serializable;\n" +
"\n" +
"public final class X implements Serializable {\n" +
"\n" +
" void bar() {}\n" +
"\n" +
" interface IM {}\n" +
" class SMember extends String {}\n" +
"\n" +
" class Member extends X { \n" +
" ZorkMember z;\n" +
" void foo() {\n" +
" this.bar();\n" +
" Zork1 z;\n" +
" } \n" +
" }\n" +
"\n" +
" void foo() {\n" +
" new X().new IM();\n" +
" class Local extends X { \n" +
" ZorkLocal z;\n" +
" void foo() {\n" +
" this.bar();\n" +
" Zork3 z;\n" +
" }\n" +
" }\n" +
" new X() {\n" +
" ZorkAnonymous2 z; \n" +
" void foo() {\n" +
" this.bar();\n" +
" Zork4 z;\n" +
" }\n" +
" };\n" +
" }\n" +
"}\n"
},
"----------\n" +
"1. WARNING in X.java (at line 3)\n" +
" public final class X implements Serializable {\n" +
" ^\n" +
"The serializable class X does not declare a static final serialVersionUID field of type long\n" +
"----------\n" +
"2. ERROR in X.java (at line 8)\n" +
" class SMember extends String {}\n" +
" ^^^^^^\n" +
"The type SMember cannot subclass the final class String\n" +
"----------\n" +
"3. ERROR in X.java (at line 10)\n" +
" class Member extends X { \n" +
" ^\n" +
"The type Member cannot subclass the final class X\n" +
"----------\n" +
"4. ERROR in X.java (at line 11)\n" +
" ZorkMember z;\n" +
" ^^^^^^^^^^\n" +
"ZorkMember cannot be resolved to a type\n" +
"----------\n" +
"5. ERROR in X.java (at line 13)\n" +
" this.bar();\n" +
" ^^^\n" +
"The method bar() is undefined for the type X.Member\n" +
"----------\n" +
"6. ERROR in X.java (at line 14)\n" +
" Zork1 z;\n" +
" ^^^^^\n" +
"Zork1 cannot be resolved to a type\n" +
"----------\n" +
"7. WARNING in X.java (at line 14)\n" +
" Zork1 z;\n" +
" ^\n" +
"The local variable z is hiding a field from type X.Member\n" +
"----------\n" +
"8. ERROR in X.java (at line 19)\n" +
" new X().new IM();\n" +
" ^^\n" +
"Cannot instantiate the type X.IM\n" +
"----------\n" +
"9. ERROR in X.java (at line 20)\n" +
" class Local extends X { \n" +
" ^\n" +
"The type Local cannot subclass the final class X\n" +
"----------\n" +
"10. ERROR in X.java (at line 21)\n" +
" ZorkLocal z;\n" +
" ^^^^^^^^^\n" +
"ZorkLocal cannot be resolved to a type\n" +
"----------\n" +
"11. ERROR in X.java (at line 23)\n" +
" this.bar();\n" +
" ^^^\n" +
"The method bar() is undefined for the type Local\n" +
"----------\n" +
"12. ERROR in X.java (at line 24)\n" +
" Zork3 z;\n" +
" ^^^^^\n" +
"Zork3 cannot be resolved to a type\n" +
"----------\n" +
"13. WARNING in X.java (at line 24)\n" +
" Zork3 z;\n" +
" ^\n" +
"The local variable z is hiding a field from type Local\n" +
"----------\n" +
"14. ERROR in X.java (at line 27)\n" +
" new X() {\n" +
" ^\n" +
"An anonymous class cannot subclass the final class X\n" +
"----------\n" +
"15. ERROR in X.java (at line 28)\n" +
" ZorkAnonymous2 z; \n" +
" ^^^^^^^^^^^^^^\n" +
"ZorkAnonymous2 cannot be resolved to a type\n" +
"----------\n" +
"16. ERROR in X.java (at line 30)\n" +
" this.bar();\n" +
" ^^^\n" +
"The method bar() is undefined for the type new X(){}\n" +
"----------\n" +
"17. ERROR in X.java (at line 31)\n" +
" Zork4 z;\n" +
" ^^^^^\n" +
"Zork4 cannot be resolved to a type\n" +
"----------\n" +
"18. WARNING in X.java (at line 31)\n" +
" Zork4 z;\n" +
" ^\n" +
"The local variable z is hiding a field from type new X(){}\n" +
"----------\n");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216683
public void test151() {
long compliance = new CompilerOptions(getCompilerOptions()).complianceLevel;
if (compliance <= ClassFileConstants.JDK1_3) {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
"\n" +
" public static interface Foo { }\n" +
" public static interface Bar { }\n" +
"\n" +
" private static class B2F extends X { }\n" +
" private static class F2B extends X { }\n" +
"\n" +
" public static abstract class Key {\n" +
"\n" +
" public abstract Key flip();\n" +
"\n" +
" private static class B2F extends Key {\n" +
" private static B2F create() { return new B2F(); }\n" +
" public Key flip() { return F2B.create(); }\n" +
" }\n" +
"\n" +
" private static class F2B extends Key {\n" +
" private static F2B create() { return new F2B(); }\n" +
" public Key flip() { return B2F.create(); }\n" +
" }\n" +
" }\n" +
"}", // =================
},
"----------\n" +
"1. ERROR in X.java (at line 15)\n" +
" public Key flip() { return F2B.create(); }\n" +
" ^^^\n" +
"The type F2B is defined in an inherited type and an enclosing scope\n" +
"----------\n" +
"2. ERROR in X.java (at line 20)\n" +
" public Key flip() { return B2F.create(); }\n" +
" ^^^\n" +
"The type B2F is defined in an inherited type and an enclosing scope\n" +
"----------\n");
} else if (compliance == ClassFileConstants.JDK1_4) {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
"\n" +
" public static interface Foo { }\n" +
" public static interface Bar { }\n" +
"\n" +
" private static class B2F extends X { }\n" +
" private static class F2B extends X { }\n" +
"\n" +
" public static abstract class Key {\n" +
"\n" +
" public abstract Key flip();\n" +
"\n" +
" private static class B2F extends Key {\n" +
" private static B2F create() { return new B2F(); }\n" +
" public Key flip() { return F2B.create(); }\n" +
" }\n" +
"\n" +
" private static class F2B extends Key {\n" +
" private static F2B create() { return new F2B(); }\n" +
" public Key flip() { return B2F.create(); }\n" +
" }\n" +
" }\n" +
"}", // =================
},
"");
} else {
this.runConformTest(
new String[] {
"X.java",
"public class X<U, V> {\n" +
"\n" +
" public static interface Foo { }\n" +
" public static interface Bar { }\n" +
"\n" +
" private static class B2F extends X<Bar, Foo> { }\n" +
" private static class F2B extends X<Foo, Bar> { }\n" +
"\n" +
" public static abstract class Key<S, T> {\n" +
"\n" +
" public abstract Key<T, S> flip();\n" +
"\n" +
" private static class B2F extends Key<Bar, Foo> {\n" +
" private static B2F create() { return new B2F(); }\n" +
" public Key<Foo, Bar> flip() { return F2B.create(); }\n" +
" }\n" +
"\n" +
" private static class F2B extends Key<Foo, Bar> {\n" +
" private static F2B create() { return new F2B(); }\n" +
" public Key<Bar, Foo> flip() { return B2F.create(); }\n" +
" }\n" +
" }\n" +
"}", // =================
},
"");
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=216683 - variation
public void test152() {
long compliance = new CompilerOptions(getCompilerOptions()).complianceLevel;
if (compliance <= ClassFileConstants.JDK1_3) {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
"\n" +
" public static interface Foo { }\n" +
" public static interface Bar { }\n" +
"\n" +
" public static class B2F extends X { }\n" +
" public static class F2B extends X { }\n" +
"\n" +
" public static abstract class Key {\n" +
"\n" +
" public abstract Key flip();\n" +
"\n" +
" public static class B2F extends Key {\n" +
" private static B2F create() { return new B2F(); }\n" +
" public Key flip() { return F2B.create(); }\n" +
" }\n" +
"\n" +
" public static class F2B extends Key {\n" +
" private static F2B create() { return new F2B(); }\n" +
" public Key flip() { return B2F.create(); }\n" +
" }\n" +
" }\n" +
"}", // =================
},
"----------\n" +
"1. ERROR in X.java (at line 15)\n" +
" public Key flip() { return F2B.create(); }\n" +
" ^^^\n" +
"The type F2B is defined in an inherited type and an enclosing scope\n" +
"----------\n" +
"2. ERROR in X.java (at line 20)\n" +
" public Key flip() { return B2F.create(); }\n" +
" ^^^\n" +
"The type B2F is defined in an inherited type and an enclosing scope\n" +
"----------\n");
} else if (compliance == ClassFileConstants.JDK1_4) {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
"\n" +
" public static interface Foo { }\n" +
" public static interface Bar { }\n" +
"\n" +
" private static class B2F extends X { }\n" +
" private static class F2B extends X { }\n" +
"\n" +
" public static abstract class Key {\n" +
"\n" +
" public abstract Key flip();\n" +
"\n" +
" private static class B2F extends Key {\n" +
" private static B2F create() { return new B2F(); }\n" +
" public Key flip() { return F2B.create(); }\n" +
" }\n" +
"\n" +
" private static class F2B extends Key {\n" +
" private static F2B create() { return new F2B(); }\n" +
" public Key flip() { return B2F.create(); }\n" +
" }\n" +
" }\n" +
"}", // =================
},
"");
} else {
this.runConformTest(
new String[] {
"X.java",
"public class X<U, V> {\n" +
"\n" +
" public static interface Foo { }\n" +
" public static interface Bar { }\n" +
"\n" +
" private static class B2F extends X<Bar, Foo> { }\n" +
" private static class F2B extends X<Foo, Bar> { }\n" +
"\n" +
" public static abstract class Key<S, T> {\n" +
"\n" +
" public abstract Key<T, S> flip();\n" +
"\n" +
" private static class B2F extends Key<Bar, Foo> {\n" +
" private static B2F create() { return new B2F(); }\n" +
" public Key<Foo, Bar> flip() { return F2B.create(); }\n" +
" }\n" +
"\n" +
" private static class F2B extends Key<Foo, Bar> {\n" +
" private static F2B create() { return new F2B(); }\n" +
" public Key<Bar, Foo> flip() { return B2F.create(); }\n" +
" }\n" +
" }\n" +
"}", // =================
},
"");
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=201487
public void _test153() {
long compliance = new CompilerOptions(getCompilerOptions()).complianceLevel;
if (compliance <= ClassFileConstants.JDK1_4) {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public class Test3 {\n" +
" protected void load() {\n" +
" }\n" +
" }\n" +
" public class Test2 {\n" +
" public Test2(String string, Test3 test3) {\n" +
" }\n" +
" }\n" +
" private String var1;\n" +
"private class Test5 {\n" +
" private class Test4 extends Test2 {\n" +
" public Test4() {\n" +
" super(\"available\", new Test3() {\n" +
" protected void load() {\n" +
" System.out.println(X.this.var1.trim());\n" +
" System.out.println(var1.trim());\n" +
" }\n" +
" });\n" +
" }\n" +
" }\n" +
" }\n" +
"}", // =================
},
"----------\n" +
"1. ERROR in X.java (at line 16)\n" +
" System.out.println(X.this.var1.trim());\n" +
" ^^^^^^\n" +
"No enclosing instance of the type X is accessible in scope\n" +
"----------\n" +
"2. WARNING in X.java (at line 16)\n" +
" System.out.println(X.this.var1.trim());\n" +
" ^^^^\n" +
"Read access to enclosing field X.var1 is emulated by a synthetic accessor method\n" +
"----------\n" +
"3. WARNING in X.java (at line 17)\n" +
" System.out.println(var1.trim());\n" +
" ^^^^\n" +
"Read access to enclosing field X.var1 is emulated by a synthetic accessor method\n" +
"----------\n" +
"4. ERROR in X.java (at line 17)\n" +
" System.out.println(var1.trim());\n" +
" ^^^^\n" +
"No enclosing instance of the type X is accessible in scope\n" +
"----------\n");
} else {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public class Test3 {\n" +
" protected void load() {\n" +
" }\n" +
" }\n" +
" public class Test2 {\n" +
" public Test2(String string, Test3 test3) {\n" +
" }\n" +
" }\n" +
" private String var1;\n" +
"private class Test5 {\n" +
" private class Test4 extends Test2 {\n" +
" public Test4() {\n" +
" super(\"available\", new Test3() {\n" +
" protected void load() {\n" +
" System.out.println(X.this.var1.trim());\n" +
" System.out.println(var1.trim());\n" +
" }\n" +
" });\n" +
" }\n" +
" }\n" +
" }\n" +
"}", // =================
},
"");
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=201487 - variation
public void test154() {
long compliance = new CompilerOptions(getCompilerOptions()).complianceLevel;
if (compliance <= ClassFileConstants.JDK1_4) {
this.runNegativeTest(
new String[] {
"X.java",
"public class X {\n" +
" public class Test3 {\n" +
" protected void load() {\n" +
" }\n" +
" }\n" +
" public class Test2 {\n" +
" public Test2(String string, Test3 test3) {\n" +
" }\n" +
" }\n" +
" private String var1;\n" +
"// private class Test5 {\n" +
" private class Test4 extends Test2 {\n" +
" public Test4() {\n" +
" super(\"available\", new Test3() {\n" +
" protected void load() {\n" +
" System.out.println(X.this.var1.trim());\n" +
" System.out.println(var1.trim());\n" +
" }\n" +
" });\n" +
" }\n" +
" }\n" +
"// }\n" +
"}", // =================
},
"----------\n" +
"1. ERROR in X.java (at line 16)\n" +
" System.out.println(X.this.var1.trim());\n" +
" ^^^^^^\n" +
"No enclosing instance of the type X is accessible in scope\n" +
"----------\n" +
"2. WARNING in X.java (at line 16)\n" +
" System.out.println(X.this.var1.trim());\n" +
" ^^^^\n" +
"Read access to enclosing field X.var1 is emulated by a synthetic accessor method\n" +
"----------\n" +
"3. WARNING in X.java (at line 17)\n" +
" System.out.println(var1.trim());\n" +
" ^^^^\n" +
"Read access to enclosing field X.var1 is emulated by a synthetic accessor method\n" +
"----------\n" +
"4. ERROR in X.java (at line 17)\n" +
" System.out.println(var1.trim());\n" +
" ^^^^\n" +
"No enclosing instance of the type X is accessible in scope\n" +
"----------\n");
} else {
this.runConformTest(
new String[] {
"X.java",
"public class X {\n" +
" public class Test3 {\n" +
" protected void load() {\n" +
" }\n" +
" }\n" +
" public class Test2 {\n" +
" public Test2(String string, Test3 test3) {\n" +
" }\n" +
" }\n" +
" private String var1;\n" +
"// private class Test5 {\n" +
" private class Test4 extends Test2 {\n" +
" public Test4() {\n" +
" super(\"available\", new Test3() {\n" +
" protected void load() {\n" +
" System.out.println(X.this.var1.trim());\n" +
" System.out.println(var1.trim());\n" +
" }\n" +
" });\n" +
" }\n" +
" }\n" +
"// }\n" +
"}", // =================
},
"");
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=
public void test155() throws Exception {
this.runConformTest(new String[] {
"X.java",
"public class X {\n" +
" Object foo() {\n" +
" return new X() {};\n" +
" }\n" +
"}"
});
File fileX = new File(OUTPUT_DIR + File.separator +"X$1.class");
IClassFileReader reader = ToolFactory.createDefaultClassFileReader(fileX.getAbsolutePath(), IClassFileReader.CONSTANT_POOL);
assertFalse("Should not be final", Flags.isFinal(reader.getAccessFlags()));
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=128563
public void test156() throws Exception {
this.runConformTest(new String[] {
"package1/A.java",//=======================
"package package1;\n" +
"abstract class A {\n" +
" protected final void outerMethod() {\n" +
" }\n" +
"}\n",
"package1/B.java",//=======================
"package package1;\n" +
"public class B extends A {\n" +
"}\n",
"package2/C.java",//=======================
"package package2;\n" +
"import package1.B;\n" +
"public class C extends B {\n" +
" private final MyInner myInner = new MyInner();\n" +
" private class MyInner {\n" +
" public void innerMethod() {\n" +
" C.this.outerMethod();\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" final C c = new C();\n" +
" c.myInner.innerMethod();\n" +
" }\n" +
"}\n",
},
"");
String expectedOutput =
" static synthetic void access$0(package2.C arg0);\n" +
" 0 aload_0 [arg0]\n" +
" 1 invokevirtual package2.C.outerMethod() : void";
checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107
public void test157() throws Exception {
this.runConformTest(new String[] {
"package1/A.java",//=======================
"package package1;\n" +
"abstract class A {\n" +
" protected int outerField; {\n" +
" }\n" +
"}\n",
"package1/B.java",//=======================
"package package1;\n" +
"public class B extends A {\n" +
"}\n",
"package2/C.java",//=======================
"package package2;\n" +
"import package1.B;\n" +
"public class C extends B {\n" +
" private final MyInner myInner = new MyInner();\n" +
" private class MyInner {\n" +
" public void innerMethod() {\n" +
" int j = C.this.outerField;\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" final C c = new C();\n" +
" c.myInner.innerMethod();\n" +
" }\n" +
"}\n",
},
"");
String expectedOutput =
" // Method descriptor #33 (Lpackage2/C;)I\n" +
" // Stack: 1, Locals: 1\n" +
" static synthetic int access$0(package2.C arg0);\n" +
" 0 aload_0 [arg0]\n" +
" 1 getfield package2.C.outerField : int";
checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test158() throws Exception {
this.runConformTest(new String[] {
"package1/A.java",//=======================
"package package1;\n" +
"abstract class A {\n" +
" protected int outerField; {\n" +
" }\n" +
"}\n",
"package1/B.java",//=======================
"package package1;\n" +
"public class B extends A {\n" +
"}\n",
"package2/C.java",//=======================
"package package2;\n" +
"import package1.B;\n" +
"public class C extends B {\n" +
" private final MyInner myInner = new MyInner();\n" +
" private class MyInner {\n" +
" public void innerMethod() {\n" +
" C.this.outerField = 12;\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" final C c = new C();\n" +
" c.myInner.innerMethod();\n" +
" }\n" +
"}\n",
},
"");
String expectedOutput =
" // Method descriptor #33 (Lpackage2/C;I)V\n" +
" // Stack: 2, Locals: 2\n" +
" static synthetic void access$0(package2.C arg0, int arg1);\n" +
" 0 aload_0 [arg0]\n" +
" 1 iload_1 [arg1]\n" +
" 2 putfield package2.C.outerField : int";
checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test159() throws Exception {
this.runConformTest(new String[] {
"package1/A.java",//=======================
"package package1;\n" +
"abstract class A {\n" +
" protected int outerField; {\n" +
" }\n" +
"}\n",
"package1/B.java",//=======================
"package package1;\n" +
"public class B extends A {\n" +
"}\n",
"package2/C.java",//=======================
"package package2;\n" +
"import package1.B;\n" +
"public class C extends B {\n" +
" private final MyInner myInner = new MyInner();\n" +
" private class MyInner {\n" +
" public void innerMethod() {\n" +
" int j = outerField;\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" final C c = new C();\n" +
" c.myInner.innerMethod();\n" +
" }\n" +
"}\n",
},
"");
String expectedOutput =
" // Method descriptor #33 (Lpackage2/C;)I\n" +
" // Stack: 1, Locals: 1\n" +
" static synthetic int access$0(package2.C arg0);\n" +
" 0 aload_0 [arg0]\n" +
" 1 getfield package2.C.outerField : int";
checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test160() throws Exception {
this.runConformTest(new String[] {
"package1/A.java",//=======================
"package package1;\n" +
"abstract class A {\n" +
" protected int outerField; {\n" +
" }\n" +
"}\n",
"package1/B.java",//=======================
"package package1;\n" +
"public class B extends A {\n" +
"}\n",
"package2/C.java",//=======================
"package package2;\n" +
"import package1.B;\n" +
"public class C extends B {\n" +
" private final MyInner myInner = new MyInner();\n" +
" private class MyInner {\n" +
" public void innerMethod() {\n" +
" outerField = 12;\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" final C c = new C();\n" +
" c.myInner.innerMethod();\n" +
" }\n" +
"}\n",
},
"");
String expectedOutput =
" // Method descriptor #33 (Lpackage2/C;I)V\n" +
" // Stack: 2, Locals: 2\n" +
" static synthetic void access$0(package2.C arg0, int arg1);\n" +
" 0 aload_0 [arg0]\n" +
" 1 iload_1 [arg1]\n" +
" 2 putfield package2.C.outerField : int";
checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test161() throws Exception {
this.runConformTest(new String[] {
"package1/A.java",//=======================
"package package1;\n" +
"abstract class A {\n" +
" static protected int outerField; {\n" +
" }\n" +
"}\n",
"package1/B.java",//=======================
"package package1;\n" +
"public class B extends A {\n" +
"}\n",
"package2/C.java",//=======================
"package package2;\n" +
"import package1.B;\n" +
"public class C extends B {\n" +
" private final MyInner myInner = new MyInner();\n" +
" private class MyInner {\n" +
" public void innerMethod() {\n" +
" int j = C.this.outerField;\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" final C c = new C();\n" +
" c.myInner.innerMethod();\n" +
" }\n" +
"}\n",
},
"");
String expectedOutput =
" // Method descriptor #33 ()I\n" +
" // Stack: 1, Locals: 0\n" +
" static synthetic int access$0();\n" +
" 0 getstatic package2.C.outerField : int";
checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test162() throws Exception {
this.runConformTest(new String[] {
"package1/A.java",//=======================
"package package1;\n" +
"abstract class A {\n" +
" static protected int outerField; {\n" +
" }\n" +
"}\n",
"package1/B.java",//=======================
"package package1;\n" +
"public class B extends A {\n" +
"}\n",
"package2/C.java",//=======================
"package package2;\n" +
"import package1.B;\n" +
"public class C extends B {\n" +
" private final MyInner myInner = new MyInner();\n" +
" private class MyInner {\n" +
" public void innerMethod() {\n" +
" C.this.outerField = 12;\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" final C c = new C();\n" +
" c.myInner.innerMethod();\n" +
" }\n" +
"}\n",
},
"");
String expectedOutput =
" // Method descriptor #33 (I)V\n" +
" // Stack: 1, Locals: 1\n" +
" static synthetic void access$0(int arg0);\n" +
" 0 iload_0 [arg0]\n" +
" 1 putstatic package2.C.outerField : int";
checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test163() throws Exception {
this.runConformTest(new String[] {
"package1/A.java",//=======================
"package package1;\n" +
"abstract class A {\n" +
" static protected int outerField; {\n" +
" }\n" +
"}\n",
"package1/B.java",//=======================
"package package1;\n" +
"public class B extends A {\n" +
"}\n",
"package2/C.java",//=======================
"package package2;\n" +
"import package1.B;\n" +
"public class C extends B {\n" +
" private final MyInner myInner = new MyInner();\n" +
" private class MyInner {\n" +
" public void innerMethod() {\n" +
" int j = outerField;\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" final C c = new C();\n" +
" c.myInner.innerMethod();\n" +
" }\n" +
"}\n",
},
"");
String expectedOutput =
" // Method descriptor #33 ()I\n" +
" // Stack: 1, Locals: 0\n" +
" static synthetic int access$0();\n" +
" 0 getstatic package2.C.outerField : int";
checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test164() throws Exception {
this.runConformTest(new String[] {
"package1/A.java",//=======================
"package package1;\n" +
"abstract class A {\n" +
" static protected int outerField; {\n" +
" }\n" +
"}\n",
"package1/B.java",//=======================
"package package1;\n" +
"public class B extends A {\n" +
"}\n",
"package2/C.java",//=======================
"package package2;\n" +
"import package1.B;\n" +
"public class C extends B {\n" +
" private final MyInner myInner = new MyInner();\n" +
" private class MyInner {\n" +
" public void innerMethod() {\n" +
" outerField = 12;\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" final C c = new C();\n" +
" c.myInner.innerMethod();\n" +
" }\n" +
"}\n",
},
"");
String expectedOutput =
" // Method descriptor #33 (I)V\n" +
" // Stack: 1, Locals: 1\n" +
" static synthetic void access$0(int arg0);\n" +
" 0 iload_0 [arg0]\n" +
" 1 putstatic package2.C.outerField : int";
checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=128563 - variation
public void test165() throws Exception {
this.runConformTest(new String[] {
"package1/A.java",//=======================
"package package1;\n" +
"abstract class A {\n" +
" static protected final void outerMethod() {\n" +
" }\n" +
"}\n",
"package1/B.java",//=======================
"package package1;\n" +
"public class B extends A {\n" +
"}\n",
"package2/C.java",//=======================
"package package2;\n" +
"import package1.B;\n" +
"public class C extends B {\n" +
" private final MyInner myInner = new MyInner();\n" +
" private class MyInner {\n" +
" public void innerMethod() {\n" +
" C.this.outerMethod();\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" final C c = new C();\n" +
" c.myInner.innerMethod();\n" +
" }\n" +
"}\n",
},
"");
String expectedOutput =
" // Method descriptor #8 ()V\n" +
" // Stack: 0, Locals: 0\n" +
" static synthetic void access$0();\n" +
" 0 invokestatic package2.C.outerMethod() : void";
checkDisassembledClassFile(OUTPUT_DIR + File.separator + "package2" + File.separator + "C.class", "C", expectedOutput);
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test166() throws Exception {
this.runConformTest(new String[] {
"X.java",//=======================
"class XSuper {\n" +
" protected String field = \"[XSuper#field]\";//$NON-NLS-1$\n" +
"}\n" +
"public class X extends XSuper {\n" +
" protected String field = \"[X#field]\";//$NON-NLS-1$\n" +
" public static void main(String[] args) {\n" +
" new X().foo();\n" +
" }\n" +
" void foo() {\n" +
" new Object() {\n" +
" void bar() {\n" +
" System.out.print(\"X.this.field=\" + X.this.field);\n" +
" System.out.print(\"X.super.field=\" + X.super.field);\n" +
" }\n" +
" }.bar();\n" +
" }\n" +
"}\n",
},
"X.this.field=[X#field]X.super.field=[XSuper#field]");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test167() throws Exception {
this.runConformTest(new String[] {
"X.java",//=======================
"class XSuper {\n" +
" protected String method() { return \"[XSuper#method()]\"; }//$NON-NLS-1$\n" +
"}\n" +
"public class X extends XSuper {\n" +
" protected String method() { return \"[X#method()]\"; }//$NON-NLS-1$\n" +
" public static void main(String[] args) {\n" +
" new X().foo();\n" +
" }\n" +
" void foo() {\n" +
" new Object() {\n" +
" void bar() {\n" +
" System.out.print(\"X.this.method()=\" + X.this.method());\n" +
" System.out.print(\"X.super.method()=\" + X.super.method());\n" +
" }\n" +
" }.bar();\n" +
" }\n" +
"}\n",
},
"X.this.method()=[X#method()]X.super.method()=[XSuper#method()]");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test168() throws Exception {
this.runConformTest(new String[] {
"X.java",//=======================
"class XSuper {\n" +
" protected String field;\n" +
"}\n" +
"public class X extends XSuper {\n" +
" protected String field;\n" +
" public static void main(String[] args) {\n" +
" new X().foo();\n" +
" }\n" +
" void foo() {\n" +
" new Object() {\n" +
" void bar() {\n" +
" X.this.field = \"[X#field]\";\n" +
" X.super.field = \"[XSuper#field]\";\n" +
" System.out.print(\"X.this.field=\" + X.this.field);\n" +
" System.out.print(\"X.super.field=\" + X.super.field);\n" +
" }\n" +
" }.bar();\n" +
" }\n" +
"}\n",
},
"X.this.field=[X#field]X.super.field=[XSuper#field]");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test169() throws Exception {
this.runConformTest(new String[] {
"X.java",//=======================
"import p.XSuper;\n" +
"public class X extends XSuper {\n" +
" protected String method() { return \"[X#method()]\"; }//$NON-NLS-1$\n" +
" public static void main(String[] args) {\n" +
" new X().foo();\n" +
" }\n" +
" void foo() {\n" +
" new Object () {\n" +
" void bar() {\n" +
" System.out.print(\"X.this.method()=\" + X.this.method());\n" +
" System.out.print(\"X.super.method()=\" + X.super.method());\n" +
" }\n" +
" }.bar();\n" +
" }\n" +
"}\n",
"p/XSuper.java",//=======================
"package p;\n" +
"class XInternal {\n" +
" protected String method() { return \"[XInternal#method()]\"; }//$NON-NLS-1$\n" +
"}\n" +
"public class XSuper extends XInternal {\n" +
"}\n",
},
"X.this.method()=[X#method()]X.super.method()=[XInternal#method()]");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test170() throws Exception {
this.runConformTest(new String[] {
"X.java",//=======================
"public class X {\n" +
" class Member {\n" +
" private String field = \"SUCCESS\";\n" +
" }\n" +
" class SubMember extends Member {\n" +
" void foo() {\n" +
" System.out.println(super.field);\n" +
" }\n" +
" } \n" +
" public static void main(String argv[]) {\n" +
" new X().new SubMember().foo(); \n" +
" }\n" +
"}\n",
},
"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=249107 - variation
public void test171() throws Exception {
this.runConformTest(new String[] {
"X.java",//=======================
"public class X {\n" +
" class Member {\n" +
" private String method() { return \"SUCCESS\"; }\n" +
" }\n" +
" class SubMember extends Member {\n" +
" void foo() {\n" +
" System.out.println(super.method());\n" +
" }\n" +
" } \n" +
" public static void main(String argv[]) {\n" +
" new X().new SubMember().foo(); \n" +
" }\n" +
"}\n",
},
"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=197271
public void test172() throws Exception {
String[] files = new String[] {
"X.java",
"public class X {\n" +
" void a() {}\n" +
" private static void a(String s) {}\n" +
" private void c() {}\n" +
" private static void c(String s) {}\n" +
" static class M1 extends X {\n" +
" public void x() {\n" +
" a(null);\n" +
" c(null);\n" +
" }\n" +
" }\n" +
" static class M2 {\n" +
" public void x() {\n" +
" a(null);\n" +
" c(null);\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" }\n" +
"}\n",
};
if (this.complianceLevel < ClassFileConstants.JDK11) {
this.runNegativeTest(
files,
"----------\n" +
"1. WARNING in X.java (at line 8)\n" +
" a(null);\n" +
" ^^^^^^^\n" +
"Access to enclosing method a(String) from the type X is emulated by a synthetic accessor method\n" +
"----------\n" +
"2. WARNING in X.java (at line 9)\n" +
" c(null);\n" +
" ^^^^^^^\n" +
"Access to enclosing method c(String) from the type X is emulated by a synthetic accessor method\n" +
"----------\n" +
"3. WARNING in X.java (at line 14)\n" +
" a(null);\n" +
" ^^^^^^^\n" +
"Access to enclosing method a(String) from the type X is emulated by a synthetic accessor method\n" +
"----------\n" +
"4. WARNING in X.java (at line 15)\n" +
" c(null);\n" +
" ^^^^^^^\n" +
"Access to enclosing method c(String) from the type X is emulated by a synthetic accessor method\n" +
"----------\n"
);
} else {
this.runConformTest(files, "");
}
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=308245
public void test173() throws Exception {
this.runConformTest(
new String[] {
"X.java",//=======================
"import java.util.ArrayList;\n" +
"import java.util.Comparator;\n" +
"import java.util.List;\n" +
"public class X {\n" +
" public static void main(String[] args) {\n" +
" final List yourList = new ArrayList();\n" +
" final List myList = new ArrayList();\n" +
" new Comparator() {\n" +
" public int compare(Object o1, Object o2) {\n" +
" compare(yourList != null ? yourList : myList, yourList);\n" +
" return 0;\n" +
" }\n" +
" };\n" +
" System.out.println(\"SUCCESS\");\n" +
" }\n" +
"}",
},
"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=308245
public void test174() throws Exception {
this.runConformTest(
new String[] {
"X.java",//=======================
"import java.util.Comparator;\n" +
"public class X {\n" +
" public static class MyList {\n" +
" int size;\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" final MyList yourList = new MyList();\n" +
" final MyList myList = new MyList();\n" +
" new Comparator() {\n" +
" public int compare(Object o1, Object o2) {\n" +
" return compare((MyList) o1, (MyList) o2);\n" +
" }\n" +
" public int compare(MyList o1, MyList o2) {\n" +
" return foo(yourList != null ? yourList.size : myList.size, yourList.size);\n" +
" }\n" +
" private int foo(int i, int j) {\n" +
" return i - j;\n" +
" }\n" +
" };\n" +
" System.out.println(\"SUCCESS\");\n" +
" }\n" +
"}",
},
"SUCCESS");
}
//https://bugs.eclipse.org/bugs/show_bug.cgi?id=388903
public void test175() throws Exception {
this.runConformTest(
new String[] {
"X.java",//=======================
"public class X {\n" +
" class Inner extends X {\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new X().new Inner(){};\n" +
" System.out.println(\"SUCCESS\");\n" +
" }\n" +
"}",
},
"SUCCESS");
this.runConformTest(
new String[] {
"X.java",//=======================
"public class X {\n" +
" String which;\n" +
" X(String s) {\n" +
" this.which = s;\n" +
" }\n" +
" class Inner extends X {\n" +
" Inner() {\n" +
" super(\"Inner\");\n" +
" System.out.print( X.this.which + \",\" ); // will output 'Enclosing,'\n" +
" }\n" +
" }\n" +
" void check() {\n" +
" new X(\"Enclosing\").new Inner() {\n" +
" {\n" +
" System.out.print( X.this.which + \",\" ); // will output 'Context,'\n" +
" }\n" +
" void f() {\n" +
" System.out.println( X.this.which ); // will output 'Context'\n" +
" }\n" +
" }.f();\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" new X(\"Context\").check();\n" +
" }\n" +
"}",
},
"Enclosing,Context,Context");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=435419 Instantiating needs outer constructor
public void test176() {
this.runConformTest(
new String[] {
"Demo.java",
"import java.util.ArrayList;\n" +
"public class Demo {\n" +
" static class ExprFactoryList extends ArrayList {\n" +
" class Expr {}\n" +
" class Expr2 extends Expr {}\n" +
" }\n" +
" final static ExprFactoryList arith = new ExprFactoryList() {\n" +
" {\n" +
" add(new Object() {public Expr generate() {return new Expr() {};} }); // OK\n" +
" add(new Object() {public Expr generate() {return new Expr2() {};} }); // Ok\n" +
" }\n" +
" };\n" +
" final static ExprFactoryList statementFactory = new ExprFactoryList() {\n" +
" class Statement extends Expr {}\n" +
" void m() {\n" +
" add(new Object() {\n" +
" public void generate() {\n" +
" new Statement(){}; // OK\n" +
" }\n" +
" });\n" +
" }\n" +
" {\n" +
" add (new Statement()); // OK\n" +
" add(new Object() {\n" +
" public void generate() {\n" +
" new Statement(); // OK\n" +
" new Statement(){}; // cannot compile\n" +
" }\n" +
" });\n" +
" }\n" +
" };\n" +
" public static void main(String[] args) {\n" +
" Demo demo = new Demo();\n" +
" System.out.println(\"SUCCESS\");\n" +
" }\n" +
" \n" +
"}"
},
"SUCCESS");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=484546 "IncompatibleClassChangeError: Expected static method[...]" with inner classes
public void testbug484546() {
this.runConformTest(
new String[] {
"inner/test/InnerTest.java",
"package inner.test;\n" +
"class Inner029SuperSuper {\n" +
" public int getValue() {\n" +
" return 10;\n" +
" }\n" +
"}\n" +
"class Inner029Super extends Inner029SuperSuper {\n" +
"}\n" +
"class InnerSuper extends Inner029Super {\n" +
" public int getValue() {\n" +
" return 20;\n" +
" }\n" +
"}\n" +
"public class InnerTest extends Inner029Super {\n" +
" public int result = new Inner().getInner2().test();\n" +
" class Inner extends InnerSuper {\n" +
" Inner2 getInner2() {\n" +
" return new Inner2();\n" +
" }\n" +
" class Inner2 {\n" +
" public int test() {\n" +
" return InnerTest.super.getValue();\n" +
" }\n" +
" }\n" +
" }\n" +
" public static void main(String[] args) {\n" +
" System.out.println(new InnerTest().result);\n" +
"}\n" +
"}\n"
},
"10");
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=373371 [compiler] JDT Compiler reports an error whereas javac compiles without problem
public void testbug373371() {
String[] sources = new String[] {
"Outer.java",
"class Outer {\n" +
" class Inner extends Outer { }\n" +
" class SubInner extends Inner {\n" +
" public SubInner() {\n" +
" // Outer.this.super(); // (1)\n" +
" }\n" +
" }\n" +
"}"
};
if (this.complianceLevel < ClassFileConstants.JDK1_4 || this.complianceLevel > ClassFileConstants.JDK1_6) {
this.runConformTest(sources);
} else {
this.runNegativeTest(
sources,
"----------\n" +
"1. ERROR in Outer.java (at line 4)\n" +
" public SubInner() {\n" +
" ^^^^^^^^^^\n" +
"No enclosing instance of type Outer is available due to some intermediate constructor invocation\n" +
"----------\n");
}
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=522061 EJC 4.8M1 does not compile a class that javac 1.8.0_112 compiles
public void testbug522061() {
String[] sources = new String[] {
"ztest/Foo.java",
"package ztest;\n" +
"import java.io.File;\n" +
"import javax.swing.Action;\n" +
"public abstract class Foo {\n" +
" public FilteredFileTree matching(final Action filterConfigAction) {\n" +
" return new FilteredFileTree() {\n" +
" //@Override\n" +
" protected File filter(File set) {\n" +
" return null;\n" +
" }\n" +
" };\n" +
" }\n" +
" public String getDisplayName() {\n" +
" return null;\n" +
" }\n" +
" private abstract class FilteredFileTree extends Foo {\n" +
" protected abstract File filter(File set);\n" +
" public String getDisplayName() {\n" +
" return Foo.this.toString();\n" +
" }\n" +
" }\n" +
"}"
};
if (this.complianceLevel < ClassFileConstants.JDK1_4 || this.complianceLevel > ClassFileConstants.JDK1_6) {
this.runConformTest(sources);
} else {
this.runNegativeTest(
sources,
"----------\n" +
"1. WARNING in ztest\\Foo.java (at line 6)\n" +
" return new FilteredFileTree() {\n" +
" ^^^^^^^^^^^^^^^^^^\n" +
"Access to enclosing constructor Foo.FilteredFileTree() is emulated by a synthetic accessor method\n" +
"----------\n" +
"2. ERROR in ztest\\Foo.java (at line 6)\n" +
" return new FilteredFileTree() {\n" +
" ^^^^^^^^^^^^^^^^^^\n" +
"No enclosing instance of type Foo is available due to some intermediate constructor invocation\n" +
"----------\n");
}
}
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=481793 Compilation error when trying to compile nested inner classes
public void testbug481793() {
String[] sources = new String[] {
"A.java",
"public class A {\n" +
" public class B extends A {\n" +
" public class C extends B {}\n" +
" }\n" +
"}"
};
if (this.complianceLevel < ClassFileConstants.JDK1_4 || this.complianceLevel > ClassFileConstants.JDK1_6) {
this.runConformTest(sources);
} else {
this.runNegativeTest(
sources,
"----------\n" +
"1. ERROR in A.java (at line 3)\n" +
" public class C extends B {}\n" +
" ^\n" +
"No enclosing instance of type A is available due to some intermediate constructor invocation\n" +
"----------\n");
}
}
public static Class testClass() {
return InnerEmulationTest.class;
}
}