Support generic underlying type of inline class in FIR

#KT-32162
This commit is contained in:
Ilmir Usmanov
2021-12-10 01:03:55 +01:00
parent 9060168542
commit 909b455758
6 changed files with 30 additions and 16 deletions
@@ -17036,6 +17036,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag
runTest("compiler/testData/diagnostics/tests/inlineClasses/functionsJvmSignaturesConflictOnInheritance.kt"); 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 @Test
@TestMetadata("identityComparisonWithInlineClasses.kt") @TestMetadata("identityComparisonWithInlineClasses.kt")
public void testIdentityComparisonWithInlineClasses() throws Exception { public void testIdentityComparisonWithInlineClasses() throws Exception {
@@ -17132,6 +17138,12 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag
runTest("compiler/testData/diagnostics/tests/inlineClasses/recursiveInlineClasses.kt"); 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 @Test
@TestMetadata("reservedMembersAndConstructsInsideInlineClass.kt") @TestMetadata("reservedMembersAndConstructsInsideInlineClass.kt")
public void testReservedMembersAndConstructsInsideInlineClass() throws Exception { public void testReservedMembersAndConstructsInsideInlineClass() throws Exception {
@@ -174,13 +174,21 @@ object FirInlineClassDeclarationChecker : FirRegularClassChecker() {
context context
) )
primaryConstructorParameter.returnTypeRef.isInapplicableParameterType() -> primaryConstructorParameter.returnTypeRef.isInapplicableParameterType() -> {
reporter.reportOn( val inlineClassHasGenericUnderlyingType = primaryConstructorParameter.returnTypeRef.coneType.let {
primaryConstructorParameter.returnTypeRef.source, (it is ConeTypeParameterType || it.isGenericArrayOfTypeParameter())
FirErrors.VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE, }
primaryConstructorParameter.returnTypeRef.coneType, if (!(context.languageVersionSettings.supportsFeature(LanguageFeature.GenericInlineClassParameter) &&
context inlineClassHasGenericUnderlyingType)
) ) {
reporter.reportOn(
primaryConstructorParameter.returnTypeRef.source,
FirErrors.VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE,
primaryConstructorParameter.returnTypeRef.coneType,
context
)
}
}
primaryConstructorParameter.returnTypeRef.coneType.isRecursiveInlineClassType(context.session) -> primaryConstructorParameter.returnTypeRef.coneType.isRecursiveInlineClassType(context.session) ->
reporter.reportOnWithSuppression( reporter.reportOnWithSuppression(
@@ -1,5 +1,6 @@
// CHECK_BYTECODE_LISTING // CHECK_BYTECODE_LISTING
// LANGUAGE: -JvmInlineValueClasses, +GenericInlineClassParameter // LANGUAGE: -JvmInlineValueClasses, +GenericInlineClassParameter
// IGNORE_BACKED: JVM
inline class ICAny<T>(val value: T) inline class ICAny<T>(val value: T)
@@ -1,8 +0,0 @@
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses, +GenericInlineClassParameter
// SKIP_TXT
inline class ICAny<T>(val value: T)
inline class ICArray<T>(val value: Array<T>)
inline class ICList<T>(val value: List<T>)
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses, +GenericInlineClassParameter // !LANGUAGE: +InlineClasses, -JvmInlineValueClasses, +GenericInlineClassParameter
// SKIP_TXT // SKIP_TXT
@@ -1,4 +1,4 @@
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses // !LANGUAGE: +InlineClasses, -JvmInlineValueClasses
// SKIP_TXT // SKIP_TXT
inline class ICAny<reified T>(val value: T) inline class ICAny<<!REIFIED_TYPE_PARAMETER_NO_INLINE!>reified<!> T>(val value: <!VALUE_CLASS_HAS_INAPPLICABLE_PARAMETER_TYPE!>T<!>)