diff options
author | Manoj Palat | 2021-02-01 09:43:39 +0000 |
---|---|---|
committer | Manoj Palat | 2021-02-01 12:09:14 +0000 |
commit | 6820434cdfea2f8aace3203b06d0b488e96bf933 (patch) | |
tree | 61ef248df405f3e6c41acfc3ab65e4090b54d471 | |
parent | a23d73ae510c5bff786b03af3f942c00b53ac3d0 (diff) | |
download | eclipse.jdt.core-6820434cdfea2f8aace3203b06d0b488e96bf933.tar.gz eclipse.jdt.core-6820434cdfea2f8aace3203b06d0b488e96bf933.tar.xz eclipse.jdt.core-6820434cdfea2f8aace3203b06d0b488e96bf933.zip |
sealed class inside a local record
Change-Id: Iaba9eb0c89135241df262ef8ea54537f9d0c337d
Signed-off-by: Manoj Palat <manpalat@in.ibm.com>
2 files changed, 29 insertions, 4 deletions
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RecordsRestrictedClassTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RecordsRestrictedClassTest.java index 7b44fe53ac..420aed3717 100644 --- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RecordsRestrictedClassTest.java +++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RecordsRestrictedClassTest.java @@ -33,7 +33,7 @@ public class RecordsRestrictedClassTest extends AbstractRegressionTest { static { // TESTS_NUMBERS = new int [] { 40 }; // TESTS_RANGE = new int[] { 1, -1 }; -// TESTS_NAMES = new String[] { "testBug570243"}; +// TESTS_NAMES = new String[] { "testBug570605"}; } public static Class<?> testClass() { @@ -8279,4 +8279,29 @@ public void testBug570230_001() { "Extended dimensions are illegal for a record component\n" + "----------\n"); } +public void testBug570605_001() { + runNegativeTest( + new String[] { + "X.java", + "sealed class Y {}\n"+ + "non-sealed class Z extends Y {}\n"+ + "public class X {\n"+ + " public void foo() {\n"+ + " record R() {\n"+ + " class L extends Y {}\n"+ + " }\n"+ + " }\n"+ + "}" + }, + "----------\n" + + "1. ERROR in X.java (at line 6)\n" + + " class L extends Y {}\n" + + " ^\n" + + "A local class L cannot have a sealed direct superclass or a sealed direct superinterface Y\n" + + "----------\n", + null, + true, + new String[] {"--enable-preview"}, + getCompilerOptions()); +} }
\ No newline at end of file diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java index 7a1b542b22..cbbed55d64 100644 --- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java +++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java @@ -1094,7 +1094,7 @@ private Map.Entry<TypeReference, ReferenceBinding> getFirstSealedSuperTypeOrInte } // TODO: Optimize the multiple loops - defer until the feature becomes standard. private void checkPermitsInType() { - if (this.isRecordDeclaration || this.isEnum()) + if (/* this.isRecordDeclaration || */this.isEnum()) return; // handled separately TypeDeclaration typeDecl = this.scope.referenceContext; if (this.isInterface()) { @@ -1144,7 +1144,7 @@ private void checkPermitsInType() { } } else if (this.isNonSealed()) { if (!foundSealedSuperTypeOrInterface) { - if (this.isClass()) + if (this.isClass() && !this.isRecord()) // record to give only illegal modifier error. this.scope.problemReporter().sealedDisAllowedNonSealedModifierInClass(this, typeDecl); else if (this.isInterface()) this.scope.problemReporter().sealedDisAllowedNonSealedModifierInInterface(this, typeDecl); @@ -1158,7 +1158,7 @@ private void checkPermitsInType() { this.scope.problemReporter().sealedMissingInterfaceModifier(this, typeDecl, sealedEntry.getValue()); } List<SourceTypeBinding> typesInCU = collectAllTypeBindings(typeDecl, this.scope.compilationUnitScope()); - if (typeDecl.superclass != null && !checkPermitsAndAdd(this.superclass, typesInCU)) + if (!typeDecl.isRecord() && typeDecl.superclass != null && !checkPermitsAndAdd(this.superclass, typesInCU)) this.scope.problemReporter().sealedSuperClassDoesNotPermit(this, typeDecl.superclass, this.superclass); for (int i = 0, l = this.superInterfaces.length; i < l; ++i) { ReferenceBinding superInterface = this.superInterfaces[i]; |