diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java
index fb650e30e219..1a7cb38ecc74 100644
--- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java
+++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightVisitorImpl.java
@@ -2026,6 +2026,16 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
public void visitGuardedPattern(PsiGuardedPattern pattern) {
super.visitGuardedPattern(pattern);
myHolder.add(checkFeature(pattern, HighlightingFeature.GUARDED_AND_PARENTHESIZED_PATTERNS));
+ if (myHolder.hasErrorResults()) return;
+ PsiExpression guardingExpr = pattern.getGuardingExpression();
+ if (guardingExpr == null) return;
+ // 14.30.1 Kinds of Patterns GuardedPattern: PrimaryPattern && ConditionalAndExpression
+ // 15.23. ConditionalAndExpression: Each operand of the conditional-and operator must be of type boolean or Boolean, or a compile-time error occurs.
+ if (!TypeConversionUtil.isBooleanType(guardingExpr.getType())) {
+ String message = JavaErrorBundle.message("incompatible.types", JavaHighlightUtil.formatType(PsiType.BOOLEAN),
+ JavaHighlightUtil.formatType(guardingExpr.getType()));
+ myHolder.add(HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(guardingExpr).descriptionAndTooltip(message).create());
+ }
}
@Override
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/GuardedPatterns.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/GuardedPatterns.java
new file mode 100644
index 000000000000..3f3e39a923a1
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlightingPatternsInSwitch/GuardedPatterns.java
@@ -0,0 +1,31 @@
+class Test {
+ void test(Object o, Integer integer) {
+ switch (o) {
+ case String s && integer -> System.out.println();
+ default -> {}
+ }
+
+ switch (o) {
+ case String s && isBool() -> System.out.println();
+ default -> {}
+ }
+
+ switch (o) {
+ case Integer i && isInt():
+ break;
+ default:
+ break;
+ }
+
+ switch (o) {
+ case Integer i && null:
+ break;
+ default:
+ break;
+ }
+ }
+
+ private native boolean isBool();
+
+ private native int isInt();
+}
\ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightPatternsForSwitchHighlightingTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightPatternsForSwitchHighlightingTest.java
index 3ce54226cf6c..187f7133d045 100644
--- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightPatternsForSwitchHighlightingTest.java
+++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightPatternsForSwitchHighlightingTest.java
@@ -59,6 +59,10 @@ public class LightPatternsForSwitchHighlightingTest extends LightJavaCodeInsight
doTest();
}
+ public void testGuardedPatterns() {
+ doTest();
+ }
+
public void testIdentifierHighlighterForPatternVariable() {
PsiFile file = myFixture.configureByFile(getTestName(false) + ".java");
PsiElement element = myFixture.getElementAtCaret();