From 9edac7c1750dd89cb8f1ab430bcd7fece2a471f3 Mon Sep 17 00:00:00 2001 From: Alexey Pavlyutkin Date: Wed, 14 Sep 2022 19:06:13 +0300 Subject: [PATCH] Backport 93eec9a103de7f4d9a87eac5b295c9a50702ee94 --- .../com/sun/tools/javac/comp/TransPatterns.java | 5 ++--- .../tools/javac/patterns/NullSwitch.java | 16 +++++++++++++++- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransPatterns.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransPatterns.java index f64a81eb5da..fda59d6ddaa 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransPatterns.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/TransPatterns.java @@ -341,9 +341,8 @@ private void handleSwitch(JCTree tree, JCCase lastCase = cases.last(); if (hasTotalPattern && !hasNullCase) { - JCCase last = lastCase; - if (last.labels.stream().noneMatch(l -> l.hasTag(Tag.DEFAULTCASELABEL))) { - last.labels = last.labels.prepend(makeLit(syms.botType, null)); + if (cases.stream().flatMap(c -> c.labels.stream()).noneMatch(l -> l.hasTag(Tag.DEFAULTCASELABEL))) { + lastCase.labels = lastCase.labels.prepend(makeLit(syms.botType, null)); hasNullCase = true; } } diff --git a/test/langtools/tools/javac/patterns/NullSwitch.java b/test/langtools/tools/javac/patterns/NullSwitch.java index 3932c9014b7..a2d74bf774e 100644 --- a/test/langtools/tools/javac/patterns/NullSwitch.java +++ b/test/langtools/tools/javac/patterns/NullSwitch.java @@ -1,6 +1,6 @@ /* * @test /nodynamiccopyright/ - * @bug 8262891 + * @bug 8262891 8272776 * @summary Check null handling for non-pattern switches. * @compile --enable-preview -source ${jdk.version} NullSwitch.java * @run main/othervm --enable-preview NullSwitch @@ -57,6 +57,9 @@ void switchTest() { assertEquals(0, matchingSwitch12("")); assertEquals(2, matchingSwitch12(null)); assertEquals(1, matchingSwitch12(0.0)); + assertEquals(0, matchingSwitch13("")); + assertEquals(1, matchingSwitch13(0.0)); + assertEquals(2, matchingSwitch13(null)); } private int matchingSwitch1(Object obj) { @@ -159,6 +162,17 @@ private int matchingSwitch12(Object obj) { } } + private int matchingSwitch13(Object obj) { + try { + switch (obj) { + default: return 1; + case String s: return 0; + } + } catch (NullPointerException ex) { + return 2; + } + } + static void assertEquals(int expected, int actual) { if (expected != actual) { throw new AssertionError("Expected: " + expected + ", actual: " + actual);