From cd6e865fb3279d2603003a6b55576688a1252701 Mon Sep 17 00:00:00 2001 From: Vladislav Grechko Date: Fri, 18 Nov 2022 03:22:17 +0100 Subject: [PATCH] Improve support of 'lateinit' modifier - Allow 'lateinit' for inline classes which underlying type is suitable for 'lateinit' - K2: report all problems related to 'lateinit' modifier ^KT-55052: Fixed --- ...CompilerTestFE10TestdataTestGenerated.java | 12 ++- .../inapplicableLateinitModifier.kt | 4 +- .../backingField/lateinitBackingFields.kt | 6 +- ...irOldFrontendDiagnosticsTestGenerated.java | 12 ++- ...DiagnosticsWithLightTreeTestGenerated.java | 12 ++- .../fir/analysis/checkers/FirHelpers.kt | 6 ++ .../FirInapplicableLateinitChecker.kt | 90 +++++++++++++++---- .../FirInlineClassDeclarationChecker.kt | 2 +- .../FirBlackBoxCodegenTestGenerated.java | 6 ++ .../kotlin/resolve/DeclarationsChecker.kt | 4 +- .../LateinitModifierApplicabilityChecker.kt | 67 ++++++++++++-- .../kotlin/resolve/LocalVariableResolver.kt | 2 +- .../cli/jvm/inapplicableLateinitModifier.out | 6 ++ .../inlineClasses/lateinitInlineClasses.kt | 69 ++++++++++++++ ...ocalVariablesWithTypeParameters_1_3.fir.kt | 2 +- ...ocalVariablesWithTypeParameters_1_4.fir.kt | 2 +- .../lateinitInlineClasses.fir.kt | 10 --- ...Classes.kt => lateinitInlineClassesOff.kt} | 1 + ...asses.txt => lateinitInlineClassesOff.txt} | 0 .../inlineClasses/lateinitInlineClassesOn.kt | 86 ++++++++++++++++++ .../modifierApplicability_lv12.fir.kt | 2 +- .../unsignedTypes/lateinitUnsignedType.fir.kt | 9 -- .../unsignedTypes/lateinitUnsignedType.kt | 1 + .../valueClasses/lateinitValueClasses.fir.kt | 17 ---- .../valueClasses/lateinitValueClasses.kt | 1 + .../test/runners/DiagnosticTestGenerated.java | 12 ++- .../codegen/BlackBoxCodegenTestGenerated.java | 6 ++ .../IrBlackBoxCodegenTestGenerated.java | 6 ++ .../LightAnalysisModeTestGenerated.java | 5 ++ .../kotlin/config/LanguageVersionSettings.kt | 1 + .../js/test/JsCodegenBoxTestGenerated.java | 6 ++ .../fir/FirJsCodegenBoxTestGenerated.java | 6 ++ .../test/ir/IrJsCodegenBoxTestGenerated.java | 6 ++ .../IrCodegenBoxWasmTestGenerated.java | 5 ++ .../NativeCodegenBoxTestGenerated.java | 8 ++ 35 files changed, 406 insertions(+), 84 deletions(-) create mode 100644 compiler/testData/codegen/box/inlineClasses/lateinitInlineClasses.kt delete mode 100644 compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClasses.fir.kt rename compiler/testData/diagnostics/tests/inlineClasses/{lateinitInlineClasses.kt => lateinitInlineClassesOff.kt} (93%) rename compiler/testData/diagnostics/tests/inlineClasses/{lateinitInlineClasses.txt => lateinitInlineClassesOff.txt} (100%) create mode 100644 compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClassesOn.kt delete mode 100644 compiler/testData/diagnostics/tests/unsignedTypes/lateinitUnsignedType.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/valueClasses/lateinitValueClasses.fir.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index 968dbc5a5ab..4ecc61438d5 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -18039,9 +18039,15 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag } @Test - @TestMetadata("lateinitInlineClasses.kt") - public void testLateinitInlineClasses() throws Exception { - runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClasses.kt"); + @TestMetadata("lateinitInlineClassesOff.kt") + public void testLateinitInlineClassesOff() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClassesOff.kt"); + } + + @Test + @TestMetadata("lateinitInlineClassesOn.kt") + public void testLateinitInlineClassesOn() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClassesOn.kt"); } @Test diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/inapplicableLateinitModifier.kt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/inapplicableLateinitModifier.kt index 3894b1275bf..db7ccd0739f 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/inapplicableLateinitModifier.kt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/inapplicableLateinitModifier.kt @@ -9,7 +9,7 @@ object Delegate { lateinit var good: String class A { - lateinit val fest = "10" + lateinit val fest = "10" lateinit var mest: String lateinit var xest: String? lateinit var nest: Int @@ -18,7 +18,7 @@ class A { lateinit var aest: Short lateinit var hest: Byte lateinit var jest: Long - lateinit val dest: String + lateinit val dest: String get() = "KEKER" } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/properties/backingField/lateinitBackingFields.kt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/properties/backingField/lateinitBackingFields.kt index 972c7d39b50..30611309bba 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/properties/backingField/lateinitBackingFields.kt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/properties/backingField/lateinitBackingFields.kt @@ -11,8 +11,8 @@ fun test() { } // Not allowed for properties with -// custom accessors -lateinit var number: Number +// custom accessors & backing fields +lateinit var number: Number field = 4 set(value) { field = 10 @@ -21,7 +21,7 @@ fun test() { val something: Number lateinit field = 4 -lateinit var oneMore: Number +lateinit var oneMore: Number lateinit field = 4 set(value) { field = 10 diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index abed7d6814a..39a2eef07e4 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -18039,9 +18039,15 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti } @Test - @TestMetadata("lateinitInlineClasses.kt") - public void testLateinitInlineClasses() throws Exception { - runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClasses.kt"); + @TestMetadata("lateinitInlineClassesOff.kt") + public void testLateinitInlineClassesOff() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClassesOff.kt"); + } + + @Test + @TestMetadata("lateinitInlineClassesOn.kt") + public void testLateinitInlineClassesOn() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClassesOn.kt"); } @Test diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index c94f7bf04d1..e07a87533a2 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -18039,9 +18039,15 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac } @Test - @TestMetadata("lateinitInlineClasses.kt") - public void testLateinitInlineClasses() throws Exception { - runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClasses.kt"); + @TestMetadata("lateinitInlineClassesOff.kt") + public void testLateinitInlineClassesOff() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClassesOff.kt"); + } + + @Test + @TestMetadata("lateinitInlineClassesOn.kt") + public void testLateinitInlineClassesOn() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClassesOn.kt"); } @Test diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt index ec1c9a5ed18..7828e567dff 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirHelpers.kt @@ -16,6 +16,8 @@ import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget import org.jetbrains.kotlin.diagnostics.* import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.declaration.primaryConstructorSymbol +import org.jetbrains.kotlin.fir.analysis.checkers.declaration.primaryConstructorSymbol import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.getChild import org.jetbrains.kotlin.fir.containingClassForLocalAttr @@ -675,3 +677,7 @@ private fun findDefaultValue(source: KtLightSourceElement): KtLightSourceElement ) } +fun ConeKotlinType.getInlineClassUnderlyingType(session: FirSession): ConeKotlinType { + require(this.isInlineClass(session)) + return toRegularClassSymbol(session)!!.primaryConstructorSymbol()!!.valueParameterSymbols[0].resolvedReturnTypeRef.coneType +} \ No newline at end of file diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInapplicableLateinitChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInapplicableLateinitChecker.kt index 6fa427354f3..a5baa916a26 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInapplicableLateinitChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInapplicableLateinitChecker.kt @@ -6,14 +6,20 @@ package org.jetbrains.kotlin.fir.analysis.checkers.declaration import org.jetbrains.kotlin.KtSourceElement -import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.diagnostics.DiagnosticReporter -import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirInlineClassDeclarationChecker.isRecursiveInlineClassType +import org.jetbrains.kotlin.fir.analysis.checkers.getInlineClassUnderlyingType +import org.jetbrains.kotlin.fir.analysis.checkers.isInlineClass +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter import org.jetbrains.kotlin.fir.declarations.utils.hasExplicitBackingField +import org.jetbrains.kotlin.fir.declarations.utils.isInline import org.jetbrains.kotlin.fir.declarations.utils.isLateInit import org.jetbrains.kotlin.fir.types.* @@ -23,41 +29,89 @@ object FirInapplicableLateinitChecker : FirPropertyChecker() { return } - when { - declaration.isVal -> - reporter.reportError(declaration.source, "is allowed only on mutable properties", context) + if (declaration.isVal) { + reporter.reportError(declaration.source, "is allowed only on mutable properties", context) + } - declaration.initializer != null -> if (declaration.isLocal) { + if (declaration.initializer != null) { + if (declaration.isLocal) { reporter.reportError(declaration.source, "is not allowed on local variables with initializer", context) } else { reporter.reportError(declaration.source, "is not allowed on properties with initializer", context) } + } - declaration.delegate != null -> - reporter.reportError(declaration.source, "is not allowed on delegated properties", context) + if (declaration.delegate != null) { + reporter.reportError(declaration.source, "is not allowed on delegated properties", context) + } - declaration.isNullable() -> - reporter.reportError(declaration.source, "is not allowed on properties of a type with nullable upper bound", context) + if (declaration.isNullable()) { + reporter.reportError(declaration.source, "is not allowed on properties of a type with nullable upper bound", context) + } - declaration.returnTypeRef.coneType.isPrimitiveOrNullablePrimitive -> if (declaration.isLocal) { + if (declaration.returnTypeRef.coneType.isPrimitive) { + if (declaration.isLocal) { reporter.reportError(declaration.source, "is not allowed on local variables of primitive types", context) } else { reporter.reportError(declaration.source, "is not allowed on properties of primitive types", context) } + } - declaration.hasExplicitBackingField -> - reporter.reportError(declaration.source, "must be moved to the field declaration", context) + if (declaration.hasExplicitBackingField) { + reporter.reportError(declaration.source, "must be moved to the field declaration", context) + } - declaration.hasGetter() || declaration.hasSetter() -> - reporter.reportError(declaration.source, "is not allowed on properties with a custom getter or setter", context) + if ((declaration.hasGetter() || declaration.hasSetter()) && declaration.delegate == null) { + reporter.reportError(declaration.source, "is not allowed on properties with a custom getter or setter", context) + } + + if (declaration.returnTypeRef.coneType.isInlineClass(context.session)) { + val declarationType = declaration.returnTypeRef.coneType + val variables = if (declaration.isLocal) "local variables" else "properties" + when { + declarationType.isUnsignedType -> reporter.reportError( + declaration.source, + "is not allowed on $variables of unsigned types", + context + ) + !context.languageVersionSettings.supportsFeature(LanguageFeature.InlineLateinit) -> reporter.reportError( + declaration.source, + "is not allowed on $variables of inline class types", + context + ) + hasUnderlyingTypeForbiddenForLateinit(declarationType, context.session) -> reporter.reportError( + declaration.source, + "is not allowed on $variables of inline type with underlying type not suitable for lateinit declaration", + context + ) + } } } - private fun FirProperty.isNullable() = when (val type = returnTypeRef.coneType) { - is ConeTypeParameterType -> type.isNullable || type.lookupTag.typeParameterSymbol.resolvedBounds.any { it.coneType.isNullable } - else -> type.isNullable + private fun hasUnderlyingTypeForbiddenForLateinit(type: ConeKotlinType, session: FirSession): Boolean { + + fun isForbiddenTypeForLateinit(type: ConeKotlinType): Boolean { + if (type.isPrimitiveOrNullablePrimitive) return true + if (type.hasNullableUpperBound) return true + if (type.isInlineClass(session)) { + return isForbiddenTypeForLateinit(type.getInlineClassUnderlyingType(session)) + } + return false + } + + // prevent infinite recursion + if (type.isRecursiveInlineClassType(session)) return false + return isForbiddenTypeForLateinit(type.getInlineClassUnderlyingType(session)) } + private val ConeKotlinType.hasNullableUpperBound + get() = when (this) { + is ConeTypeParameterType -> isNullable || lookupTag.typeParameterSymbol.resolvedBounds.any { it.coneType.isNullable } + else -> isNullable + } + + private fun FirProperty.isNullable() = returnTypeRef.coneType.hasNullableUpperBound + private fun FirProperty.hasGetter() = getter != null && getter !is FirDefaultPropertyGetter private fun FirProperty.hasSetter() = setter != null && setter !is FirDefaultPropertySetter diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineClassDeclarationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineClassDeclarationChecker.kt index d755bb06fa4..470bf855b37 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineClassDeclarationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirInlineClassDeclarationChecker.kt @@ -257,7 +257,7 @@ object FirInlineClassDeclarationChecker : FirRegularClassChecker() { arrayElementType.isGenericArrayOfTypeParameter() } - private fun ConeKotlinType.isRecursiveInlineClassType(session: FirSession) = + fun ConeKotlinType.isRecursiveInlineClassType(session: FirSession) = isRecursiveInlineClassType(hashSetOf(), session) private fun ConeKotlinType.isRecursiveInlineClassType(visited: HashSet, session: FirSession): Boolean { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java index 8bb89b3bc38..b6b8a02fe37 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/codegen/FirBlackBoxCodegenTestGenerated.java @@ -22391,6 +22391,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/inlineClasses/kt54656.kt"); } + @Test + @TestMetadata("lateinitInlineClasses.kt") + public void testLateinitInlineClasses() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/lateinitInlineClasses.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal()); + } + @Test @TestMetadata("mangledDefaultParameterFunction.kt") public void testMangledDefaultParameterFunction() throws Exception { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt index 13708cba06d..d316d10d5f9 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt @@ -495,7 +495,7 @@ class DeclarationsChecker( for (parameter in declaration.valueParameters) { trace.get(PRIMARY_CONSTRUCTOR_PARAMETER, parameter)?.let { modifiersChecker.checkModifiersForDeclaration(parameter, it) - LateinitModifierApplicabilityChecker.checkLateinitModifierApplicability(trace, parameter, it) + LateinitModifierApplicabilityChecker.checkLateinitModifierApplicability(trace, parameter, it, languageVersionSettings) } } @@ -610,7 +610,7 @@ class DeclarationsChecker( if (containingDeclaration is ClassDescriptor) { checkMemberProperty(property, propertyDescriptor, containingDeclaration) } - LateinitModifierApplicabilityChecker.checkLateinitModifierApplicability(trace, property, propertyDescriptor) + LateinitModifierApplicabilityChecker.checkLateinitModifierApplicability(trace, property, propertyDescriptor, languageVersionSettings) checkPropertyInitializer(property, propertyDescriptor) checkAccessors(property, propertyDescriptor) checkTypeParameterConstraints(property) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/LateinitModifierApplicabilityChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/LateinitModifierApplicabilityChecker.kt index d566252e9a0..323d6e2f09b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/LateinitModifierApplicabilityChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/LateinitModifierApplicabilityChecker.kt @@ -18,6 +18,9 @@ package org.jetbrains.kotlin.resolve import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.UnsignedTypes +import org.jetbrains.kotlin.config.LanguageFeature +import org.jetbrains.kotlin.config.LanguageVersionSettings +import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.VariableDescriptor @@ -28,10 +31,18 @@ import org.jetbrains.kotlin.psi.KtCallableDeclaration import org.jetbrains.kotlin.psi.KtParameter import org.jetbrains.kotlin.psi.KtProperty import org.jetbrains.kotlin.resolve.DeclarationsChecker.Companion.hasAccessorImplementation +import org.jetbrains.kotlin.resolve.descriptorUtil.inlineClassRepresentation +import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeUtils +import org.jetbrains.kotlin.types.typeUtil.isUnsignedNumberType object LateinitModifierApplicabilityChecker { - fun checkLateinitModifierApplicability(trace: BindingTrace, ktDeclaration: KtCallableDeclaration, descriptor: VariableDescriptor) { + fun checkLateinitModifierApplicability( + trace: BindingTrace, + ktDeclaration: KtCallableDeclaration, + descriptor: VariableDescriptor, + languageVersionSettings: LanguageVersionSettings + ) { if (!ktDeclaration.hasModifier(KtTokens.LATEINIT_KEYWORD)) return val variables = when (descriptor) { @@ -47,10 +58,27 @@ object LateinitModifierApplicabilityChecker { } if (type.isInlineClassType()) { - if (UnsignedTypes.isUnsignedType(type)) { - trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(ktDeclaration, "is not allowed on $variables of unsigned types")) - } else { - trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(ktDeclaration, "is not allowed on $variables of inline class types")) + when { + type.isUnsignedNumberType() -> trace.report( + Errors.INAPPLICABLE_LATEINIT_MODIFIER.on( + ktDeclaration, + "is not allowed on $variables of unsigned types" + ) + ) + !languageVersionSettings.supportsFeature(LanguageFeature.InlineLateinit) -> + trace.report( + Errors.INAPPLICABLE_LATEINIT_MODIFIER.on( + ktDeclaration, + "is not allowed on $variables of inline class types" + ) + ) + hasUnderlyingTypeForbiddenForLateinit(type) -> + trace.report( + Errors.INAPPLICABLE_LATEINIT_MODIFIER.on( + ktDeclaration, + "is not allowed on $variables of inline type with underlying type not suitable for lateinit declaration" + ) + ) } } @@ -100,7 +128,12 @@ object LateinitModifierApplicabilityChecker { ) ) } else if (!isAbstract && !hasBackingField) { - trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(ktDeclaration, "is not allowed on properties without backing field")) + trace.report( + Errors.INAPPLICABLE_LATEINIT_MODIFIER.on( + ktDeclaration, + "is not allowed on properties without backing field" + ) + ) } } @@ -109,4 +142,26 @@ object LateinitModifierApplicabilityChecker { } } } + + private fun hasUnderlyingTypeForbiddenForLateinit(type: KotlinType): Boolean { + + fun getUnderlyingType(type: KotlinType): KotlinType { + return (type.constructor.declarationDescriptor as ClassDescriptor).inlineClassRepresentation!!.underlyingType + } + + fun isForbiddenForLateinit(type: KotlinType): Boolean { + if (type.isMarkedNullable || TypeUtils.isNullableType(type)) return true + if (KotlinBuiltIns.isPrimitiveType(type)) return true + if (type.isInlineClassType()) { + return isForbiddenForLateinit(getUnderlyingType(type)) + } + return false + } + + // prevent infinite recursion + if (type.isRecursiveInlineOrValueClassType()) return false + return isForbiddenForLateinit(getUnderlyingType(type)) + } + + } \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/LocalVariableResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/LocalVariableResolver.kt index 9f888a918f1..fa337010eb9 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/LocalVariableResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/LocalVariableResolver.kt @@ -150,7 +150,7 @@ class LocalVariableResolver( modifiersChecker.withTrace(context.trace).checkModifiersForLocalDeclaration(ktProperty, descriptor) identifierChecker.checkDeclaration(ktProperty, context.trace) - LateinitModifierApplicabilityChecker.checkLateinitModifierApplicability(context.trace, ktProperty, descriptor) + LateinitModifierApplicabilityChecker.checkLateinitModifierApplicability(context.trace, ktProperty, descriptor, languageVersionSettings) } private fun resolveLocalVariableDescriptor( diff --git a/compiler/testData/cli/jvm/inapplicableLateinitModifier.out b/compiler/testData/cli/jvm/inapplicableLateinitModifier.out index 23be76c0cf6..604dc3853eb 100644 --- a/compiler/testData/cli/jvm/inapplicableLateinitModifier.out +++ b/compiler/testData/cli/jvm/inapplicableLateinitModifier.out @@ -7,6 +7,9 @@ lateinit var kest by Delegate compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:9:5: error: 'lateinit' modifier is allowed only on mutable properties lateinit val fest = "10" ^ +compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:9:5: error: 'lateinit' modifier is not allowed on properties with initializer + lateinit val fest = "10" + ^ compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:11:5: error: 'lateinit' modifier is not allowed on properties of a type with nullable upper bound lateinit var xest: String? ^ @@ -16,6 +19,9 @@ compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:12:5: error: 'lateinit compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:13:5: error: 'lateinit' modifier is allowed only on mutable properties lateinit val dest: String ^ +compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:13:5: error: 'lateinit' modifier is not allowed on properties with a custom getter or setter + lateinit val dest: String + ^ compiler/testData/cli/jvm/inapplicableLateinitModifier.kt:18:5: error: 'lateinit' modifier is not allowed on properties of a type with nullable upper bound lateinit var best: T ^ diff --git a/compiler/testData/codegen/box/inlineClasses/lateinitInlineClasses.kt b/compiler/testData/codegen/box/inlineClasses/lateinitInlineClasses.kt new file mode 100644 index 00000000000..de210d50359 --- /dev/null +++ b/compiler/testData/codegen/box/inlineClasses/lateinitInlineClasses.kt @@ -0,0 +1,69 @@ +// WITH_STDLIB +// WORKS_WHEN_VALUE_CLASS +// LANGUAGE: +ValueClasses, +InlineLateinit + +OPTIONAL_JVM_INLINE_ANNOTATION +value class IC1(val x: String) + +lateinit var a: IC1 + +OPTIONAL_JVM_INLINE_ANNOTATION +value class IC2(val x: T) + +class MyClass { + lateinit var b: IC2 + + fun isInit() = ::b.isInitialized +} + +OPTIONAL_JVM_INLINE_ANNOTATION +value class IC3(val x: Comparable) + +OPTIONAL_JVM_INLINE_ANNOTATION +value class IC4(val x: IC1) + +lateinit var c: IC4 + +inline fun assertThrows(block: () -> Unit): Boolean { + try { + block.invoke() + } catch (t: Throwable) { + return t is T + } + return false +} + +fun box(): String { + if (::a.isInitialized) return "Fail 1.1" + if (!assertThrows { val t = a }) return "Fail 1.2" + a = IC1("a") + if (!::a.isInitialized) return "Fail 1.3" + if (a.x != "a") return "Fail 1.4" + + val inst = MyClass() + if (inst.isInit()) return "Fail 2.1" + if (!assertThrows { val t = inst.b }) return "Fail 2.2" + inst.b = IC2(42) + if (!inst.isInit()) return "Fail 2.3" + if (inst.b.x != 42) return "Fail 2.4" + + lateinit var z: IC3 + if (!assertThrows { val t = z }) return "Fail 3.1" + z = IC3(5.0) + if (z.x != 5.0) return "Fail 3.2" + + if (::c.isInitialized) return "Fail 4.1" + if (!assertThrows { val t = c }) return "Fail 4.2" + c = IC4(IC1("c")) + if (!::c.isInitialized) return "Fail 4.3" + if (c.x.x != "c") return "Fail 4.4" + + return "OK" +} + +//CHECK_BYTECODE_TEXT +// JVM_IR_TEMPLATES +// 0 INVOKESTATIC IC1.box-impl +// 0 INVOKESTATIC IC2.box-impl +// 0 INVOKESTATIC IC3.box-impl +// 0 INVOKESTATIC IC4.box-impl \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_3.fir.kt b/compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_3.fir.kt index fdb697c6449..b114049a1ca 100644 --- a/compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_3.fir.kt +++ b/compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_3.fir.kt @@ -8,7 +8,7 @@ fun test() { val __UNRESOLVED__> a1 = "" val String> a2 = 0 const val a3 = 0 - lateinit val a4 = 0 + lateinit val a4 = 0 val a5 by Delegate() val a6 by Delegate<T>() } diff --git a/compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_4.fir.kt b/compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_4.fir.kt index bb9c4af76cc..e2bf4d1269a 100644 --- a/compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_4.fir.kt +++ b/compiler/testData/diagnostics/tests/declarationChecks/localVariablesWithTypeParameters_1_4.fir.kt @@ -8,7 +8,7 @@ fun test() { val __UNRESOLVED__> a1 = "" val String> a2 = 0 const val a3 = 0 - lateinit val a4 = 0 + lateinit val a4 = 0 val a5 by Delegate() val a6 by Delegate<T>() } diff --git a/compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClasses.fir.kt b/compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClasses.fir.kt deleted file mode 100644 index bb264ef9e0e..00000000000 --- a/compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClasses.fir.kt +++ /dev/null @@ -1,10 +0,0 @@ -// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses -// !DIAGNOSTICS: -UNUSED_VARIABLE - -inline class Foo(val x: Int) - -lateinit var a: Foo - -fun foo() { - lateinit var b: Foo -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClasses.kt b/compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClassesOff.kt similarity index 93% rename from compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClasses.kt rename to compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClassesOff.kt index 89a50702ef4..dd6bb5a62e3 100644 --- a/compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClasses.kt +++ b/compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClassesOff.kt @@ -1,5 +1,6 @@ // !LANGUAGE: +InlineClasses, -JvmInlineValueClasses // !DIAGNOSTICS: -UNUSED_VARIABLE +// FIR_IDENTICAL inline class Foo(val x: Int) diff --git a/compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClasses.txt b/compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClassesOff.txt similarity index 100% rename from compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClasses.txt rename to compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClassesOff.txt diff --git a/compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClassesOn.kt b/compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClassesOn.kt new file mode 100644 index 00000000000..9c7f5f9371b --- /dev/null +++ b/compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClassesOn.kt @@ -0,0 +1,86 @@ +// WITH_STDLIB +// SKIP_TXT +// !LANGUAGE: +InlineLateinit +// FIR_IDENTICAL + +@JvmInline +value class IC1(val x: Int) + +@JvmInline +value class IC2(val x: IC1) + +@JvmInline +value class IC3(val x: String) + +@JvmInline +value class IC4(val x: String?) + +@JvmInline +value class IC5(val x: IC4) + +@JvmInline +value class IC6(val x: T) + +@JvmInline +value class IC7(val x: T) + +@JvmInline +value class IC8(val x: IC9) + +@JvmInline +value class IC9(val x: IC8) + +@JvmInline +value class IC10(val x: IC6) + +@JvmInline +value class IC11(val x : IC4?) + +lateinit var a: IC1 +lateinit var b: IC2 +lateinit var c: IC3 +lateinit var d: IC4 +lateinit var e: IC6 +lateinit var f: IC6<*> +lateinit var g: IC5 +lateinit var h: IC7 +lateinit var i: IC7<*> +lateinit var j: IC8 +lateinit var k : IC10 +lateinit var o : IC3? +lateinit var m : UInt +lateinit var n : IC11 + +class B { + lateinit var a: IC1 + lateinit var b: IC2 + lateinit var c: IC3 + lateinit var d: IC4 + lateinit var e: IC6 + lateinit var f: IC6<*> + lateinit var g: IC5 + lateinit var h: IC7 + lateinit var i: IC7<*> + lateinit var j: IC8 + lateinit var k : IC10 + lateinit var o : IC3? + lateinit var m : UInt + lateinit var n : IC11 +} + +fun foo() { + lateinit var a: IC1 + lateinit var b: IC2 + lateinit var c: IC3 + lateinit var d: IC4 + lateinit var e: IC6 + lateinit var f: IC6<*> + lateinit var g: IC5 + lateinit var h: IC7 + lateinit var i: IC7<*> + lateinit var j: IC8 + lateinit var k : IC10 + lateinit var o : IC3? + lateinit var m : UInt + lateinit var n : IC11 +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/lateinit/modifierApplicability_lv12.fir.kt b/compiler/testData/diagnostics/tests/lateinit/modifierApplicability_lv12.fir.kt index eeb08876d7f..df4efef4a49 100644 --- a/compiler/testData/diagnostics/tests/lateinit/modifierApplicability_lv12.fir.kt +++ b/compiler/testData/diagnostics/tests/lateinit/modifierApplicability_lv12.fir.kt @@ -30,7 +30,7 @@ public abstract class A(lateinit var p2: String) { lateinit var e5 = "A" // With initializer, primitive - lateinit var e6 = 3 + lateinit var e6 = 3 lateinit var e7 by CustomDelegate() diff --git a/compiler/testData/diagnostics/tests/unsignedTypes/lateinitUnsignedType.fir.kt b/compiler/testData/diagnostics/tests/unsignedTypes/lateinitUnsignedType.fir.kt deleted file mode 100644 index 8a7cd8b6da2..00000000000 --- a/compiler/testData/diagnostics/tests/unsignedTypes/lateinitUnsignedType.fir.kt +++ /dev/null @@ -1,9 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_VARIABLE - -lateinit var a: UInt - -fun foo() { - lateinit var b: UByte - lateinit var c: UShort - lateinit var d: ULong -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/unsignedTypes/lateinitUnsignedType.kt b/compiler/testData/diagnostics/tests/unsignedTypes/lateinitUnsignedType.kt index d9d223817f0..1d221d94868 100644 --- a/compiler/testData/diagnostics/tests/unsignedTypes/lateinitUnsignedType.kt +++ b/compiler/testData/diagnostics/tests/unsignedTypes/lateinitUnsignedType.kt @@ -1,4 +1,5 @@ // !DIAGNOSTICS: -UNUSED_VARIABLE +// FIR_IDENTICAL lateinit var a: UInt diff --git a/compiler/testData/diagnostics/tests/valueClasses/lateinitValueClasses.fir.kt b/compiler/testData/diagnostics/tests/valueClasses/lateinitValueClasses.fir.kt deleted file mode 100644 index fc2ee1587d2..00000000000 --- a/compiler/testData/diagnostics/tests/valueClasses/lateinitValueClasses.fir.kt +++ /dev/null @@ -1,17 +0,0 @@ -// !SKIP_JAVAC -// !LANGUAGE: +InlineClasses -// ALLOW_KOTLIN_PACKAGE -// !DIAGNOSTICS: -UNUSED_VARIABLE - -package kotlin.jvm - -annotation class JvmInline - -@JvmInline -value class Foo(val x: Int) - -lateinit var a: Foo - -fun foo() { - lateinit var b: Foo -} diff --git a/compiler/testData/diagnostics/tests/valueClasses/lateinitValueClasses.kt b/compiler/testData/diagnostics/tests/valueClasses/lateinitValueClasses.kt index 81a0117420c..eb075188c14 100644 --- a/compiler/testData/diagnostics/tests/valueClasses/lateinitValueClasses.kt +++ b/compiler/testData/diagnostics/tests/valueClasses/lateinitValueClasses.kt @@ -2,6 +2,7 @@ // !LANGUAGE: +InlineClasses // ALLOW_KOTLIN_PACKAGE // !DIAGNOSTICS: -UNUSED_VARIABLE +// FIR_IDENTICAL package kotlin.jvm diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 9e72e3a4da0..b21cb9f08e8 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -18045,9 +18045,15 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { } @Test - @TestMetadata("lateinitInlineClasses.kt") - public void testLateinitInlineClasses() throws Exception { - runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClasses.kt"); + @TestMetadata("lateinitInlineClassesOff.kt") + public void testLateinitInlineClassesOff() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClassesOff.kt"); + } + + @Test + @TestMetadata("lateinitInlineClassesOn.kt") + public void testLateinitInlineClassesOn() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClassesOn.kt"); } @Test diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java index 97dc8056979..2253a9803db 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/BlackBoxCodegenTestGenerated.java @@ -21569,6 +21569,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/inlineClasses/kt54455.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal()); } + @Test + @TestMetadata("lateinitInlineClasses.kt") + public void testLateinitInlineClasses() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/lateinitInlineClasses.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal()); + } + @Test @TestMetadata("mangledDefaultParameterFunction.kt") public void testMangledDefaultParameterFunction() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java index 37eafb62657..d9bff85892a 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/codegen/IrBlackBoxCodegenTestGenerated.java @@ -22391,6 +22391,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/inlineClasses/kt54656.kt"); } + @Test + @TestMetadata("lateinitInlineClasses.kt") + public void testLateinitInlineClasses() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/lateinitInlineClasses.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal()); + } + @Test @TestMetadata("mangledDefaultParameterFunction.kt") public void testMangledDefaultParameterFunction() throws Exception { diff --git a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 00e5a11ba96..cd3c5435064 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -18020,6 +18020,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/inlineClasses/kt54455.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal()); } + @TestMetadata("lateinitInlineClasses.kt") + public void testLateinitInlineClasses() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/lateinitInlineClasses.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal()); + } + @TestMetadata("mangledDefaultParameterFunction.kt") public void testMangledDefaultParameterFunction() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/mangledDefaultParameterFunction.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal()); diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index 08d8b7bfbac..1fe137603e8 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -280,6 +280,7 @@ enum class LanguageFeature( CustomEqualsInInlineClasses(KOTLIN_1_9), // KT-24874 EnhanceNullabilityOfPrimitiveArrays(KOTLIN_1_9, kind = BUG_FIX), // KT-54521 RefineTypeCheckingOnAssignmentsToJavaFields(KOTLIN_1_9, kind = BUG_FIX), // KT-46727 + InlineLateinit(KOTLIN_1_9, kind = OTHER), // KT-23814 // Disabled for indefinite time. See KT-53751 diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java index add8da29142..4890cd00d0a 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/JsCodegenBoxTestGenerated.java @@ -16951,6 +16951,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/kt54455.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation()); } + @Test + @TestMetadata("lateinitInlineClasses.kt") + public void testLateinitInlineClasses() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/lateinitInlineClasses.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation()); + } + @Test @TestMetadata("mangledDefaultParameterFunction.kt") public void testMangledDefaultParameterFunction() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java index 2dd6ec4fe01..9b1f61bc57c 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirJsCodegenBoxTestGenerated.java @@ -16969,6 +16969,12 @@ public class FirJsCodegenBoxTestGenerated extends AbstractFirJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/kt54455.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation()); } + @Test + @TestMetadata("lateinitInlineClasses.kt") + public void testLateinitInlineClasses() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/lateinitInlineClasses.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation()); + } + @Test @TestMetadata("mangledDefaultParameterFunction.kt") public void testMangledDefaultParameterFunction() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java index 038c14b5709..5e207a6c3b8 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrJsCodegenBoxTestGenerated.java @@ -16969,6 +16969,12 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest { runTest("compiler/testData/codegen/box/inlineClasses/kt54455.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation()); } + @Test + @TestMetadata("lateinitInlineClasses.kt") + public void testLateinitInlineClasses() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/lateinitInlineClasses.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation()); + } + @Test @TestMetadata("mangledDefaultParameterFunction.kt") public void testMangledDefaultParameterFunction() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java index 462f1832f9b..51461653f2b 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testOld/wasm/semantics/IrCodegenBoxWasmTestGenerated.java @@ -15025,6 +15025,11 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest runTest("compiler/testData/codegen/box/inlineClasses/kt54455.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation()); } + @TestMetadata("lateinitInlineClasses.kt") + public void testLateinitInlineClasses() throws Exception { + runTest("compiler/testData/codegen/box/inlineClasses/lateinitInlineClasses.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation()); + } + @TestMetadata("mangledDefaultParameterFunction.kt") public void testMangledDefaultParameterFunction() throws Exception { runTest("compiler/testData/codegen/box/inlineClasses/mangledDefaultParameterFunction.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation()); diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java index 496ed50ca81..e38b32dbb86 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/NativeCodegenBoxTestGenerated.java @@ -16836,6 +16836,7 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest register("compiler/testData/codegen/box/inlineClasses/kt51254.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation()); register("compiler/testData/codegen/box/inlineClasses/kt52913.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation()); register("compiler/testData/codegen/box/inlineClasses/kt54455.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation()); + register("compiler/testData/codegen/box/inlineClasses/lateinitInlineClasses.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation()); register("compiler/testData/codegen/box/inlineClasses/mangledDefaultParameterFunction.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation()); register("compiler/testData/codegen/box/inlineClasses/mangledDefaultParameterFunctionGeneric.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation()); register("compiler/testData/codegen/box/inlineClasses/mangledSuperCalls.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation()); @@ -18691,6 +18692,13 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest runTest("compiler/testData/codegen/box/inlineClasses/kt54455.kt"); } + @Test + @TestMetadata("lateinitInlineClasses.kt") + public void testLateinitInlineClasses() throws Exception { + // There is a registered source transformer for the testcase: TransformersFunctions.getRemoveOptionalJvmInlineAnnotation() + runTest("compiler/testData/codegen/box/inlineClasses/lateinitInlineClasses.kt"); + } + @Test @TestMetadata("mangledDefaultParameterFunction.kt") public void testMangledDefaultParameterFunction() throws Exception {