RFR: 8269113: Javac throws when compiling switch (null)

Guoxiong Li gli at openjdk.java.net
Sun Jul 4 18:21:11 UTC 2021

Hi all,

When we use `switch(null)` in the source code, the type of the selector is `BottomType`.
So the statement `Type seltype = selector.type;` of the method `TransPatterns::handleSwitch` will get a `BottomType`.
Then compiler mistakenly uses this `BottomType` to construct a new `VarSymbol`.

            VarSymbol temp = new VarSymbol(Flags.SYNTHETIC,
                    names.fromString("selector" + tree.pos + target.syntheticNameChar() + "temp"),
                    seltype,     // <--------here is a BottomType

At last, when the compiler uses the new `VarSymbol temp` to construct a new `JCVariableDecl`(the code shown as below), it crashes at the method `TreeMaker::Type` because the method `TreeMaker::Type` can't handle the type `BottomType`.

statements.append(make.at(tree.pos).VarDef(temp, !hasNullCase ? attr.makeNullCheck(selector)
                                                                          : selector));

This patch changes the type from `BottomType` to `syms.objectType` and adds the corresponding test.
Thanks for taking the time to review.

Best Regards,
-- Guoxiong


Commit messages:
 - 8269113: Javac throws when compiling switch (null)

Changes: https://git.openjdk.java.net/jdk/pull/4679/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=4679&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8269113
  Stats: 17 lines in 2 files changed: 15 ins; 0 del; 2 mod
  Patch: https://git.openjdk.java.net/jdk/pull/4679.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/4679/head:pull/4679

PR: https://git.openjdk.java.net/jdk/pull/4679

More information about the compiler-dev mailing list