From 909b455758d95c0159ed82e9e65d2b869453bc82 Mon Sep 17 00:00:00 2001 From: Ilmir Usmanov Date: Fri, 10 Dec 2021 01:03:55 +0100 Subject: [PATCH] Support generic underlying type of inline class in FIR #KT-32162 --- ...CompilerTestFE10TestdataTestGenerated.java | 12 ++++++++++ .../FirInlineClassDeclarationChecker.kt | 22 +++++++++++++------ .../genericUnderlyingValue/simple.kt | 1 + .../inlineClasses/genericInlineClass.fir.kt | 8 ------- .../tests/inlineClasses/genericInlineClass.kt | 1 + .../reifiedGenericUnderlyingType.fir.kt | 2 +- 6 files changed, 30 insertions(+), 16 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/inlineClasses/genericInlineClass.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 dcec8916226..f99712ba121 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 @@ -17036,6 +17036,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/inlineClasses/functionsJvmSignaturesConflictOnInheritance.kt"); } + @Test + @TestMetadata("genericInlineClass.kt") + public void testGenericInlineClass() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineClasses/genericInlineClass.kt"); + } + @Test @TestMetadata("identityComparisonWithInlineClasses.kt") public void testIdentityComparisonWithInlineClasses() throws Exception { @@ -17132,6 +17138,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/inlineClasses/recursiveInlineClasses.kt"); } + @Test + @TestMetadata("reifiedGenericUnderlyingType.kt") + public void testReifiedGenericUnderlyingType() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineClasses/reifiedGenericUnderlyingType.kt"); + } + @Test @TestMetadata("reservedMembersAndConstructsInsideInlineClass.kt") public void testReservedMembersAndConstructsInsideInlineClass() throws Exception { 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 601b8b94511..ce73c5fa0aa 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 @@ -174,13 +174,21 @@ object FirInlineClassDeclarationChecker : FirRegularClassChecker() { context ) - primaryConstructorParameter.returnTypeRef.isInapplicableParameterType() -> - reporter.reportOn( - primaryConstructorParameter.returnTypeRef.source, - FirErrors.VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE, - primaryConstructorParameter.returnTypeRef.coneType, - context - ) + primaryConstructorParameter.returnTypeRef.isInapplicableParameterType() -> { + val inlineClassHasGenericUnderlyingType = primaryConstructorParameter.returnTypeRef.coneType.let { + (it is ConeTypeParameterType || it.isGenericArrayOfTypeParameter()) + } + if (!(context.languageVersionSettings.supportsFeature(LanguageFeature.GenericInlineClassParameter) && + inlineClassHasGenericUnderlyingType) + ) { + reporter.reportOn( + primaryConstructorParameter.returnTypeRef.source, + FirErrors.VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE, + primaryConstructorParameter.returnTypeRef.coneType, + context + ) + } + } primaryConstructorParameter.returnTypeRef.coneType.isRecursiveInlineClassType(context.session) -> reporter.reportOnWithSuppression( diff --git a/compiler/testData/codegen/box/inlineClasses/genericUnderlyingValue/simple.kt b/compiler/testData/codegen/box/inlineClasses/genericUnderlyingValue/simple.kt index 6a9b26d8a5b..d8a3b8582c9 100644 --- a/compiler/testData/codegen/box/inlineClasses/genericUnderlyingValue/simple.kt +++ b/compiler/testData/codegen/box/inlineClasses/genericUnderlyingValue/simple.kt @@ -1,5 +1,6 @@ // CHECK_BYTECODE_LISTING // LANGUAGE: -JvmInlineValueClasses, +GenericInlineClassParameter +// IGNORE_BACKED: JVM inline class ICAny(val value: T) diff --git a/compiler/testData/diagnostics/tests/inlineClasses/genericInlineClass.fir.kt b/compiler/testData/diagnostics/tests/inlineClasses/genericInlineClass.fir.kt deleted file mode 100644 index 3f10052f55d..00000000000 --- a/compiler/testData/diagnostics/tests/inlineClasses/genericInlineClass.fir.kt +++ /dev/null @@ -1,8 +0,0 @@ -// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses, +GenericInlineClassParameter -// SKIP_TXT - -inline class ICAny(val value: T) - -inline class ICArray(val value: Array) - -inline class ICList(val value: List) \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inlineClasses/genericInlineClass.kt b/compiler/testData/diagnostics/tests/inlineClasses/genericInlineClass.kt index fdf8c1d8f43..bf0143f9b40 100644 --- a/compiler/testData/diagnostics/tests/inlineClasses/genericInlineClass.kt +++ b/compiler/testData/diagnostics/tests/inlineClasses/genericInlineClass.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !LANGUAGE: +InlineClasses, -JvmInlineValueClasses, +GenericInlineClassParameter // SKIP_TXT diff --git a/compiler/testData/diagnostics/tests/inlineClasses/reifiedGenericUnderlyingType.fir.kt b/compiler/testData/diagnostics/tests/inlineClasses/reifiedGenericUnderlyingType.fir.kt index 30e5c8eda50..4716f4c4645 100644 --- a/compiler/testData/diagnostics/tests/inlineClasses/reifiedGenericUnderlyingType.fir.kt +++ b/compiler/testData/diagnostics/tests/inlineClasses/reifiedGenericUnderlyingType.fir.kt @@ -1,4 +1,4 @@ // !LANGUAGE: +InlineClasses, -JvmInlineValueClasses // SKIP_TXT -inline class ICAny(val value: T) \ No newline at end of file +inline class ICAny<reified T>(val value: T)