javac produces class that does not pass verifier.

XMLWordPrintable

    • Type: Bug
    • Resolution: Fixed
    • Priority: P3
    • 26
    • Affects Version/s: 24, 25, 26
    • Component/s: tools
    • None
    • b05

        Consider:
        ```
        $ cat Main.java
        /**
         * @test
         * @compile Main.java
         * @run main Main
         */
        public class Main {

            private boolean test(String s, int i) {
                if (s.subSequence(0, 1) instanceof Runnable r) {
                    return true;
                }

                Integer dummy;
                switch (i) {
                    case 0:
                        String clashing = null;
                        return true;
                    default:
                        return true;
                }
            }

            public static void main(String[] args) {
            }
        }
        ```

        This leads to (using JDK 24):
        ```
        $ java Main.java
        Exception in thread "main" java.lang.VerifyError: Inconsistent stackmap frames at branch target 49
        Exception Details:
          Location:
            Main.test(Ljava/lang/String;I)Z @49: iconst_1
          Reason:
            Type top (current frame, locals[4]) is not assignable to 'java/lang/String' (stack map, locals[4])
          Current Frame:
            bci: @25
            flags: { }
            locals: { 'Main', 'java/lang/String', integer }
            stack: { integer }
          Stackmap Frame:
            bci: @49
            flags: { }
            locals: { 'Main', 'java/lang/String', integer, top, 'java/lang/String' }
            stack: { }
          Bytecode:
            0000000: 2b03 04b6 0007 3a04 1904 c100 0d99 000b
            0000010: 1904 c000 0d4e 04ac 1cab 0000 0000 0018
            0000020: 0000 0001 0000 0000 0000 0013 013a 0404
            0000030: ac04 ac
          Stackmap Table:
            same_frame(@24)
            same_frame(@44)
            append_frame(@49,Top,Object[#8])

                at java.base/java.lang.Class.getDeclaredMethods0(Native Method)
                at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3035)
                at java.base/java.lang.Class.getMethodsRecursive(Class.java:3177)
                at java.base/java.lang.Class.findMethod(Class.java:2465)
                at java.base/java.lang.System$1.findMethod(System.java:1980)
                at java.base/jdk.internal.misc.MethodFinder.findMainMethod(MethodFinder.java:86)
                at jdk.compiler/com.sun.tools.javac.launcher.SourceLauncher.execute(SourceLauncher.java:194)
                at jdk.compiler/com.sun.tools.javac.launcher.SourceLauncher.run(SourceLauncher.java:138)
                at jdk.compiler/com.sun.tools.javac.launcher.SourceLauncher.main(SourceLauncher.java:76)
        ```

              Assignee:
              Jan Lahoda
              Reporter:
              Jan Lahoda
              Votes:
              1 Vote for this issue
              Watchers:
              5 Start watching this issue

                Created:
                Updated:
                Resolved: