// RUN_PIPELINE_TILL: FRONTEND
// LANGUAGE: +ProhibitConfusingSyntaxInWhenBranches
// DIAGNOSTICS: -INCOMPATIBLE_TYPES, -NON_EXHAUSTIVE_WHEN_STATEMENT, -ASSIGNED_BUT_NEVER_ACCESSED_VARIABLE
// ISSUE: KT-48385

operator fun Boolean.plus(other: Boolean): Boolean = true
operator fun Boolean.minus(other: Boolean): Boolean = true
operator fun Boolean.times(other: Boolean): Boolean = true
operator fun Boolean.div(other: Boolean): Boolean = true
operator fun Boolean.rem(other: Boolean): Boolean = true

operator fun Boolean.rangeTo(other: Boolean): Boolean = true

fun Boolean.id(): Boolean = true

operator fun Boolean.inc(): Boolean = true
operator fun Boolean.dec(): Boolean = true

operator fun Boolean.plusAssign(other: Boolean) {}
operator fun Boolean.minusAssign(other: Boolean) {}
operator fun Boolean.timesAssign(other: Boolean) {}
operator fun Boolean.divAssign(other: Boolean) {}
operator fun Boolean.remAssign(other: Boolean) {}

operator fun Any?.contains(other: Any): Boolean = false

fun testWithSubject_ok(x: Boolean, y: Boolean?, any: Any, z: Boolean) {
    when {
        x.id() -> {}
        <!TYPE_MISMATCH!>y?.id()<!> -> {}
        <!TYPE_MISMATCH!>any as? Boolean<!> -> {}
        any as Boolean -> {}
        x * x -> {}
        x / x -> {}
        x % x -> {}
        x + x -> {}
        x - x -> {}
        x..x -> {}
        <!TYPE_MISMATCH!>y<!> -> {}
        y ?: x -> {}
        x in x -> {}
        x !in x -> {}
        x is String -> {}
        x !is String -> {}
        x <!OVERLOAD_RESOLUTION_AMBIGUITY!><<!> x -> {}
        x <!OVERLOAD_RESOLUTION_AMBIGUITY!>><!> x -> {}
        x <!OVERLOAD_RESOLUTION_AMBIGUITY!><=<!> x -> {}
        x <!OVERLOAD_RESOLUTION_AMBIGUITY!>>=<!> x -> {}
        x == x -> {}
        x != x -> {}
        <!DEPRECATED_IDENTITY_EQUALS!>x === x<!> -> {}
        <!DEPRECATED_IDENTITY_EQUALS!>x !== x<!> -> {}
        x && x -> {}
        x || x -> {}
    }

    var b = z
    <!NO_ELSE_IN_WHEN!>when<!> (z) {
        b++ -> {}
        b-- -> {}
    }
}

/* GENERATED_FIR_TAGS: additiveExpression, andExpression, asExpression, assignment, comparisonExpression,
disjunctionExpression, elvisExpression, equalityExpression, funWithExtensionReceiver, functionDeclaration,
incrementDecrementExpression, intersectionType, isExpression, localProperty, multiplicativeExpression, nullableType,
operator, propertyDeclaration, rangeExpression, safeCall, smartcast, whenExpression, whenWithSubject */
