Possible compiler bug: continue is skipped after or-condition

Roland Illig roland.illig at gmx.de
Sat Feb 15 17:43:37 UTC 2020


ping?

On 08.02.2020 20:05, Roland Illig wrote:
> /* - */ public class Demo {
> /* - */     static String[] strings = {"1a", "1b", "2", "3"};
> /* - */
> /* - */     public static void main(String[] args) {
> /* 5 */         for (String s : strings) {
> /* 6 */             if (s.equals("1a") || s.equals("1b")) {
> /* 7 */                 continue;
> /* - */             }
> /* 9 */             if (s.equals("2")) {
> /* - */                 continue;
> /* - */             }
> /* - */             System.out.println(s);
> /* - */         }
> /* - */     }
> /* - */ }
>
> The generated code for the if statement in line 6 is:
>
> if (token.equals("1a"))
>      goto line 5 to continue the loop;
> if (!token.equals("1b"))
>      goto line 9;
> implicitly goto line 7;
>
> Instead of the shortcut "goto line 5 to continue the loop" I had
> expected the more obvious "goto line 7", so that a possible breakpoint
> in line 7 is visited.
>
> This affects not only breakpoints but also code coverage tools, which
> will report that line 7 is only reached once, even though the source
> code says it is reached twice: once for 1a and once for 1b.
>
> I tested this using JDK 1.8.0_201 and JDK 13.0.1. Both compile to the
> same bytecode.

Curiously, the Eclipse Java Compiler behaves the same. It also
"optimizes" the goto chain, thereby skipping line 7 for the string "1a".


More information about the compiler-dev mailing list