Skip to content

Commit f466d32

Browse files
lunakolySpace Team
authored andcommitted
[FIR] Report NOT_YET_SUPPORTED_IN_INLINE for inlines inside inlines
Specifically, for `inline` functions inside `inline` functions. Such code is prohibited in K1 and was allowed by accident. ^KT-79013 Fixed
1 parent 1fe95bd commit f466d32

File tree

9 files changed

+22
-9
lines changed

9 files changed

+22
-9
lines changed

compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineBodyRegularClassChecker.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import org.jetbrains.kotlin.fir.declarations.FirRegularClass
1515
object FirInlineBodyRegularClassChecker : FirRegularClassChecker(MppCheckerKind.Common) {
1616
context(context: CheckerContext, reporter: DiagnosticReporter)
1717
override fun check(declaration: FirRegularClass) {
18-
if (FirInlineBodySimpleFunctionChecker.isInsideInlineContext() && !declaration.classKind.isSingleton) {
18+
if (FirInlineBodySimpleFunctionChecker.isInsideInlineContext(declaration) && !declaration.classKind.isSingleton) {
1919
reporter.reportOn(declaration.source, FirErrors.NOT_YET_SUPPORTED_IN_INLINE, "Local classes")
2020
}
2121
}

compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineBodySimpleFunctionChecker.kt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.diagnostics.reportOn
1111
import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
1212
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
1313
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
14+
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
1415
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
1516
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
1617
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousObjectSymbol
@@ -19,16 +20,20 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
1920
object FirInlineBodySimpleFunctionChecker : FirSimpleFunctionChecker(MppCheckerKind.Common) {
2021
context(context: CheckerContext, reporter: DiagnosticReporter)
2122
override fun check(declaration: FirSimpleFunction) {
22-
if (isInsideInlineContext()) {
23+
if (isInsideInlineContext(declaration)) {
2324
reporter.reportOn(declaration.source, FirErrors.NOT_YET_SUPPORTED_IN_INLINE, "Local functions")
2425
}
2526
}
2627

2728
context(context: CheckerContext)
28-
fun isInsideInlineContext(): Boolean {
29+
fun isInsideInlineContext(declaration: FirDeclaration): Boolean {
30+
val outerInlineContext = when {
31+
declaration == context.inlineFunctionBodyContext?.inlineFunction -> context.inlineFunctionBodyContext?.parentInlineContext
32+
else -> context.inlineFunctionBodyContext
33+
}
2934
for (it in context.containingDeclarations.asReversed()) {
3035
when {
31-
it == context.inlineFunctionBodyContext?.inlineFunction?.symbol -> return true
36+
it == outerInlineContext?.inlineFunction?.symbol -> return true
3237
it.isObject -> return false
3338
}
3439
}

compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineDeclarationChecker.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ object FirInlineDeclarationChecker : FirFunctionChecker(MppCheckerKind.Common) {
6262
val inlineFunction: FirFunction,
6363
val inlineFunEffectiveVisibility: EffectiveVisibility,
6464
override val session: FirSession,
65+
val parentInlineContext: InlineFunctionBodyContext?,
6566
) : SessionHolder {
6667
private val isEffectivelyPrivateApiFunction: Boolean = inlineFunEffectiveVisibility.privateApi
6768

@@ -425,11 +426,16 @@ internal fun FirValueParameter.isInlinable(session: FirSession): Boolean {
425426
return !fullyExpandedType.isMarkedNullable && fullyExpandedType.functionTypeKind(session)?.isInlineable == true
426427
}
427428

428-
fun createInlineFunctionBodyContext(function: FirFunction, session: FirSession): FirInlineDeclarationChecker.InlineFunctionBodyContext {
429+
fun createInlineFunctionBodyContext(
430+
function: FirFunction,
431+
session: FirSession,
432+
parentInlineContext: FirInlineDeclarationChecker.InlineFunctionBodyContext?
433+
): FirInlineDeclarationChecker.InlineFunctionBodyContext {
429434
return FirInlineDeclarationChecker.InlineFunctionBodyContext(
430435
function,
431436
function.publishedApiEffectiveVisibility ?: function.effectiveVisibility,
432437
session,
438+
parentInlineContext,
433439
)
434440
}
435441

compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/AbstractDiagnosticCollectorVisitor.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ abstract class AbstractDiagnosticCollectorVisitor(
342342
val oldInlinableParameterContext = context.inlinableParameterContext
343343
return try {
344344
if (isInline) {
345-
val bodyContext = createInlineFunctionBodyContext(function, context.session)
345+
val bodyContext = createInlineFunctionBodyContext(function, context.session, oldBodyContext)
346346
val parameterContext = createInlinableParameterContext(function, context.session)
347347
context = context.setInlineFunctionBodyContext(bodyContext).setInlinableParameterContext(parameterContext)
348348
}

compiler/testData/codegen/box/inline/nestedLabelsInlinedClashingAtFunctionsWithClosure.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ internal fun test(state: State) {
1010
"NOT_YET_SUPPORTED_IN_INLINE", // K1/JVM-only error
1111
)
1212
inline fun test3() {
13+
@Suppress("NOT_YET_SUPPORTED_IN_INLINE") // K2/ANY error
1314
inline fun test2() {
1415
inline fun test1() {
1516
loop@ for (i in 1..10) {

compiler/testData/diagnostics/nativeTests/localInsideInlineInsideLocal.fir.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ inline fun topLevelInlineFun() {
55
<!NOT_YET_SUPPORTED_IN_INLINE!>fun<!> localFun() {}
66
localFun()
77

8-
inline fun localInlineFun() {
8+
<!NOT_YET_SUPPORTED_IN_INLINE!>inline<!> fun localInlineFun() {
99
<!NOT_YET_SUPPORTED_IN_INLINE!>fun<!> localFun() {}
1010
localFun()
1111
}

compiler/testData/diagnostics/tests/localInsideInlineInsideLocal.fir.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ inline fun topLevelInlineFun() {
66
<!NOT_YET_SUPPORTED_IN_INLINE!>fun<!> localFun() {}
77
localFun()
88

9-
<!NOT_YET_SUPPORTED_LOCAL_INLINE_FUNCTION!>inline<!> fun localInlineFun() {
9+
<!NOT_YET_SUPPORTED_IN_INLINE, NOT_YET_SUPPORTED_LOCAL_INLINE_FUNCTION!>inline<!> fun localInlineFun() {
1010
<!NOT_YET_SUPPORTED_IN_INLINE!>fun<!> localFun() {}
1111
localFun()
1212
}

compiler/testData/diagnostics/testsWithJsStdLib/localInsideInlineInsideLocal.fir.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ inline fun topLevelInlineFun() {
55
<!NOT_YET_SUPPORTED_IN_INLINE!>fun<!> localFun() {}
66
localFun()
77

8-
inline fun localInlineFun() {
8+
<!NOT_YET_SUPPORTED_IN_INLINE!>inline<!> fun localInlineFun() {
99
<!NOT_YET_SUPPORTED_IN_INLINE!>fun<!> localFun() {}
1010
localFun()
1111
}

js/js.translator/testData/box/labels/nestedLabelsInlinedClashingAtFunctionsWithClosure.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class State() {
1010

1111
internal fun test(state: State) {
1212
inline fun test3() {
13+
@Suppress("NOT_YET_SUPPORTED_IN_INLINE")
1314
inline fun test2() {
1415
inline fun test1() {
1516
loop@ for (i in 1..10) {

0 commit comments

Comments
 (0)