Skip to content

Commit 50a7755

Browse files
committed
8347530: Improve error message with invalid permits clauses
Reviewed-by: jlahoda
1 parent 50e873f commit 50a7755

File tree

7 files changed

+78
-5
lines changed

7 files changed

+78
-5
lines changed

src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5475,8 +5475,13 @@ void attribClass(ClassSymbol c) throws CompletionFailure {
54755475
.stream()
54765476
.anyMatch(d -> d.tsym == c);
54775477
if (!thisIsASuper) {
5478-
log.error(TreeInfo.diagnosticPositionFor(subType.tsym, env.tree),
5479-
Errors.InvalidPermitsClause(Fragments.DoesntExtendSealed(subType)));
5478+
if(c.isInterface()) {
5479+
log.error(TreeInfo.diagnosticPositionFor(subType.tsym, env.tree),
5480+
Errors.InvalidPermitsClause(Fragments.DoesntImplementSealed(kindName(subType.tsym), subType)));
5481+
} else {
5482+
log.error(TreeInfo.diagnosticPositionFor(subType.tsym, env.tree),
5483+
Errors.InvalidPermitsClause(Fragments.DoesntExtendSealed(subType)));
5484+
}
54805485
}
54815486
}
54825487
}

src/jdk.compiler/share/classes/com/sun/tools/javac/resources/compiler.properties

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3957,7 +3957,11 @@ compiler.misc.is.duplicated=\
39573957

39583958
# 0: type
39593959
compiler.misc.doesnt.extend.sealed=\
3960-
subclass {0} must extend sealed class
3960+
class {0} must extend sealed class
3961+
3962+
# 0: kind name, 1: type
3963+
compiler.misc.doesnt.implement.sealed=\
3964+
{0} {1} must extend sealed interface
39613965

39623966
compiler.misc.must.not.be.same.class=\
39633967
illegal self-reference in permits clause
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
* @test /nodynamiccopyright/
3+
* @bug 8347530
4+
* @summary Improve error message with invalid permits clauses
5+
* @compile/fail/ref=T8347530.out -XDrawDiagnostics T8347530.java
6+
*/
7+
8+
class T8347530 {
9+
// sealed interfaces
10+
sealed interface A0 permits B0 {}
11+
class B0 {} // class {0} must implement sealed interface
12+
13+
sealed interface A1 permits B1 {}
14+
record B1() {} // record {0} must implement sealed interface
15+
16+
sealed interface A2 permits B2 {}
17+
enum B2 {} // enum {0} must implement sealed interface
18+
19+
sealed interface A3 permits B3 {}
20+
interface B3 {} // interface {0} must implement sealed interface
21+
22+
// sealed classes
23+
sealed class C0 permits S0 {}
24+
class S0 {} // class {0} must extend sealed class
25+
26+
// record cannot extend other classes in general
27+
// enums cannot extend other classes in general
28+
// interfaces cannot extend other classes in general
29+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
T8347530.java:10:33: compiler.err.invalid.permits.clause: (compiler.misc.doesnt.implement.sealed: kindname.class, T8347530.B0)
2+
T8347530.java:13:33: compiler.err.invalid.permits.clause: (compiler.misc.doesnt.implement.sealed: kindname.record, T8347530.B1)
3+
T8347530.java:16:33: compiler.err.invalid.permits.clause: (compiler.misc.doesnt.implement.sealed: kindname.enum, T8347530.B2)
4+
T8347530.java:19:33: compiler.err.invalid.permits.clause: (compiler.misc.doesnt.implement.sealed: kindname.interface, T8347530.B3)
5+
T8347530.java:23:29: compiler.err.invalid.permits.clause: (compiler.misc.doesnt.extend.sealed: T8347530.S0)
6+
5 errors
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/*
2+
* Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 2 only, as
7+
* published by the Free Software Foundation.
8+
*
9+
* This code is distributed in the hope that it will be useful, but WITHOUT
10+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12+
* version 2 for more details (a copy is included in the LICENSE file that
13+
* accompanied this code).
14+
*
15+
* You should have received a copy of the GNU General Public License version
16+
* 2 along with this work; if not, write to the Free Software Foundation,
17+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18+
*
19+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20+
* or visit www.oracle.com if you need additional information or have any
21+
* questions.
22+
*/
23+
24+
// key: compiler.err.invalid.permits.clause
25+
// key: compiler.misc.doesnt.implement.sealed
26+
27+
sealed interface A3 permits B3 {}
28+
interface B3 {}
29+

test/langtools/tools/javac/sealed/SealedDiffConfigurationsTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -556,7 +556,7 @@ public void testSameModuleSamePkgNeg2(Path base) throws Exception {
556556
.getOutputLines(OutputKind.DIRECT);
557557

558558
List<String> expected = List.of(
559-
"Sealed.java:1:66: compiler.err.invalid.permits.clause: (compiler.misc.doesnt.extend.sealed: pkg.Sub2)",
559+
"Sealed.java:1:66: compiler.err.invalid.permits.clause: (compiler.misc.doesnt.implement.sealed: kindname.class, pkg.Sub2)",
560560
"1 error");
561561
if (!error.containsAll(expected)) {
562562
throw new AssertionError("Expected output not found. Found: " + error);
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
CyclicHierarchyTest.java:9:37: compiler.err.invalid.permits.clause: (compiler.misc.doesnt.extend.sealed: CyclicHierarchyTest.Add)
1+
CyclicHierarchyTest.java:9:37: compiler.err.invalid.permits.clause: (compiler.misc.doesnt.implement.sealed: kindname.class, CyclicHierarchyTest.Add)
22
CyclicHierarchyTest.java:11:55: compiler.err.invalid.permits.clause: (compiler.misc.must.not.be.same.class)
33
2 errors

0 commit comments

Comments
 (0)