Skip to content

Commit 9a19eb6

Browse files
author
Vicente Romero
committed
8254105: allow static nested declarations
Reviewed-by: mcimadamore
1 parent 14de791 commit 9a19eb6

25 files changed

+567
-445
lines changed

src/jdk.compiler/share/classes/com/sun/tools/javac/code/Flags.java

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -383,30 +383,31 @@ public static EnumSet<Flag> asFlagSet(long flags) {
383383
/** Modifier masks.
384384
*/
385385
public static final int
386-
AccessFlags = PUBLIC | PROTECTED | PRIVATE,
387-
LocalClassFlags = FINAL | ABSTRACT | STRICTFP | ENUM | SYNTHETIC,
388-
StaticLocalFlags = LocalClassFlags | STATIC | INTERFACE,
389-
MemberClassFlags = LocalClassFlags | INTERFACE | AccessFlags,
390-
MemberRecordFlags = MemberClassFlags | STATIC,
391-
ClassFlags = LocalClassFlags | INTERFACE | PUBLIC | ANNOTATION,
392-
InterfaceVarFlags = FINAL | STATIC | PUBLIC,
393-
VarFlags = AccessFlags | FINAL | STATIC |
394-
VOLATILE | TRANSIENT | ENUM,
395-
ConstructorFlags = AccessFlags,
396-
InterfaceMethodFlags = ABSTRACT | PUBLIC,
397-
MethodFlags = AccessFlags | ABSTRACT | STATIC | NATIVE |
398-
SYNCHRONIZED | FINAL | STRICTFP,
399-
RecordMethodFlags = AccessFlags | ABSTRACT | STATIC |
400-
SYNCHRONIZED | FINAL | STRICTFP;
386+
AccessFlags = PUBLIC | PROTECTED | PRIVATE,
387+
LocalClassFlags = FINAL | ABSTRACT | STRICTFP | ENUM | SYNTHETIC,
388+
StaticLocalFlags = LocalClassFlags | STATIC | INTERFACE,
389+
MemberClassFlags = LocalClassFlags | INTERFACE | AccessFlags,
390+
MemberStaticClassFlags = MemberClassFlags | STATIC,
391+
ClassFlags = LocalClassFlags | INTERFACE | PUBLIC | ANNOTATION,
392+
InterfaceVarFlags = FINAL | STATIC | PUBLIC,
393+
VarFlags = AccessFlags | FINAL | STATIC |
394+
VOLATILE | TRANSIENT | ENUM,
395+
ConstructorFlags = AccessFlags,
396+
InterfaceMethodFlags = ABSTRACT | PUBLIC,
397+
MethodFlags = AccessFlags | ABSTRACT | STATIC | NATIVE |
398+
SYNCHRONIZED | FINAL | STRICTFP,
399+
RecordMethodFlags = AccessFlags | ABSTRACT | STATIC |
400+
SYNCHRONIZED | FINAL | STRICTFP;
401401
public static final long
402-
ExtendedStandardFlags = (long)StandardFlags | DEFAULT | SEALED | NON_SEALED,
403-
ExtendedMemberClassFlags = (long)MemberClassFlags | SEALED | NON_SEALED,
404-
ExtendedClassFlags = (long)ClassFlags | SEALED | NON_SEALED,
405-
ModifierFlags = ((long)StandardFlags & ~INTERFACE) | DEFAULT | SEALED | NON_SEALED,
406-
InterfaceMethodMask = ABSTRACT | PRIVATE | STATIC | PUBLIC | STRICTFP | DEFAULT,
407-
AnnotationTypeElementMask = ABSTRACT | PUBLIC,
408-
LocalVarFlags = FINAL | PARAMETER,
409-
ReceiverParamFlags = PARAMETER;
402+
ExtendedStandardFlags = (long)StandardFlags | DEFAULT | SEALED | NON_SEALED,
403+
ExtendedMemberClassFlags = (long)MemberClassFlags | SEALED | NON_SEALED,
404+
ExtendedMemberStaticClassFlags = (long) MemberStaticClassFlags | SEALED | NON_SEALED,
405+
ExtendedClassFlags = (long)ClassFlags | SEALED | NON_SEALED,
406+
ModifierFlags = ((long)StandardFlags & ~INTERFACE) | DEFAULT | SEALED | NON_SEALED,
407+
InterfaceMethodMask = ABSTRACT | PRIVATE | STATIC | PUBLIC | STRICTFP | DEFAULT,
408+
AnnotationTypeElementMask = ABSTRACT | PUBLIC,
409+
LocalVarFlags = FINAL | PARAMETER,
410+
ReceiverParamFlags = PARAMETER;
410411

411412
@SuppressWarnings("preview")
412413
public static Set<Modifier> asModifierSet(long flags) {

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

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,7 @@ protected Attr(Context context) {
171171
allowReifiableTypesInInstanceof =
172172
Feature.REIFIABLE_TYPES_INSTANCEOF.allowedInSource(source) &&
173173
(!preview.isPreview(Feature.REIFIABLE_TYPES_INSTANCEOF) || preview.isEnabled());
174+
allowRecords = Feature.RECORDS.allowedInSource(source);
174175
sourceName = source.name;
175176
useBeforeDeclarationWarning = options.isSet("useBeforeDeclarationWarning");
176177

@@ -207,6 +208,10 @@ protected Attr(Context context) {
207208
*/
208209
boolean allowReifiableTypesInInstanceof;
209210

211+
/** Are records allowed
212+
*/
213+
private final boolean allowRecords;
214+
210215
/**
211216
* Switch: warn about use of variable before declaration?
212217
* RFE: 6425594
@@ -5309,14 +5314,15 @@ private void attribClassBody(Env<AttrContext> env, ClassSymbol c) {
53095314
attribStat(l.head, env);
53105315
// Check that declarations in inner classes are not static (JLS 8.1.2)
53115316
// Make an exception for static constants.
5312-
if (c.owner.kind != PCK &&
5313-
((c.flags() & STATIC) == 0 || c.name == names.empty) &&
5314-
(TreeInfo.flags(l.head) & (STATIC | INTERFACE)) != 0) {
5317+
if (!allowRecords &&
5318+
c.owner.kind != PCK &&
5319+
((c.flags() & STATIC) == 0 || c.name == names.empty) &&
5320+
(TreeInfo.flags(l.head) & (STATIC | INTERFACE)) != 0) {
53155321
Symbol sym = null;
53165322
if (l.head.hasTag(VARDEF)) sym = ((JCVariableDecl) l.head).sym;
53175323
if (sym == null ||
5318-
sym.kind != VAR ||
5319-
((VarSymbol) sym).getConstValue() == null)
5324+
sym.kind != VAR ||
5325+
((VarSymbol) sym).getConstValue() == null)
53205326
log.error(l.head.pos(), Errors.IclsCantHaveStaticDecl(c));
53215327
}
53225328
}

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

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1216,23 +1216,20 @@ else if ((sym.owner.flags_field & INTERFACE) != 0)
12161216
implicit |= sym.owner.flags_field & STRICTFP;
12171217
break;
12181218
case TYP:
1219-
if (sym.isLocal()) {
1219+
if (sym.owner.kind.matches(KindSelector.VAL_MTH)) {
12201220
boolean implicitlyStatic = !sym.isAnonymous() &&
12211221
((flags & RECORD) != 0 || (flags & ENUM) != 0 || (flags & INTERFACE) != 0);
12221222
boolean staticOrImplicitlyStatic = (flags & STATIC) != 0 || implicitlyStatic;
1223+
// local statics are allowed only if records are allowed too
12231224
mask = staticOrImplicitlyStatic && allowRecords && (flags & ANNOTATION) == 0 ? StaticLocalFlags : LocalClassFlags;
12241225
implicit = implicitlyStatic ? STATIC : implicit;
1225-
if (staticOrImplicitlyStatic) {
1226-
if (sym.owner.kind == TYP) {
1227-
log.error(pos, Errors.StaticDeclarationNotAllowedInInnerClasses);
1228-
}
1229-
}
12301226
} else if (sym.owner.kind == TYP) {
1231-
mask = (flags & RECORD) != 0 ? MemberRecordFlags : ExtendedMemberClassFlags;
1227+
// statics in inner classes are allowed only if records are allowed too
1228+
mask = ((flags & STATIC) != 0) && allowRecords ? ExtendedMemberStaticClassFlags : ExtendedMemberClassFlags;
12321229
if (sym.owner.owner.kind == PCK ||
1233-
(sym.owner.flags_field & STATIC) != 0)
1230+
(sym.owner.flags_field & STATIC) != 0) {
12341231
mask |= STATIC;
1235-
else if ((flags & ENUM) != 0 || (flags & RECORD) != 0) {
1232+
} else if (!allowRecords && ((flags & ENUM) != 0 || (flags & RECORD) != 0)) {
12361233
log.error(pos, Errors.StaticDeclarationNotAllowedInInnerClasses);
12371234
}
12381235
// Nested interfaces and enums are always STATIC (Spec ???)

test/langtools/tools/javac/AnonStaticMember_1.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,11 @@
2424
/*
2525
* @test
2626
* @bug 4279339
27-
* @summary Verify that an anonymous class cannot contain a static field.
27+
* @summary Verify that an anonymous class can contain a static field only if source >= 16
2828
* @author maddox
2929
*
30-
* @run compile/fail AnonStaticMember_1.java
30+
* @compile/fail/ref=AnonStaticMember_1.out -source 15 -XDrawDiagnostics AnonStaticMember_1.java
31+
* @compile AnonStaticMember_1.java
3132
*/
3233

3334
class AnonStaticMember_1 {
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
- compiler.warn.source.no.system.modules.path: 15
2+
AnonStaticMember_1.java:36:20: compiler.err.icls.cant.have.static.decl: compiler.misc.anonymous.class: AnonStaticMember_1$1
3+
1 error
4+
1 warning

test/langtools/tools/javac/AnonStaticMember_2.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
/*
22
* @test /nodynamiccopyright/
33
* @bug 4279339 6969184
4-
* @summary Verify that an anonymous class cannot contain a static method.
4+
* @summary Verify that an anonymous class can contain a static method only if source >= 16
55
* @author maddox
66
*
7-
* @run compile/fail/ref=AnonStaticMember_2.out -XDrawDiagnostics AnonStaticMember_2.java
7+
* @compile/fail/ref=AnonStaticMember_2.out -source 15 -XDrawDiagnostics AnonStaticMember_2.java
8+
* @compile AnonStaticMember_2.java
89
*/
910

1011
class AnonStaticMember_2 {
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
1-
AnonStaticMember_2.java:12:21: compiler.err.icls.cant.have.static.decl: compiler.misc.anonymous.class: AnonStaticMember_2$1
1+
- compiler.warn.source.no.system.modules.path: 15
2+
AnonStaticMember_2.java:13:21: compiler.err.icls.cant.have.static.decl: compiler.misc.anonymous.class: AnonStaticMember_2$1
23
1 error
4+
1 warning

test/langtools/tools/javac/InnerNamedConstant_2.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
* @summary Verify rejection of illegal static variables in inner classes.
55
* @author William Maddox (maddox)
66
*
7-
* @compile/fail/ref=InnerNamedConstant_2.out -XDrawDiagnostics InnerNamedConstant_2.java
7+
* @compile/fail/ref=InnerNamedConstant_2_A.out -XDrawDiagnostics -source 15 InnerNamedConstant_2.java
8+
* @compile/fail/ref=InnerNamedConstant_2_B.out -XDrawDiagnostics InnerNamedConstant_2.java
89
*/
910

1011
public class InnerNamedConstant_2 {

test/langtools/tools/javac/InnerNamedConstant_2.out

Lines changed: 0 additions & 5 deletions
This file was deleted.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
- compiler.warn.source.no.system.modules.path: 15
2+
InnerNamedConstant_2.java:23:20: compiler.err.icls.cant.have.static.decl: InnerNamedConstant_2.Inner2
3+
InnerNamedConstant_2.java:24:29: compiler.err.icls.cant.have.static.decl: InnerNamedConstant_2.Inner2
4+
InnerNamedConstant_2.java:26:13: compiler.err.cant.assign.val.to.final.var: z
5+
InnerNamedConstant_2.java:35:26: compiler.err.icls.cant.have.static.decl: InnerNamedConstant_2.Inner3
6+
4 errors
7+
1 warning

0 commit comments

Comments
 (0)