From bd9b24c0f8e0db88ae9714cdb355dcd56d802ab4 Mon Sep 17 00:00:00 2001 From: Liam Miller-Cushon Date: Fri, 7 Feb 2025 19:43:33 +0000 Subject: [PATCH] 8349512: Duplicate PermittedSubclasses entries with doclint enabled Reviewed-by: vromero --- .../com/sun/tools/javac/code/Symbol.java | 2 +- .../sealed/SealedDiffConfigurationsTest.java | 36 +++++++++++++++++-- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java index 76931675220..54b3fe8a562 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/code/Symbol.java @@ -1353,8 +1353,8 @@ public abstract class Symbol extends AnnoConstruct implements PoolConstant, Elem int index = Collections.binarySearch(permitted, element, java.util.Comparator.comparing(PermittedClassWithPos::pos)); if (index < 0) { index = -index - 1; + permitted.add(index, element); } - permitted.add(index, element); } public boolean isPermittedSubclass(Symbol csym) { diff --git a/test/langtools/tools/javac/sealed/SealedDiffConfigurationsTest.java b/test/langtools/tools/javac/sealed/SealedDiffConfigurationsTest.java index 597d4b16e68..30fc23922bb 100644 --- a/test/langtools/tools/javac/sealed/SealedDiffConfigurationsTest.java +++ b/test/langtools/tools/javac/sealed/SealedDiffConfigurationsTest.java @@ -22,7 +22,7 @@ */ /* - * @test 8247352 8293348 + * @test 8247352 8293348 8349512 * @summary test different configurations of sealed classes, same compilation unit, diff pkg or mdl, etc * @library /tools/lib * @modules jdk.compiler/com.sun.tools.javac.api @@ -132,7 +132,10 @@ public class SealedDiffConfigurationsTest extends TestRunner { ClassModel sealedCF = ClassFile.of().parse(out.resolve(cfName)); Assert.check((sealedCF.flags().flagsMask() & ClassFile.ACC_FINAL) == 0, String.format("class at file %s must not be final", cfName)); PermittedSubclassesAttribute permittedSubclasses = sealedCF.findAttribute(Attributes.permittedSubclasses()).orElseThrow(); - Assert.check(permittedSubclasses.permittedSubclasses().size() == expectedSubTypeNames.size()); + Assert.check(permittedSubclasses.permittedSubclasses().size() == expectedSubTypeNames.size(), + String.format("%s != %s", + permittedSubclasses.permittedSubclasses(), + expectedSubTypeNames)); List subtypeNames = new ArrayList<>(); permittedSubclasses.permittedSubclasses().forEach(i -> { try { @@ -726,4 +729,33 @@ public class SealedDiffConfigurationsTest extends TestRunner { .run(); checkSealedClassFile(out, "Foo.class", List.of("Foo$R1", "Foo$R2")); } + + @Test + public void testDuplicatePermittedSubclassesDoclint(Path base) throws Exception { + Path src = base.resolve("src"); + Path foo = src.resolve("Foo.java"); + + tb.writeFile(foo, + """ + public class Foo { + private enum E { + INSTANCE { + /** foo {@link E} */ + void f() {} + }; + void f() {} + } + } + """); + + Path out = base.resolve("out"); + Files.createDirectories(out); + + new JavacTask(tb) + .options("-Xdoclint:html,syntax") + .outdir(out) + .files(foo) + .run(); + checkSealedClassFile(out, "Foo$E.class", List.of("Foo$E$1")); + } }