OpenJDK / jdk / jdk
changeset 57857:7574d72eac00
8235778: No compilation error reported when a record is declared in a local class
Reviewed-by: mcimadamore
author | vromero |
---|---|
date | Mon, 27 Jan 2020 23:06:46 -0500 |
parents | 70e2851bc9cd |
children | db294f18ccc2 a96bc204e3b3 |
files | src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java test/langtools/tools/javac/records/RecordCompilationTests.java |
diffstat | 2 files changed, 40 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java Mon Jan 27 20:01:35 2020 -0500 +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Check.java Mon Jan 27 23:06:46 2020 -0500 @@ -1207,6 +1207,9 @@ 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) {
--- a/test/langtools/tools/javac/records/RecordCompilationTests.java Mon Jan 27 20:01:35 2020 -0500 +++ b/test/langtools/tools/javac/records/RecordCompilationTests.java Mon Jan 27 23:06:46 2020 -0500 @@ -417,6 +417,14 @@ " 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 @@ " 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() {