Skip to content

Commit c2e69df

Browse files
author
Vicente Romero
committed
8235778: No compilation error reported when a record is declared in a local class
Reviewed-by: mcimadamore
1 parent 8c33bba commit c2e69df

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

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

+3
Original file line numberDiff line numberDiff line change
@@ -1207,6 +1207,9 @@ else if ((sym.owner.flags_field & INTERFACE) != 0)
12071207
mask = (flags & RECORD) != 0 ? LocalRecordFlags : LocalClassFlags;
12081208
if ((flags & RECORD) != 0) {
12091209
implicit = STATIC;
1210+
if (sym.owner.kind == TYP) {
1211+
log.error(pos, Errors.RecordDeclarationNotAllowedInInnerClasses);
1212+
}
12101213
}
12111214
if ((sym.owner.flags_field & STATIC) == 0 &&
12121215
(flags & ENUM) != 0) {

test/langtools/tools/javac/records/RecordCompilationTests.java

+37
Original file line numberDiff line numberDiff line change
@@ -417,6 +417,14 @@ public void testLocalRecords() {
417417
" record RR(int x) { public int x() { return z; }};\n" +
418418
" }\n" +
419419
"}");
420+
// can be contained inside a lambda
421+
assertOK("""
422+
class Outer {
423+
Runnable run = () -> {
424+
record TestRecord(int i) {}
425+
};
426+
}
427+
""");
420428

421429
// Can't self-shadow
422430
assertFail("compiler.err.already.defined",
@@ -488,6 +496,35 @@ public void testRecordsInsideInner() {
488496
" record R(int a) {}\n" +
489497
" }\n" +
490498
"}");
499+
assertFail("compiler.err.record.declaration.not.allowed.in.inner.classes",
500+
"""
501+
class Outer {
502+
public void test() {
503+
class Inner extends Outer {
504+
record R(int i) {}
505+
}
506+
}
507+
}
508+
""");
509+
assertFail("compiler.err.record.declaration.not.allowed.in.inner.classes",
510+
"""
511+
class Outer {
512+
Runnable run = new Runnable() {
513+
record TestRecord(int i) {}
514+
public void run() {}
515+
};
516+
}
517+
""");
518+
assertFail("compiler.err.record.declaration.not.allowed.in.inner.classes",
519+
"""
520+
class Outer {
521+
void m() {
522+
record A() {
523+
record B() { }
524+
}
525+
}
526+
}
527+
""");
491528
}
492529

493530
public void testReceiverParameter() {

0 commit comments

Comments
 (0)