Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorManoj Palat2021-02-01 09:43:39 +0000
committerManoj Palat2021-02-01 12:09:14 +0000
commit6820434cdfea2f8aace3203b06d0b488e96bf933 (patch)
tree61ef248df405f3e6c41acfc3ab65e4090b54d471
parenta23d73ae510c5bff786b03af3f942c00b53ac3d0 (diff)
downloadeclipse.jdt.core-6820434cdfea2f8aace3203b06d0b488e96bf933.tar.gz
eclipse.jdt.core-6820434cdfea2f8aace3203b06d0b488e96bf933.tar.xz
eclipse.jdt.core-6820434cdfea2f8aace3203b06d0b488e96bf933.zip
Bug 570605 - [16] [records] No error reported for local class extending
sealed class inside a local record Change-Id: Iaba9eb0c89135241df262ef8ea54537f9d0c337d Signed-off-by: Manoj Palat <manpalat@in.ibm.com>
-rw-r--r--org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RecordsRestrictedClassTest.java27
-rw-r--r--org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/SourceTypeBinding.java6
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];

Back to the top