Skip to content

Commit 0ad6423

Browse files
committed
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
1 parent 68aa4d4 commit 0ad6423

File tree

6 files changed

+271
-9
lines changed

6 files changed

+271
-9
lines changed

src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java

+10-5
Original file line numberDiff line numberDiff line change
@@ -2587,17 +2587,22 @@ public void visitApply(JCMethodInvocation tree) {
25872587
chk.checkRefType(qualifier.pos(),
25882588
attribExpr(qualifier, localEnv,
25892589
encl));
2590-
} else if (methName == names._super) {
2591-
// qualifier omitted; check for existence
2592-
// of an appropriate implicit qualifier.
2593-
checkNewInnerClass(tree.meth.pos(), localEnv, site, true);
25942590
}
25952591
} else if (tree.meth.hasTag(SELECT)) {
25962592
log.error(tree.meth.pos(),
25972593
Errors.IllegalQualNotIcls(site.tsym));
25982594
attribExpr(((JCFieldAccess) tree.meth).selected, localEnv, site);
25992595
}
26002596

2597+
if (tree.meth.hasTag(IDENT)) {
2598+
// non-qualified super(...) call; check whether explicit constructor
2599+
// invocation is well-formed. If the super class is an inner class,
2600+
// make sure that an appropriate implicit qualifier exists. If the super
2601+
// class is a local class, make sure that the current class is defined
2602+
// in the same context as the local class.
2603+
checkNewInnerClass(tree.meth.pos(), localEnv, site, true);
2604+
}
2605+
26012606
// if we're calling a java.lang.Enum constructor,
26022607
// prefix the implicit String and int parameters
26032608
if (site.tsym == syms.enumSym)
@@ -3065,7 +3070,7 @@ public void report(DiagnosticPosition _unused, JCDiagnostic details) {
30653070
}
30663071

30673072
void checkNewInnerClass(DiagnosticPosition pos, Env<AttrContext> env, Type type, boolean isSuper) {
3068-
boolean isLocal = type.tsym.owner.kind == MTH;
3073+
boolean isLocal = type.tsym.owner.kind == VAR || type.tsym.owner.kind == MTH;
30693074
if ((type.tsym.flags() & (INTERFACE | ENUM | RECORD)) != 0 ||
30703075
(!isLocal && !type.tsym.isInner()) ||
30713076
(isSuper && env.enclClass.sym.isAnonymous())) {

src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Resolve.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -3834,7 +3834,7 @@ Symbol findSelfContaining(DiagnosticPosition pos,
38343834
*/
38353835
Symbol findLocalClassOwner(Env<AttrContext> env, TypeSymbol c) {
38363836
Symbol owner = c.owner;
3837-
Assert.check(owner.kind == MTH);
3837+
Assert.check(owner.kind == MTH || owner.kind == VAR);
38383838
Env<AttrContext> env1 = env;
38393839
boolean staticOnly = false;
38403840
while (env1.outer != null) {
@@ -3846,7 +3846,9 @@ Symbol findLocalClassOwner(Env<AttrContext> env, TypeSymbol c) {
38463846
if (isStatic(env1)) staticOnly = true;
38473847
env1 = env1.outer;
38483848
}
3849-
return methodNotFound;
3849+
return owner.kind == MTH ?
3850+
methodNotFound :
3851+
varNotFound;
38503852
}
38513853

38523854
/**

test/langtools/tools/javac/LocalFreeVarStaticInstantiate.java

+58-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
* @test /nodynamiccopyright/
3-
* @bug 8322882
3+
* @bug 8322882 8345953
44
* @summary Disallow attempts to access a free variable proxy field from a static method
55
* @compile/fail/ref=LocalFreeVarStaticInstantiate.out -XDrawDiagnostics LocalFreeVarStaticInstantiate.java
66
*/
@@ -41,4 +41,61 @@ class Local {
4141
};
4242
}
4343
};
44+
45+
// local class in switch
46+
static Object bar = switch (foo) {
47+
case Runnable r -> {
48+
Object there = "";
49+
class Local {
50+
{
51+
there.hashCode();
52+
}
53+
54+
static {
55+
new Local(); // can't get there from here
56+
}
57+
58+
static Runnable r = () -> {
59+
new Local(); // can't get there from here
60+
};
61+
}
62+
yield r;
63+
}
64+
};
65+
66+
// local class in instance init
67+
{
68+
Object there = "";
69+
class Local {
70+
{
71+
there.hashCode();
72+
}
73+
74+
static {
75+
new Local(); // can't get there from here
76+
}
77+
78+
static Runnable r = () -> {
79+
new Local(); // can't get there from here
80+
};
81+
}
82+
}
83+
84+
// local class in static init
85+
static {
86+
Object there = "";
87+
class Local {
88+
{
89+
there.hashCode();
90+
}
91+
92+
static {
93+
new Local(); // can't get there from here
94+
}
95+
96+
static Runnable r = () -> {
97+
new Local(); // can't get there from here
98+
};
99+
}
100+
}
44101
}

test/langtools/tools/javac/LocalFreeVarStaticInstantiate.out

+7-1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,10 @@ LocalFreeVarStaticInstantiate.java:18:17: compiler.err.local.cant.be.inst.static
22
LocalFreeVarStaticInstantiate.java:22:17: compiler.err.local.cant.be.inst.static: kindname.class, Local
33
LocalFreeVarStaticInstantiate.java:36:17: compiler.err.local.cant.be.inst.static: kindname.class, Local
44
LocalFreeVarStaticInstantiate.java:40:17: compiler.err.local.cant.be.inst.static: kindname.class, Local
5-
4 errors
5+
LocalFreeVarStaticInstantiate.java:55:21: compiler.err.local.cant.be.inst.static: kindname.class, Local
6+
LocalFreeVarStaticInstantiate.java:59:21: compiler.err.local.cant.be.inst.static: kindname.class, Local
7+
LocalFreeVarStaticInstantiate.java:75:17: compiler.err.local.cant.be.inst.static: kindname.class, Local
8+
LocalFreeVarStaticInstantiate.java:79:17: compiler.err.local.cant.be.inst.static: kindname.class, Local
9+
LocalFreeVarStaticInstantiate.java:93:17: compiler.err.local.cant.be.inst.static: kindname.class, Local
10+
LocalFreeVarStaticInstantiate.java:97:17: compiler.err.local.cant.be.inst.static: kindname.class, Local
11+
10 errors
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
/*
2+
* @test /nodynamiccopyright/
3+
* @bug 8345944
4+
* @summary JEP 492: extending local class in a different static context should not be allowed
5+
* @compile/fail/ref=LocalFreeVarStaticSuper.out -XDrawDiagnostics LocalFreeVarStaticSuper.java
6+
*/
7+
8+
class LocalFreeVarStaticSuper {
9+
10+
// local class in method
11+
static void foo(Object there) {
12+
class Local {
13+
{
14+
there.hashCode();
15+
}
16+
17+
static {
18+
class Sub1 extends Local { }
19+
class Sub2 extends Local {
20+
Sub2() { }
21+
}
22+
class Sub3 extends Local {
23+
Sub3() { super(); }
24+
}
25+
}
26+
27+
static Runnable r = () -> {
28+
class Sub1 extends Local { }
29+
class Sub2 extends Local {
30+
Sub2() { }
31+
}
32+
class Sub3 extends Local {
33+
Sub3() { super(); }
34+
}
35+
};
36+
}
37+
}
38+
39+
// local class in lambda
40+
static Runnable foo = () -> {
41+
Object there = "";
42+
class Local {
43+
{
44+
there.hashCode();
45+
}
46+
47+
static {
48+
class Sub1 extends Local { }
49+
class Sub2 extends Local {
50+
Sub2() { }
51+
}
52+
class Sub3 extends Local {
53+
Sub3() { super(); }
54+
}
55+
}
56+
57+
static Runnable r = () -> {
58+
class Sub1 extends Local { }
59+
class Sub2 extends Local {
60+
Sub2() { }
61+
}
62+
class Sub3 extends Local {
63+
Sub3() { super(); }
64+
}
65+
};
66+
}
67+
};
68+
69+
// local class in switch
70+
static Object bar = switch (foo) {
71+
case Runnable r -> {
72+
Object there = "";
73+
class Local {
74+
{
75+
there.hashCode();
76+
}
77+
78+
static {
79+
class Sub1 extends Local { }
80+
class Sub2 extends Local {
81+
Sub2() { }
82+
}
83+
class Sub3 extends Local {
84+
Sub3() { super(); }
85+
}
86+
}
87+
88+
static Runnable r = () -> {
89+
class Sub1 extends Local { }
90+
class Sub2 extends Local {
91+
Sub2() { }
92+
}
93+
class Sub3 extends Local {
94+
Sub3() { super(); }
95+
}
96+
};
97+
}
98+
yield r;
99+
}
100+
};
101+
102+
// local class in instance init
103+
{
104+
Object there = "";
105+
class Local {
106+
{
107+
there.hashCode();
108+
}
109+
110+
static {
111+
class Sub1 extends Local { }
112+
class Sub2 extends Local {
113+
Sub2() { }
114+
}
115+
class Sub3 extends Local {
116+
Sub3() { super(); }
117+
}
118+
}
119+
120+
static Runnable r = () -> {
121+
class Sub1 extends Local { }
122+
class Sub2 extends Local {
123+
Sub2() { }
124+
}
125+
class Sub3 extends Local {
126+
Sub3() { super(); }
127+
}
128+
};
129+
}
130+
}
131+
132+
// local class in static init
133+
static {
134+
Object there = "";
135+
class Local {
136+
{
137+
there.hashCode();
138+
}
139+
140+
static {
141+
class Sub1 extends Local { }
142+
class Sub2 extends Local {
143+
Sub2() { }
144+
}
145+
class Sub3 extends Local {
146+
Sub3() { super(); }
147+
}
148+
}
149+
150+
static Runnable r = () -> {
151+
class Sub1 extends Local { }
152+
class Sub2 extends Local {
153+
Sub2() { }
154+
}
155+
class Sub3 extends Local {
156+
Sub3() { super(); }
157+
}
158+
};
159+
}
160+
}
161+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
LocalFreeVarStaticSuper.java:18:17: compiler.err.local.cant.be.inst.static: kindname.class, Local
2+
LocalFreeVarStaticSuper.java:20:28: compiler.err.local.cant.be.inst.static: kindname.class, Local
3+
LocalFreeVarStaticSuper.java:23:30: compiler.err.local.cant.be.inst.static: kindname.class, Local
4+
LocalFreeVarStaticSuper.java:28:17: compiler.err.local.cant.be.inst.static: kindname.class, Local
5+
LocalFreeVarStaticSuper.java:30:28: compiler.err.local.cant.be.inst.static: kindname.class, Local
6+
LocalFreeVarStaticSuper.java:33:30: compiler.err.local.cant.be.inst.static: kindname.class, Local
7+
LocalFreeVarStaticSuper.java:48:17: compiler.err.local.cant.be.inst.static: kindname.class, Local
8+
LocalFreeVarStaticSuper.java:50:28: compiler.err.local.cant.be.inst.static: kindname.class, Local
9+
LocalFreeVarStaticSuper.java:53:30: compiler.err.local.cant.be.inst.static: kindname.class, Local
10+
LocalFreeVarStaticSuper.java:58:17: compiler.err.local.cant.be.inst.static: kindname.class, Local
11+
LocalFreeVarStaticSuper.java:60:28: compiler.err.local.cant.be.inst.static: kindname.class, Local
12+
LocalFreeVarStaticSuper.java:63:30: compiler.err.local.cant.be.inst.static: kindname.class, Local
13+
LocalFreeVarStaticSuper.java:79:21: compiler.err.local.cant.be.inst.static: kindname.class, Local
14+
LocalFreeVarStaticSuper.java:81:32: compiler.err.local.cant.be.inst.static: kindname.class, Local
15+
LocalFreeVarStaticSuper.java:84:34: compiler.err.local.cant.be.inst.static: kindname.class, Local
16+
LocalFreeVarStaticSuper.java:89:21: compiler.err.local.cant.be.inst.static: kindname.class, Local
17+
LocalFreeVarStaticSuper.java:91:32: compiler.err.local.cant.be.inst.static: kindname.class, Local
18+
LocalFreeVarStaticSuper.java:94:34: compiler.err.local.cant.be.inst.static: kindname.class, Local
19+
LocalFreeVarStaticSuper.java:111:17: compiler.err.local.cant.be.inst.static: kindname.class, Local
20+
LocalFreeVarStaticSuper.java:113:28: compiler.err.local.cant.be.inst.static: kindname.class, Local
21+
LocalFreeVarStaticSuper.java:116:30: compiler.err.local.cant.be.inst.static: kindname.class, Local
22+
LocalFreeVarStaticSuper.java:121:17: compiler.err.local.cant.be.inst.static: kindname.class, Local
23+
LocalFreeVarStaticSuper.java:123:28: compiler.err.local.cant.be.inst.static: kindname.class, Local
24+
LocalFreeVarStaticSuper.java:126:30: compiler.err.local.cant.be.inst.static: kindname.class, Local
25+
LocalFreeVarStaticSuper.java:141:17: compiler.err.local.cant.be.inst.static: kindname.class, Local
26+
LocalFreeVarStaticSuper.java:143:28: compiler.err.local.cant.be.inst.static: kindname.class, Local
27+
LocalFreeVarStaticSuper.java:146:30: compiler.err.local.cant.be.inst.static: kindname.class, Local
28+
LocalFreeVarStaticSuper.java:151:17: compiler.err.local.cant.be.inst.static: kindname.class, Local
29+
LocalFreeVarStaticSuper.java:153:28: compiler.err.local.cant.be.inst.static: kindname.class, Local
30+
LocalFreeVarStaticSuper.java:156:30: compiler.err.local.cant.be.inst.static: kindname.class, Local
31+
30 errors

0 commit comments

Comments
 (0)