From feed3a57d028e94b179f3230e92ee17b3173f5b9 Mon Sep 17 00:00:00 2001 From: "Evgeniy.Zhelenskiy" Date: Thu, 5 Oct 2023 18:41:56 +0200 Subject: [PATCH] [FIR] Report wrong modifiers in function type arguments and types of value parameters #KT-59955 --- .../projectionsOnNonClassTypeArguments.kt | 2 +- .../checkers/CommonExpressionCheckers.kt | 1 + .../analysis/checkers/CommonTypeCheckers.kt | 1 + .../checkers/ModifiersCompatibilityUtils.kt | 121 ++++++++++++++++++ .../declaration/FirModifierChecker.kt | 84 +----------- ...patibleProjectionsOnTypeArgumentChecker.kt | 20 +++ ...rojectionsOnNonClassTypeArgumentChecker.kt | 8 +- .../type/FirInOutProjectionModifierChecker.kt | 24 ++++ .../ProjectionOnFunctionArgumentErrror.fir.kt | 4 - .../ProjectionOnFunctionArgumentErrror.kt | 1 + .../inference/capturedTypes/kt2872.fir.kt | 6 - .../tests/inference/capturedTypes/kt2872.kt | 1 + .../incompatibleVarianceModifiers.fir.kt | 22 ---- .../incompatibleVarianceModifiers.kt | 1 + .../calleeExpressionAsCallExpression.fir.kt | 2 +- .../nullCalleeExpression.fir.kt | 2 +- .../projectionsInTypeAliasConstructor.fir.kt | 6 - .../projectionsInTypeAliasConstructor.kt | 1 + 18 files changed, 183 insertions(+), 124 deletions(-) create mode 100644 compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/ModifiersCompatibilityUtils.kt create mode 100644 compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirIncompatibleProjectionsOnTypeArgumentChecker.kt create mode 100644 compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/type/FirInOutProjectionModifierChecker.kt delete mode 100644 compiler/testData/diagnostics/tests/ProjectionOnFunctionArgumentErrror.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/inference/capturedTypes/kt2872.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/modifiers/incompatibleVarianceModifiers.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/typealias/projectionsInTypeAliasConstructor.fir.kt diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/projectionsOnNonClassTypeArguments.kt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/projectionsOnNonClassTypeArguments.kt index b4af0c1ef1b..60b664b62b1 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/projectionsOnNonClassTypeArguments.kt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/projectionsOnNonClassTypeArguments.kt @@ -2,7 +2,7 @@ class A class B fun test() { - val a1 = A<in Int, out B>() + val a1 = A<in Int, out B>() val a2 = A() val a3 = A<*, *>() } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt index dbb96dc845f..69aab7fc690 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt @@ -42,6 +42,7 @@ object CommonExpressionCheckers : ExpressionCheckers() { FirAbstractSuperCallChecker, FirQualifiedSupertypeExtendedByOtherSupertypeChecker, FirProjectionsOnNonClassTypeArgumentChecker, + FirIncompatibleProjectionsOnTypeArgumentChecker, FirUpperBoundViolatedExpressionChecker, FirTypeArgumentsNotAllowedExpressionChecker, FirTypeParameterInQualifiedAccessChecker, diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonTypeCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonTypeCheckers.kt index d3460ba2409..0a8e7083f93 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonTypeCheckers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonTypeCheckers.kt @@ -17,6 +17,7 @@ object CommonTypeCheckers : TypeCheckers() { FirUnsupportedDefaultValueInFunctionTypeParameterChecker, FirUnsupportedModifiersInFunctionTypeParameterChecker, FirStarProjectionModifierChecker, + FirInOutProjectionModifierChecker, FirDuplicateParameterNameInFunctionTypeChecker, FirOptionalExpectationTypeChecker, FirIncompatibleClassTypeChecker, diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/ModifiersCompatibilityUtils.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/ModifiersCompatibilityUtils.kt new file mode 100644 index 00000000000..e28fc62e8f5 --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/ModifiersCompatibilityUtils.kt @@ -0,0 +1,121 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.analysis.checkers + +import org.jetbrains.kotlin.KtRealSourceElementKind +import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors +import org.jetbrains.kotlin.fir.declarations.FirClass +import org.jetbrains.kotlin.fir.types.FirTypeProjection +import org.jetbrains.kotlin.resolve.Compatibility +import org.jetbrains.kotlin.resolve.compatibility + + +internal fun checkCompatibilityType( + firstModifier: FirModifier<*>, + secondModifier: FirModifier<*>, + reporter: DiagnosticReporter, + reportedNodes: MutableSet>, + owner: FirElement?, + context: CheckerContext +) { + val firstModifierToken = firstModifier.token + val secondModifierToken = secondModifier.token + when (val compatibilityType = compatibility(firstModifierToken, secondModifierToken)) { + Compatibility.COMPATIBLE -> { + } + Compatibility.REPEATED -> + if (reportedNodes.add(secondModifier)) { + reporter.reportOn(secondModifier.source, FirErrors.REPEATED_MODIFIER, secondModifierToken, context) + } + Compatibility.REDUNDANT -> { + reporter.reportOn( + secondModifier.source, + FirErrors.REDUNDANT_MODIFIER, + secondModifierToken, + firstModifierToken, + context + ) + } + Compatibility.REVERSE_REDUNDANT -> { + reporter.reportOn( + firstModifier.source, + FirErrors.REDUNDANT_MODIFIER, + firstModifierToken, + secondModifierToken, + context + ) + } + Compatibility.DEPRECATED -> { + reporter.reportOn( + firstModifier.source, + FirErrors.DEPRECATED_MODIFIER_PAIR, + firstModifierToken, + secondModifierToken, + context + ) + reporter.reportOn( + secondModifier.source, + FirErrors.DEPRECATED_MODIFIER_PAIR, + secondModifierToken, + firstModifierToken, + context + ) + } + Compatibility.INCOMPATIBLE, Compatibility.COMPATIBLE_FOR_CLASSES_ONLY -> { + if (compatibilityType == Compatibility.COMPATIBLE_FOR_CLASSES_ONLY && owner is FirClass) { + return + } + if (reportedNodes.add(firstModifier)) { + reporter.reportOn( + firstModifier.source, + FirErrors.INCOMPATIBLE_MODIFIERS, + firstModifierToken, + secondModifierToken, + context + ) + } + if (reportedNodes.add(secondModifier)) { + reporter.reportOn( + secondModifier.source, + FirErrors.INCOMPATIBLE_MODIFIERS, + secondModifierToken, + firstModifierToken, + context + ) + } + } + } +} + +private fun checkModifiersCompatibility( + owner: FirElement, + modifierList: FirModifierList, + reporter: DiagnosticReporter, + reportedNodes: MutableSet>, + context: CheckerContext, +) { + val modifiers = modifierList.modifiers + for ((secondIndex, secondModifier) in modifiers.withIndex()) { + for (firstIndex in 0..>() + + checkModifiersCompatibility(typeArgument, modifierList, reporter, reportedNodes, context) +} diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirModifierChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirModifierChecker.kt index beb326e40ec..8ba4ec8cc38 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirModifierChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirModifierChecker.kt @@ -10,16 +10,17 @@ import org.jetbrains.kotlin.KtSourceElement import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget.Companion.classActualTargets +import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.diagnostics.KtDiagnosticFactory2 +import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.analysis.checkers.FirModifier import org.jetbrains.kotlin.fir.analysis.checkers.FirModifierList +import org.jetbrains.kotlin.fir.analysis.checkers.checkCompatibilityType import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.context.findClosest import org.jetbrains.kotlin.fir.analysis.checkers.getActualTargetList import org.jetbrains.kotlin.fir.analysis.checkers.getModifierList -import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors -import org.jetbrains.kotlin.diagnostics.KtDiagnosticFactory2 -import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.impl.FirPrimaryConstructor import org.jetbrains.kotlin.fir.declarations.utils.* @@ -89,83 +90,6 @@ object FirModifierChecker : FirBasicDeclarationChecker() { } } - private fun checkCompatibilityType( - firstModifier: FirModifier<*>, - secondModifier: FirModifier<*>, - reporter: DiagnosticReporter, - reportedNodes: MutableSet>, - owner: FirDeclaration?, - context: CheckerContext - ) { - val firstModifierToken = firstModifier.token - val secondModifierToken = secondModifier.token - when (val compatibilityType = compatibility(firstModifierToken, secondModifierToken)) { - Compatibility.COMPATIBLE -> { - } - Compatibility.REPEATED -> - if (reportedNodes.add(secondModifier)) { - reporter.reportOn(secondModifier.source, FirErrors.REPEATED_MODIFIER, secondModifierToken, context) - } - Compatibility.REDUNDANT -> { - reporter.reportOn( - secondModifier.source, - FirErrors.REDUNDANT_MODIFIER, - secondModifierToken, - firstModifierToken, - context - ) - } - Compatibility.REVERSE_REDUNDANT -> { - reporter.reportOn( - firstModifier.source, - FirErrors.REDUNDANT_MODIFIER, - firstModifierToken, - secondModifierToken, - context - ) - } - Compatibility.DEPRECATED -> { - reporter.reportOn( - firstModifier.source, - FirErrors.DEPRECATED_MODIFIER_PAIR, - firstModifierToken, - secondModifierToken, - context - ) - reporter.reportOn( - secondModifier.source, - FirErrors.DEPRECATED_MODIFIER_PAIR, - secondModifierToken, - firstModifierToken, - context - ) - } - Compatibility.INCOMPATIBLE, Compatibility.COMPATIBLE_FOR_CLASSES_ONLY -> { - if (compatibilityType == Compatibility.COMPATIBLE_FOR_CLASSES_ONLY && owner is FirClass) { - return - } - if (reportedNodes.add(firstModifier)) { - reporter.reportOn( - firstModifier.source, - FirErrors.INCOMPATIBLE_MODIFIERS, - firstModifierToken, - secondModifierToken, - context - ) - } - if (reportedNodes.add(secondModifier)) { - reporter.reportOn( - secondModifier.source, - FirErrors.INCOMPATIBLE_MODIFIERS, - secondModifierToken, - firstModifierToken, - context - ) - } - } - } - } - private fun checkTarget( modifierSource: KtSourceElement, modifierToken: KtModifierKeywordToken, diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirIncompatibleProjectionsOnTypeArgumentChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirIncompatibleProjectionsOnTypeArgumentChecker.kt new file mode 100644 index 00000000000..a43582095fe --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirIncompatibleProjectionsOnTypeArgumentChecker.kt @@ -0,0 +1,20 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.analysis.checkers.expression + +import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.fir.analysis.checkers.checkModifiersCompatibility +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression + + +object FirIncompatibleProjectionsOnTypeArgumentChecker : FirQualifiedAccessExpressionChecker() { + override fun check(expression: FirQualifiedAccessExpression, context: CheckerContext, reporter: DiagnosticReporter) { + for (it in expression.typeArguments) { + checkModifiersCompatibility(it, context, reporter) + } + } +} diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirProjectionsOnNonClassTypeArgumentChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirProjectionsOnNonClassTypeArgumentChecker.kt index 6f664e09e61..638cf04e1a9 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirProjectionsOnNonClassTypeArgumentChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirProjectionsOnNonClassTypeArgumentChecker.kt @@ -5,10 +5,11 @@ package org.jetbrains.kotlin.fir.analysis.checkers.expression -import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.diagnostics.DiagnosticReporter -import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.getModifierList +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression import org.jetbrains.kotlin.fir.types.FirStarProjection import org.jetbrains.kotlin.fir.types.FirTypeProjectionWithVariance @@ -21,7 +22,8 @@ object FirProjectionsOnNonClassTypeArgumentChecker : FirQualifiedAccessExpressio is FirStarProjection -> reporter.reportOn(it.source, FirErrors.PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT, context) is FirTypeProjectionWithVariance -> { if (it.variance != Variance.INVARIANT) { - reporter.reportOn(it.source, FirErrors.PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT, context) + val modifierSource = it.source.getModifierList()?.modifiers?.firstOrNull()?.source + reporter.reportOn(modifierSource ?: it.source, FirErrors.PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT, context) } } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/type/FirInOutProjectionModifierChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/type/FirInOutProjectionModifierChecker.kt new file mode 100644 index 00000000000..882591588a7 --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/type/FirInOutProjectionModifierChecker.kt @@ -0,0 +1,24 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.analysis.checkers.type + +import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.fir.analysis.checkers.checkModifiersCompatibility +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.types.* + +object FirInOutProjectionModifierChecker : FirTypeRefChecker() { + override fun check(typeRef: FirTypeRef, context: CheckerContext, reporter: DiagnosticReporter) { + if (typeRef !is FirResolvedTypeRef) return + + val delegatedTypeRef = typeRef.delegatedTypeRef as? FirUserTypeRef ?: return + for (part in delegatedTypeRef.qualifier) { + for (typeArgument in part.typeArgumentList.typeArguments) { + checkModifiersCompatibility(typeArgument, context, reporter) + } + } + } +} diff --git a/compiler/testData/diagnostics/tests/ProjectionOnFunctionArgumentErrror.fir.kt b/compiler/testData/diagnostics/tests/ProjectionOnFunctionArgumentErrror.fir.kt deleted file mode 100644 index e8b80c8f4ca..00000000000 --- a/compiler/testData/diagnostics/tests/ProjectionOnFunctionArgumentErrror.fir.kt +++ /dev/null @@ -1,4 +0,0 @@ -fun test() { - fun foo(){} - foo<in Int>() -} diff --git a/compiler/testData/diagnostics/tests/ProjectionOnFunctionArgumentErrror.kt b/compiler/testData/diagnostics/tests/ProjectionOnFunctionArgumentErrror.kt index 3248de9941e..9f814542777 100644 --- a/compiler/testData/diagnostics/tests/ProjectionOnFunctionArgumentErrror.kt +++ b/compiler/testData/diagnostics/tests/ProjectionOnFunctionArgumentErrror.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL fun test() { fun foo(){} foo<in Int>() diff --git a/compiler/testData/diagnostics/tests/inference/capturedTypes/kt2872.fir.kt b/compiler/testData/diagnostics/tests/inference/capturedTypes/kt2872.fir.kt deleted file mode 100644 index e12f5dcaa1e..00000000000 --- a/compiler/testData/diagnostics/tests/inference/capturedTypes/kt2872.fir.kt +++ /dev/null @@ -1,6 +0,0 @@ -fun Array.foo() {} - -fun test(array: Array) { - array.foo() - array.foo<out Int>() -} diff --git a/compiler/testData/diagnostics/tests/inference/capturedTypes/kt2872.kt b/compiler/testData/diagnostics/tests/inference/capturedTypes/kt2872.kt index 66f5ea3b673..e6f7507418d 100644 --- a/compiler/testData/diagnostics/tests/inference/capturedTypes/kt2872.kt +++ b/compiler/testData/diagnostics/tests/inference/capturedTypes/kt2872.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL fun Array.foo() {} fun test(array: Array) { diff --git a/compiler/testData/diagnostics/tests/modifiers/incompatibleVarianceModifiers.fir.kt b/compiler/testData/diagnostics/tests/modifiers/incompatibleVarianceModifiers.fir.kt deleted file mode 100644 index 7c7ac648f25..00000000000 --- a/compiler/testData/diagnostics/tests/modifiers/incompatibleVarianceModifiers.fir.kt +++ /dev/null @@ -1,22 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_VARIABLE - -interface Foo -interface Foo2in T> - -fun test1(foo: Foo) = foo -fun test2(): Foo = throw Exception() - -fun test3() { - val f: Foo - - class Bzzin T> -} - -class A { - fun <out out T> bar() { - } -} - -fun test4(a: A) { - a.bar<out out Int>() -} diff --git a/compiler/testData/diagnostics/tests/modifiers/incompatibleVarianceModifiers.kt b/compiler/testData/diagnostics/tests/modifiers/incompatibleVarianceModifiers.kt index 3c93fc552b9..9c8b208708f 100644 --- a/compiler/testData/diagnostics/tests/modifiers/incompatibleVarianceModifiers.kt +++ b/compiler/testData/diagnostics/tests/modifiers/incompatibleVarianceModifiers.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // !DIAGNOSTICS: -UNUSED_VARIABLE interface Foo diff --git a/compiler/testData/diagnostics/tests/qualifiedExpression/calleeExpressionAsCallExpression.fir.kt b/compiler/testData/diagnostics/tests/qualifiedExpression/calleeExpressionAsCallExpression.fir.kt index 3a79d7d2fed..5701478414e 100644 --- a/compiler/testData/diagnostics/tests/qualifiedExpression/calleeExpressionAsCallExpression.fir.kt +++ b/compiler/testData/diagnostics/tests/qualifiedExpression/calleeExpressionAsCallExpression.fir.kt @@ -1 +1 @@ -val unwrapped = some<sdf()()<out Any>::unwrap +val unwrapped = some<sdf()()<out Any>::unwrap diff --git a/compiler/testData/diagnostics/tests/qualifiedExpression/nullCalleeExpression.fir.kt b/compiler/testData/diagnostics/tests/qualifiedExpression/nullCalleeExpression.fir.kt index 548220ab308..0098c771ad6 100644 --- a/compiler/testData/diagnostics/tests/qualifiedExpression/nullCalleeExpression.fir.kt +++ b/compiler/testData/diagnostics/tests/qualifiedExpression/nullCalleeExpression.fir.kt @@ -1,3 +1,3 @@ // NI_EXPECTED_FILE -val unwrapped = some.<cabc$Wrapper<out Any>::unwrap +val unwrapped = some.<cabc$Wrapper<out Any>::unwrap diff --git a/compiler/testData/diagnostics/tests/typealias/projectionsInTypeAliasConstructor.fir.kt b/compiler/testData/diagnostics/tests/typealias/projectionsInTypeAliasConstructor.fir.kt deleted file mode 100644 index fc0a333602b..00000000000 --- a/compiler/testData/diagnostics/tests/typealias/projectionsInTypeAliasConstructor.fir.kt +++ /dev/null @@ -1,6 +0,0 @@ -class In(val x: Any) - -typealias InAlias = In - -val test1 = In<out String>("") -val test2 = InAlias<out String>("") diff --git a/compiler/testData/diagnostics/tests/typealias/projectionsInTypeAliasConstructor.kt b/compiler/testData/diagnostics/tests/typealias/projectionsInTypeAliasConstructor.kt index 8e759df35e3..b3e9cd0ef34 100644 --- a/compiler/testData/diagnostics/tests/typealias/projectionsInTypeAliasConstructor.kt +++ b/compiler/testData/diagnostics/tests/typealias/projectionsInTypeAliasConstructor.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL class In(val x: Any) typealias InAlias = In