closure-compiler
closure-compiler copied to clipboard
self-breaking labeled statement causes internal compiler error
The following JavaScript program is silly but valid:
label: break label
If run, the break
should jump to the code immediately after the label:
, so effectively label: break label
is a no-op statement.
When saved as labels.js
and run through the Closure compiler like this...
java -jar closure-compiler-v20210907.jar --js labels.js --js_output_file compiled.js
...an internal compiler error results:
java.lang.RuntimeException: INTERNAL COMPILER ERROR.
Please report this problem.
INTERNAL COMPILER ERROR.
Please report this problem.
Cannot invoke "com.google.javascript.rhino.Node.isLabel()" because "target" is null
Node(BREAK): labels.js:1:7
label: break label
Parent(LABEL): labels.js:1:0
label: break label
at com.google.javascript.jscomp.Compiler.throwInternalError(Compiler.java:2895)
at com.google.javascript.jscomp.NodeTraversal.throwUnexpectedException(NodeTraversal.java:442)
at com.google.javascript.jscomp.NodeTraversal.traverse(NodeTraversal.java:462)
at com.google.javascript.jscomp.NodeTraversal.access$200(NodeTraversal.java:38)
at com.google.javascript.jscomp.NodeTraversal$Builder.traverse(NodeTraversal.java:398)
at com.google.javascript.jscomp.NodeTraversal.traverse(NodeTraversal.java:468)
at com.google.javascript.jscomp.CombinedCompilerPass.process(CombinedCompilerPass.java:144)
at com.google.javascript.jscomp.PhaseOptimizer$NamedPass.process(PhaseOptimizer.java:317)
at com.google.javascript.jscomp.PhaseOptimizer.process(PhaseOptimizer.java:232)
at com.google.javascript.jscomp.Compiler.check(Compiler.java:1216)
at com.google.javascript.jscomp.Compiler.performChecks(Compiler.java:1014)
at com.google.javascript.jscomp.Compiler.lambda$stage1Passes$7(Compiler.java:925)
at com.google.javascript.jscomp.CompilerExecutor.lambda$runInCompilerThread$0(CompilerExecutor.java:101)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
at java.base/java.lang.Thread.run(Thread.java:831)
Caused by: java.lang.RuntimeException: INTERNAL COMPILER ERROR.
Please report this problem.
Cannot invoke "com.google.javascript.rhino.Node.isLabel()" because "target" is null
Node(BREAK): labels.js:1:7
label: break label
Parent(LABEL): labels.js:1:0
label: break label
at com.google.javascript.jscomp.Compiler.throwInternalError(Compiler.java:2895)
at com.google.javascript.jscomp.NodeTraversal.throwUnexpectedException(NodeTraversal.java:442)
at com.google.javascript.jscomp.NodeTraversal.traverse(NodeTraversal.java:462)
at com.google.javascript.jscomp.NodeTraversal.access$200(NodeTraversal.java:38)
at com.google.javascript.jscomp.NodeTraversal$Builder.traverse(NodeTraversal.java:398)
at com.google.javascript.jscomp.NodeTraversal.traverse(NodeTraversal.java:468)
at com.google.javascript.jscomp.ControlFlowAnalysis.process(ControlFlowAnalysis.java:159)
at com.google.javascript.jscomp.NodeTraversal.getControlFlowGraph(NodeTraversal.java:1157)
at com.google.javascript.jscomp.CheckUnreachableCode.enterScope(CheckUnreachableCode.java:47)
at com.google.javascript.jscomp.CombinedCompilerPass$CallbackWrapper.enterScopeIfActive(CombinedCompilerPass.java:127)
at com.google.javascript.jscomp.CombinedCompilerPass.enterScope(CombinedCompilerPass.java:178)
at com.google.javascript.jscomp.NodeTraversal.pushScope(NodeTraversal.java:1012)
at com.google.javascript.jscomp.NodeTraversal.traverse(NodeTraversal.java:457)
... 14 more
Caused by: java.lang.NullPointerException: Cannot invoke "com.google.javascript.rhino.Node.isLabel()" because "target" is null
at com.google.javascript.jscomp.ControlFlowAnalysis.matchLabel(ControlFlowAnalysis.java:949)
at com.google.javascript.jscomp.ControlFlowAnalysis.isBreakTarget(ControlFlowAnalysis.java:929)
at com.google.javascript.jscomp.ControlFlowAnalysis.handleBreak(ControlFlowAnalysis.java:609)
at com.google.javascript.jscomp.ControlFlowAnalysis.visit(ControlFlowAnalysis.java:361)
at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:856)
at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:847)
at com.google.javascript.jscomp.NodeTraversal.traverseChildren(NodeTraversal.java:984)
at com.google.javascript.jscomp.NodeTraversal.handleScript(NodeTraversal.java:748)
at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:800)
at com.google.javascript.jscomp.NodeTraversal.traverseBranch(NodeTraversal.java:847)
at com.google.javascript.jscomp.NodeTraversal.traverse(NodeTraversal.java:459)
... 24 more
Similar failures arise when several labels are nested around the break
, as in:
outer: inner: break inner
And:
outer: inner: break outer