jdk/test/langtools/tools/javac/LocalFreeVarStaticSuper.java
Maurizio Cimadamore 67b8251679 8345944: JEP 492: extending local class in a different static context should not be allowed
8345953: JEP 492: instantiating local classes in a different static context should not be allowed

Reviewed-by: vromero
Backport-of: 0ad64234e2fd19ec0435fb00340120153b928f9c
2024-12-16 10:17:28 +00:00

162 lines
4.1 KiB
Java

/*
* @test /nodynamiccopyright/
* @bug 8345944
* @summary JEP 492: extending local class in a different static context should not be allowed
* @compile/fail/ref=LocalFreeVarStaticSuper.out -XDrawDiagnostics LocalFreeVarStaticSuper.java
*/
class LocalFreeVarStaticSuper {
// local class in method
static void foo(Object there) {
class Local {
{
there.hashCode();
}
static {
class Sub1 extends Local { }
class Sub2 extends Local {
Sub2() { }
}
class Sub3 extends Local {
Sub3() { super(); }
}
}
static Runnable r = () -> {
class Sub1 extends Local { }
class Sub2 extends Local {
Sub2() { }
}
class Sub3 extends Local {
Sub3() { super(); }
}
};
}
}
// local class in lambda
static Runnable foo = () -> {
Object there = "";
class Local {
{
there.hashCode();
}
static {
class Sub1 extends Local { }
class Sub2 extends Local {
Sub2() { }
}
class Sub3 extends Local {
Sub3() { super(); }
}
}
static Runnable r = () -> {
class Sub1 extends Local { }
class Sub2 extends Local {
Sub2() { }
}
class Sub3 extends Local {
Sub3() { super(); }
}
};
}
};
// local class in switch
static Object bar = switch (foo) {
case Runnable r -> {
Object there = "";
class Local {
{
there.hashCode();
}
static {
class Sub1 extends Local { }
class Sub2 extends Local {
Sub2() { }
}
class Sub3 extends Local {
Sub3() { super(); }
}
}
static Runnable r = () -> {
class Sub1 extends Local { }
class Sub2 extends Local {
Sub2() { }
}
class Sub3 extends Local {
Sub3() { super(); }
}
};
}
yield r;
}
};
// local class in instance init
{
Object there = "";
class Local {
{
there.hashCode();
}
static {
class Sub1 extends Local { }
class Sub2 extends Local {
Sub2() { }
}
class Sub3 extends Local {
Sub3() { super(); }
}
}
static Runnable r = () -> {
class Sub1 extends Local { }
class Sub2 extends Local {
Sub2() { }
}
class Sub3 extends Local {
Sub3() { super(); }
}
};
}
}
// local class in static init
static {
Object there = "";
class Local {
{
there.hashCode();
}
static {
class Sub1 extends Local { }
class Sub2 extends Local {
Sub2() { }
}
class Sub3 extends Local {
Sub3() { super(); }
}
}
static Runnable r = () -> {
class Sub1 extends Local { }
class Sub2 extends Local {
Sub2() { }
}
class Sub3 extends Local {
Sub3() { super(); }
}
};
}
}
}