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

Incorrect control flow analysis causes statement subsequent to a switch statement to be flagged unreachable under some circumstances #3376

Closed
iloveeclipse opened this issue Dec 2, 2024 · 1 comment · Fixed by #3377
Assignees
Labels
bug Something isn't working regression Something was broken by a previous change
Milestone

Comments

@iloveeclipse
Copy link
Member

javac from Java 21 compiles the code below fine.
ecj starting from a589ad2 reports "Unreachable code" compilation error on return.

public class SwitchTest {
    String unreachableCode(String arg) {
        String result;
        switch (arg) {
            case "a" -> {
                result = "A";
            }
            default -> throw new RuntimeException(arg);
        }
        return result;      // <- ecj reports "Unreachable code"
    }
}

Both compiler agree that the code below is fine:

public class SwitchTest {
    String unreachableCode(String arg) {
        String result;
        switch (arg) {
            case "a" -> {
                result = "A";
                break;       // <- this makes ecj happy
            }
            default -> throw new RuntimeException(arg);
        }
        return result;
    }
}

For the "old style" switch both ecj and javac agree that the return is unreachable:

public class SwitchTest {
    String unreachableCode(String arg) {
        String result;
        switch (arg) {
            case "a" : {
                result = "A";
            }
            default : throw new RuntimeException(arg);
        }
        return result;
    }
}

I assume ecj has a regression with a589ad2, but I haven't checked what JLS says here.
@srikanth-sankaran : please check.

@iloveeclipse iloveeclipse added bug Something isn't working regression Something was broken by a previous change labels Dec 2, 2024
@srikanth-sankaran srikanth-sankaran added this to the 4.35 M1 milestone Dec 2, 2024
@srikanth-sankaran
Copy link
Contributor

srikanth-sankaran commented Dec 2, 2024

Thanks for the report. I can see where the problem originates from. The commit comment says: Eliminate the hack to inject synthetic BreakStatement in label rule switch blocks. Enhance the code generator to handle these explicitly.

To remove the earlier kludgy implementation, it is not enough that the code generator is enhanced to handle these explicitly - we should also delink flow analysis's dependence on the earlier kludge.

PR will follow shortly.

@srikanth-sankaran srikanth-sankaran changed the title Unreachable code reported for switch on return Incorrect Unreachable code diagnostic reported for switch on return Dec 2, 2024
@srikanth-sankaran srikanth-sankaran changed the title Incorrect Unreachable code diagnostic reported for switch on return Incorrect control flow analysis causes statement subsequent to a switch statement to be flagged unreachable under some circumstances Dec 2, 2024
srikanth-sankaran added a commit to srikanth-sankaran/eclipse.jdt.core that referenced this issue Dec 2, 2024
statement to be flagged unreachable under some circumstances

* Fixes eclipse-jdt#3376
jarthana added a commit that referenced this issue Dec 6, 2024
* Remove nolonger support converterJclMin (#3332)

Versions older than 1.8 are not supported and thus shouldn't be needed
anymore.

* Fix and enable Java50Tests#testMissingRequiredBinaries

* Version bump(s) for 4.35 stream

* Test failures in I-Builds due to less diagnostics being emitted (#3357)

* Fixes #3356

* Textual problem indicator goes wild with lamda (#3358)

* jclMin23: ignore missing serializable problem

"The serializable class Long does not declare a static final
serialVersionUID field of type"

* Fix FieldLocator and MethodLocator to support local/anonymous classes (#3314)

- Fix FieldLocator.reportDeclaration() and
  MethodLocator.reportDeclaration() to find the anonymous or local
  type for the declaration rather than to return
- add new tests to JavaSearchBugsTests
- fixes #3308

* Codegen Primitives in record comonent patterns to be enabled with null check before calling accessor(#3361)

Before generating an invoke of accessor of a record component, do a null check if primitive conversions are involved.

* java.lang.StackOverflowError during "Requesting Java AST from selection" (#3373)

+ resilience: avoid accepting a sourceType being completed already
+ better hiding of modules seen via the classpath

Fixes #3273

* Add NoSuchFieldError to converterJclMin18 (#3368)

Add NoSuchFieldError to converterJclMin18
 + build the jar
 + avoid new warning

Enable couple of tests fixed by this.

---------
Co-authored-by: Stephan Herrmann <stephan.herrmann@berlin.de>

* Incorrect control flow analysis causes statement subsequent to a switch statement to be flagged unreachable under some circumstances(#3377)

* Fixes #3376

* Remove unused api problem filter

* Update tycho build to 4.0.10

* Completion for unimported types doesn't work.

- use MissingTypesGuesser to select all missing types and offer their completion
- Fixes #1502

* [Enhanced Switch] Wrong error message: Cannot switch on a value of type Integer... at levels that don't support enhanced switch (#3380)

* Fixes #3379

---------

Co-authored-by: Александър Куртаков <akurtakov@gmail.com>
Co-authored-by: Eclipse JDT Bot <jdt-bot@eclipse.org>
Co-authored-by: Srikanth Sankaran <131454720+srikanth-sankaran@users.noreply.github.com>
Co-authored-by: Jörg Kubitz <jkubitz-eclipse@gmx.de>
Co-authored-by: Jeff Johnston <jjohnstn@redhat.com>
Co-authored-by: Manoj  N Palat <manoj.palat@in.ibm.com>
Co-authored-by: Stephan Herrmann <stephan.herrmann@berlin.de>
Co-authored-by: Snjeza <snjezana.peco@redhat.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working regression Something was broken by a previous change
Projects
None yet
2 participants