8235778: No compilation error reported when a record is declared in a local class

Reviewed-by: mcimadamore
This commit is contained in:
Vicente Romero 2020-01-27 23:06:46 -05:00
parent 8c33bba226
commit c2e69df562
2 changed files with 40 additions and 0 deletions

View File

@ -1207,6 +1207,9 @@ public class Check {
mask = (flags & RECORD) != 0 ? LocalRecordFlags : LocalClassFlags;
if ((flags & RECORD) != 0) {
implicit = STATIC;
if (sym.owner.kind == TYP) {
log.error(pos, Errors.RecordDeclarationNotAllowedInInnerClasses);
}
}
if ((sym.owner.flags_field & STATIC) == 0 &&
(flags & ENUM) != 0) {

View File

@ -417,6 +417,14 @@ public class RecordCompilationTests extends CompilationTestCase {
" record RR(int x) { public int x() { return z; }};\n" +
" }\n" +
"}");
// can be contained inside a lambda
assertOK("""
class Outer {
Runnable run = () -> {
record TestRecord(int i) {}
};
}
""");
// Can't self-shadow
assertFail("compiler.err.already.defined",
@ -488,6 +496,35 @@ public class RecordCompilationTests extends CompilationTestCase {
" record R(int a) {}\n" +
" }\n" +
"}");
assertFail("compiler.err.record.declaration.not.allowed.in.inner.classes",
"""
class Outer {
public void test() {
class Inner extends Outer {
record R(int i) {}
}
}
}
""");
assertFail("compiler.err.record.declaration.not.allowed.in.inner.classes",
"""
class Outer {
Runnable run = new Runnable() {
record TestRecord(int i) {}
public void run() {}
};
}
""");
assertFail("compiler.err.record.declaration.not.allowed.in.inner.classes",
"""
class Outer {
void m() {
record A() {
record B() { }
}
}
}
""");
}
public void testReceiverParameter() {