closure-compiler icon indicating copy to clipboard operation
closure-compiler copied to clipboard

self-breaking labeled statement causes internal compiler error

Open liblit opened this issue 2 years ago • 0 comments

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

liblit avatar Sep 16 '21 21:09 liblit