On Tue, 18 Apr 2023 13:43:17 GMT, Maurizio Cimadamore <mcimadam...@openjdk.org> 
wrote:

>> Jan Lahoda has updated the pull request incrementally with six additional 
>> commits since the last revision:
>> 
>>  - Fixing infinite loop where a binding pattern is replaced with a binding 
>> pattern for the same type.
>>  - Reflecting review comments.
>>  - Fixing exhaustiveness for unsealed supertype pattern.
>>  - No need to enable features after error reported.
>>  - SwitchBootstraps.typeSwitch should not initialize enum classes.
>>  - A prototype of avoiding enum initialization.
>
> src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Flow.java line 812:
> 
>> 810:                     if (l instanceof JCPatternCaseLabel patternLabel) {
>> 811:                         for (Type component : 
>> components(selector.type)) {
>> 812:                             patterns = 
>> patterns.prepend(PatternDescription.from(types, component, 
>> patternLabel.pat));
> 
> I noted that this code ends up adding redundant pattern descriptions to the 
> list - for instance:
> 
> 
> class Test {
>     sealed interface I1 permits B, C { }
>     sealed interface I2 permits B, C { }
> 
>     static final class B implements I1, I2 { }
>     static final class C implements I1, I2 { }
> 
>     <Z extends I1 & I2> int test(Z z) {
>         return switch (z) {
>             case B c -> 2;
>             case C d -> 3;
>         };
>     }
> }
> 
> 
> In this case the list ends up with 6 elements, [ B, B, B, C, C, C ]. Given 
> that the complexity of the algorithm depends on the number of patterns in the 
> list, it would probably be better to use a set here and try to make the list 
> as small as possible from early on.

I've also found an infinite loop with this:


class Test {
    sealed interface I0 permits I1, I2 { }
    sealed interface I00 permits I1, I2 { }

    sealed interface I1 extends I0, I00 permits B, C { }
    sealed interface I2 extends I0, I00 permits B, C { }

    static final class B implements I1, I2 { }
    static final class C implements I1, I2 { }

    int test(Object o) {
        return switch (o) {
            case B c -> 2;
            case C d -> 3;
        };
    }
}

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/13074#discussion_r1170079092

Reply via email to