diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt index 641918ecbd5..d7fef737026 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -4018,6 +4018,18 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirJvmErrors.SYNCHRONIZED_ON_SUSPEND.errorFactory) { firDiagnostic -> + SynchronizedOnSuspendErrorImpl( + firDiagnostic as KtPsiDiagnostic, + token, + ) + } + add(FirJvmErrors.SYNCHRONIZED_ON_SUSPEND.warningFactory) { firDiagnostic -> + SynchronizedOnSuspendWarningImpl( + firDiagnostic as KtPsiDiagnostic, + token, + ) + } add(FirJvmErrors.OVERLOADS_WITHOUT_DEFAULT_ARGUMENTS) { firDiagnostic -> OverloadsWithoutDefaultArgumentsImpl( firDiagnostic as KtPsiDiagnostic, diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt index 601d908ab64..e7500ac921c 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt @@ -2797,6 +2797,14 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { override val diagnosticClass get() = SynchronizedOnInline::class } + abstract class SynchronizedOnSuspendError : KtFirDiagnostic() { + override val diagnosticClass get() = SynchronizedOnSuspendError::class + } + + abstract class SynchronizedOnSuspendWarning : KtFirDiagnostic() { + override val diagnosticClass get() = SynchronizedOnSuspendWarning::class + } + abstract class OverloadsWithoutDefaultArguments : KtFirDiagnostic() { override val diagnosticClass get() = OverloadsWithoutDefaultArguments::class } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index b2c6902dee6..706daf8de89 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -3378,6 +3378,16 @@ internal class SynchronizedOnInlineImpl( override val token: ValidityToken, ) : KtFirDiagnostic.SynchronizedOnInline(), KtAbstractFirDiagnostic +internal class SynchronizedOnSuspendErrorImpl( + override val firDiagnostic: KtPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.SynchronizedOnSuspendError(), KtAbstractFirDiagnostic + +internal class SynchronizedOnSuspendWarningImpl( + override val firDiagnostic: KtPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.SynchronizedOnSuspendWarning(), KtAbstractFirDiagnostic + internal class OverloadsWithoutDefaultArgumentsImpl( override val firDiagnostic: KtPsiDiagnostic, override val token: ValidityToken, diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index 5c31a2f7ffe..8f90d1d8683 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -35750,6 +35750,18 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/testsWithStdLib/coroutines/suspesionInDefaultValue.kt"); } + @Test + @TestMetadata("synchronizedOnSuspend.kt") + public void testSynchronizedOnSuspend() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/coroutines/synchronizedOnSuspend.kt"); + } + + @Test + @TestMetadata("synchronizedOnSuspendError.kt") + public void testSynchronizedOnSuspendError() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/coroutines/synchronizedOnSuspendError.kt"); + } + @Test @TestMetadata("tryCatchLambda.kt") public void testTryCatchLambda() throws Exception { @@ -37423,12 +37435,6 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag public void testSynchronizedOnInline() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/inline/synchronizedOnInline.kt"); } - - @Test - @TestMetadata("synchronizedOnSuspend.kt") - public void testSynchronizedOnSuspend() throws Exception { - runTest("compiler/testData/diagnostics/testsWithStdLib/inline/synchronizedOnSuspend.kt"); - } } @Nested diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index 5a78c7ff463..0eabb54558c 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -35750,6 +35750,18 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/testsWithStdLib/coroutines/suspesionInDefaultValue.kt"); } + @Test + @TestMetadata("synchronizedOnSuspend.kt") + public void testSynchronizedOnSuspend() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/coroutines/synchronizedOnSuspend.kt"); + } + + @Test + @TestMetadata("synchronizedOnSuspendError.kt") + public void testSynchronizedOnSuspendError() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/coroutines/synchronizedOnSuspendError.kt"); + } + @Test @TestMetadata("tryCatchLambda.kt") public void testTryCatchLambda() throws Exception { @@ -37423,12 +37435,6 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti public void testSynchronizedOnInline() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/inline/synchronizedOnInline.kt"); } - - @Test - @TestMetadata("synchronizedOnSuspend.kt") - public void testSynchronizedOnSuspend() throws Exception { - runTest("compiler/testData/diagnostics/testsWithStdLib/inline/synchronizedOnSuspend.kt"); - } } @Nested diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index b7684cc2957..315ad7a7a48 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -35750,6 +35750,18 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/testsWithStdLib/coroutines/suspesionInDefaultValue.kt"); } + @Test + @TestMetadata("synchronizedOnSuspend.kt") + public void testSynchronizedOnSuspend() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/coroutines/synchronizedOnSuspend.kt"); + } + + @Test + @TestMetadata("synchronizedOnSuspendError.kt") + public void testSynchronizedOnSuspendError() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/coroutines/synchronizedOnSuspendError.kt"); + } + @Test @TestMetadata("tryCatchLambda.kt") public void testTryCatchLambda() throws Exception { @@ -37423,12 +37435,6 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac public void testSynchronizedOnInline() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/inline/synchronizedOnInline.kt"); } - - @Test - @TestMetadata("synchronizedOnSuspend.kt") - public void testSynchronizedOnSuspend() throws Exception { - runTest("compiler/testData/diagnostics/testsWithStdLib/inline/synchronizedOnSuspend.kt"); - } } @Nested diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt index d7b30983dfe..1bc6025a1cb 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.fir.checkers.generator.diagnostics import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature.* import org.jetbrains.kotlin.fir.PrivateForInline import org.jetbrains.kotlin.fir.checkers.generator.diagnostics.model.DiagnosticList @@ -60,6 +61,7 @@ object JVM_DIAGNOSTICS_LIST : DiagnosticList("FirJvmErrors") { val SYNCHRONIZED_ON_ABSTRACT by error() val SYNCHRONIZED_IN_INTERFACE by error() val SYNCHRONIZED_ON_INLINE by warning() + val SYNCHRONIZED_ON_SUSPEND by deprecationError(SynchronizedSuspendError) val OVERLOADS_WITHOUT_DEFAULT_ARGUMENTS by warning() val OVERLOADS_ABSTRACT by error() val OVERLOADS_INTERFACE by error() diff --git a/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt b/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt index 59c5f17b1d4..7102169be23 100644 --- a/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt +++ b/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.config.LanguageFeature.ProhibitConcurrentHashMapCont import org.jetbrains.kotlin.config.LanguageFeature.ProhibitJvmOverloadsOnConstructorsOfAnnotationClasses import org.jetbrains.kotlin.config.LanguageFeature.ProhibitSpreadOnSignaturePolymorphicCall import org.jetbrains.kotlin.config.LanguageFeature.RepeatableAnnotationContainerConstraints +import org.jetbrains.kotlin.config.LanguageFeature.SynchronizedSuspendError import org.jetbrains.kotlin.diagnostics.* import org.jetbrains.kotlin.diagnostics.SourceElementPositioningStrategies import org.jetbrains.kotlin.diagnostics.rendering.RootDiagnosticRendererFactory @@ -58,6 +59,7 @@ object FirJvmErrors { val SYNCHRONIZED_ON_ABSTRACT by error0() val SYNCHRONIZED_IN_INTERFACE by error0() val SYNCHRONIZED_ON_INLINE by warning0() + val SYNCHRONIZED_ON_SUSPEND by deprecationError0(SynchronizedSuspendError) val OVERLOADS_WITHOUT_DEFAULT_ARGUMENTS by warning0() val OVERLOADS_ABSTRACT by error0() val OVERLOADS_INTERFACE by error0() diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrorsDefaultMessages.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrorsDefaultMessages.kt index 149c073e677..0b102e92f90 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrorsDefaultMessages.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrorsDefaultMessages.kt @@ -82,6 +82,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.SUSPENSION import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.SYNCHRONIZED_IN_INTERFACE import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.SYNCHRONIZED_ON_ABSTRACT import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.SYNCHRONIZED_ON_INLINE +import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.SYNCHRONIZED_ON_SUSPEND import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.UPPER_BOUND_CANNOT_BE_ARRAY import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.VALUE_CLASS_WITHOUT_JVM_INLINE_ANNOTATION import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.VOLATILE_ON_DELEGATE @@ -98,6 +99,7 @@ object FirJvmErrorsDefaultMessages : BaseDiagnosticRendererFactory() { map.put(VOLATILE_ON_DELEGATE, "'@Volatile' annotation cannot be used on delegated properties") map.put(SYNCHRONIZED_ON_ABSTRACT, "'@Synchronized' annotation cannot be used on abstract functions") map.put(SYNCHRONIZED_ON_INLINE, "'@Synchronized' annotation has no effect on inline functions") + map.put(SYNCHRONIZED_ON_SUSPEND, "@Synchronized annotation is not applicable to suspend functions and lambdas") map.put(SYNCHRONIZED_IN_INTERFACE, "'@Synchronized' annotation cannot be used on interface members") map.put(OVERLOADS_WITHOUT_DEFAULT_ARGUMENTS, "'@JvmOverloads' annotation has no effect for methods without default arguments") map.put(OVERLOADS_ABSTRACT, "'@JvmOverloads' annotation cannot be used on abstract methods") diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirSynchronizedAnnotationChecker.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirSynchronizedAnnotationChecker.kt index 599c8ef9b91..c30f8bf1429 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirSynchronizedAnnotationChecker.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirSynchronizedAnnotationChecker.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.fir.analysis.jvm.checkers.declaration +import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.analysis.checkers.classKind import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext @@ -13,10 +14,14 @@ import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.getAnnotationByClassId import org.jetbrains.kotlin.fir.declarations.utils.isAbstract import org.jetbrains.kotlin.fir.declarations.utils.isInline +import org.jetbrains.kotlin.fir.declarations.utils.isSuspend +import org.jetbrains.kotlin.fir.types.coneType +import org.jetbrains.kotlin.fir.types.isSuspendFunctionType import org.jetbrains.kotlin.name.JvmNames.SYNCHRONIZED_ANNOTATION_CLASS_ID object FirSynchronizedAnnotationChecker : FirFunctionChecker() { @@ -27,6 +32,12 @@ object FirSynchronizedAnnotationChecker : FirFunctionChecker() { reporter.reportOn(annotation.source, FirJvmErrors.SYNCHRONIZED_ON_INLINE, context) return } + if (declaration.isSuspend || + (declaration as? FirAnonymousFunction)?.typeRef?.coneType?.isSuspendFunctionType(context.session) == true + ) { + reporter.reportOn(annotation.source, FirJvmErrors.SYNCHRONIZED_ON_SUSPEND, context) + return + } val containingClass = declaration.getContainingClassSymbol(context.session) ?: return if (containingClass.classKind == ClassKind.INTERFACE) { diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/SynchronizedAnnotationOnLambdaChecker.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/SynchronizedAnnotationOnLambdaChecker.kt index 46434811472..cdce710abf1 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/SynchronizedAnnotationOnLambdaChecker.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/SynchronizedAnnotationOnLambdaChecker.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.resolve.jvm.checkers +import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget @@ -33,7 +34,7 @@ object SynchronizedAnnotationOnLambdaChecker : AdditionalAnnotationChecker { val literal = (annotated?.unwrapParenthesesLabelsAndAnnotations() as? KtLambdaExpression)?.functionLiteral ?: return val descriptor = trace.bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, literal] if (descriptor is FunctionDescriptor && descriptor.isSuspend) { - trace.report(ErrorsJvm.SYNCHRONIZED_ON_SUSPEND.on(annotation)) + trace.report(ErrorsJvm.SYNCHRONIZED_ON_SUSPEND.on(languageVersionSettings, annotation)) } } } \ No newline at end of file diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt index a004600dabf..042395e3cf8 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/declarationCheckers.kt @@ -198,7 +198,7 @@ class SynchronizedAnnotationChecker : DeclarationChecker { } else if (descriptor.isInline) { context.trace.report(ErrorsJvm.SYNCHRONIZED_ON_INLINE.on(annotationEntry)) } else if (descriptor.isSuspend) { - context.trace.report(ErrorsJvm.SYNCHRONIZED_ON_SUSPEND.on(annotationEntry)) + context.trace.report(ErrorsJvm.SYNCHRONIZED_ON_SUSPEND.on(context.languageVersionSettings, annotationEntry)) } else if (descriptor.containingDeclaration.let { it is ClassDescriptor && it.isValue }) { context.trace.report(ErrorsJvm.SYNCHRONIZED_ON_VALUE_CLASS.on(annotationEntry)) } diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java index 34dea8aa1ac..2e330653085 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/diagnostics/ErrorsJvm.java @@ -49,7 +49,8 @@ public interface ErrorsJvm { DiagnosticFactory0 SYNCHRONIZED_ON_ABSTRACT = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 SYNCHRONIZED_ON_INLINE = DiagnosticFactory0.create(WARNING); DiagnosticFactory0 SYNCHRONIZED_ON_VALUE_CLASS = DiagnosticFactory0.create(WARNING); - DiagnosticFactory0 SYNCHRONIZED_ON_SUSPEND = DiagnosticFactory0.create(WARNING); + DiagnosticFactoryForDeprecation0 SYNCHRONIZED_ON_SUSPEND = + DiagnosticFactoryForDeprecation0.create(LanguageFeature.SynchronizedSuspendError); DiagnosticFactory0 SYNCHRONIZED_IN_INTERFACE = DiagnosticFactory0.create(ERROR); DiagnosticFactory0 OVERLOADS_WITHOUT_DEFAULT_ARGUMENTS = DiagnosticFactory0.create(WARNING); diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/synchronizedOnSuspend.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/synchronizedOnSuspend.kt new file mode 100644 index 00000000000..ca943d2c803 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/synchronizedOnSuspend.kt @@ -0,0 +1,25 @@ +// FIR_IDENTICAL +// !DIAGNOSTICS: -UNUSED_PARAMETER +// SKIP_TXT + +@Synchronized +suspend fun foo(f: () -> Unit): Unit = f() + +fun builder(c: suspend () -> Unit) {} + +val a: suspend () -> Unit + get() = @Synchronized {} +val b: suspend () -> Unit = @Synchronized {} +val c = builder (@Synchronized {}) +val d = suspend @Synchronized {} +val e = @Synchronized suspend {} + +fun test() { + @Synchronized + suspend fun foo(f: () -> Unit): Unit = f() + + val b: suspend () -> Unit = @Synchronized {} + val c = builder (@Synchronized {}) + val d = suspend @Synchronized {} + val e = @Synchronized suspend {} +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/coroutines/synchronizedOnSuspendError.kt b/compiler/testData/diagnostics/testsWithStdLib/coroutines/synchronizedOnSuspendError.kt new file mode 100644 index 00000000000..9c7d75e8e83 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithStdLib/coroutines/synchronizedOnSuspendError.kt @@ -0,0 +1,26 @@ +// FIR_IDENTICAL +// LANGUAGE: +SynchronizedSuspendError +// !DIAGNOSTICS: -UNUSED_PARAMETER +// SKIP_TXT + +@Synchronized +suspend fun foo(f: () -> Unit): Unit = f() + +fun builder(c: suspend () -> Unit) {} + +val a: suspend () -> Unit + get() = @Synchronized {} +val b: suspend () -> Unit = @Synchronized {} +val c = builder (@Synchronized {}) +val d = suspend @Synchronized {} +val e = @Synchronized suspend {} + +fun test() { + @Synchronized + suspend fun foo(f: () -> Unit): Unit = f() + + val b: suspend () -> Unit = @Synchronized {} + val c = builder (@Synchronized {}) + val d = suspend @Synchronized {} + val e = @Synchronized suspend {} +} diff --git a/compiler/testData/diagnostics/testsWithStdLib/inline/synchronizedOnSuspend.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/inline/synchronizedOnSuspend.fir.kt deleted file mode 100644 index 2a8f629d671..00000000000 --- a/compiler/testData/diagnostics/testsWithStdLib/inline/synchronizedOnSuspend.fir.kt +++ /dev/null @@ -1,24 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_PARAMETER -// SKIP_TXT - -@Synchronized -suspend fun foo(f: () -> Unit): Unit = f() - -fun builder(c: suspend () -> Unit) {} - -val a: suspend () -> Unit - get() = @Synchronized {} -val b: suspend () -> Unit = @Synchronized {} -val c = builder (@Synchronized {}) -val d = suspend @Synchronized {} -val e = @Synchronized suspend {} - -fun test() { - @Synchronized - suspend fun foo(f: () -> Unit): Unit = f() - - val b: suspend () -> Unit = @Synchronized {} - val c = builder (@Synchronized {}) - val d = suspend @Synchronized {} - val e = @Synchronized suspend {} -} diff --git a/compiler/testData/diagnostics/testsWithStdLib/inline/synchronizedOnSuspend.kt b/compiler/testData/diagnostics/testsWithStdLib/inline/synchronizedOnSuspend.kt deleted file mode 100644 index 8f185a0335c..00000000000 --- a/compiler/testData/diagnostics/testsWithStdLib/inline/synchronizedOnSuspend.kt +++ /dev/null @@ -1,24 +0,0 @@ -// !DIAGNOSTICS: -UNUSED_PARAMETER -// SKIP_TXT - -@Synchronized -suspend fun foo(f: () -> Unit): Unit = f() - -fun builder(c: suspend () -> Unit) {} - -val a: suspend () -> Unit - get() = @Synchronized {} -val b: suspend () -> Unit = @Synchronized {} -val c = builder (@Synchronized {}) -val d = suspend @Synchronized {} -val e = @Synchronized suspend {} - -fun test() { - @Synchronized - suspend fun foo(f: () -> Unit): Unit = f() - - val b: suspend () -> Unit = @Synchronized {} - val c = builder (@Synchronized {}) - val d = suspend @Synchronized {} - val e = @Synchronized suspend {} -} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 73373000e65..cef6872c6c2 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -35840,6 +35840,18 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/testsWithStdLib/coroutines/suspesionInDefaultValue.kt"); } + @Test + @TestMetadata("synchronizedOnSuspend.kt") + public void testSynchronizedOnSuspend() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/coroutines/synchronizedOnSuspend.kt"); + } + + @Test + @TestMetadata("synchronizedOnSuspendError.kt") + public void testSynchronizedOnSuspendError() throws Exception { + runTest("compiler/testData/diagnostics/testsWithStdLib/coroutines/synchronizedOnSuspendError.kt"); + } + @Test @TestMetadata("tryCatchLambda.kt") public void testTryCatchLambda() throws Exception { @@ -37513,12 +37525,6 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { public void testSynchronizedOnInline() throws Exception { runTest("compiler/testData/diagnostics/testsWithStdLib/inline/synchronizedOnInline.kt"); } - - @Test - @TestMetadata("synchronizedOnSuspend.kt") - public void testSynchronizedOnSuspend() throws Exception { - runTest("compiler/testData/diagnostics/testsWithStdLib/inline/synchronizedOnSuspend.kt"); - } } @Nested diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index 6bd858db746..718c3fe69cc 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -260,6 +260,7 @@ enum class LanguageFeature( IgnoreNullabilityForErasedValueParameters(KOTLIN_1_8, kind = BUG_FIX), ForbidUsingExtensionPropertyTypeParameterInDelegate(KOTLIN_1_8, kind = BUG_FIX), ModifierNonBuiltinSuspendFunError(KOTLIN_1_8), + SynchronizedSuspendError(KOTLIN_1_8), // 1.9