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");
}
@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 {
@@ -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(
@@ -1,5 +1,6 @@
// CHECK_BYTECODE_LISTING
// LANGUAGE: -JvmInlineValueClasses, +GenericInlineClassParameter
// IGNORE_BACKED: JVM
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
// SKIP_TXT
@@ -1,4 +1,4 @@
// !LANGUAGE: +InlineClasses, -JvmInlineValueClasses
// 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<!>)