// RUN_PIPELINE_TILL: FRONTEND
// DIAGNOSTICS: -UNUSED_PARAMETER

interface Base

class Impl1 : Base

class Impl2 : Base

operator fun Base.plus(arg: Base) = Impl1()

operator fun Impl2.plus(arg: Base) = Impl2()

operator fun Base.plus(arg: Impl2) = Impl2()

operator fun Base.unaryMinus() = Impl1()

operator fun Impl2.unaryMinus() = Impl2()

// See also KT-10384: in non-error functions, as is necessary!
fun add1(x: Impl2, y: Base): Impl1 = x as Base + y

fun error1(x: Impl2, y: Base): Impl1 = <!RETURN_TYPE_MISMATCH!>x + y<!>

fun add2(x: Base, y: Impl2): Impl1 = x + y as Base

fun error2(x: Base, y: Impl2): Impl1 = <!RETURN_TYPE_MISMATCH!>x + y<!>

fun minus3(x: Impl2): Impl1 = -(x as Base)

fun error3(x: Impl2): Impl1 = <!RETURN_TYPE_MISMATCH!>-x<!>

/* GENERATED_FIR_TAGS: additiveExpression, asExpression, classDeclaration, funWithExtensionReceiver, functionDeclaration,
interfaceDeclaration, operator, unaryExpression */
