blob: 0f8744558c44272a2389701c08baef3ba6f9e76b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2020 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.core.tests.compiler.regression;
import java.io.File;
import java.io.IOException;
import java.util.Map;
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.ClassFormatException;
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import junit.framework.Test;
public class LocalStaticsTest_15 extends AbstractRegressionTest {
static {
// TESTS_NUMBERS = new int [] { 40 };
// TESTS_RANGE = new int[] { 1, -1 };
// TESTS_NAMES = new String[] { "testBug566715_003"};
}
public static Class<?> testClass() {
return LocalStaticsTest_15.class;
}
public static Test suite() {
return buildMinimalComplianceTestSuite(testClass(), F_15);
}
public LocalStaticsTest_15(String testName){
super(testName);
}
// Enables the tests to run individually
protected Map<String, String> getCompilerOptions() {
Map<String, String> defaultOptions = super.getCompilerOptions();
defaultOptions.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_15); // FIXME
defaultOptions.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_15);
defaultOptions.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_15);
defaultOptions.put(CompilerOptions.OPTION_EnablePreviews, CompilerOptions.ENABLED);
defaultOptions.put(CompilerOptions.OPTION_ReportPreviewFeatures, CompilerOptions.IGNORE);
defaultOptions.put(CompilerOptions.OPTION_Store_Annotations, CompilerOptions.ENABLED);
return defaultOptions;
}
@Override
protected void runConformTest(String[] testFiles, String expectedOutput) {
runConformTest(testFiles, expectedOutput, getCompilerOptions());
}
@Override
protected void runConformTest(String[] testFiles, String expectedOutput, Map<String, String> customOptions) {
Runner runner = new Runner();
runner.testFiles = testFiles;
runner.expectedOutputString = expectedOutput;
runner.vmArguments = new String[] {"--enable-preview"};
runner.customOptions = customOptions;
runner.javacTestOptions = JavacTestOptions.forReleaseWithPreview("15");
runner.runConformTest();
}
@Override
protected void runNegativeTest(String[] testFiles, String expectedCompilerLog) {
runNegativeTest(testFiles, expectedCompilerLog, JavacTestOptions.forReleaseWithPreview("15"));
}
protected void runWarningTest(String[] testFiles, String expectedCompilerLog) {
runWarningTest(testFiles, expectedCompilerLog, null);
}
protected void runWarningTest(String[] testFiles, String expectedCompilerLog, Map<String, String> customOptions) {
runWarningTest(testFiles, expectedCompilerLog, customOptions, null);
}
protected void runWarningTest(String[] testFiles, String expectedCompilerLog,
Map<String, String> customOptions, String javacAdditionalTestOptions) {
Runner runner = new Runner();
runner.testFiles = testFiles;
runner.expectedCompilerLog = expectedCompilerLog;
runner.customOptions = customOptions;
runner.vmArguments = new String[] {"--enable-preview"};
runner.javacTestOptions = javacAdditionalTestOptions == null ? JavacTestOptions.forReleaseWithPreview("15") :
JavacTestOptions.forReleaseWithPreview("15", javacAdditionalTestOptions);
runner.runWarningTest();
}
private static void verifyClassFile(String expectedOutput, String classFileName, int mode)
throws IOException, ClassFormatException {
File f = new File(OUTPUT_DIR + File.separator + classFileName);
byte[] classFileBytes = org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(f);
ClassFileBytesDisassembler disassembler = ToolFactory.createDefaultClassFileBytesDisassembler();
String result = disassembler.disassemble(classFileBytes, "\n", mode);
int index = result.indexOf(expectedOutput);
if (index == -1 || expectedOutput.length() == 0) {
System.out.println(Util.displayString(result, 3));
System.out.println("...");
}
if (index == -1) {
assertEquals("Wrong contents", expectedOutput, result);
}
}
public void testBug566284_001() {
runConformTest(
new String[] {
"X.java",
"public class X {\n"+
" static void foo() {\n"+
" interface F {\n"+
" static int create(int lo) {\n"+
" I myI = s -> lo;\n"+
" return myI.bar(0);\n"+
" }\n"+
" }\n"+
" System.out.println(F.create(0));\n"+
" }\n"+
" public static void main(String[] args) {\n"+
" X.foo();\n"+
" }\n"+
"}\n"+
"\n"+
"interface I {\n"+
" int bar(int l);\n"+
"}"
},
"0");
}
public void testBug566284_002() {
runConformTest(
new String[] {
"X.java",
"public class X {\n"+
" static void foo() {\n"+
" record R() {\n"+
" static int create(int lo) {\n"+
" I myI = s -> lo;\n"+
" return myI.bar(0);\n"+
" }\n"+
" }\n"+
" System.out.println(R.create(0));\n"+
" }\n"+
" public static void main(String[] args) {\n"+
" X.foo();\n"+
" }\n"+
"}\n"+
"\n"+
"interface I {\n"+
" int bar(int l);\n"+
"}"
},
"0");
}
public void testBug566284_003() {
runNegativeTest(
new String[] {
"X.java",
"class X {\n"+
" static int si;\n"+
" int nsi;\n"+
"\n"+
" void m() {\n"+
" int li;\n"+
"\n"+
" interface F {\n"+
" static int fi = 0;\n"+
"\n"+
" default void foo(int i) {\n"+
" System.out.println(li); // error, local variable of method of outer enclosing class\n"+
" System.out.println(nsi); // error, non-static member\n"+
" System.out.println(fi); // ok, static member of current class\n"+
" System.out.println(si); // ok, static member of enclosing class\n"+
" System.out.println(i); // ok, local variable of current method\n"+
" }\n"+
"\n"+
" static void bar(int lo) {\n"+
" int k = lo; // ok\n"+
" int j = fi; // ok\n"+
" I myI = s -> lo; // ok, local var of method\n"+
" }\n"+
"\n"+
" static void bar2(int lo) {\n"+
" I myI = s -> li; // error - local var of outer class\n"+
" }\n"+
" }\n"+
" }\n"+
"}\n"+
"\n"+
"interface I {\n"+
" int bar(int l);\n"+
"}"
},
"----------\n" +
"1. ERROR in X.java (at line 12)\n" +
" System.out.println(li); // error, local variable of method of outer enclosing class\n" +
" ^^\n" +
"Cannot make a static reference to the non-static variable li\n" +
"----------\n" +
"2. ERROR in X.java (at line 13)\n" +
" System.out.println(nsi); // error, non-static member\n" +
" ^^^\n" +
"Cannot make a static reference to the non-static field nsi\n" +
"----------\n" +
"3. ERROR in X.java (at line 26)\n" +
" I myI = s -> li; // error - local var of outer class\n" +
" ^^\n" +
"Cannot make a static reference to the non-static variable li\n" +
"----------\n"
);
}
public void testBug566518_001() {
runConformTest(
new String[] {
"X.java",
"public class X {\n"+
" static void foo() {\n"+
" int f = switch (5) {\n"+
" case 5: {\n"+
" interface I{\n"+
" \n"+
" }\n"+
" class C implements I{\n"+
" public int j = 5;\n"+
" }\n"+
" \n"+
" yield new C().j;\n"+
" }\n"+
" default:\n"+
" throw new IllegalArgumentException(\"Unexpected value: \" );\n"+
" };\n"+
" System.out.println(f);\n"+
" }\n"+
" public static void main(String[] args) {\n"+
" X.foo();\n"+
" }\n"+
"}"
},
"5");
}
public void testBug566518_002() {
runConformTest(
new String[] {
"X.java",
"public class X {\n"+
" static void foo() {\n"+
" class F {\n"+
" int create(int lo) {\n"+
" I myI = s -> lo;\n"+
" return myI.bar(0);\n"+
" }\n"+
" }\n"+
" System.out.println(new F().create(0));\n"+
" }\n"+
" public static void main(String[] args) {\n"+
" X.foo();\n"+
" }\n"+
"}\n"+
"\n"+
"interface I {\n"+
" int bar(int l);\n"+
"}"
},
"0");
}
public void testBug566518_003() {
runConformTest(
new String[] {
"X.java",
"public interface X {\n"+
" static void foo() {\n"+
" class F {\n"+
" int create(int lo) {\n"+
" I myI = s -> lo;\n"+
" return myI.bar(0);\n"+
" }\n"+
" }\n"+
" System.out.println(new F().create(0));\n"+
" }\n"+
" public static void main(String[] args) {\n"+
" X.foo();\n"+
" }\n"+
"}\n"+
"\n"+
"interface I {\n"+
" int bar(int l);\n"+
"}"
},
"0");
}
public void testBug566518_004() {
runConformTest(
new String[] {
"X.java",
"public interface X {\n"+
" static void foo() {\n"+
" interface F {\n"+
" static int create(int lo) {\n"+
" I myI = s -> lo;\n"+
" return myI.bar(0);\n"+
" }\n"+
" }\n"+
" System.out.println(F.create(0));\n"+
" }\n"+
" public static void main(String[] args) {\n"+
" X.foo();\n"+
" }\n"+
"}\n"+
"\n"+
"interface I {\n"+
" int bar(int l);\n"+
"}"
},
"0");
}
public void testBug566518_005() {
runNegativeTest(
new String[] {
"X.java",
"public class X {\n"+
" static void foo() {\n"+
" int f = switch (5) {\n"+
" case 5: {\n"+
" interface I{\n"+
" \n"+
" }\n"+
" class C implements I{\n"+
" public int j = 5;\n"+
" }\n"+
" \n"+
" yield new C().j;\n"+
" }\n"+
" default:\n"+
" throw new IllegalArgumentException(\"Unexpected value: \" );\n"+
" };\n"+
" System.out.println(f);\n"+
" class C1 implements I{\n"+
" public int j = 5;\n"+
" }\n"+
" }\n"+
" public static void main(String[] args) {\n"+
" X.foo();\n"+
" }\n"+
"}\n"
},
"----------\n"+
"1. ERROR in X.java (at line 18)\n"+
" class C1 implements I{\n"+
" ^\n" +
"I cannot be resolved to a type\n"+
"----------\n"
);
}
public void testBug566518_006() {
runConformTest(
new String[] {
"X.java",
"public enum X {\n"+
" A, B, C;\n"+
" public void foo() {\n"+
" int f = switch (5) {\n"+
" case 5: {\n"+
" interface I{\n"+
" \n"+
" }\n"+
" class C implements I{\n"+
" public int j = 5;\n"+
" }\n"+
" \n"+
" yield new C().j;\n"+
" }\n"+
" default:\n"+
" throw new IllegalArgumentException(\"Unexpected value: \" );\n"+
" };\n"+
" }\n"+
" public static void main(String[] args) {\n"+
" X x = X.A;\n"+
" System.out.println();\n"+
" }\n"+
"}"
},
"");
}
// 6.5.5.1
public void testBug566715_001() {
runNegativeTest(
new String[] {
"X.java",
"public class X<T> {\n"+
" static void foo() {\n"+
" interface I {\n"+
" X<T> supply();\n"+
" }\n"+
" }\n"+
"}\n"
},
"----------\n"+
"1. WARNING in X.java (at line 3)\n" +
" interface I {\n" +
" ^\n" +
"The type I is never used locally\n" +
"----------\n" +
"2. ERROR in X.java (at line 4)\n" +
" X<T> supply();\n" +
" ^\n" +
"Cannot make a static reference to the non-static type T\n" +
"----------\n"
);
}
// 6.5.5.1
public void testBug566715_002() {
runNegativeTest(
new String[] {
"X.java",
"public class X<T> {\n"+
" void foo() {\n"+
" interface I {\n"+
" X<T> supply();\n"+
" }\n"+
" }\n"+
"}\n"
},
"----------\n"+
"1. WARNING in X.java (at line 3)\n" +
" interface I {\n" +
" ^\n" +
"The type I is never used locally\n" +
"----------\n" +
"2. ERROR in X.java (at line 4)\n" +
" X<T> supply();\n" +
" ^\n" +
"Cannot make a static reference to the non-static type T\n" +
"----------\n"
);
}
// 6.5.5.1
public void testBug566715_003() {
runNegativeTest(
new String[] {
"X.java",
"public class X<T> {\n"+
" void foo() {\n"+
" record R(X<T> x) {}\n"+
" }\n"+
"}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" record R(X<T> x) {}\n" +
" ^\n" +
"Cannot make a static reference to the non-static type T\n" +
"----------\n"
);
}
// 9.1.1/14.3
public void testBug566720_001() {
runNegativeTest(
new String[] {
"X.java",
"public class X<T> {\n"+
" void foo() {\n"+
" public interface I {}\n"+
" }\n"+
"}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" public interface I {}\n" +
" ^\n" +
"Illegal modifier for the local interface I; abstract and strictfp are the only modifiers allowed explicitly \n" +
"----------\n"
);
}
// 9.1.1/14.3
public void testBug566720_002() {
runNegativeTest(
new String[] {
"X.java",
"public class X<T> {\n"+
" void foo() {\n"+
" private interface I {}\n"+
" }\n"+
"}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" private interface I {}\n" +
" ^\n" +
"Illegal modifier for the local interface I; abstract and strictfp are the only modifiers allowed explicitly \n" +
"----------\n"
);
}
// 9.1.1
public void testBug566720_003() {
runNegativeTest(
new String[] {
"X.java",
"public class X<T> {\n"+
" void foo() {\n"+
" protected interface I {}\n"+
" }\n"+
"}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" protected interface I {}\n" +
" ^\n" +
"Illegal modifier for the local interface I; abstract and strictfp are the only modifiers allowed explicitly \n" +
"----------\n"
);
}
// 9.1.1
public void testBug566720_004() {
runNegativeTest(
new String[] {
"X.java",
"public class X<T> {\n"+
" void foo() {\n"+
" final interface I {}\n"+
" }\n"+
"}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" final interface I {}\n" +
" ^\n" +
"Illegal modifier for the local interface I; abstract and strictfp are the only modifiers allowed explicitly \n" +
"----------\n"
);
}
// 9.1.1
public void testBug566720_005() {
runNegativeTest(
new String[] {
"X.java",
"public class X<T> {\n"+
" void foo() {\n"+
" static interface I {}\n"+
" }\n"+
"}\n"
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" static interface I {}\n" +
" ^\n" +
"Illegal modifier for the local interface I; abstract and strictfp are the only modifiers allowed explicitly \n" +
"----------\n"
);
}
public void testBug566748_001() {
runNegativeTest(
new String[] {
"X.java",
"class X<T> {\n"+
" int count;\n"+
" void doNothing() {}\n"+
" void foo1(String s) {\n"+
" int i;\n"+
" interface I {\n"+
" default X<T> bar() {\n"+
" if (count > 0 || i > 0 || s == null)\n"+
" return null;\n"+
" doNothing();\n"+
" return null;\n"+
" }\n"+
" } \n"+
" }\n"+
" void foo2(String s) {\n"+
" try {\n"+
" throw new Exception();\n"+
" } catch (Exception e) {\n"+
" interface I {\n"+
" default int bar() {\n"+
" return e != null ? 0 : 1;\n"+
" }\n"+
" } \n"+
" \n"+
" }\n"+
" }\n"+
"}"
},
"----------\n" +
"1. WARNING in X.java (at line 6)\n" +
" interface I {\n" +
" ^\n" +
"The type I is never used locally\n" +
"----------\n" +
"2. ERROR in X.java (at line 7)\n" +
" default X<T> bar() {\n" +
" ^\n" +
"Cannot make a static reference to the non-static type T\n" +
"----------\n" +
"3. ERROR in X.java (at line 8)\n" +
" if (count > 0 || i > 0 || s == null)\n" +
" ^^^^^\n" +
"Cannot make a static reference to the non-static field count\n" +
"----------\n" +
"4. ERROR in X.java (at line 8)\n" +
" if (count > 0 || i > 0 || s == null)\n" +
" ^\n" +
"Cannot make a static reference to the non-static variable i\n" +
"----------\n" +
"5. ERROR in X.java (at line 8)\n" +
" if (count > 0 || i > 0 || s == null)\n" +
" ^\n" +
"Cannot make a static reference to the non-static variable s\n" +
"----------\n" +
"6. ERROR in X.java (at line 10)\n" +
" doNothing();\n" +
" ^^^^^^^^^\n" +
"Cannot make a static reference to the non-static method doNothing() from the type X<T>\n" +
"----------\n" +
"7. WARNING in X.java (at line 19)\n" +
" interface I {\n" +
" ^\n" +
"The type I is never used locally\n" +
"----------\n" +
"8. ERROR in X.java (at line 21)\n" +
" return e != null ? 0 : 1;\n" +
" ^\n" +
"Cannot make a static reference to the non-static variable e\n" +
"----------\n"
);
}
public void testBug566748_002() {
runNegativeTest(
new String[] {
"X.java",
"interface X<T> {\n"+
" int count = 0;\n"+
"\n"+
" default void doNothing() {}\n"+
"\n"+
" default void foo1(String s) {\n"+
" int i;\n"+
" interface I {\n"+
" default X<T> bar() {\n"+
" if (count > 0 || i > 0 || s == null)\n"+
" return null;\n"+
" doNothing();\n"+
" return null;\n"+
" }\n"+
" }\n"+
" }\n"+
"\n"+
" default void foo2(String s) {\n"+
" try {\n"+
" throw new Exception();\n"+
" } catch (Exception e) {\n"+
" interface I { \n"+
" default int bar() {\n"+
" return e != null ? 0 : 1;\n"+
" } \n"+
" } \n"+
" \n"+
" } \n"+
" }\n"+
"}"
},
"----------\n" +
"1. WARNING in X.java (at line 8)\n" +
" interface I {\n" +
" ^\n" +
"The type I is never used locally\n" +
"----------\n" +
"2. ERROR in X.java (at line 9)\n" +
" default X<T> bar() {\n" +
" ^\n" +
"Cannot make a static reference to the non-static type T\n" +
"----------\n" +
"3. ERROR in X.java (at line 10)\n" +
" if (count > 0 || i > 0 || s == null)\n" +
" ^\n" +
"Cannot make a static reference to the non-static variable i\n" +
"----------\n" +
"4. ERROR in X.java (at line 10)\n" +
" if (count > 0 || i > 0 || s == null)\n" +
" ^\n" +
"Cannot make a static reference to the non-static variable s\n" +
"----------\n" +
"5. ERROR in X.java (at line 12)\n" +
" doNothing();\n" +
" ^^^^^^^^^\n" +
"Cannot make a static reference to the non-static method doNothing() from the type X<T>\n" +
"----------\n" +
"6. WARNING in X.java (at line 22)\n" +
" interface I { \n" +
" ^\n" +
"The type I is never used locally\n" +
"----------\n" +
"7. ERROR in X.java (at line 24)\n" +
" return e != null ? 0 : 1;\n" +
" ^\n" +
"Cannot make a static reference to the non-static variable e\n" +
"----------\n"
);
}
// 9.6
public void testBug564557AnnotInterface_001() {
runNegativeTest(
new String[] {
"X.java",
"class X {\n"+
" void foo() {\n"+
" class I {\n"+
" @interface Annot {\n"+
" }\n"+
" }\n"+
" }\n"+
"}"
},
"----------\n" +
"1. ERROR in X.java (at line 4)\n" +
" @interface Annot {\n" +
" ^^^^^\n" +
"The member annotation Annot can only be defined inside a top-level class or interface or in a static context\n" +
"----------\n"
);
}
// 9.6
public void testBug564557AnnotInterface_002() {
runNegativeTest(
new String[] {
"X.java",
"class X {\n"+
" void foo() {\n"+
" interface I {\n"+
" @interface Annot {\n"+
" }\n"+
" }\n"+
" }\n"+
"}"
},
"----------\n" +
"1. ERROR in X.java (at line 4)\n" +
" @interface Annot {\n" +
" ^^^^^\n" +
"The member annotation Annot can only be defined inside a top-level class or interface or in a static context\n" +
"----------\n"
);
}
// 9.4 && 15.12.3
public void testBug564557MethodInvocation_003() {
runNegativeTest(
new String[] {
"X.java",
"class X {\n"+
" void foo() {\n"+
" Zork();\n"+
" interface I {\n"+
" default void bar() {}\n"+
" default void b1() {\n"+
" class J {\n"+
" void jb2() {\n"+
" bar();\n"+
" }\n"+
" }\n"+
" }\n"+
" }\n"+
" }\n"+
"}"
},
"----------\n" +
"1. ERROR in X.java (at line 3)\n" +
" Zork();\n" +
" ^^^^\n" +
"The method Zork() is undefined for the type X\n" +
"----------\n"
);
}
// 9.4 && 15.12.3
public void testBug564557MethodInvocation_004() {
runNegativeTest(
new String[] {
"X.java",
"class X {\n"+
" void foo() {\n"+
" interface I {\n"+
" default void bar() {}\n"+
" default void b1() {\n"+
" interface J {\n"+
" default void jb2() {\n"+
" bar();\n"+
" }\n"+
" }\n"+
" }\n"+
" }\n"+
" }\n"+
"}"
},
"----------\n" +
"1. WARNING in X.java (at line 3)\n" +
" interface I {\n" +
" ^\n" +
"The type I is never used locally\n" +
"----------\n" +
"2. WARNING in X.java (at line 5)\n" +
" default void b1() {\n" +
" ^^^^\n" +
"The method b1() from the type I is never used locally\n" +
"----------\n" +
"3. WARNING in X.java (at line 6)\n" +
" interface J {\n" +
" ^\n" +
"The type J is never used locally\n" +
"----------\n" +
"4. ERROR in X.java (at line 8)\n" +
" bar();\n" +
" ^^^\n" +
"Cannot make a static reference to the non-static method bar() from the type I\n" +
"----------\n"
);
}
// 13.1
public void testBug564557BinaryForm_005() throws Exception {
runConformTest(
new String[] {
"X.java",
"class X {\n"+
" public static void main(String[] args) {\n"+
" System.out.println(\"\");\n"+
" }\n"+
" void foo() {\n"+
" interface I {\n"+
" }\n"+
" }\n"+
"}"
},
"");
String expectedOutput = "abstract static interface X$1I {\n";
LocalStaticsTest_15.verifyClassFile(expectedOutput, "X$1I.class", ClassFileBytesDisassembler.SYSTEM);
}
// 14.3 for enum
public void testBug564557BinaryForm_006() throws Exception {
runConformTest(
new String[] {
"X.java",
"class X {\n"+
" public static void main(String[] args) {\n"+
" System.out.println(\"\");\n"+
" }\n"+
" void foo() {\n"+
" enum I {\n"+
" }\n"+
" }\n"+
"}"
},
"");
String expectedOutput = "static final enum X$1I {\n";
LocalStaticsTest_15.verifyClassFile(expectedOutput, "X$1I.class", ClassFileBytesDisassembler.SYSTEM);
}
// 15.8.3
public void testBug564557thisInStatic_007() {
runNegativeTest(
new String[] {
"X.java",
"class X {\n"+
" void foo() {\n"+
" interface I {\n"+
" int count = 0;\n"+
" static void bar() {\n"+
" int i = this.count;\n"+
" }\n"+
" }\n"+
" }\n"+
"}"
},
"----------\n" +
"1. WARNING in X.java (at line 3)\n" +
" interface I {\n" +
" ^\n" +
"The type I is never used locally\n" +
"----------\n" +
"2. WARNING in X.java (at line 4)\n" +
" int count = 0;\n" +
" ^^^^^\n" +
"The value of the field I.count is not used\n" +
"----------\n" +
"3. ERROR in X.java (at line 6)\n" +
" int i = this.count;\n" +
" ^^^^\n" +
"Cannot use this in a static context\n" +
"----------\n"
);
}
// 15.8.3
public void testBug564557thisInStatic_008() {
runNegativeTest(
new String[] {
"X.java",
"class X {\n"+
" int count = 0;\n"+
" void foo() {\n"+
" interface I {\n"+
" static void bar() {\n"+
" int i = X.this.count;\n"+
" }\n"+
" }\n"+
" }\n"+
"}"
},
"----------\n" +
"1. WARNING in X.java (at line 4)\n" +
" interface I {\n" +
" ^\n" +
"The type I is never used locally\n" +
"----------\n" +
"2. ERROR in X.java (at line 6)\n" +
" int i = X.this.count;\n" +
" ^^^^^^\n" +
"No enclosing instance of the type X is accessible in scope\n" +
"----------\n"
);
}
}