google / google/closure-compiler

self-breaking labeled statement causes internal compiler error

Open
#3,870 0 comments 1 reaction 0 assignees View on GitHub
triage-done
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.