RFR: JDK-8246486: javac doesn't allow a subclass to be declared before a sealed superclass with no permits clause

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Thu Jun 4 21:28:23 UTC 2020


Hit "send" too fast - small tweak suggested - instead of:

sym.permitted = !permittedSubtypeSymbols.isEmpty() ?
+ permittedSubtypeSymbols.toList() :
+ sym.permitted;

Just go for:

if (!permittedSubtypeSymbols.isEmpty()) { sym.permitted = 
permittedSubtypeSymbols.toList(); }


Maurizio

On 04/06/2020 22:24, Maurizio Cimadamore wrote:
>
> Changes look good.
>
> Maurizio
>
>
> On 03/06/2020 21:22, Vicente Romero wrote:
>> Please review the fix for [1] at [2], this patch if fixing the 
>> following issue, javac doesn't accept code like:
>>
>> final class B extends A {}
>> sealed class A {}  // no permits clause
>>
>> the reason is that when analyzing the permits clause of the sealed 
>> class, the permitted list was overwritten without checking if it 
>> wasn't empty. This is fixed now. Also as the presence of annotation 
>> processors can provoke several iterations on the same code, now it is 
>> necessary to clean out the `permitted` list if annotations processors 
>> are present. This avoid that an iteration can find symbols stored in 
>> this list by a previous iteration. Given this new dependency on 
>> annotation processors of the sealed classes code, test 
>> SealedCompilationTests has been modified to be executed twice: with 
>> and without a simple annotations processor to stress this dependency. 
>> There is a change that is not strictly related to the main theme of 
>> the patch which is this one liner:
>>
>> diff -r 0a32396f7a69 -r 3a73b52df56b 
>> src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TypeEnter.java
>> --- 
>> a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TypeEnter.java 
>> Wed Jun 03 12:09:04 2020 -0400
>> +++ 
>> b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TypeEnter.java 
>> Wed Jun 03 15:25:41 2020 -0400
>> @@ -717,7 +717,6 @@
>>              ListBuffer<Symbol> permittedSubtypeSymbols = new 
>> ListBuffer<>();
>>              List<JCExpression> permittedTrees = tree.permitting;
>>              for (JCExpression permitted : permittedTrees) {
>> -                permitted = clearTypeParams(permitted);
>>                  Type pt = attr.attribBase(permitted, baseEnv, false, 
>> false, false);
>> permittedSubtypeSymbols.append(pt.tsym);
>>              }
>>
>> permitted subclasses can't have type parameters thus this line is a 
>> no-op, but given that the bug was related to the permits clause I 
>> found this issue and addressed it as part of the patch,
>>
>> Thanks,
>> Vicente
>>
>> [1] https://bugs.openjdk.java.net/browse/JDK-8246486
>> [2] http://cr.openjdk.java.net/~vromero/8246486/webrev.00/ 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/compiler-dev/attachments/20200604/16353d3f/attachment.htm>


More information about the compiler-dev mailing list