google / google/closure-compiler
self-breaking labeled statement causes internal compiler error
- Dominant language
- JavaScript
- Stars
- 7.7k
- Forks
- 1.2k
- Avg merge
- 2d 12h
- Merged PRs (30d)
- 6
Description
The following JavaScript program is silly but valid:
```javascript
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...
```shell
java -jar closure-compiler-v20210907.jar --js labels.js --js_output_file compiled.js
```
...an internal compiler error results:
```text
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:
```javascript
outer: inner: break inner
```
And:
```javascript
outer: inner: break outer
```
Contributor guide
Assessment
This issue has not been assessed yet.