diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java index 4f6ceb32b8e..ea46e84e1aa 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java @@ -318,7 +318,6 @@ public interface Errors { DiagnosticFactory0 INLINE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 INLINE_CLASS_WITH_INITIALIZER = DiagnosticFactory0.create(ERROR); - // Secondary constructors DiagnosticFactory0 CYCLIC_CONSTRUCTOR_DELEGATION_CALL = DiagnosticFactory0.create(ERROR); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java index 3b89f9454a7..f38a920aa38 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java @@ -630,7 +630,7 @@ public class DefaultErrorMessages { MAP.put(NON_PUBLIC_PRIMARY_CONSTRUCTOR_OF_INLINE_CLASS, "Primary constructor of inline class must be public"); MAP.put(INLINE_CLASS_CONSTRUCTOR_WRONG_PARAMETERS_SIZE, "Inline class must have exactly one primary constructor parameter"); MAP.put(INLINE_CLASS_CONSTRUCTOR_NOT_FINAL_READ_ONLY_PARAMETER, "Inline class primary constructor must have only final read-only (val) property parameter"); - MAP.put(INLINE_CLASS_WITH_INITIALIZER, "Inline class cannot have initializer block"); + MAP.put(INLINE_CLASS_WITH_INITIALIZER, "Inline class cannot have an initializer block"); MAP.put(VARIANCE_ON_TYPE_PARAMETER_NOT_ALLOWED, "Variance annotations are only allowed for type parameters of classes and interfaces"); MAP.put(BOUND_ON_TYPE_ALIAS_PARAMETER_NOT_ALLOWED, "Bounds are not allowed on type alias parameters"); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt index b4848d70b6c..77ec827fcc0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DeclarationsChecker.kt @@ -918,7 +918,7 @@ class DeclarationsChecker( val nullableNothing = callableDescriptor.builtIns.nullableNothingType for (parameter in varargParameters) { val varargElementType = parameter.varargElementType!!.upperIfFlexible() - if (KotlinTypeChecker.DEFAULT.isSubtypeOf(varargElementType, nullableNothing)) { + if (KotlinTypeChecker.DEFAULT.isSubtypeOf(varargElementType, nullableNothing) || varargElementType.isInlineClassType()) { val parameterDeclaration = DescriptorToSourceUtils.descriptorToDeclaration(parameter) as? KtParameter ?: continue trace.report(FORBIDDEN_VARARG_PARAMETER_TYPE.on(parameterDeclaration, varargElementType)) } diff --git a/compiler/testData/diagnostics/tests/inlineClasses/varargsOnParametersOfInlineClassType.kt b/compiler/testData/diagnostics/tests/inlineClasses/varargsOnParametersOfInlineClassType.kt new file mode 100644 index 00000000000..749a288b2b3 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inlineClasses/varargsOnParametersOfInlineClassType.kt @@ -0,0 +1,21 @@ +// !LANGUAGE: +InlineClasses +// !DIAGNOSTICS: -UNUSED_PARAMETER, -UNUSED_VARIABLE, -UNUSED_ANONYMOUS_PARAMETER + +inline class Foo(val x: Int) + +fun f1(vararg a: Foo) {} +fun f2(vararg a: Foo?) {} + +class A { + fun f3(a0: Int, vararg a1: Foo) { + fun f4(vararg a: Foo) {} + + val g = fun (vararg v: Foo) {} + } +} + +class B(vararg val s: Foo) { + constructor(a: Int, vararg s: Foo) : this(*s) +} + +annotation class Ann(vararg val f: Foo) \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/inlineClasses/varargsOnParametersOfInlineClassType.txt b/compiler/testData/diagnostics/tests/inlineClasses/varargsOnParametersOfInlineClassType.txt new file mode 100644 index 00000000000..166ca86ebd0 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inlineClasses/varargsOnParametersOfInlineClassType.txt @@ -0,0 +1,37 @@ +package + +public fun f1(/*0*/ vararg a: Foo /*kotlin.Array*/): kotlin.Unit +public fun f2(/*0*/ vararg a: Foo? /*kotlin.Array*/): kotlin.Unit + +public final class A { + public constructor A() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final fun f3(/*0*/ a0: kotlin.Int, /*1*/ vararg a1: Foo /*kotlin.Array*/): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final annotation class Ann : kotlin.Annotation { + public constructor Ann(/*0*/ vararg f: Foo /*kotlin.Array*/) + public final val f: kotlin.Array + 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 B { + public constructor B(/*0*/ vararg s: Foo /*kotlin.Array*/) + public constructor B(/*0*/ a: kotlin.Int, /*1*/ vararg s: Foo /*kotlin.Array*/) + public final val s: kotlin.Array + 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 inline class Foo { + public constructor Foo(/*0*/ x: kotlin.Int) + public final val x: kotlin.Int + 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 +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index a730bb0b86b..fe1644af792 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -10692,6 +10692,11 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { public void testPresenceOfPublicPrimaryConstructorForInlineClass() throws Exception { runTest("compiler/testData/diagnostics/tests/inlineClasses/presenceOfPublicPrimaryConstructorForInlineClass.kt"); } + + @TestMetadata("varargsOnParametersOfInlineClassType.kt") + public void testVarargsOnParametersOfInlineClassType() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineClasses/varargsOnParametersOfInlineClassType.kt"); + } } @TestMetadata("compiler/testData/diagnostics/tests/inner") diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java index a868116ce67..6bd433edede 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/javac/DiagnosticsUsingJavacTestGenerated.java @@ -10692,6 +10692,11 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing public void testPresenceOfPublicPrimaryConstructorForInlineClass() throws Exception { runTest("compiler/testData/diagnostics/tests/inlineClasses/presenceOfPublicPrimaryConstructorForInlineClass.kt"); } + + @TestMetadata("varargsOnParametersOfInlineClassType.kt") + public void testVarargsOnParametersOfInlineClassType() throws Exception { + runTest("compiler/testData/diagnostics/tests/inlineClasses/varargsOnParametersOfInlineClassType.kt"); + } } @TestMetadata("compiler/testData/diagnostics/tests/inner")