Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[20] Switch pattern dominance: redundant ECJ compiler errors #919

Closed
kriegaex opened this issue Mar 28, 2023 · 3 comments
Closed

[20] Switch pattern dominance: redundant ECJ compiler errors #919

kriegaex opened this issue Mar 28, 2023 · 3 comments
Assignees
Milestone

Comments

@kriegaex
Copy link
Contributor

kriegaex commented Mar 28, 2023

@jarthana, @mpalat: The current batch compiler for Java 20 shows the behaviour described in the Javadoc comment of this sample class:

/**
 * This used to work up to preview 3 (Java 19), but no longer in preview 4 (Java 20).
 * Now, the default case seems to need to be the last one in the list.
 *
 * Javac says 4x: "this case label is dominated by a preceding case label"
 *
 * ECJ/AJC says 11x: "This case label is dominated by one of the preceding case label" (yes, "label" singular)
 */
public class SwitchPatternPreview4Error {
  static void defaultCanAppearBeforePattern(Integer i) {
    switch (i) {
      case null -> System.out.println("value unavailable: " + i);
      case -1, 1 -> System.out.println("absolute value 1: " + i);
      default -> System.out.println("other integer: " + i);
      case Integer value when value > 0 -> System.out.println("positive integer: " + i);
    }
  }

  static void defaultCanAppearBeforeNull(Integer i) {
    switch (i) {
      case -1, 1 -> System.out.println("absolute value 1: " + i);
      default -> System.out.println("other integer: " + i);
      case null -> System.out.println("value unavailable: " + i);
      case Integer value when value > 0 -> System.out.println("positive integer: " + i);
    }
  }

  static void defaultCanAppearBeforeConstantLabel(Integer i) {
    switch (i) {
      case null -> System.out.println("value unavailable: " + i);
      default -> System.out.println("other integer: " + i);
      case -1, 1 -> System.out.println("absolute value 1: " + i);
      case Integer value when value > 0 -> System.out.println("positive integer: " + i);
    }
  }
}

Some logs for you to compare:

$ javac -J-Duser.language=en --enable-preview --release 20 SwitchPatternPreview4Error.java

SwitchPatternPreview4Error.java:15: error: this case label is dominated by a preceding case label
      case Integer value when value > 0 -> System.out.println("positive integer: " + i);
           ^
SwitchPatternPreview4Error.java:23: error: this case label is dominated by a preceding case label
      case null -> System.out.println("value unavailable: " + i);
           ^
SwitchPatternPreview4Error.java:24: error: this case label is dominated by a preceding case label
      case Integer value when value > 0 -> System.out.println("positive integer: " + i);
           ^
SwitchPatternPreview4Error.java:33: error: this case label is dominated by a preceding case label
      case Integer value when value > 0 -> System.out.println("positive integer: " + i);
           ^
Note: SwitchPatternPreview4Error.java uses preview features of Java SE 20.
Note: Recompile with -Xlint:preview for details.
4 errors
$ java -jar org.eclipse.jdt.core.compiler.batch_3.34.0.v20230327-1130.jar --enable-preview --release 20 -nowarn SwitchPatternPreview4Error.java

----------
1. ERROR in C:\Users\Alexander\Documents\java-src\AspectJ\tests\features1920\java20\SwitchPatternPreview4Error.java (at line 15)
        case Integer value when value > 0 -> System.out.println("positive integer: " + i);
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This case label is dominated by one of the preceding case label
----------
2. ERROR in C:\Users\Alexander\Documents\java-src\AspectJ\tests\features1920\java20\SwitchPatternPreview4Error.java (at line 15)
        case Integer value when value > 0 -> System.out.println("positive integer: " + i);
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This case label is dominated by one of the preceding case label
----------
3. ERROR in C:\Users\Alexander\Documents\java-src\AspectJ\tests\features1920\java20\SwitchPatternPreview4Error.java (at line 15)
        case Integer value when value > 0 -> System.out.println("positive integer: " + i);
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This case label is dominated by one of the preceding case label
----------
4. ERROR in C:\Users\Alexander\Documents\java-src\AspectJ\tests\features1920\java20\SwitchPatternPreview4Error.java (at line 23)
        case null -> System.out.println("value unavailable: " + i);
             ^^^^
This case label is dominated by one of the preceding case label
----------
5. ERROR in C:\Users\Alexander\Documents\java-src\AspectJ\tests\features1920\java20\SwitchPatternPreview4Error.java (at line 23)
        case null -> System.out.println("value unavailable: " + i);
             ^^^^
This case label is dominated by one of the preceding case label
----------
6. ERROR in C:\Users\Alexander\Documents\java-src\AspectJ\tests\features1920\java20\SwitchPatternPreview4Error.java (at line 24)
        case Integer value when value > 0 -> System.out.println("positive integer: " + i);
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This case label is dominated by one of the preceding case label
----------
7. ERROR in C:\Users\Alexander\Documents\java-src\AspectJ\tests\features1920\java20\SwitchPatternPreview4Error.java (at line 24)
        case Integer value when value > 0 -> System.out.println("positive integer: " + i);
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This case label is dominated by one of the preceding case label
----------
8. ERROR in C:\Users\Alexander\Documents\java-src\AspectJ\tests\features1920\java20\SwitchPatternPreview4Error.java (at line 24)
        case Integer value when value > 0 -> System.out.println("positive integer: " + i);
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This case label is dominated by one of the preceding case label
----------
9. ERROR in C:\Users\Alexander\Documents\java-src\AspectJ\tests\features1920\java20\SwitchPatternPreview4Error.java (at line 33)
        case Integer value when value > 0 -> System.out.println("positive integer: " + i);
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This case label is dominated by one of the preceding case label
----------
10. ERROR in C:\Users\Alexander\Documents\java-src\AspectJ\tests\features1920\java20\SwitchPatternPreview4Error.java (at line 33)
        case Integer value when value > 0 -> System.out.println("positive integer: " + i);
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This case label is dominated by one of the preceding case label
----------
11. ERROR in C:\Users\Alexander\Documents\java-src\AspectJ\tests\features1920\java20\SwitchPatternPreview4Error.java (at line 33)
        case Integer value when value > 0 -> System.out.println("positive integer: " + i);
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This case label is dominated by one of the preceding case label
----------
11 problems (11 errors)

You see that ECJ reports the same 4 error types, but 1x2 + 3x3 = 11 times instead of 4x1 times.

The source for the batch compiler was I20230327-1800, more exactly org.eclipse.jdt.core.compiler.batch_3.34.0.v20230327-1130.jar

@jarthana jarthana added this to the 4.28 M1 milestone Mar 29, 2023
@jarthana jarthana self-assigned this Mar 29, 2023
jarthana added a commit to jarthana/eclipse.jdt.core that referenced this issue Mar 29, 2023
@mpalat
Copy link
Contributor

mpalat commented Mar 30, 2023

@jarthana this may be same as #881 - so please enable RPT._test26 also and check when this is fixed

@jarthana
Copy link
Member

@jarthana this may be same as #881 - so please enable RPT._test26 also and check when this is fixed

Nope, that one is different. Closing this one as fixed.

@kriegaex
Copy link
Contributor Author

Thanks for fixing this, I successfully retested it in AspectJ after my merge.

Do you think it would be possible to also fix this message, as mentioned above, and add a plural "s"?

This case label is dominated by one of the preceding case labels
                                                               ^
                                                           plural "s"

kriegaex added a commit to eclipse-aspectj/aspectj that referenced this issue Mar 30, 2023
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
jarthana added a commit to jarthana/eclipse.jdt.core that referenced this issue Mar 30, 2023
kriegaex added a commit to eclipse-aspectj/aspectj that referenced this issue Mar 31, 2023
kriegaex added a commit to eclipse-aspectj/aspectj that referenced this issue Jun 24, 2023
Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
kriegaex added a commit to eclipse-aspectj/aspectj that referenced this issue Jun 24, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants