From 98e6c0278a1ff1568c784815c7f779af9ff3f2e4 Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Thu, 14 Sep 2023 10:04:15 +0200 Subject: [PATCH] [FIR] Fix false negative REPEATED_BOUND ... in presence of typealiases. #KT-61921 --- .../FirTypeParameterBoundsChecker.kt | 2 +- .../cannotHaveManyClassUpperBounds.kt | 6 ++ .../cannotHaveManyClassUpperBounds.txt | 93 ------------------- 3 files changed, 7 insertions(+), 94 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/typeParameters/cannotHaveManyClassUpperBounds.txt diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTypeParameterBoundsChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTypeParameterBoundsChecker.kt index f30cc1ed781..00b59335f50 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTypeParameterBoundsChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirTypeParameterBoundsChecker.kt @@ -108,7 +108,7 @@ object FirTypeParameterBoundsChecker : FirTypeParameterChecker() { private fun checkBoundUniqueness(declaration: FirTypeParameter, context: CheckerContext, reporter: DiagnosticReporter) { val seenClasses = mutableSetOf() val allNonErrorBounds = declaration.symbol.resolvedBounds.filter { it !is FirErrorTypeRef } - val uniqueBounds = allNonErrorBounds.distinctBy { it.coneType.classId ?: it.coneType } + val uniqueBounds = allNonErrorBounds.distinctBy { it.coneType.fullyExpandedClassId(context.session) ?: it.coneType } uniqueBounds.forEach { bound -> bound.coneType.toRegularClassSymbol(context.session)?.let { symbol -> diff --git a/compiler/testData/diagnostics/tests/typeParameters/cannotHaveManyClassUpperBounds.kt b/compiler/testData/diagnostics/tests/typeParameters/cannotHaveManyClassUpperBounds.kt index fb8b8ddb7cb..3c62c600bbe 100644 --- a/compiler/testData/diagnostics/tests/typeParameters/cannotHaveManyClassUpperBounds.kt +++ b/compiler/testData/diagnostics/tests/typeParameters/cannotHaveManyClassUpperBounds.kt @@ -17,3 +17,9 @@ class A5 where T : C1, T : E1 object O1 class A6<T> where T : O1, T : C2 + +typealias TA1 = C1 +typealias TA2 = C2 + +class A7 where T : C1, T : TA1 +class A8 where T : C1, T : TA2 \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/typeParameters/cannotHaveManyClassUpperBounds.txt b/compiler/testData/diagnostics/tests/typeParameters/cannotHaveManyClassUpperBounds.txt deleted file mode 100644 index 772bb70cd8d..00000000000 --- a/compiler/testData/diagnostics/tests/typeParameters/cannotHaveManyClassUpperBounds.txt +++ /dev/null @@ -1,93 +0,0 @@ -package - -public fun f1(): kotlin.Unit where T : C2, T : C3 -public fun f2(): kotlin.Unit where T : C3 -public fun f3(): kotlin.Unit where T : C2 - -public final class A1 where T : C2 { - public constructor A1() where T : C2 - 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 final class A2 where T : C2, T : C3 { - public constructor A2() where T : C2, T : C3 - 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 final class A3 where T : C3 { - public constructor A3() where T : C3 - 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 final class A4 where T : C2 { - public constructor A4() where T : C2 - 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 final class A5 where T : E1 { - public constructor A5() where T : E1 - 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 final class A6 where T : C2 { - public constructor A6() where T : C2 - 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 class C1 { - public constructor C1() - 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 class C2 { - public constructor C2() - 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 class C3 : C2 { - public constructor C3() - 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 final enum class E1 : kotlin.Enum { - private constructor E1() - @kotlin.internal.IntrinsicConstEvaluation public final override /*1*/ /*fake_override*/ val name: kotlin.String - public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int - protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any - public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: E1): kotlin.Int - public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - 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 - - // Static members - public final /*synthesized*/ val entries: kotlin.enums.EnumEntries - public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): E1 - public final /*synthesized*/ fun values(): kotlin.Array -} - -public object O1 { - private constructor O1() - 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 -}