// FIR_IDENTICAL @RequiresOptIn annotation class Marker // Error! @SubclassOptInRequired(Marker::class) class Final // Error! @SubclassOptInRequired(Marker::class) sealed class SealedClass { @SubclassOptInRequired(Marker::class) object O : SealedClass() } // Error! @SubclassOptInRequired(Marker::class) sealed interface SealedInterface // Error! @SubclassOptInRequired(Marker::class) fun interface FunInterface { fun doIt() } sealed class Normal // Ok! @SubclassOptInRequired(Marker::class) open class NormalOpen : Normal() // Ok! @SubclassOptInRequired(Marker::class) abstract class NormalAbstract : Normal() // Error! @SubclassOptInRequired(Marker::class) sealed class ErrorSealed : Normal() // Error! @SubclassOptInRequired(Marker::class) class ErrorFinal : Normal() // Ok! @SubclassOptInRequired(Marker::class) abstract class Abstract // Error! Should be replaced with OptIn @SubclassOptInRequired(Marker::class) class Derived1 : Abstract() // Ok! @OptIn(Marker::class) class Derived2 : Abstract() // Error! @SubclassOptInRequired(Marker::class) object Obj // Error! @SubclassOptInRequired(Marker::class) enum class E1 { FIRST; } enum class E2 { // Error! @SubclassOptInRequired(Marker::class) SECOND; } // Error! @SubclassOptInRequired(Marker::class) annotation class A // Local stuff fun foo() { // Error! val v = @SubclassOptInRequired(Marker::class) object : Any() { } // Error! @SubclassOptInRequired(Marker::class) open class OpenLocal // Ok! @OptIn(Marker::class) class DerivedLocal : OpenLocal() // Error! @SubclassOptInRequired(Marker::class) class Local } // Common rules with OptIn annotation class Simple // Error! Opt-in marker required @SubclassOptInRequired(Simple::class) open class Some