diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/LateinitModifierApplicabilityChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/LateinitModifierApplicabilityChecker.kt index 9e56ec46fce..0fdcfeab2fd 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/LateinitModifierApplicabilityChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/LateinitModifierApplicabilityChecker.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.resolve import org.jetbrains.kotlin.builtins.KotlinBuiltIns +import org.jetbrains.kotlin.builtins.UnsignedTypes import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.VariableDescriptor @@ -45,6 +46,14 @@ object LateinitModifierApplicabilityChecker { trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(modifier, "is allowed only on mutable $variables")) } + if (type.isInlineClassType()) { + if (UnsignedTypes.isUnsignedType(type)) { + trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(modifier, "is not allowed on $variables of unsigned types")) + } else { + trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(modifier, "is not allowed on $variables of inline class types")) + } + } + if (type.isMarkedNullable) { trace.report(Errors.INAPPLICABLE_LATEINIT_MODIFIER.on(modifier, "is not allowed on $variables of nullable types")) } else if (TypeUtils.isNullableType(type)) { diff --git a/compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClasses.kt b/compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClasses.kt new file mode 100644 index 00000000000..b05bacd607e --- /dev/null +++ b/compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClasses.kt @@ -0,0 +1,10 @@ +// !LANGUAGE: +InlineClasses +// !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.txt b/compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClasses.txt new file mode 100644 index 00000000000..4df16de4338 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClasses.txt @@ -0,0 +1,12 @@ +package + +public lateinit var a: Foo +public fun foo(): kotlin.Unit + +public final inline class Foo { + public constructor Foo(/*0*/ x: kotlin.Int) + public final val x: kotlin.Int + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/testsWithUnsignedTypes/lateinitUnsignedType.kt b/compiler/testData/diagnostics/testsWithUnsignedTypes/lateinitUnsignedType.kt new file mode 100644 index 00000000000..d9d223817f0 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithUnsignedTypes/lateinitUnsignedType.kt @@ -0,0 +1,9 @@ +// !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/testsWithUnsignedTypes/lateinitUnsignedType.txt b/compiler/testData/diagnostics/testsWithUnsignedTypes/lateinitUnsignedType.txt new file mode 100644 index 00000000000..48b5b77981c --- /dev/null +++ b/compiler/testData/diagnostics/testsWithUnsignedTypes/lateinitUnsignedType.txt @@ -0,0 +1,4 @@ +package + +public lateinit var a: kotlin.UInt +public fun foo(): kotlin.Unit diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index fba016c6b12..b754f1c1150 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -10862,6 +10862,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { runTest("compiler/testData/diagnostics/tests/inlineClasses/inlineClassesInsideAnnotations.kt"); } + @TestMetadata("lateinitInlineClasses.kt") + public void testLateinitInlineClasses() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClasses.kt"); + } + @TestMetadata("presenceOfInitializerBlockInsideInlineClass.kt") public void testPresenceOfInitializerBlockInsideInlineClass() throws Exception { runTest("compiler/testData/diagnostics/tests/inlineClasses/presenceOfInitializerBlockInsideInlineClass.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsWithUnsignedTypesGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsWithUnsignedTypesGenerated.java index b076d972332..c5f7c870cee 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsWithUnsignedTypesGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsWithUnsignedTypesGenerated.java @@ -44,6 +44,11 @@ public class DiagnosticsWithUnsignedTypesGenerated extends AbstractDiagnosticsWi runTest("compiler/testData/diagnostics/testsWithUnsignedTypes/forbiddenEqualsOnUnsignedTypes.kt"); } + @TestMetadata("lateinitUnsignedType.kt") + public void testLateinitUnsignedType() throws Exception { + runTest("compiler/testData/diagnostics/testsWithUnsignedTypes/lateinitUnsignedType.kt"); + } + @TestMetadata("overloadResolutionOfBasicOperations.kt") public void testOverloadResolutionOfBasicOperations() throws Exception { runTest("compiler/testData/diagnostics/testsWithUnsignedTypes/overloadResolutionOfBasicOperations.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 26d03a6db08..b8c0c5ff8fe 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -10862,6 +10862,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing runTest("compiler/testData/diagnostics/tests/inlineClasses/inlineClassesInsideAnnotations.kt"); } + @TestMetadata("lateinitInlineClasses.kt") + public void testLateinitInlineClasses() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineClasses/lateinitInlineClasses.kt"); + } + @TestMetadata("presenceOfInitializerBlockInsideInlineClass.kt") public void testPresenceOfInitializerBlockInsideInlineClass() throws Exception { runTest("compiler/testData/diagnostics/tests/inlineClasses/presenceOfInitializerBlockInsideInlineClass.kt");