diff --git a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java index f5a9d43162e..42e1accb7f4 100644 --- a/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java +++ b/src/jdk.compiler/share/classes/com/sun/tools/javac/comp/Attr.java @@ -1610,14 +1610,16 @@ public class Attr extends JCTree.Visitor { } public void visitSwitchExpression(JCSwitchExpression tree) { + boolean wrongContext = false; + tree.polyKind = (pt().hasTag(NONE) && pt() != Type.recoveryType && pt() != Infer.anyPoly) ? PolyKind.STANDALONE : PolyKind.POLY; if (tree.polyKind == PolyKind.POLY && resultInfo.pt.hasTag(VOID)) { //this means we are returning a poly conditional from void-compatible lambda expression resultInfo.checkContext.report(tree, diags.fragment(Fragments.SwitchExpressionTargetCantBeVoid)); - result = tree.type = types.createErrorType(resultInfo.pt); - return; + resultInfo = recoveryInfo; + wrongContext = true; } ResultInfo condInfo = tree.polyKind == PolyKind.STANDALONE ? @@ -1655,7 +1657,7 @@ public class Attr extends JCTree.Visitor { Type owntype = (tree.polyKind == PolyKind.STANDALONE) ? condType(caseTypePositions.toList(), caseTypes.toList()) : pt(); - result = tree.type = check(tree, owntype, KindSelector.VAL, resultInfo); + result = tree.type = wrongContext? types.createErrorType(pt()) : check(tree, owntype, KindSelector.VAL, resultInfo); } //where: CheckContext switchExpressionContext(CheckContext checkContext) { diff --git a/test/langtools/tools/javac/T8323502.java b/test/langtools/tools/javac/T8323502.java new file mode 100644 index 00000000000..8ba0c6797d5 --- /dev/null +++ b/test/langtools/tools/javac/T8323502.java @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 8323502 + * @summary javac crash with wrongly typed method block in Flow + * @compile/fail/ref=T8323502.out -XDrawDiagnostics --should-stop=at=FLOW -XDdev T8323502.java + */ +public class T8323502 { + public void m(Object o) { + return switch(o) { + default -> System.out.println("boom"); + }; + } +} diff --git a/test/langtools/tools/javac/T8323502.out b/test/langtools/tools/javac/T8323502.out new file mode 100644 index 00000000000..89e2100d79e --- /dev/null +++ b/test/langtools/tools/javac/T8323502.out @@ -0,0 +1,2 @@ +T8323502.java:31:16: compiler.err.prob.found.req: (compiler.misc.unexpected.ret.val) +1 error