diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/inlineClassManglingUtils.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/inlineClassManglingUtils.kt index 7d8e309f1d05c..e6fd417edf946 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/inlineClassManglingUtils.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/inlineClassManglingUtils.kt @@ -8,10 +8,8 @@ package org.jetbrains.kotlin.codegen.state import org.jetbrains.kotlin.codegen.coroutines.unwrapInitialDescriptorForSuspendFunction import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.name.FqNameUnsafe -import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.InlineClassDescriptorResolver -import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe import org.jetbrains.kotlin.resolve.isInlineClass import org.jetbrains.kotlin.resolve.jvm.requiresFunctionNameManglingForParameterTypes diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java index 7f464477a927e..6659b194ca6fa 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/fir/FirOldFrontendDiagnosticsTestGenerated.java @@ -25015,6 +25015,11 @@ public void testIdentityComparisonWithValueClasses() throws Exception { runTest("compiler/testData/diagnostics/tests/valueClasses/identityComparisonWithValueClasses.kt"); } + @TestMetadata("jvmInlineApplicability.kt") + public void testJvmInlineApplicability() throws Exception { + runTest("compiler/testData/diagnostics/tests/valueClasses/jvmInlineApplicability.kt"); + } + @TestMetadata("lateinitValueClasses.kt") public void testLateinitValueClasses() throws Exception { runTest("compiler/testData/diagnostics/tests/valueClasses/lateinitValueClasses.kt"); diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmInlineApplicabilityChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmInlineApplicabilityChecker.kt new file mode 100644 index 0000000000000..d765f695232c4 --- /dev/null +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JvmInlineApplicabilityChecker.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2010-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.resolve.jvm.checkers + +import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils +import org.jetbrains.kotlin.resolve.JVM_INLINE_ANNOTATION_FQ_NAME +import org.jetbrains.kotlin.resolve.checkers.DeclarationChecker +import org.jetbrains.kotlin.resolve.checkers.DeclarationCheckerContext +import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm + +class JvmInlineApplicabilityChecker : DeclarationChecker { + override fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, context: DeclarationCheckerContext) { + if (descriptor !is ClassDescriptor) return + val annotation = descriptor.annotations.findAnnotation(JVM_INLINE_ANNOTATION_FQ_NAME) + if (annotation != null && !descriptor.isValue) { + val annotationEntry = DescriptorToSourceUtils.getSourceFromAnnotation(annotation) ?: return + context.trace.report(ErrorsJvm.JVM_INLINE_WITHOUT_VALUE_CLASS.on(annotationEntry)) + } + + if (descriptor.isValue && annotation == null) { + val valueKeyword = declaration.modifierList?.getModifier(KtTokens.VALUE_KEYWORD) ?: return + context.trace.report(ErrorsJvm.VALUE_CLASS_WITHOUT_JVM_INLINE_ANNOTATION.on(valueKeyword)) + } + } +} diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java index e4532c94ac311..206dc2d47fdae 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/DefaultErrorMessagesJvm.java @@ -180,6 +180,9 @@ public class DefaultErrorMessagesJvm implements DefaultErrorMessages.Extension { SHORT_NAMES_IN_TYPES, SHORT_NAMES_IN_TYPES, TO_STRING); MAP.put(DANGEROUS_CHARACTERS, "Name contains characters which can cause problems on Windows: {0}", STRING); + + MAP.put(VALUE_CLASS_WITHOUT_JVM_INLINE_ANNOTATION, "Value classes without @JvmInline annotation are not supported yet"); + MAP.put(JVM_INLINE_WITHOUT_VALUE_CLASS, "@JvmInline annotation is only applicable to value classes"); } @NotNull diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java index 09134f13e338f..d83fb0af60f39 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java @@ -148,6 +148,9 @@ public interface ErrorsJvm { DiagnosticFactory1 DANGEROUS_CHARACTERS = DiagnosticFactory1.create(WARNING); + DiagnosticFactory0 VALUE_CLASS_WITHOUT_JVM_INLINE_ANNOTATION = DiagnosticFactory0.create(ERROR); + DiagnosticFactory0 JVM_INLINE_WITHOUT_VALUE_CLASS = DiagnosticFactory0.create(ERROR); + @SuppressWarnings("UnusedDeclaration") Object _initializer = new Object() { { diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt index b480c13f288cc..0193fe88314d2 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/platform/JvmPlatformConfigurator.kt @@ -34,6 +34,7 @@ object JvmPlatformConfigurator : PlatformConfiguratorBase( JvmFieldApplicabilityChecker(), TypeParameterBoundIsNotArrayChecker(), JvmSyntheticApplicabilityChecker(), + JvmInlineApplicabilityChecker(), StrictfpApplicabilityChecker(), JvmAnnotationsTargetNonExistentAccessorChecker(), BadInheritedJavaSignaturesChecker, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 61b37a840b82d..821a05c031e85 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -362,7 +362,6 @@ public interface Errors { DiagnosticFactory0 INLINE_CLASS_CANNOT_BE_RECURSIVE = DiagnosticFactory0.create(ERROR); DiagnosticFactory1 RESERVED_MEMBER_INSIDE_INLINE_CLASS = DiagnosticFactory1.create(ERROR); DiagnosticFactory0 SECONDARY_CONSTRUCTOR_WITH_BODY_INSIDE_INLINE_CLASS = DiagnosticFactory0.create(ERROR); - DiagnosticFactory0 VALUE_CLASS_WITHOUT_JVM_INLINE_ANNOTATION = DiagnosticFactory0.create(ERROR); // Result class diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index deb9aa147dd35..b67d915a45d77 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -717,7 +717,6 @@ public static DiagnosticRenderer getRendererForDiagnostic(@NotNull UnboundDiagno MAP.put(INLINE_CLASS_CANNOT_BE_RECURSIVE, "Inline class cannot be recursive"); MAP.put(RESERVED_MEMBER_INSIDE_INLINE_CLASS, "Member with the name ''{0}'' is reserved for future releases", STRING); MAP.put(SECONDARY_CONSTRUCTOR_WITH_BODY_INSIDE_INLINE_CLASS, "Secondary constructors with bodies are reserved for for future releases"); - MAP.put(VALUE_CLASS_WITHOUT_JVM_INLINE_ANNOTATION, "Value classes without @JvmInline annotation are not supported yet"); MAP.put(RESULT_CLASS_IN_RETURN_TYPE, "'kotlin.Result' cannot be used as a return type"); MAP.put(RESULT_CLASS_WITH_NULLABLE_OPERATOR, "Expression of type 'kotlin.Result' cannot be used as a left operand of ''{0}''", STRING); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/InlineClassDeclarationChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/InlineClassDeclarationChecker.kt index 4d8bc1f606080..64f026ace36db 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/InlineClassDeclarationChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/InlineClassDeclarationChecker.kt @@ -9,7 +9,6 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.lexer.KtTokens -import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.modalityModifier import org.jetbrains.kotlin.resolve.* @@ -88,10 +87,6 @@ object InlineClassDeclarationChecker : DeclarationChecker { } } } - - if (descriptor.isValue && !descriptor.annotations.hasAnnotation(JVM_INLINE_ANNOTATION)) { - trace.report(Errors.VALUE_CLASS_WITHOUT_JVM_INLINE_ANNOTATION.on(inlineOrValueKeyword)) - } } private fun KotlinType.isInapplicableParameterType() = diff --git a/compiler/testData/compileJavaAgainstKotlin/method/primitiveOverrideWithInlineClass/InlineIntOverridesObject.txt b/compiler/testData/compileJavaAgainstKotlin/method/primitiveOverrideWithInlineClass/InlineIntOverridesObject.txt index 3bedb4fb13f67..e030987629f93 100644 --- a/compiler/testData/compileJavaAgainstKotlin/method/primitiveOverrideWithInlineClass/InlineIntOverridesObject.txt +++ b/compiler/testData/compileJavaAgainstKotlin/method/primitiveOverrideWithInlineClass/InlineIntOverridesObject.txt @@ -14,7 +14,7 @@ public open class KFooZ : test.IFoo { public open fun foo(): test.Z } -public final inline class Z { +public final value class Z { public constructor Z(/*0*/ kotlin.Int) public final val value: kotlin.Int } diff --git a/compiler/testData/diagnostics/tests/valueClasses/basicValueClassDeclaration.kt b/compiler/testData/diagnostics/tests/valueClasses/basicValueClassDeclaration.kt index 3bdc892c7009b..95e721c23aee8 100644 --- a/compiler/testData/diagnostics/tests/valueClasses/basicValueClassDeclaration.kt +++ b/compiler/testData/diagnostics/tests/valueClasses/basicValueClassDeclaration.kt @@ -7,7 +7,7 @@ annotation class JvmInline @JvmInline value class Foo(val x: Int) -value interface InlineInterface -value annotation class InlineAnn -value object InlineObject -value enum class InlineEnum +value interface InlineInterface +value annotation class InlineAnn +value object InlineObject +value enum class InlineEnum diff --git a/compiler/testData/diagnostics/tests/valueClasses/basicValueClassDeclaration.txt b/compiler/testData/diagnostics/tests/valueClasses/basicValueClassDeclaration.txt index c98b37739ef5a..e73947de324d4 100644 --- a/compiler/testData/diagnostics/tests/valueClasses/basicValueClassDeclaration.txt +++ b/compiler/testData/diagnostics/tests/valueClasses/basicValueClassDeclaration.txt @@ -12,9 +12,9 @@ package kotlin { public final value annotation class InlineAnn : kotlin.Annotation { public constructor InlineAnn() - 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 + public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String } public final value enum class InlineEnum : kotlin.Enum { @@ -27,7 +27,7 @@ package kotlin { protected/*protected and package*/ final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun finalize(): kotlin.Unit public final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun getDeclaringClass(): java.lang.Class! public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int - public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String // Static members public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): kotlin.InlineEnum @@ -35,16 +35,16 @@ package kotlin { } public value interface InlineInterface { - 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 + public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String } public value object InlineObject { private constructor InlineObject() - 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 + public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String } public final annotation class JvmInline : kotlin.Annotation { diff --git a/compiler/testData/diagnostics/tests/valueClasses/basicValueClassDeclarationDisabled.kt b/compiler/testData/diagnostics/tests/valueClasses/basicValueClassDeclarationDisabled.kt index e018281ab1654..5411729d17f23 100644 --- a/compiler/testData/diagnostics/tests/valueClasses/basicValueClassDeclarationDisabled.kt +++ b/compiler/testData/diagnostics/tests/valueClasses/basicValueClassDeclarationDisabled.kt @@ -7,9 +7,9 @@ annotation class JvmInline value class Foo(val x: Int) -value annotation class InlineAnn -value object InlineObject -value enum class InlineEnum +value annotation class InlineAnn +value object InlineObject +value enum class InlineEnum @JvmInline value class NotVal(x: Int) \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/valueClasses/basicValueClassDeclarationDisabled.txt b/compiler/testData/diagnostics/tests/valueClasses/basicValueClassDeclarationDisabled.txt index 3a25001d96668..4d045c56d64a3 100644 --- a/compiler/testData/diagnostics/tests/valueClasses/basicValueClassDeclarationDisabled.txt +++ b/compiler/testData/diagnostics/tests/valueClasses/basicValueClassDeclarationDisabled.txt @@ -5,16 +5,16 @@ package kotlin { public final value 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 + public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String } public final value annotation class InlineAnn : kotlin.Annotation { public constructor InlineAnn() - 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 + public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String } public final value enum class InlineEnum : kotlin.Enum { @@ -27,7 +27,7 @@ package kotlin { protected/*protected and package*/ final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun finalize(): kotlin.Unit public final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun getDeclaringClass(): java.lang.Class! public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int - public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String // Static members public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): kotlin.InlineEnum @@ -36,9 +36,9 @@ package kotlin { public value object InlineObject { private constructor InlineObject() - 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 + public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String } public final annotation class JvmInline : kotlin.Annotation { diff --git a/compiler/testData/diagnostics/tests/valueClasses/jvmInlineApplicability.fir.kt b/compiler/testData/diagnostics/tests/valueClasses/jvmInlineApplicability.fir.kt new file mode 100644 index 0000000000000..b1083cad466db --- /dev/null +++ b/compiler/testData/diagnostics/tests/valueClasses/jvmInlineApplicability.fir.kt @@ -0,0 +1,23 @@ +// !LANGUAGE: +InlineClasses + +package kotlin + +annotation class JvmInline + +@JvmInline +inline class IC(val a: Any) + +@JvmInline +value class VC(val a: Any) + +@JvmInline +class C + +@JvmInline +interface I + +@JvmInline +object O + +@JvmInline +data class DC(val a: Any) diff --git a/compiler/testData/diagnostics/tests/valueClasses/jvmInlineApplicability.kt b/compiler/testData/diagnostics/tests/valueClasses/jvmInlineApplicability.kt new file mode 100644 index 0000000000000..820263b497b8b --- /dev/null +++ b/compiler/testData/diagnostics/tests/valueClasses/jvmInlineApplicability.kt @@ -0,0 +1,23 @@ +// !LANGUAGE: +InlineClasses + +package kotlin + +annotation class JvmInline + +@JvmInline +inline class IC(val a: Any) + +@JvmInline +value class VC(val a: Any) + +@JvmInline +class C + +@JvmInline +interface I + +@JvmInline +object O + +@JvmInline +data class DC(val a: Any) diff --git a/compiler/testData/diagnostics/tests/valueClasses/jvmInlineApplicability.txt b/compiler/testData/diagnostics/tests/valueClasses/jvmInlineApplicability.txt new file mode 100644 index 0000000000000..b41121095b1be --- /dev/null +++ b/compiler/testData/diagnostics/tests/valueClasses/jvmInlineApplicability.txt @@ -0,0 +1,57 @@ +package + +package kotlin { + + @kotlin.JvmInline public final class C { + public constructor C() + 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 + } + + @kotlin.JvmInline public final data class DC { + public constructor DC(/*0*/ a: kotlin.Any) + public final val a: kotlin.Any + public final operator /*synthesized*/ fun component1(): kotlin.Any + public final /*synthesized*/ fun copy(/*0*/ a: kotlin.Any = ...): kotlin.DC + public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String + } + + @kotlin.JvmInline public interface I { + 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 + } + + @kotlin.JvmInline public final inline class IC { + public constructor IC(/*0*/ a: kotlin.Any) + public final val a: kotlin.Any + public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String + } + + public final annotation class JvmInline : kotlin.Annotation { + public constructor JvmInline() + 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 + } + + @kotlin.JvmInline public object O { + private constructor O() + 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 + } + + @kotlin.JvmInline public final value class VC { + public constructor VC(/*0*/ a: kotlin.Any) + public final val a: kotlin.Any + public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String + } +} diff --git a/compiler/testData/diagnostics/tests/valueClasses/valueClassDeclarationCheck.kt b/compiler/testData/diagnostics/tests/valueClasses/valueClassDeclarationCheck.kt index 8a46844bd7927..3b5c978717eec 100644 --- a/compiler/testData/diagnostics/tests/valueClasses/valueClassDeclarationCheck.kt +++ b/compiler/testData/diagnostics/tests/valueClasses/valueClassDeclarationCheck.kt @@ -44,8 +44,8 @@ object B2 { @JvmInline final value class D0(val x: Int) -open value class D1(val x: Int) -abstract value class D2(val x: Int) -sealed value class D3(val x: Int) +open value class D1(val x: Int) +abstract value class D2(val x: Int) +sealed value class D3(val x: Int) -value data class D4(val x: String) +value data class D4(val x: String) diff --git a/compiler/testData/diagnostics/tests/valueClasses/valueClassDeclarationCheck.txt b/compiler/testData/diagnostics/tests/valueClasses/valueClassDeclarationCheck.txt index f0504130aaf10..0dffe83ffd7d6 100644 --- a/compiler/testData/diagnostics/tests/valueClasses/valueClassDeclarationCheck.txt +++ b/compiler/testData/diagnostics/tests/valueClasses/valueClassDeclarationCheck.txt @@ -136,25 +136,25 @@ package kotlin { public open value class D1 { public constructor D1(/*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 + public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String } public abstract value class D2 { public constructor D2(/*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 + public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String } public sealed value class D3 { private constructor D3(/*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 + public open override /*1*/ /*synthesized*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*synthesized*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*synthesized*/ fun toString(): kotlin.String } public final data value class D4 { diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/HiddenConstructorWithInlineClassParameters.kt b/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/HiddenConstructorWithInlineClassParameters.kt index db45c36cb4ac4..3f8d4d98b1e88 100644 --- a/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/HiddenConstructorWithInlineClassParameters.kt +++ b/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/HiddenConstructorWithInlineClassParameters.kt @@ -1,4 +1,5 @@ // !LANGUAGE: +InlineClasses +// NO_CHECK_SOURCE_VS_BINARY package test annotation class Ann diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/HiddenConstructorWithInlineClassParameters.txt b/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/HiddenConstructorWithInlineClassParameters.txt index eafbed2da126c..5a96613bc75c2 100644 --- a/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/HiddenConstructorWithInlineClassParameters.txt +++ b/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/HiddenConstructorWithInlineClassParameters.txt @@ -24,7 +24,7 @@ public final class Test { public final fun (): test.Z } -public final inline class Z { +public final value class Z { /*primary*/ public constructor Z(/*0*/ x: kotlin.Int) public final val x: kotlin.Int public final fun (): kotlin.Int diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/PublishedApiAnnotationOnInlineClassCosntructor.kt b/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/PublishedApiAnnotationOnInlineClassCosntructor.kt index f3c6057c88ae9..a3fa3ee3b840b 100644 --- a/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/PublishedApiAnnotationOnInlineClassCosntructor.kt +++ b/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/PublishedApiAnnotationOnInlineClassCosntructor.kt @@ -1,4 +1,5 @@ // !LANGUAGE: +InlineClasses +// NO_CHECK_SOURCE_VS_BINARY @file:Suppress("NON_PUBLIC_PRIMARY_CONSTRUCTOR_OF_INLINE_CLASS") package test diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/PublishedApiAnnotationOnInlineClassCosntructor.runtime.txt b/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/PublishedApiAnnotationOnInlineClassCosntructor.runtime.txt index f0b85fba57030..92185af785546 100644 --- a/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/PublishedApiAnnotationOnInlineClassCosntructor.runtime.txt +++ b/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/PublishedApiAnnotationOnInlineClassCosntructor.runtime.txt @@ -1,6 +1,6 @@ package test -public final inline class Z { +public final value class Z { /*primary*/ internal constructor Z(/*0*/ kotlin.Int) public final val value: kotlin.Int public final fun (): kotlin.Int diff --git a/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/PublishedApiAnnotationOnInlineClassCosntructor.txt b/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/PublishedApiAnnotationOnInlineClassCosntructor.txt index 8dc619b255d41..4b2803557ad73 100644 --- a/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/PublishedApiAnnotationOnInlineClassCosntructor.txt +++ b/compiler/testData/loadJava/compiledKotlin/annotations/classMembers/PublishedApiAnnotationOnInlineClassCosntructor.txt @@ -1,6 +1,6 @@ package test -public final inline class Z { +public final value class Z { /*primary*/ @kotlin.PublishedApi internal constructor Z(/*0*/ value: kotlin.Int) public final val value: kotlin.Int public final fun (): kotlin.Int diff --git a/compiler/tests-gen/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index 6123ea0f4ddef..da36d1cfb30e1 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -25097,6 +25097,11 @@ public void testIdentityComparisonWithValueClasses() throws Exception { runTest("compiler/testData/diagnostics/tests/valueClasses/identityComparisonWithValueClasses.kt"); } + @TestMetadata("jvmInlineApplicability.kt") + public void testJvmInlineApplicability() throws Exception { + runTest("compiler/testData/diagnostics/tests/valueClasses/jvmInlineApplicability.kt"); + } + @TestMetadata("lateinitValueClasses.kt") public void testLateinitValueClasses() throws Exception { runTest("compiler/testData/diagnostics/tests/valueClasses/lateinitValueClasses.kt"); diff --git a/compiler/tests-gen/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index 31bdfd1493b4f..3b0c389a8133c 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -25017,6 +25017,11 @@ public void testIdentityComparisonWithValueClasses() throws Exception { runTest("compiler/testData/diagnostics/tests/valueClasses/identityComparisonWithValueClasses.kt"); } + @TestMetadata("jvmInlineApplicability.kt") + public void testJvmInlineApplicability() throws Exception { + runTest("compiler/testData/diagnostics/tests/valueClasses/jvmInlineApplicability.kt"); + } + @TestMetadata("lateinitValueClasses.kt") public void testLateinitValueClasses() throws Exception { runTest("compiler/testData/diagnostics/tests/valueClasses/lateinitValueClasses.kt"); diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/inlineClassesUtils.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/inlineClassesUtils.kt index fb2622039a350..b3804f4d0d2c1 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/inlineClassesUtils.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/inlineClassesUtils.kt @@ -13,7 +13,7 @@ import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.utils.addToStdlib.safeAs -val JVM_INLINE_ANNOTATION = FqName("kotlin.JvmInline") +val JVM_INLINE_ANNOTATION_FQ_NAME = FqName("kotlin.JvmInline") fun ClassDescriptor.underlyingRepresentation(): ValueParameterDescriptor? { if (!isInlineClass()) return null