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() {